From 23859333c65201f6e707d331d6533eb219567436 Mon Sep 17 00:00:00 2001 From: zhom <2717306+zhom@users.noreply.github.com> Date: Wed, 8 Jul 2026 00:47:02 +0400 Subject: [PATCH] refactor: fully deprecate camoufox --- .github/ISSUE_TEMPLATE/bug-report.yml | 13 +- .github/workflows/issue-validation.yml | 35 +- .vscode/settings.json | 1 - CONTRIBUTING.md | 2 +- _typos.toml | 3 +- src-tauri/Cargo.lock | 223 +- src-tauri/Cargo.toml | 2 - src-tauri/src/api_client.rs | 1551 +- src-tauri/src/api_server.rs | 67 +- src-tauri/src/auto_updater.rs | 188 +- src-tauri/src/browser.rs | 667 - src-tauri/src/browser_runner.rs | 1207 +- src-tauri/src/browser_version_manager.rs | 733 +- src-tauri/src/camoufox/config.rs | 677 - .../camoufox/data/browser-helper-file.json | 120 - src-tauri/src/camoufox/data/browserforge.yml | 68 - .../data/fingerprint-network-definition.zip | Bin 601335 -> 0 bytes .../data/fingerprint-presets-v135.json | 6029 ------ .../data/fingerprint-presets-v150.json | 16511 ---------------- src-tauri/src/camoufox/data/fonts.json | 822 - .../data/header-network-definition.zip | Bin 40135 -> 0 bytes .../src/camoufox/data/headers-order.json | 164 - .../data/input-network-definition.zip | Bin 3919 -> 0 bytes src-tauri/src/camoufox/data/mod.rs | 27 - src-tauri/src/camoufox/data/webgl_data.db | Bin 266240 -> 0 bytes src-tauri/src/camoufox/env_vars.rs | 142 - .../camoufox/fingerprint/bayesian_network.rs | 198 - .../src/camoufox/fingerprint/bayesian_node.rs | 231 - src-tauri/src/camoufox/fingerprint/mod.rs | 569 - src-tauri/src/camoufox/fingerprint/types.rs | 302 - src-tauri/src/camoufox/fonts.rs | 83 - src-tauri/src/camoufox/launcher.rs | 338 - src-tauri/src/camoufox/mod.rs | 155 - src-tauri/src/camoufox/presets.rs | 405 - src-tauri/src/camoufox/webgl.rs | 251 - src-tauri/src/camoufox_manager.rs | 855 - src-tauri/src/cookie_manager.rs | 407 +- src-tauri/src/downloaded_browsers_registry.rs | 12 +- src-tauri/src/downloader.rs | 208 +- src-tauri/src/ephemeral_dirs.rs | 3 +- src-tauri/src/extension_manager.rs | 196 +- src-tauri/src/extraction.rs | 30 +- src-tauri/src/geoip_downloader.rs | 40 +- src-tauri/src/{camoufox => }/geolocation.rs | 168 +- src-tauri/src/ip_utils.rs | 35 - src-tauri/src/lib.rs | 46 +- src-tauri/src/mcp_server.rs | 103 +- src-tauri/src/platform_browser.rs | 2 +- src-tauri/src/profile/manager.rs | 798 +- src-tauri/src/profile/types.rs | 6 +- src-tauri/src/profile_importer.rs | 37 +- src-tauri/src/proxy_manager.rs | 5 +- src-tauri/src/proxy_storage.rs | 3 +- src-tauri/src/sync/engine.rs | 2 +- src-tauri/src/synchronizer.rs | 5 +- .../territoryInfo.xml => territory_info.xml} | 0 src-tauri/src/version_updater.rs | 4 +- src-tauri/src/wayfern_manager.rs | 4 +- src-tauri/tests/sync_e2e.rs | 4 +- src/app/page.tsx | 119 +- src/components/camoufox-config-dialog.tsx | 213 - .../camoufox-deprecation-dialog.tsx | 78 - src/components/cookie-copy-dialog.tsx | 6 +- src/components/create-profile-dialog.tsx | 31 +- .../extension-management-dialog.tsx | 39 +- src/components/import-profile-dialog.tsx | 11 +- src/components/profile-data-table.tsx | 23 +- src/components/profile-info-dialog.tsx | 105 +- src/components/release-type-selector.tsx | 200 - .../shared-camoufox-config-form.tsx | 1382 -- .../shared-fingerprint-config-form.tsx | 1 + src/components/wayfern-config-dialog.tsx | 163 + .../window-resize-warning-dialog.tsx | 13 +- src/hooks/use-browser-download.ts | 14 +- src/hooks/use-browser-state.ts | 5 +- src/hooks/use-update-notifications.tsx | 1 - src/i18n/locales/en.json | 91 +- src/i18n/locales/es.json | 91 +- src/i18n/locales/fr.json | 91 +- src/i18n/locales/ja.json | 91 +- src/i18n/locales/ko.json | 91 +- src/i18n/locales/pt.json | 91 +- src/i18n/locales/ru.json | 91 +- src/i18n/locales/vi.json | 91 +- src/i18n/locales/zh.json | 91 +- src/lib/browser-utils.ts | 19 +- src/types.ts | 190 +- tsconfig.json | 8 +- 88 files changed, 702 insertions(+), 37495 deletions(-) delete mode 100644 src-tauri/src/camoufox/config.rs delete mode 100644 src-tauri/src/camoufox/data/browser-helper-file.json delete mode 100644 src-tauri/src/camoufox/data/browserforge.yml delete mode 100644 src-tauri/src/camoufox/data/fingerprint-network-definition.zip delete mode 100644 src-tauri/src/camoufox/data/fingerprint-presets-v135.json delete mode 100644 src-tauri/src/camoufox/data/fingerprint-presets-v150.json delete mode 100644 src-tauri/src/camoufox/data/fonts.json delete mode 100644 src-tauri/src/camoufox/data/header-network-definition.zip delete mode 100644 src-tauri/src/camoufox/data/headers-order.json delete mode 100644 src-tauri/src/camoufox/data/input-network-definition.zip delete mode 100644 src-tauri/src/camoufox/data/mod.rs delete mode 100644 src-tauri/src/camoufox/data/webgl_data.db delete mode 100644 src-tauri/src/camoufox/env_vars.rs delete mode 100644 src-tauri/src/camoufox/fingerprint/bayesian_network.rs delete mode 100644 src-tauri/src/camoufox/fingerprint/bayesian_node.rs delete mode 100644 src-tauri/src/camoufox/fingerprint/mod.rs delete mode 100644 src-tauri/src/camoufox/fingerprint/types.rs delete mode 100644 src-tauri/src/camoufox/fonts.rs delete mode 100644 src-tauri/src/camoufox/launcher.rs delete mode 100644 src-tauri/src/camoufox/mod.rs delete mode 100644 src-tauri/src/camoufox/presets.rs delete mode 100644 src-tauri/src/camoufox/webgl.rs delete mode 100644 src-tauri/src/camoufox_manager.rs rename src-tauri/src/{camoufox => }/geolocation.rs (63%) rename src-tauri/src/{camoufox/data/territoryInfo.xml => territory_info.xml} (100%) delete mode 100644 src/components/camoufox-config-dialog.tsx delete mode 100644 src/components/camoufox-deprecation-dialog.tsx delete mode 100644 src/components/release-type-selector.tsx delete mode 100644 src/components/shared-camoufox-config-form.tsx create mode 100644 src/components/shared-fingerprint-config-form.tsx create mode 100644 src/components/wayfern-config-dialog.tsx diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 623715d..bb6ce3c 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -41,15 +41,12 @@ body: validations: required: true - - type: dropdown - id: browser + - type: input + id: wayfern_version attributes: - label: Which browser is affected? - options: - - Wayfern - - Camoufox - - Both - - Not browser-specific + label: Wayfern version + description: Settings → About, or the version shown when creating a profile. Use "unknown" if not browser-specific. + placeholder: e.g. 138.0.7204.50 or unknown validations: required: true diff --git a/.github/workflows/issue-validation.yml b/.github/workflows/issue-validation.yml index 88e358c..cb59df4 100644 --- a/.github/workflows/issue-validation.yml +++ b/.github/workflows/issue-validation.yml @@ -68,7 +68,7 @@ jobs: const get = (k) => fields[k] || ''; fs.writeFileSync('/tmp/issue-os.txt', get('Operating System')); fs.writeFileSync('/tmp/issue-version.txt', get('Donut Browser version')); - fs.writeFileSync('/tmp/issue-browser.txt', get('Which browser is affected?')); + fs.writeFileSync('/tmp/issue-wayfern-version.txt', get('Wayfern version')); fs.writeFileSync('/tmp/issue-repro.txt', get('Steps to reproduce')); fs.writeFileSync('/tmp/issue-logs.txt', get('Error logs or screenshots')); fs.writeFileSync('/tmp/issue-what.txt', get('What happened?') || get('What do you want?')); @@ -102,17 +102,7 @@ jobs: its API, MCP server, and the bundled `donut-sync` self-hosted server. - **Wayfern** — a Chromium fork maintained by zhom (the same maintainer). Wayfern bugs are in-scope here unless they are obviously upstream Chromium issues. - - **Camoufox** — a Firefox fork by daijro, used by Donut but maintained in a - separate repository. Bugs about Camoufox's *internal* behavior are outside - the scope of this project. - - Bugs about Camoufox's *internal* behavior (page rendering, JS engine, - dropdowns, form widgets, fingerprinting *as Camoufox implements it*, - checkbox/radio quirks) are out of scope here. Ask the user to first - search https://github.com/daijro/camoufox/issues for a matching report, - and if they don't find one, to open it there themselves. - - Bugs about how Donut *launches, configures, or downloads* Camoufox are - in-scope here. - - **Forks of Wayfern or Camoufox** (e.g. CloverLabsAI, VulpineOS) are NOT + - **Forks of Wayfern** (e.g. CloverLabsAI, VulpineOS) are NOT supported. Feature requests asking for them are out of scope. # PAID vs FREE FEATURES @@ -121,7 +111,7 @@ jobs: ## Free (no account required) - Unlimited local profiles - - Chromium (Wayfern) and Firefox (Camoufox) browser engines + - Chromium (Wayfern) anti-detect browser engine - Proxy support (HTTP/SOCKS5) - VPN support (WireGuard) - Profile Management API & MCP (list / create / launch / kill / config) @@ -147,13 +137,8 @@ jobs: differently ("worked in 0.21", "went from 2 to 8 false positives"). Do NOT dismiss as "known issue" / "expected" / "false positive in Tauri apps". Ask which exact version was the last working one and what changed. - - **Out-of-scope (upstream Camoufox)**: report is about Camoufox's own - behavior. Tell the user it's outside the scope of this project and ask - them to search the Camoufox repo and, if no matching issue exists, file - one there. Do NOT say the maintainer doesn't contribute / can't fix it - — keep it strictly about project scope. Do not collect logs. - **Fork-support request**: asks the maintainer to support an alternative - Wayfern/Camoufox fork. Acknowledge in one neutral sentence — do NOT call it + Wayfern fork. Acknowledge in one neutral sentence — do NOT call it "clear", "reasonable", "well-thought-out", etc. - **AI-generated / template-violating report**: report doesn't follow the template, may cite "official documentation" via context7, deepwiki, or any @@ -214,7 +199,7 @@ jobs: Return ONLY valid JSON. No preamble, no code fences. Schema: { "language": "en" or ISO 639-1 code, - "classification": one of ["bug-in-scope", "bug-upstream-camoufox", "bug-template-violation", "feature-request", "fork-request", "regression", "ai-generated-junk", "question", "other"], + "classification": one of ["bug-in-scope", "bug-template-violation", "feature-request", "fork-request", "regression", "ai-generated-junk", "question", "other"], "operating_system": "macos" | "windows" | "linux" | "unknown", "is_paid_feature": true | false, "user_followed_template": true | false, @@ -225,13 +210,12 @@ jobs: } Classification guidance: - - "bug-upstream-camoufox": Camoufox-internal behavior (rendering, dropdowns, JS, fingerprint impl). NOT how Donut launches it. - "bug-template-violation": missing or filled-in nonsense for required template fields. - "ai-generated-junk": cites fabricated "official docs" (context7, deepwiki, non-donutbrowser URLs) or has the polished AI-spam shape (long, structured, fabricated certainty). - "fork-request": asks for support of CloverLabsAI/VulpineOS/etc. forks. - "regression": user names a prior version that worked. - File selection: pick files that an experienced reviewer would actually look at to act on this issue. If the issue is upstream-Camoufox, fork-request, or junk, set files_to_read to []. Otherwise pick concrete files relevant to the symptoms. + File selection: pick files that an experienced reviewer would actually look at to act on this issue. If the issue is a fork-request or junk, set files_to_read to []. Otherwise pick concrete files relevant to the symptoms. TRIAGE_TAIL } > /tmp/triage-system.txt wc -c /tmp/triage-system.txt @@ -292,7 +276,7 @@ jobs: - name: Read files chosen by triage run: | : > /tmp/file-context.txt - # files_to_read may be empty (e.g. upstream Camoufox) — that's fine. + # files_to_read may be empty (e.g. fork-request or junk) — that's fine. jq -r '.files_to_read[]? // empty' /tmp/triage.json | while IFS= read -r filepath; do filepath=$(echo "$filepath" | xargs) [ -z "$filepath" ] && continue @@ -329,7 +313,7 @@ jobs: ## Output shape - One sentence acknowledging the report. - - Then **Missing information** — only if there is anything actually missing. Skip this section if the user already provided OS, version, browser, repro steps, and any logs the situation calls for. + - Then **Missing information** — only if there is anything actually missing. Skip this section if the user already provided OS, Donut Browser version, Wayfern version, repro steps, and any logs the situation calls for. - Maximum 15 lines. - No labels, no `Label:` line, no markdown headings other than `**Missing information**`. - No closing pleasantries ("please let me know", "happy to help", etc.). @@ -347,8 +331,7 @@ jobs: The triage classification (`triage.classification`) determines the response shape: - `bug-in-scope`: ask for what is missing using the user's reported OS log path. Be concrete about how to obtain logs. - - `bug-upstream-camoufox`: redirect ONLY. One sentence acknowledging, then say this is outside the scope of this project — ask the user to first search https://github.com/daijro/camoufox/issues for a matching report and, if none exists, to open one there themselves. Do NOT phrase it as "the maintainer does not contribute" or anything personal — keep it strictly about scope. Do NOT ask for Donut logs. Stop after that. - - `bug-template-violation` or `ai-generated-junk`: politely ask the user to refile using the bug-report template (the Operating System, Donut Browser version, Which browser, Steps to reproduce, Error logs sections). If they cited "documentation" from any non-`donutbrowser.com`/non-`github.com/zhom` URL (e.g. context7, deepwiki), gently note that those are AI-generated third-party summaries and the only authoritative sources are this repo and donutbrowser.com. + - `bug-template-violation` or `ai-generated-junk`: politely ask the user to refile using the bug-report template (the Operating System, Donut Browser version, Wayfern version, Steps to reproduce, Error logs sections). If they cited "documentation" from any non-`donutbrowser.com`/non-`github.com/zhom` URL (e.g. context7, deepwiki), gently note that those are AI-generated third-party summaries and the only authoritative sources are this repo and donutbrowser.com. - `feature-request`: one neutral sentence acknowledging, then ask only what is genuinely needed (concrete use case, whether a workaround would suffice). Do NOT validate. - `fork-request`: one neutral sentence acknowledging the request. Note that this would substantially increase support burden and the maintainer evaluates such requests on a case-by-case basis. Ask whether the alternative fork supports all platforms the user uses (macOS / Windows / Linux). No "clear enhancement" language. - `regression`: do NOT call known/expected. Ask which exact previous version was the last working one, what changed in the user's environment between then and now, and the specific delta in symptoms. diff --git a/.vscode/settings.json b/.vscode/settings.json index 30d7888..26cb559 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,7 +21,6 @@ "Buildx", "busctl", "CAMOU", - "camoufox", "catppuccin", "cdylib", "certifi", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 55d814a..9b91087 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -92,7 +92,7 @@ codeql database analyze /tmp/codeql-rust --format=sarifv2.1.0 --output=/tmp/rust - **Backend**: Tauri (Rust), `src-tauri/src/` - **Proxy Worker**: Detached process for proxy tunneling, `src-tauri/src/bin/proxy_server.rs` - **Sync**: Cloud sync via S3-compatible storage, `src-tauri/src/sync/`, `donut-sync/` -- **Browsers**: Camoufox (Firefox-based) and Wayfern (Chromium-based) +- **Browsers**: Wayfern (Chromium-based anti-detect) ## Getting Help diff --git a/_typos.toml b/_typos.toml index ec93ca5..61497eb 100644 --- a/_typos.toml +++ b/_typos.toml @@ -1,7 +1,6 @@ [files] extend-exclude = [ - "src-tauri/src/camoufox/data/*.json", - "src-tauri/src/camoufox/data/*.xml", + "src-tauri/src/territory_info.xml", "src/i18n/locales/*.json", # Auto-generated from commit subjects by release.yml; typos here originate # in commit messages, which are immutable, so don't spell-check it. diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b6bef9b..cf907fe 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -194,9 +194,6 @@ name = "arbitrary" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" -dependencies = [ - "derive_arbitrary", -] [[package]] name = "arboard" @@ -641,7 +638,7 @@ dependencies = [ "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.4.2", + "constant_time_eq", "cpufeatures 0.3.0", ] @@ -1223,12 +1220,6 @@ dependencies = [ "tiny-keccak", ] -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - [[package]] name = "constant_time_eq" version = "0.4.2" @@ -1561,12 +1552,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "092966b41edc516079bdf31ec78a2e0588d1d0c08f78b91d8307215928642b2b" -[[package]] -name = "deflate64" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" - [[package]] name = "defmt" version = "0.3.100" @@ -1627,17 +1612,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "derive_arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] - [[package]] name = "derive_more" version = "2.1.1" @@ -1822,11 +1796,10 @@ dependencies = [ "objc2", "objc2-app-kit", "once_cell", - "playwright", "quick-xml 0.40.1", "rand 0.10.1", "regex-lite", - "reqwest 0.13.4", + "reqwest", "resvg", "ring", "rusqlite", @@ -1869,7 +1842,7 @@ dependencies = [ "windows 0.62.2", "winreg 0.56.0", "wiremock", - "zip 8.6.0", + "zip", ] [[package]] @@ -2584,11 +2557,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi 5.3.0", "wasip2", - "wasm-bindgen", ] [[package]] @@ -3704,17 +3675,6 @@ dependencies = [ "crc", ] -[[package]] -name = "lzma-sys" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - [[package]] name = "lzxd" version = "0.2.6" @@ -4523,16 +4483,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - [[package]] name = "percent-encoding" version = "2.3.2" @@ -4680,29 +4630,6 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" -[[package]] -name = "playwright" -version = "0.0.23" -source = "git+https://github.com/zhom/playwright-rust?branch=master#0482f839aa24507268d9e3ee47c2be859eeef4f2" -dependencies = [ - "base64 0.22.1", - "chrono", - "dirs", - "futures", - "itertools", - "log", - "paste", - "reqwest 0.12.28", - "serde", - "serde_json", - "serde_with", - "strong", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "zip 2.4.2", -] - [[package]] name = "plist" version = "1.9.0" @@ -5259,48 +5186,6 @@ dependencies = [ "bytecheck", ] -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tower", - "tower-http 0.6.11", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "reqwest" version = "0.13.4" @@ -6315,15 +6200,6 @@ dependencies = [ "quote", ] -[[package]] -name = "strong" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbe0fc7652d95bcd84f61cd036181b395f329ef45b25169b69a42f72cb6975f" -dependencies = [ - "serde", -] - [[package]] name = "strsim" version = "0.11.1" @@ -6562,7 +6438,7 @@ dependencies = [ "percent-encoding", "plist", "raw-window-handle", - "reqwest 0.13.4", + "reqwest", "serde", "serde_json", "serde_repr", @@ -7166,18 +7042,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - [[package]] name = "tokio-tfo" version = "0.4.3" @@ -8858,15 +8722,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "y4m" version = "0.8.0" @@ -9051,36 +8906,6 @@ dependencies = [ "syn 2.0.118", ] -[[package]] -name = "zip" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" -dependencies = [ - "aes 0.8.4", - "arbitrary", - "bzip2", - "constant_time_eq 0.3.1", - "crc32fast", - "crossbeam-utils", - "deflate64", - "displaydoc", - "flate2", - "getrandom 0.3.4", - "hmac", - "indexmap 2.14.0", - "lzma-rs", - "memchr", - "pbkdf2", - "sha1", - "thiserror 2.0.18", - "time", - "xz2", - "zeroize", - "zopfli", - "zstd", -] - [[package]] name = "zip" version = "8.6.0" @@ -9100,46 +8925,6 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" -[[package]] -name = "zopfli" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" -dependencies = [ - "bumpalo", - "crc32fast", - "log", - "simd-adler32", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zune-core" version = "0.5.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c6e10cf..03acf2f 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -91,8 +91,6 @@ http-body-util = "0.1" clap = { version = "4", features = ["derive"] } async-socks5 = "0.6" -# Camoufox/Playwright integration -playwright = { git = "https://github.com/zhom/playwright-rust", branch = "master" } # Wayfern CDP integration tokio-tungstenite = { version = "0.29", features = ["native-tls"] } diff --git a/src-tauri/src/api_client.rs b/src-tauri/src/api_client.rs index c80ee3c..33ff636 100644 --- a/src-tauri/src/api_client.rs +++ b/src-tauri/src/api_client.rs @@ -1,145 +1,49 @@ use reqwest::Client; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; use std::fs; use std::path::PathBuf; use std::time::{SystemTime, UNIX_EPOCH}; -use crate::browser::GithubRelease; - #[derive(Debug, Clone, PartialEq, Eq)] pub struct VersionComponent { pub major: u32, pub minor: u32, pub patch: u32, pub build: u32, - pub pre_release: Option, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct PreRelease { - pub kind: PreReleaseKind, - pub number: Option, -} - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -pub enum PreReleaseKind { - Alpha, - Beta, - RC, - Dev, - Pre, } impl VersionComponent { pub fn parse(version: &str) -> Self { let version = version.trim(); - // Normalize common tag prefixes like 'v1.2.3' -> '1.2.3' let version = if version.starts_with('v') || version.starts_with('V') { &version[1..] } else { version }; - // Handle special case for Zen Browser twilight releases - if version.to_lowercase() == "twilight" { - // Pure twilight release without base version - return VersionComponent { - major: 999, // High major version to indicate it's a rolling release - minor: 0, - patch: 0, - build: 0, - pre_release: Some(PreRelease { - kind: PreReleaseKind::Alpha, - number: Some(999), // High number to indicate it's a rolling release - }), - }; - } + let numeric_part = Self::numeric_prefix(version); - // Split version into numeric and pre-release parts - let (numeric_part, pre_release_part) = Self::split_version(version); - - // Parse numeric parts (major.minor.patch) let parts: Vec = numeric_part .split('.') .filter_map(|part| part.parse().ok()) .collect(); - let major = parts.first().copied().unwrap_or(0); - let minor = parts.get(1).copied().unwrap_or(0); - let patch = parts.get(2).copied().unwrap_or(0); - let build = parts.get(3).copied().unwrap_or(0); - - // Parse pre-release part - let pre_release = pre_release_part - .as_deref() - .and_then(Self::parse_pre_release); - VersionComponent { - major, - minor, - patch, - build, - pre_release, + major: parts.first().copied().unwrap_or(0), + minor: parts.get(1).copied().unwrap_or(0), + patch: parts.get(2).copied().unwrap_or(0), + build: parts.get(3).copied().unwrap_or(0), } } - fn split_version(version: &str) -> (String, Option) { + fn numeric_prefix(version: &str) -> String { let version = version.to_lowercase(); - - // Look for pre-release indicators for (i, ch) in version.char_indices() { if ch.is_alphabetic() && i > 0 { - // Check if this is a pre-release indicator - let remaining = &version[i..]; - if remaining.starts_with('a') - || remaining.starts_with('b') - || remaining.starts_with("alpha") - || remaining.starts_with("beta") - || remaining.starts_with("rc") - || remaining.starts_with("dev") - || remaining.starts_with("pre") - { - return (version[..i].to_string(), Some(remaining.to_string())); - } + return version[..i].to_string(); } } - - (version, None) - } - - fn parse_pre_release(pre_release: &str) -> Option { - let pre_release = pre_release.trim().to_lowercase(); - - if pre_release.is_empty() { - return None; - } - - // Extract kind and number - let (kind, number) = if let Some(stripped) = pre_release.strip_prefix("alpha") { - (PreReleaseKind::Alpha, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix("beta") { - (PreReleaseKind::Beta, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix("rc") { - (PreReleaseKind::RC, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix("dev") { - (PreReleaseKind::Dev, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix("pre") { - (PreReleaseKind::Pre, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix('a') { - (PreReleaseKind::Alpha, Self::extract_number(stripped)) - } else if let Some(stripped) = pre_release.strip_prefix('b') { - (PreReleaseKind::Beta, Self::extract_number(stripped)) - } else { - return None; - }; - - Some(PreRelease { kind, number }) - } - - fn extract_number(s: &str) -> Option { - let numeric_part: String = s.chars().filter(|c| c.is_ascii_digit()).collect(); - numeric_part.parse().ok() + version } } @@ -151,90 +55,23 @@ impl PartialOrd for VersionComponent { impl Ord for VersionComponent { fn cmp(&self, other: &Self) -> std::cmp::Ordering { - use std::cmp::Ordering; - - // Check for twilight versions - let self_is_twilight = self - .pre_release - .as_ref() - .map(|pr| pr.kind == PreReleaseKind::Alpha && pr.number == Some(999)) - .unwrap_or(false); - let other_is_twilight = other - .pre_release - .as_ref() - .map(|pr| pr.kind == PreReleaseKind::Alpha && pr.number == Some(999)) - .unwrap_or(false); - - // If one is twilight and the other isn't, twilight always has priority - if self_is_twilight && !other_is_twilight { - return Ordering::Greater; // twilight > non-twilight - } - if !self_is_twilight && other_is_twilight { - return Ordering::Less; // non-twilight < twilight - } - - // Both are twilight or both are not twilight - use normal comparison - match (self_is_twilight, other_is_twilight) { - (true, true) => { - // Both are twilight, compare by base version - return (self.major, self.minor, self.patch, self.build).cmp(&( - other.major, - other.minor, - other.patch, - other.build, - )); - } - (false, false) => { - // Neither is twilight, continue with normal comparison - } - _ => unreachable!(), // Already handled above - } - - // Compare major.minor.patch.build first - match (self.major, self.minor, self.patch, self.build).cmp(&( + (self.major, self.minor, self.patch, self.build).cmp(&( other.major, other.minor, other.patch, other.build, - )) { - Ordering::Equal => { - // If numeric parts are equal, compare pre-release - match (&self.pre_release, &other.pre_release) { - (None, None) => Ordering::Equal, - (None, Some(_)) => Ordering::Greater, // Stable > pre-release - (Some(_), None) => Ordering::Less, // Pre-release < stable - (Some(a), Some(b)) => { - // Compare pre-release kinds first - match a.kind.cmp(&b.kind) { - Ordering::Equal => { - // Same kind, compare numbers - match (&a.number, &b.number) { - (None, None) => Ordering::Equal, - (None, Some(_)) => Ordering::Less, - (Some(_), None) => Ordering::Greater, - (Some(a_num), Some(b_num)) => a_num.cmp(b_num), - } - } - other => other, - } - } - } - } - other => other, - } + )) } } -// Helper function to sort versions properly pub fn sort_versions(versions: &mut [String]) { versions.sort_by(|a, b| { let version_a = VersionComponent::parse(a); let version_b = VersionComponent::parse(b); - version_b.cmp(&version_a) // Descending order (newest first) + version_b.cmp(&version_a) }); } -// Helper function to compare two versions pub fn compare_versions(version1: &str, version2: &str) -> std::cmp::Ordering { let version_a = VersionComponent::parse(version1); let version_b = VersionComponent::parse(version2); @@ -242,116 +79,22 @@ pub fn compare_versions(version1: &str, version2: &str) -> std::cmp::Ordering { } pub fn is_version_newer(version1: &str, version2: &str) -> bool { - // Use the proper VersionComponent comparison from api_client.rs let version_a = VersionComponent::parse(version1); let version_b = VersionComponent::parse(version2); version_a > version_b } -// Helper function to sort GitHub releases -pub fn sort_github_releases(releases: &mut [GithubRelease]) { - releases.sort_by(|a, b| { - // Normalize tags like "v1.81.9" -> "1.81.9" for correct ordering - let tag_a = a.tag_name.trim_start_matches('v'); - let tag_b = b.tag_name.trim_start_matches('v'); - let version_a = VersionComponent::parse(tag_a); - let version_b = VersionComponent::parse(tag_b); - version_b.cmp(&version_a) // Descending order (newest first) - }); -} - -pub fn is_nightly_version(version: &str) -> bool { - let version_comp = VersionComponent::parse(version); - version_comp.pre_release.is_some() -} - -/// Centralized function to determine if a browser version/release is nightly/prerelease -/// This is the single source of truth for nightly detection across the entire codebase -pub fn is_browser_version_nightly( - browser: &str, - version: &str, - release_name: Option<&str>, -) -> bool { - match browser { - "zen" => { - // For Zen Browser, only "twilight" is considered nightly - version.to_lowercase() == "twilight" - } - "brave" => { - // For Brave Browser, only releases whose name starts with "Release" (case-insensitive) are stable. - if let Some(name) = release_name { - let normalized = name.trim_start().to_ascii_lowercase(); - return !normalized.starts_with("release"); - } - - // Fallback: try cached GitHub releases - if let Some(releases) = ApiClient::instance().get_cached_github_releases("brave") { - if let Some(found) = releases.iter().find(|r| r.tag_name == version) { - let normalized = found.name.trim_start().to_ascii_lowercase(); - return !normalized.starts_with("release"); - } - } - - // Last resort: when no name available, treat as nightly (non-Release) - true - } - "firefox-developer" => { - // For Firefox Developer Edition, always treat as nightly/prerelease - // This ensures consistent behavior regardless of cache state or API response parsing - true - } - "firefox" => { - // For Firefox, use the category from the API response to determine stability - // This will be handled in the API parsing, so this fallback is for cached versions - is_nightly_version(version) - } - "chromium" => { - // Chromium builds are generally stable snapshots - false - } - "camoufox" => { - // For Camoufox, beta versions are actually the stable releases - false - } - "wayfern" => { - // For Wayfern, all releases from version.json are stable - false - } - _ => { - // Default fallback - is_nightly_version(version) - } - } -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct FirefoxRelease { - pub build_number: u32, - pub category: String, - pub date: String, - pub description: Option, - pub is_security_driven: bool, - pub product: String, - pub version: String, -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct FirefoxApiResponse { - pub releases: HashMap, -} - #[derive(Debug, Serialize, Deserialize, Clone)] pub struct BrowserRelease { pub version: String, pub date: String, - pub is_prerelease: bool, } /// Wayfern version info from https://donutbrowser.com/wayfern.json #[derive(Debug, Serialize, Deserialize, Clone)] pub struct WayfernVersionInfo { pub version: String, - pub downloads: HashMap>, + pub downloads: std::collections::HashMap>, } #[derive(Debug, Serialize, Deserialize)] @@ -360,12 +103,6 @@ struct CachedVersionData { timestamp: u64, } -#[derive(Debug, Serialize, Deserialize)] -struct CachedGithubData { - releases: Vec, - timestamp: u64, -} - #[derive(Debug, Serialize, Deserialize)] struct CachedWayfernData { version_info: WayfernVersionInfo, @@ -374,10 +111,6 @@ struct CachedWayfernData { pub struct ApiClient { client: Client, - firefox_api_base: String, - firefox_dev_api_base: String, - github_api_base: String, - chromium_api_base: String, } impl ApiClient { @@ -387,95 +120,13 @@ impl ApiClient { .build() .unwrap_or_else(|_| Client::new()); - Self { - client, - firefox_api_base: "https://product-details.mozilla.org/1.0".to_string(), - firefox_dev_api_base: "https://product-details.mozilla.org/1.0".to_string(), - github_api_base: "https://api.github.com".to_string(), - chromium_api_base: "https://commondatastorage.googleapis.com/chromium-browser-snapshots" - .to_string(), - } - } - - async fn fetch_github_releases_multiple_pages( - &self, - base_releases_url: &str, - ) -> Result, Box> { - let mut all_releases: Vec = Vec::new(); - - // For now, only fetch 1 page - for page in 1..=1 { - let url = format!("{base_releases_url}?per_page=100&page={page}"); - let response = self - .client - .get(&url) - .header( - "User-Agent", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", - ) - .send() - .await?; - - if !response.status().is_success() { - // If the first page fails, propagate error; otherwise stop pagination - if page == 1 { - return Err( - format!( - "GitHub API returned status for page {}: {}", - page, - response.status() - ) - .into(), - ); - } else { - break; - } - } - - let text = response.text().await?; - let mut page_releases: Vec = serde_json::from_str(&text).map_err(|e| { - log::error!("Failed to parse GitHub API response (page {page}): {e}"); - log::error!( - "Response text (first 500 chars): {}", - if text.len() > 500 { - &text[..500] - } else { - &text - } - ); - format!("Failed to parse GitHub API response: {e}") - })?; - - if page_releases.is_empty() { - break; - } - - all_releases.append(&mut page_releases); - } - - Ok(all_releases) + Self { client } } pub fn instance() -> &'static ApiClient { &API_CLIENT } - #[cfg(test)] - pub fn new_with_base_urls( - firefox_api_base: String, - firefox_dev_api_base: String, - github_api_base: String, - chromium_api_base: String, - ) -> Self { - Self { - client: Client::new(), - firefox_api_base, - firefox_dev_api_base, - github_api_base, - chromium_api_base, - } - } - fn get_cache_dir() -> Result> { let cache_dir = crate::app_dirs::cache_dir().join("version_cache"); fs::create_dir_all(&cache_dir)?; @@ -491,7 +142,7 @@ impl ApiClient { fn is_cache_valid(timestamp: u64) -> bool { let current_time = Self::get_current_timestamp(); - let cache_duration = 10 * 60; // 10 minutes in seconds + let cache_duration = 10 * 60; current_time - timestamp < cache_duration } @@ -505,18 +156,15 @@ impl ApiClient { let content = fs::read_to_string(&cache_file).ok()?; if let Ok(cached) = serde_json::from_str::(&content) { - // Always return cached releases regardless of age - they're always valid log::info!("Using cached versions for {browser}"); return Some(cached.releases); } - // Backward compatibility: legacy caches stored just an array of version strings if let Ok(legacy_versions) = serde_json::from_str::>(&content) { log::info!("Using legacy cached versions for {browser}; upgrading in-memory"); let releases: Vec = legacy_versions .into_iter() .map(|version| BrowserRelease { - is_prerelease: is_browser_version_nightly(browser, &version, None), version, date: "".to_string(), }) @@ -530,25 +178,24 @@ impl ApiClient { pub fn is_cache_expired(&self, browser: &str) -> bool { let cache_dir = match Self::get_cache_dir() { Ok(dir) => dir, - Err(_) => return true, // If we can't get cache dir, consider expired + Err(_) => return true, }; let cache_file = cache_dir.join(format!("{browser}_versions.json")); if !cache_file.exists() { - return true; // No cache file means expired + return true; } let content = match fs::read_to_string(&cache_file) { Ok(content) => content, - Err(_) => return true, // Can't read cache, consider expired + Err(_) => return true, }; let cached_data: CachedVersionData = match serde_json::from_str(&content) { Ok(data) => data, - Err(_) => return true, // Can't parse cache, consider expired + Err(_) => return true, }; - // Check if cache is older than 10 minutes !Self::is_cache_valid(cached_data.timestamp) } @@ -571,524 +218,6 @@ impl ApiClient { Ok(()) } - fn load_cached_github_releases(&self, browser: &str) -> Option> { - let cache_dir = Self::get_cache_dir().ok()?; - let cache_file = cache_dir.join(format!("{browser}_github.json")); - - if !cache_file.exists() { - return None; - } - - let content = fs::read_to_string(&cache_file).ok()?; - let cached_data: CachedGithubData = serde_json::from_str(&content).ok()?; - - // Always use cached GitHub releases - cache never expires, only gets updated with new versions - Some(cached_data.releases) - } - - /// Public accessor for cached GitHub releases (used by other modules for classification) - pub fn get_cached_github_releases(&self, browser: &str) -> Option> { - self.load_cached_github_releases(browser) - } - - fn save_cached_github_releases( - &self, - browser: &str, - releases: &[GithubRelease], - ) -> Result<(), Box> { - let cache_dir = Self::get_cache_dir()?; - let cache_file = cache_dir.join(format!("{browser}_github.json")); - - let cached_data = CachedGithubData { - releases: releases.to_vec(), - timestamp: Self::get_current_timestamp(), - }; - - let content = serde_json::to_string_pretty(&cached_data)?; - fs::write(&cache_file, content)?; - log::info!("Cached {} GitHub releases for {}", releases.len(), browser); - Ok(()) - } - - pub async fn fetch_firefox_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_versions("firefox") { - return Ok(cached_releases); - } - } - - log::info!("Fetching Firefox releases from Mozilla API..."); - let url = format!("{}/firefox.json", self.firefox_api_base); - - let response = self - .client - .get(url) - .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36") - .send() - .await?; - - if !response.status().is_success() { - return Err(format!("Failed to fetch Firefox versions: {}", response.status()).into()); - } - - let firefox_response: FirefoxApiResponse = response.json().await?; - - // Extract releases and filter for stable versions - let mut releases: Vec = firefox_response - .releases - .into_iter() - .filter_map(|(key, release)| { - // Only include releases that start with "firefox-" and have proper version format - if key.starts_with("firefox-") && !release.version.is_empty() { - let is_stable = matches!(release.category.as_str(), "major" | "stability"); - Some(BrowserRelease { - version: release.version.clone(), - date: release.date, - is_prerelease: !is_stable, - }) - } else { - None - } - }) - .collect(); - - // Sort by version number in descending order (newest first) - releases.sort_by(|a, b| { - let version_a = VersionComponent::parse(&a.version); - let version_b = VersionComponent::parse(&b.version); - version_b.cmp(&version_a) - }); - - // Cache the results (unless bypassing cache) - if !no_caching { - if let Err(e) = self.save_cached_versions("firefox", &releases) { - log::error!("Failed to cache Firefox versions: {e}"); - } - } - - Ok(releases) - } - - pub async fn fetch_firefox_developer_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_versions("firefox-developer") { - return Ok(cached_releases); - } - } - - log::info!("Fetching Firefox Developer Edition releases from Mozilla API..."); - let url = format!("{}/devedition.json", self.firefox_dev_api_base); - - let response = self - .client - .get(&url) - .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36") - .send() - .await?; - - if !response.status().is_success() { - let error_msg = format!( - "Failed to fetch Firefox Developer Edition versions: {} - URL: {}", - response.status(), - url - ); - log::error!("{error_msg}"); - return Err(error_msg.into()); - } - - let firefox_response: FirefoxApiResponse = response.json().await?; - - // Extract releases and filter for developer edition versions - let mut releases: Vec = firefox_response - .releases - .into_iter() - .filter_map(|(key, release)| { - // Only include releases that start with "devedition-" and have proper version format - if key.starts_with("devedition-") && !release.version.is_empty() { - let is_stable = matches!(release.category.as_str(), "major" | "stability"); - Some(BrowserRelease { - version: release.version.clone(), - date: release.date, - is_prerelease: !is_stable, - }) - } else { - None - } - }) - .collect(); - - // Sort by version number in descending order (newest first) - releases.sort_by(|a, b| { - let version_a = VersionComponent::parse(&a.version); - let version_b = VersionComponent::parse(&b.version); - version_b.cmp(&version_a) - }); - - // Cache the results (unless bypassing cache) - if !no_caching { - if let Err(e) = self.save_cached_versions("firefox-developer", &releases) { - log::error!("Failed to cache Firefox Developer versions: {e}"); - } - } - - Ok(releases) - } - - pub async fn fetch_zen_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_github_releases("zen") { - return Ok(cached_releases); - } - } - - log::info!("Fetching Zen releases from GitHub API"); - let base_url = format!( - "{}/repos/zen-browser/desktop/releases", - self.github_api_base - ); - let mut releases: Vec = - self.fetch_github_releases_multiple_pages(&base_url).await?; - - // Check for twilight updates and mark alpha releases - for release in &mut releases { - // Use browser-specific alpha detection for Zen Browser - only "twilight" is nightly - release.is_nightly = - is_browser_version_nightly("zen", &release.tag_name, Some(&release.name)); - - // Check for twilight update if this is a twilight release - if release.tag_name.to_lowercase() == "twilight" { - if let Ok(has_update) = self.check_twilight_update(release).await { - if has_update { - log::info!( - "Detected update for Zen twilight release: {}", - release.tag_name - ); - } - } - } - } - - // Sort releases using the new version sorting system - sort_github_releases(&mut releases); - - // Cache the results (unless bypassing cache) - if !no_caching { - if let Err(e) = self.save_cached_github_releases("zen", &releases) { - log::error!("Failed to cache Zen releases: {e}"); - } - } - - Ok(releases) - } - - pub async fn fetch_brave_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_github_releases("brave") { - return Ok(cached_releases); - } - } - - log::info!("Fetching Brave releases from GitHub API"); - let base_url = format!( - "{}/repos/brave/brave-browser/releases", - self.github_api_base - ); - let releases: Vec = self.fetch_github_releases_multiple_pages(&base_url).await?; - - // Get platform info to filter appropriate releases - let (os, _) = Self::get_platform_info(); - - // Filter releases that have assets compatible with the current platform - let mut filtered_releases: Vec = releases - .into_iter() - .filter_map(|mut release| { - // Check if this release has compatible assets for the current platform - let has_compatible_asset = Self::has_compatible_brave_asset(&release.assets, &os); - - if has_compatible_asset { - // Use the centralized nightly detection function - release.is_nightly = - is_browser_version_nightly("brave", &release.tag_name, Some(&release.name)); - Some(release) - } else { - None - } - }) - .collect(); - - // Sort releases using the new version sorting system - sort_github_releases(&mut filtered_releases); - - if let Err(e) = self.save_cached_github_releases("brave", &filtered_releases) { - log::error!("Failed to cache Brave releases: {e}"); - } - - Ok(filtered_releases) - } - - /// Check if a Camoufox release has compatible assets for the given platform and architecture - fn has_compatible_camoufox_asset( - &self, - assets: &[crate::browser::GithubAsset], - os: &str, - arch: &str, - ) -> bool { - let (os_name, arch_name) = match (os, arch) { - ("windows", "x64") => ("win", "x86_64"), - ("windows", "arm64") => ("win", "arm64"), - ("linux", "x64") => ("lin", "x86_64"), - ("linux", "arm64") => ("lin", "arm64"), - ("macos", "x64") => ("mac", "x86_64"), - ("macos", "arm64") => ("mac", "arm64"), - _ => return false, - }; - - // Look for assets matching the pattern: camoufox-{version}-beta.{number}-{os}.{arch}.zip - // The separator before OS is a dash, e.g., camoufox-135.0.1-beta.24-lin.x86_64.zip - let pattern = format!("-{os_name}.{arch_name}.zip"); - assets.iter().any(|asset| { - let name = asset.name.to_lowercase(); - name.starts_with("camoufox-") && name.ends_with(&pattern) - }) - } - - fn has_compatible_brave_asset(assets: &[crate::browser::GithubAsset], os: &str) -> bool { - match os { - "windows" => { - // For Windows, look for standalone setup EXE (not the auto-updater one) - assets.iter().any(|asset| { - let name = asset.name.to_lowercase(); - name.contains("standalone") && name.ends_with(".exe") && !name.contains("silent") - }) || assets.iter().any(|asset| asset.name.ends_with(".exe")) - } - "macos" => { - // For macOS, prefer universal DMG - assets.iter().any(|asset| { - let name = asset.name.to_lowercase(); - name.contains("universal") && name.ends_with(".dmg") - }) || assets.iter().any(|asset| asset.name.ends_with(".dmg")) - } - "linux" => { - if assets.iter().any(|asset| { - let name = asset.name.to_lowercase(); - name.contains("lin") - }) { - return true; - } - - false - } - _ => false, - } - } - - /// Get platform and architecture information - fn get_platform_info() -> (String, String) { - let os = if cfg!(target_os = "windows") { - "windows" - } else if cfg!(target_os = "linux") { - "linux" - } else if cfg!(target_os = "macos") { - "macos" - } else { - "unknown" - }; - - let arch = if cfg!(target_arch = "x86_64") { - "x64" - } else if cfg!(target_arch = "aarch64") { - "arm64" - } else { - "unknown" - }; - - (os.to_string(), arch.to_string()) - } - - pub async fn fetch_chromium_latest_version( - &self, - ) -> Result> { - // Use platform-aware URL for Chromium to match download URL generation - let (os, arch) = Self::get_platform_info(); - let platform_str = match (&os[..], &arch[..]) { - ("windows", "x64") => "Win_x64", - ("windows", "arm64") => "Win_Arm64", - ("linux", "x64") => "Linux_x64", - ("linux", "arm64") => return Err("Chromium doesn't support ARM64 on Linux".into()), - ("macos", "x64") => "Mac", - ("macos", "arm64") => "Mac_Arm", - _ => { - return Err(format!("Unsupported platform/architecture for Chromium: {os}/{arch}").into()) - } - }; - let url = format!("{}/{platform_str}/LAST_CHANGE", self.chromium_api_base); - let version = self - .client - .get(&url) - .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36") - .send() - .await? - .text() - .await? - .trim() - .to_string(); - - Ok(version) - } - - pub async fn fetch_chromium_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_versions("chromium") { - return Ok(cached_releases); - } - } - - log::info!("Fetching Chromium releases..."); - - // Get the latest version first - let latest_version = self.fetch_chromium_latest_version().await?; - let latest_num: u32 = latest_version.parse().unwrap_or(0); - - // Generate a list of recent versions (last 20 builds, going back by 1000 each time) - let mut versions = Vec::new(); - for i in 0..20 { - let version_num = latest_num.saturating_sub(i * 1000); - if version_num > 0 { - versions.push(version_num.to_string()); - } - } - - // Convert to BrowserRelease objects - let releases: Vec = versions - .into_iter() - .map(|version| BrowserRelease { - version: version.clone(), - date: "".to_string(), - is_prerelease: false, - }) - .collect(); - - // Cache the results (unless bypassing cache) - if !no_caching { - if let Err(e) = self.save_cached_versions("chromium", &releases) { - log::error!("Failed to cache Chromium versions: {e}"); - } - } - - Ok(releases) - } - - pub async fn fetch_camoufox_releases_with_caching( - &self, - no_caching: bool, - ) -> Result, Box> { - // Check cache first (unless bypassing) - if !no_caching { - if let Some(cached_releases) = self.load_cached_github_releases("camoufox") { - log::info!( - "Using cached Camoufox releases, count: {}", - cached_releases.len() - ); - return Ok(cached_releases); - } - } - - log::info!("Fetching Camoufox releases from GitHub API"); - let base_url = format!("{}/repos/daijro/camoufox/releases", self.github_api_base); - let releases: Vec = self.fetch_github_releases_multiple_pages(&base_url).await?; - - log::info!( - "Fetched {} total Camoufox releases from GitHub", - releases.len() - ); - - // Get platform info to filter appropriate releases - let (os, arch) = Self::get_platform_info(); - log::info!("Filtering for platform: {os}/{arch}"); - - // Filter releases that have assets compatible with the current platform - let mut compatible_releases: Vec = releases - .into_iter() - .enumerate() - .filter_map(|(i, release)| { - let has_compatible = self.has_compatible_camoufox_asset(&release.assets, &os, &arch); - if !has_compatible { - log::info!( - "Release {} ({}) has no compatible assets for {}/{}", - i, - release.tag_name, - os, - arch - ); - log::info!( - " Available assets: {:?}", - release.assets.iter().map(|a| &a.name).collect::>() - ); - } - if has_compatible { - Some(release) - } else { - None - } - }) - .collect(); - - log::info!( - "After platform filtering: {} compatible releases", - compatible_releases.len() - ); - - // Sort by version (latest first) with debugging - log::info!( - "Before sorting: {:?}", - compatible_releases - .iter() - .map(|r| &r.tag_name) - .take(10) - .collect::>() - ); - sort_github_releases(&mut compatible_releases); - log::info!( - "After sorting: {:?}", - compatible_releases - .iter() - .map(|r| &r.tag_name) - .take(10) - .collect::>() - ); - - // Cache the results (unless bypassing cache) - if !no_caching { - if let Err(e) = self.save_cached_github_releases("camoufox", &compatible_releases) { - log::error!("Failed to cache Camoufox releases: {e}"); - } else { - log::info!("Cached {} Camoufox releases", compatible_releases.len()); - } - } - - Ok(compatible_releases) - } - fn load_cached_wayfern_version(&self) -> Option { let cache_dir = Self::get_cache_dir().ok()?; let cache_file = cache_dir.join("wayfern_version.json"); @@ -1100,7 +229,6 @@ impl ApiClient { let content = fs::read_to_string(&cache_file).ok()?; let cached_data: CachedWayfernData = serde_json::from_str(&content).ok()?; - // Always use cached Wayfern version - cache never expires, only gets updated Some(cached_data.version_info) } @@ -1127,7 +255,6 @@ impl ApiClient { &self, no_caching: bool, ) -> Result> { - // Check cache first (unless bypassing) if !no_caching { if let Some(cached_version) = self.load_cached_wayfern_version() { log::info!("Using cached Wayfern version: {}", cached_version.version); @@ -1181,7 +308,6 @@ impl ApiClient { })?; log::info!("Fetched Wayfern version: {}", version_info.version); - // Cache the results (unless bypassing cache) if !no_caching { if let Err(e) = self.save_cached_wayfern_version(&version_info) { log::error!("Failed to cache Wayfern version: {e}"); @@ -1207,68 +333,32 @@ impl ApiClient { self.get_wayfern_download_url(version_info).is_some() } - /// Check if a Zen twilight release has been updated by comparing file size - pub async fn check_twilight_update( - &self, - release: &GithubRelease, - ) -> Result> { - if release.tag_name.to_lowercase() != "twilight" { - return Ok(false); // Not a twilight release - } - - // Find the macOS universal DMG asset - let asset = release - .assets - .iter() - .find(|asset| asset.name == "zen.macos-universal.dmg") - .ok_or("No macOS universal asset found for twilight release")?; - - // Check if we have cached file size information - let cache_dir = Self::get_cache_dir()?; - let twilight_cache_file = cache_dir.join("zen_twilight_info.json"); - - #[derive(serde::Serialize, serde::Deserialize)] - struct TwilightInfo { - file_size: u64, - last_updated: u64, - } - - let current_info = TwilightInfo { - file_size: asset.size, - last_updated: Self::get_current_timestamp(), + fn get_platform_info() -> (String, String) { + let os = if cfg!(target_os = "windows") { + "windows" + } else if cfg!(target_os = "linux") { + "linux" + } else if cfg!(target_os = "macos") { + "macos" + } else { + "unknown" }; - if !twilight_cache_file.exists() { - // No cache exists, save current info and return true (new) - let content = serde_json::to_string_pretty(¤t_info)?; - fs::write(&twilight_cache_file, content)?; - return Ok(true); - } + let arch = if cfg!(target_arch = "x86_64") { + "x64" + } else if cfg!(target_arch = "aarch64") { + "arm64" + } else { + "unknown" + }; - let cached_content = fs::read_to_string(&twilight_cache_file)?; - let cached_info: TwilightInfo = serde_json::from_str(&cached_content)?; - - // Check if file size has changed - if cached_info.file_size != current_info.file_size { - // File size changed, update cache and return true - let content = serde_json::to_string_pretty(¤t_info)?; - fs::write(&twilight_cache_file, content)?; - log::info!( - "Zen twilight release updated: file size changed from {} to {}", - cached_info.file_size, - current_info.file_size - ); - return Ok(true); - } - - Ok(false) // No update detected + (os.to_string(), arch.to_string()) } pub fn clear_all_cache(&self) -> Result<(), Box> { let cache_dir = Self::get_cache_dir()?; if cache_dir.exists() { - // Remove all cache files for entry in fs::read_dir(&cache_dir)? { let entry = entry?; let path = entry.path(); @@ -1284,7 +374,6 @@ impl ApiClient { } } -// Global singleton instance lazy_static::lazy_static! { static ref API_CLIENT: ApiClient = ApiClient::new(); } @@ -1292,585 +381,47 @@ lazy_static::lazy_static! { #[cfg(test)] mod tests { use super::*; - use wiremock::matchers::{method, path, query_param}; - use wiremock::{Mock, MockServer, ResponseTemplate}; - - async fn setup_mock_server() -> MockServer { - MockServer::start().await - } - - fn create_test_client(server: &MockServer) -> ApiClient { - let base_url = server.uri(); - ApiClient::new_with_base_urls( - base_url.clone(), // firefox_api_base - base_url.clone(), // firefox_dev_api_base - base_url.clone(), // github_api_base - base_url.clone(), // chromium_api_base - ) - } #[test] fn test_version_parsing() { - // Test basic version parsing let v1 = VersionComponent::parse("1.2.3"); assert_eq!(v1.major, 1); assert_eq!(v1.minor, 2); assert_eq!(v1.patch, 3); - assert!(v1.pre_release.is_none()); - // Test alpha version - let v2 = VersionComponent::parse("1.2.3a1"); - assert_eq!(v2.major, 1); - assert_eq!(v2.minor, 2); - assert_eq!(v2.patch, 3); - assert!(v2.pre_release.is_some()); - let pre = v2.pre_release.unwrap(); - assert_eq!(pre.kind, PreReleaseKind::Alpha); - assert_eq!(pre.number, Some(1)); + let v2 = VersionComponent::parse("138.0.7204.50"); + assert_eq!(v2.major, 138); + assert_eq!(v2.minor, 0); + assert_eq!(v2.patch, 7204); + assert_eq!(v2.build, 50); - // Test beta version let v3 = VersionComponent::parse("137.0b5"); assert_eq!(v3.major, 137); assert_eq!(v3.minor, 0); assert_eq!(v3.patch, 0); - assert!(v3.pre_release.is_some()); - let pre = v3.pre_release.unwrap(); - assert_eq!(pre.kind, PreReleaseKind::Beta); - assert_eq!(pre.number, Some(5)); - - // Test twilight version (Zen Browser) - let v4 = VersionComponent::parse("twilight"); - assert_eq!(v4.major, 999); - assert_eq!(v4.minor, 0); - assert_eq!(v4.patch, 0); - assert!(v4.pre_release.is_some()); - let pre = v4.pre_release.unwrap(); - assert_eq!(pre.kind, PreReleaseKind::Alpha); - assert_eq!(pre.number, Some(999)); } #[test] fn test_version_comparison() { - // Test basic version comparison - let v1 = VersionComponent::parse("1.2.3"); - let v2 = VersionComponent::parse("1.2.4"); - assert!(v2 > v1); - - // Test major version difference - let v3 = VersionComponent::parse("2.0.0"); - let v4 = VersionComponent::parse("1.9.9"); - assert!(v3 > v4); - - // Test stable vs pre-release - let v5 = VersionComponent::parse("1.2.3"); - let v6 = VersionComponent::parse("1.2.3b1"); - assert!(v5 > v6); // Stable > beta - - // Test different pre-release types - let v7 = VersionComponent::parse("1.2.3a1"); - let v8 = VersionComponent::parse("1.2.3b1"); - assert!(v8 > v7); // Beta > alpha - - // Test pre-release numbers - let v9 = VersionComponent::parse("137.0b4"); - let v10 = VersionComponent::parse("137.0b5"); - assert!(v10 > v9); // b5 > b4 - - // Test twilight version (should have highest priority) - let v11 = VersionComponent::parse("twilight"); - let v12 = VersionComponent::parse("1.0.0"); - assert!(v11 > v12); // twilight > stable due to high major version - - // Test twilight vs other pre-releases - let v13 = VersionComponent::parse("twilight"); - let v14 = VersionComponent::parse("1.0.0a1"); - assert!(v13 > v14); // twilight > a1 due to high major version + assert!(VersionComponent::parse("1.2.4") > VersionComponent::parse("1.2.3")); + assert!(VersionComponent::parse("2.0.0") > VersionComponent::parse("1.9.9")); + assert!(VersionComponent::parse("138.0.7204.50") > VersionComponent::parse("138.0.7204.49")); } #[test] fn test_version_sorting() { let mut versions = vec![ - "1.9.9b".to_string(), - "1.12.6b".to_string(), - "1.10.0".to_string(), - "137.0b4".to_string(), - "137.0b5".to_string(), - "137.0".to_string(), - "twilight".to_string(), - "2.0.0a1".to_string(), + "138.0.7204.50".to_string(), + "138.0.7204.49".to_string(), + "139.0.7204.1".to_string(), + "137.0.7204.99".to_string(), ]; sort_versions(&mut versions); - // Expected order with twilight priority: twilight first due to high major version (999), then normal semantic versioning - assert_eq!(versions[0], "twilight"); - assert_eq!(versions[1], "137.0"); - assert_eq!(versions[2], "137.0b5"); - assert_eq!(versions[3], "137.0b4"); - assert_eq!(versions[4], "2.0.0a1"); - assert_eq!(versions[5], "1.12.6b"); - assert_eq!(versions[6], "1.10.0"); - assert_eq!(versions[7], "1.9.9b"); - } - - #[test] - fn test_sort_versions_comprehensive() { - let mut versions = vec![ - "1.0.0".to_string(), - "1.0.1".to_string(), - "1.1.0".to_string(), - "2.0.0a1".to_string(), - "2.0.0b1".to_string(), - "2.0.0rc1".to_string(), - "2.0.0".to_string(), - "10.0.0".to_string(), - "twilight".to_string(), - ]; - - sort_versions(&mut versions); - - // Expected order with twilight priority: twilight first due to high major version (999), then normal semantic versioning - assert_eq!(versions[0], "twilight"); - assert_eq!(versions[1], "10.0.0"); - assert_eq!(versions[2], "2.0.0"); - assert_eq!(versions[3], "2.0.0rc1"); - assert_eq!(versions[4], "2.0.0b1"); - assert_eq!(versions[5], "2.0.0a1"); - } - - #[tokio::test] - async fn test_firefox_api() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let mock_response = r#"{ - "releases": { - "firefox-139.0": { - "build_number": 1, - "category": "major", - "date": "2024-01-15", - "description": "Firefox 139.0 Release", - "is_security_driven": false, - "product": "firefox", - "version": "139.0" - }, - "firefox-138.0": { - "build_number": 1, - "category": "major", - "date": "2024-01-01", - "description": "Firefox 138.0 Release", - "is_security_driven": false, - "product": "firefox", - "version": "138.0" - } - } - }"#; - - Mock::given(method("GET")) - .and(path("/firefox.json")) - .respond_with( - ResponseTemplate::new(200) - .set_body_string(mock_response) - .insert_header("content-type", "application/json"), - ) - .mount(&server) - .await; - - let result = client.fetch_firefox_releases_with_caching(true).await; - - if let Err(e) = &result { - log::info!("Firefox API test error: {e}"); - } - assert!(result.is_ok()); - let releases = result.unwrap(); - assert!(!releases.is_empty()); - assert_eq!(releases[0].version, "139.0"); - } - - #[tokio::test] - async fn test_firefox_developer_api() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let mock_response = r#"{ - "releases": { - "devedition-140.0b1": { - "build_number": 1, - "category": "major", - "date": "2024-01-20", - "description": "Firefox Developer Edition 140.0b1", - "is_security_driven": false, - "product": "devedition", - "version": "140.0b1" - } - } - }"#; - - Mock::given(method("GET")) - .and(path("/devedition.json")) - .respond_with( - ResponseTemplate::new(200) - .set_body_string(mock_response) - .insert_header("content-type", "application/json"), - ) - .mount(&server) - .await; - - let result = client - .fetch_firefox_developer_releases_with_caching(true) - .await; - - if let Err(e) = &result { - log::info!("Firefox Developer API test error: {e}"); - } - assert!(result.is_ok()); - let releases = result.unwrap(); - assert!(!releases.is_empty()); - assert_eq!(releases[0].version, "140.0b1"); - } - - #[tokio::test] - async fn test_zen_api() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let mock_response = r#"[ - { - "tag_name": "twilight", - "name": "Zen Browser Twilight", - "prerelease": false, - "published_at": "2024-01-15T10:00:00Z", - "assets": [ - { - "name": "zen.macos-universal.dmg", - "browser_download_url": "https://example.com/zen-twilight.dmg", - "size": 120000000 - } - ] - } - ]"#; - - Mock::given(method("GET")) - .and(path("/repos/zen-browser/desktop/releases")) - .and(query_param("per_page", "100")) - .respond_with( - ResponseTemplate::new(200) - .set_body_string(mock_response) - .insert_header("content-type", "application/json"), - ) - .mount(&server) - .await; - - let result = client.fetch_zen_releases_with_caching(true).await; - - assert!(result.is_ok()); - let releases = result.unwrap(); - assert!(!releases.is_empty()); - assert_eq!(releases[0].tag_name, "twilight"); - } - - #[tokio::test] - async fn test_brave_api() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let mock_response = r#"[ - { - "tag_name": "v1.81.9", - "name": "Release v1.81.9 (Chromium 137.0.7151.104)", - "prerelease": false, - "published_at": "2024-01-15T10:00:00Z", - "draft": false, - "assets": [ - { - "name": "brave-v1.81.9-universal.dmg", - "browser_download_url": "https://example.com/brave-1.81.9-universal.dmg", - "size": 200000000 - }, - { - "name": "brave-browser-1.81.9-linux-amd64.zip", - "browser_download_url": "https://example.com/brave-1.81.9-linux-amd64.zip", - "size": 180000000 - }, - { - "name": "BraveBrowserStandaloneSetup.exe", - "browser_download_url": "https://example.com/brave-1.81.9-setup.exe", - "size": 150000000 - } - ] - } - ]"#; - - Mock::given(method("GET")) - .and(path("/repos/brave/brave-browser/releases")) - .and(query_param("per_page", "100")) - .respond_with( - ResponseTemplate::new(200) - .set_body_string(mock_response) - .insert_header("content-type", "application/json"), - ) - .mount(&server) - .await; - - let result = client.fetch_brave_releases_with_caching(true).await; - - if let Err(e) = &result { - log::info!("Brave API test error: {e}"); - } - assert!(result.is_ok()); - let releases = result.unwrap(); - assert!(!releases.is_empty()); - assert_eq!(releases[0].tag_name, "v1.81.9"); - assert!(!releases[0].is_nightly); // "Release v1.81.9 (Chromium 137.0.7151.104)" starts with "Release" so it should be stable - } - - #[tokio::test] - async fn test_chromium_api() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let (os, arch) = ApiClient::get_platform_info(); - let platform_str = match (&os[..], &arch[..]) { - ("windows", "x64") => "Win_x64", - ("windows", "arm64") => "Win_Arm64", - ("linux", "x64") => "Linux_x64", - ("linux", "arm64") => return, - ("macos", "x64") => "Mac", - ("macos", "arm64") => "Mac_Arm", - _ => return, - }; - - Mock::given(method("GET")) - .and(path(format!("/{platform_str}/LAST_CHANGE"))) - .respond_with( - ResponseTemplate::new(200) - .set_body_string("1465660") - .insert_header("content-type", "text/plain"), - ) - .mount(&server) - .await; - - let result = client.fetch_chromium_latest_version().await; - - assert!(result.is_ok()); - let version = result.unwrap(); - assert_eq!(version, "1465660"); - } - - #[tokio::test] - async fn test_chromium_releases_with_caching() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - let (os, arch) = ApiClient::get_platform_info(); - let platform_str = match (&os[..], &arch[..]) { - ("windows", "x64") => "Win_x64", - ("windows", "arm64") => "Win_Arm64", - ("linux", "x64") => "Linux_x64", - ("linux", "arm64") => return, - ("macos", "x64") => "Mac", - ("macos", "arm64") => "Mac_Arm", - _ => return, - }; - - Mock::given(method("GET")) - .and(path(format!("/{platform_str}/LAST_CHANGE"))) - .respond_with( - ResponseTemplate::new(200) - .set_body_string("1465660") - .insert_header("content-type", "text/plain"), - ) - .mount(&server) - .await; - - let result = client.fetch_chromium_releases_with_caching(true).await; - - assert!(result.is_ok()); - let releases = result.unwrap(); - assert!(!releases.is_empty()); - assert_eq!(releases[0].version, "1465660"); - assert!(!releases[0].is_prerelease); - } - - #[test] - fn test_is_nightly_version() { - assert!(is_nightly_version("1.2.3a1")); - assert!(is_nightly_version("137.0b5")); - assert!(is_nightly_version("140.0rc1")); - assert!(!is_nightly_version("139.0")); - assert!(!is_nightly_version("1.2.3")); - } - - #[test] - fn test_is_zen_nightly_version() { - // Only "twilight" should be considered nightly for Zen Browser - assert!(is_browser_version_nightly("zen", "twilight", None)); - assert!(is_browser_version_nightly("zen", "TWILIGHT", None)); // Case insensitive - - // Versions with "b" should NOT be considered nightly for Zen Browser - assert!(!is_browser_version_nightly("zen", "1.12.8b", None)); - assert!(!is_browser_version_nightly("zen", "1.0.0b1", None)); - assert!(!is_browser_version_nightly("zen", "2.0.0", None)); - } - - #[tokio::test] - async fn test_error_handling_404() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - Mock::given(method("GET")) - .and(path("/firefox.json")) - .respond_with(ResponseTemplate::new(404)) - .mount(&server) - .await; - - let result = client.fetch_firefox_releases_with_caching(true).await; - assert!(result.is_err()); - } - - #[tokio::test] - async fn test_error_handling_invalid_json() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - Mock::given(method("GET")) - .and(path("/firefox.json")) - .respond_with( - ResponseTemplate::new(200) - .set_body_string("invalid json") - .insert_header("content-type", "application/json"), - ) - .mount(&server) - .await; - - let result = client.fetch_firefox_releases_with_caching(true).await; - assert!(result.is_err()); - } - - #[tokio::test] - async fn test_github_api_rate_limit() { - let server = setup_mock_server().await; - let client = create_test_client(&server); - - Mock::given(method("GET")) - .and(path("/repos/zen-browser/desktop/releases")) - .and(query_param("per_page", "100")) - .respond_with(ResponseTemplate::new(429).insert_header("retry-after", "60")) - .mount(&server) - .await; - - let result = client.fetch_zen_releases_with_caching(true).await; - assert!(result.is_err()); - } - - #[test] - fn test_camoufox_beta_version_parsing() { - // Test specific Camoufox beta versions that are causing issues - let v22 = VersionComponent::parse("135.0.5beta22"); - let v24 = VersionComponent::parse("135.0.5beta24"); - - log::info!("v22: {v22:?}"); - log::info!("v24: {v24:?}"); - - // v24 should be greater than v22 - assert!( - v24 > v22, - "135.0.5beta24 should be greater than 135.0.5beta22" - ); - - // Test other beta version combinations - let v1 = VersionComponent::parse("135.0.5beta1"); - let v2 = VersionComponent::parse("135.0.5beta2"); - assert!(v2 > v1, "135.0.5beta2 should be greater than 135.0.5beta1"); - - // Test sorting of multiple versions - let mut versions = vec![ - "135.0.5beta22".to_string(), - "135.0.5beta24".to_string(), - "135.0.5beta23".to_string(), - "135.0.5beta21".to_string(), - ]; - - sort_versions(&mut versions); - - log::info!("Sorted versions: {versions:?}"); - - // Should be sorted from newest to oldest - assert_eq!(versions[0], "135.0.5beta24"); - assert_eq!(versions[1], "135.0.5beta23"); - assert_eq!(versions[2], "135.0.5beta22"); - assert_eq!(versions[3], "135.0.5beta21"); - } - - #[test] - fn test_camoufox_user_reported_versions() { - // Test the exact versions reported by the user: 135.0.1beta24 vs 135.0beta22 - let v22 = VersionComponent::parse("135.0beta22"); - let v24 = VersionComponent::parse("135.0.1beta24"); - - log::info!("User reported v22: {v22:?}"); - log::info!("User reported v24: {v24:?}"); - - // 135.0.1beta24 should be greater than 135.0beta22 (newer patch version) - assert!( - v24 > v22, - "135.0.1beta24 should be greater than 135.0beta22, but got: v24={v24:?} vs v22={v22:?}" - ); - - // Test sorting of the exact user-reported versions - let mut versions = vec!["135.0beta22".to_string(), "135.0.1beta24".to_string()]; - - sort_versions(&mut versions); - - log::info!("User reported sorted versions: {versions:?}"); - - // Should be sorted from newest to oldest - assert_eq!( - versions[0], "135.0.1beta24", - "135.0.1beta24 should be first (newest)" - ); - assert_eq!( - versions[1], "135.0beta22", - "135.0beta22 should be second (older)" - ); - } - - #[test] - fn test_camoufox_version_classification() { - // Test that Camoufox beta versions are now correctly classified as stable (not nightly) - assert!( - !is_browser_version_nightly("camoufox", "135.0beta22", None), - "135.0beta22 should be classified as stable for Camoufox" - ); - assert!( - !is_browser_version_nightly("camoufox", "135.0.1beta24", None), - "135.0.1beta24 should be classified as stable for Camoufox" - ); - - // Test with release names too - beta releases should be stable - assert!( - !is_browser_version_nightly("camoufox", "135.0beta22", Some("Release Beta 22")), - "Release with 'Beta' in name should be classified as stable for Camoufox" - ); - - // Test that stable versions are not classified as nightly - assert!( - !is_browser_version_nightly("camoufox", "135.0", None), - "135.0 should be classified as stable" - ); - assert!( - !is_browser_version_nightly("camoufox", "135.0.1", None), - "135.0.1 should be classified as stable" - ); - - // Test alpha and RC versions are still considered nightly - assert!( - !is_browser_version_nightly("camoufox", "136.0alpha1", None), - "136.0alpha1 should not be classified as nightly/prerelease" - ); - assert!( - !is_browser_version_nightly("camoufox", "136.0rc1", None), - "136.0rc1 should not be classified as nightly/prerelease" - ); + assert_eq!(versions[0], "139.0.7204.1"); + assert_eq!(versions[1], "138.0.7204.50"); + assert_eq!(versions[2], "138.0.7204.49"); + assert_eq!(versions[3], "137.0.7204.99"); } } diff --git a/src-tauri/src/api_server.rs b/src-tauri/src/api_server.rs index c8db515..c6e659b 100644 --- a/src-tauri/src/api_server.rs +++ b/src-tauri/src/api_server.rs @@ -1,5 +1,4 @@ use crate::browser::ProxySettings; -use crate::camoufox_manager::CamoufoxConfig; use crate::events; use crate::group_manager::GROUP_MANAGER; use crate::profile::manager::ProfileManager; @@ -35,7 +34,6 @@ pub struct ApiProfile { pub last_launch: Option, pub release_type: String, #[schema(value_type = Object)] - pub camoufox_config: Option, pub group_id: Option, pub tags: Vec, pub is_running: bool, @@ -57,7 +55,7 @@ pub struct ApiProfileResponse { #[derive(Debug, Serialize, Deserialize, ToSchema)] pub struct CreateProfileRequest { pub name: String, - /// Browser engine. Must be `"wayfern"` (anti-detect Chromium) or `"camoufox"` + /// Browser engine. Must be `"wayfern"` (anti-detect Chromium) /// (anti-detect Firefox). Any other value (e.g. `"chromium"`) is rejected with /// 400. pub browser: String, @@ -70,12 +68,11 @@ pub struct CreateProfileRequest { pub vpn_id: Option, pub launch_hook: Option, pub release_type: Option, - /// Camoufox fingerprint/config. Send only when `browser` is `"camoufox"`. + /// Wayfern fingerprint/config. Send only when `browser` is `"wayfern"`. /// Omit it, or pass an empty object `{}`, to have a fresh fingerprint /// generated automatically at creation. Provide a `fingerprint` field to /// pin a specific one. #[schema(value_type = Object)] - pub camoufox_config: Option, /// Wayfern fingerprint/config. Send only when `browser` is `"wayfern"`. /// Omit it, or pass an empty object `{}`, to have a fresh fingerprint /// generated automatically at creation. Provide a `fingerprint` field to @@ -98,7 +95,6 @@ pub struct UpdateProfileRequest { pub launch_hook: Option, pub release_type: Option, #[schema(value_type = Object)] - pub camoufox_config: Option, pub group_id: Option, pub tags: Option>, pub extension_group_id: Option, @@ -682,14 +678,6 @@ pub async fn get_api_server_status() -> Result, String> { Ok(server_guard.get_port()) } -/// Serialize a browser config (camoufox/wayfern) to JSON for an API response. -/// Viewing a profile's fingerprint is available to every API caller; only -/// editing it (via `update_profile`) and launching/killing profiles -/// programmatically require an active paid plan. -fn config_to_api_value(config: Option<&T>) -> Option { - serde_json::to_value(config?).ok() -} - // API Handlers - Profiles #[utoipa::path( get, @@ -720,7 +708,6 @@ async fn get_profiles() -> Result, StatusCode> { process_id: profile.process_id, last_launch: profile.last_launch, release_type: profile.release_type.clone(), - camoufox_config: config_to_api_value(profile.camoufox_config.as_ref()), group_id: profile.group_id.clone(), tags: profile.tags.clone(), is_running: profile.process_id.is_some(), // Simple check based on process_id @@ -774,7 +761,6 @@ async fn get_profile( process_id: profile.process_id, last_launch: profile.last_launch, release_type: profile.release_type.clone(), - camoufox_config: config_to_api_value(profile.camoufox_config.as_ref()), group_id: profile.group_id.clone(), tags: profile.tags.clone(), is_running: profile.process_id.is_some(), // Simple check based on process_id @@ -792,12 +778,12 @@ async fn get_profile( /// Create a profile. /// -/// - `browser` must be `"wayfern"` or `"camoufox"`; any other value is rejected +/// - `browser` must be `"wayfern"`; any other value is rejected /// with 400. /// - `version` is optional: omit it or pass `"latest"` to use the newest /// already-downloaded version of that browser. The version must be present /// locally (this endpoint does not download new versions); 400 if none is. -/// - Omitting the matching `wayfern_config`/`camoufox_config`, or passing an +/// - Omitting the matching `wayfern_config`, or passing an /// empty object `{}`, generates a fresh fingerprint automatically. #[utoipa::path( post, @@ -821,16 +807,16 @@ async fn create_profile( ) -> Result, (StatusCode, String)> { let profile_manager = ProfileManager::instance(); - // Only Wayfern and Camoufox profiles are launchable; the rest of the system + // Only Wayfern profiles are launchable; the rest of the system // (fingerprint generation, launch, run) supports nothing else. Reject anything // else up front — otherwise the profile is created with no fingerprint and an // unrecognized browser, then crashes with a 500 on /run. Mirrors the MCP // create_profile validation. - if request.browser != "wayfern" && request.browser != "camoufox" { + if request.browser != "wayfern" { return Err(( StatusCode::BAD_REQUEST, format!( - "Invalid browser \"{}\". Must be \"wayfern\" (anti-detect Chromium) or \"camoufox\" (anti-detect Firefox).", + "Invalid browser \"{}\". Must be \"wayfern\" (anti-detect Chromium).", request.browser ), )); @@ -863,13 +849,6 @@ async fn create_profile( } }; - // Parse camoufox config if provided - let camoufox_config = if let Some(config) = &request.camoufox_config { - serde_json::from_value(config.clone()).ok() - } else { - None - }; - // Parse wayfern config if provided let wayfern_config = if let Some(config) = &request.wayfern_config { serde_json::from_value(config.clone()).ok() @@ -905,7 +884,6 @@ async fn create_profile( request.release_type.as_deref().unwrap_or("stable"), request.proxy_id.clone(), request.vpn_id.clone(), - camoufox_config, wayfern_config, request.group_id.clone(), false, @@ -947,7 +925,6 @@ async fn create_profile( process_id: profile.process_id, last_launch: profile.last_launch, release_type: profile.release_type, - camoufox_config: config_to_api_value(profile.camoufox_config.as_ref()), group_id: profile.group_id, tags: profile.tags, is_running: false, @@ -1054,30 +1031,6 @@ async fn update_profile( } } - if let Some(camoufox_config) = request.camoufox_config { - // Editing a profile's fingerprint config is part of the cross-OS fingerprint - // capability (GUI, API, MCP). Viewing it is free; mutating it is not. - if !crate::cloud_auth::CLOUD_AUTH - .can_use_cross_os_fingerprints() - .await - { - return Err(StatusCode::PAYMENT_REQUIRED); - } - let config: Result = serde_json::from_value(camoufox_config); - match config { - Ok(config) => { - if profile_manager - .update_camoufox_config(state.app_handle.clone(), &id, config) - .await - .is_err() - { - return Err(StatusCode::BAD_REQUEST); - } - } - Err(_) => return Err(StatusCode::BAD_REQUEST), - } - } - if let Some(group_id) = request.group_id { if profile_manager .assign_profiles_to_group(&state.app_handle, vec![id.clone()], Some(group_id)) @@ -2444,7 +2397,7 @@ mod tests { #[test] fn create_profile_request_allows_omitting_version_and_configs() { - // Minimal body: no version, no wayfern_config/camoufox_config. Must + // Minimal body: no version, no wayfern_config. Must // deserialize (version resolves to latest-downloaded at the handler; an // absent config triggers fresh-fingerprint generation). let json = r#"{"name": "p", "browser": "wayfern"}"#; @@ -2453,16 +2406,14 @@ mod tests { assert_eq!(parsed.browser, "wayfern"); assert!(parsed.version.is_none()); assert!(parsed.wayfern_config.is_none()); - assert!(parsed.camoufox_config.is_none()); } #[test] fn create_profile_browser_validation_matches_supported_engines() { // The handler rejects anything that isn't a launchable engine; this is the // same predicate it uses, kept in lockstep with MCP's create_profile. - let is_valid = |b: &str| b == "wayfern" || b == "camoufox"; + let is_valid = |b: &str| b == "wayfern"; assert!(is_valid("wayfern")); - assert!(is_valid("camoufox")); assert!(!is_valid("chromium")); assert!(!is_valid("firefox")); assert!(!is_valid("")); diff --git a/src-tauri/src/auto_updater.rs b/src-tauri/src/auto_updater.rs index b4b8c94..74c5651 100644 --- a/src-tauri/src/auto_updater.rs +++ b/src-tauri/src/auto_updater.rs @@ -13,7 +13,6 @@ pub struct UpdateNotification { pub current_version: String, pub new_version: String, pub affected_profiles: Vec, - pub is_stable_update: bool, pub timestamp: u64, } @@ -231,18 +230,10 @@ impl AutoUpdater { available_versions: &[BrowserVersionInfo], ) -> Result, Box> { let current_version = &profile.version; - let is_current_nightly = - crate::api_client::is_browser_version_nightly(&profile.browser, current_version, None); - // Find the best available update let best_update = available_versions .iter() - .filter(|v| { - // Only consider versions newer than current - self.is_version_newer(&v.version, current_version) - && crate::api_client::is_browser_version_nightly(&profile.browser, &v.version, None) - == is_current_nightly - }) + .filter(|v| self.is_version_newer(&v.version, current_version)) .max_by(|a, b| self.compare_versions(&a.version, &b.version)); if let Some(update_version) = best_update { @@ -255,7 +246,6 @@ impl AutoUpdater { current_version: current_version.clone(), new_version: update_version.version.clone(), affected_profiles: vec![profile.name.clone()], - is_stable_update: !update_version.is_prerelease, timestamp: std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap() @@ -291,12 +281,7 @@ impl AutoUpdater { let mut result: Vec = grouped.into_values().collect(); - // Sort by priority: stable updates first, then by timestamp - result.sort_by(|a, b| match (a.is_stable_update, b.is_stable_update) { - (true, false) => std::cmp::Ordering::Less, - (false, true) => std::cmp::Ordering::Greater, - _ => b.timestamp.cmp(&a.timestamp), - }); + result.sort_by_key(|b| std::cmp::Reverse(b.timestamp)); result } @@ -338,7 +323,6 @@ impl AutoUpdater { current_version: profile.version.clone(), new_version: new_version.to_string(), affected_profiles: vec![profile.name.clone()], - is_stable_update: true, timestamp: std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap_or_default() @@ -510,15 +494,6 @@ impl AutoUpdater { return None; } - // Only update stable->stable and nightly->nightly - let is_profile_nightly = - crate::api_client::is_browser_version_nightly(&profile.browser, &profile.version, None); - let is_latest_nightly = - crate::api_client::is_browser_version_nightly(&profile.browser, &latest, None); - if is_profile_nightly != is_latest_nightly { - return None; - } - match self .profile_manager .update_profile_version(app_handle, &profile.id.to_string(), &latest) @@ -595,15 +570,6 @@ impl AutoUpdater { continue; } - // Only update stable->stable and nightly->nightly - let is_profile_nightly = - crate::api_client::is_browser_version_nightly(&browser, &profile.version, None); - let is_latest_nightly = - crate::api_client::is_browser_version_nightly(&browser, &latest_version, None); - if is_profile_nightly != is_latest_nightly { - continue; - } - match self.profile_manager.update_profile_version( app_handle, &profile.id.to_string(), @@ -686,7 +652,6 @@ mod tests { launch_hook: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: None, wayfern_config: None, group_id: None, tags: Vec::new(), @@ -708,10 +673,9 @@ mod tests { } } - fn create_test_version_info(version: &str, is_prerelease: bool) -> BrowserVersionInfo { + fn create_test_version_info(version: &str) -> BrowserVersionInfo { BrowserVersionInfo { version: version.to_string(), - is_prerelease, date: "2024-01-01".to_string(), } } @@ -753,111 +717,26 @@ mod tests { } #[test] - fn test_camoufox_beta_version_comparison() { + fn test_check_profile_update_picks_newer_wayfern_version() { let updater = AutoUpdater::instance(); - - // Test the exact user-reported scenario: 135.0.1beta24 vs 135.0beta22 - assert!( - updater.is_version_newer("135.0.1beta24", "135.0beta22"), - "135.0.1beta24 should be newer than 135.0beta22" - ); - - assert_eq!( - updater.compare_versions("135.0.1beta24", "135.0beta22"), - std::cmp::Ordering::Greater, - "135.0.1beta24 should compare as greater than 135.0beta22" - ); - - // Test other camoufox beta version combinations - assert!( - updater.is_version_newer("135.0.5beta24", "135.0.5beta22"), - "135.0.5beta24 should be newer than 135.0.5beta22" - ); - - assert!( - updater.is_version_newer("135.0.1beta1", "135.0beta1"), - "135.0.1beta1 should be newer than 135.0beta1 due to patch version" - ); - - // Test that older versions are not considered newer - assert!( - !updater.is_version_newer("135.0beta22", "135.0.1beta24"), - "135.0beta22 should NOT be newer than 135.0.1beta24" - ); - } - - #[test] - fn test_beta_version_ordering_comprehensive() { - let updater = AutoUpdater::instance(); - - // Test various beta version patterns that could appear in camoufox - let test_cases = vec![ - ("135.0.1beta24", "135.0beta22", true), // User reported case - ("135.0.5beta24", "135.0.5beta22", true), // Same patch, different beta - ("135.1beta1", "135.0beta99", true), // Higher minor beats beta number - ("136.0beta1", "135.9.9beta99", true), // Higher major beats everything - ("135.0.1beta1", "135.0beta1", true), // Patch version matters - ("135.0beta22", "135.0.1beta24", false), // Reverse of user case - ]; - - for (newer, older, should_be_newer) in test_cases { - let result = updater.is_version_newer(newer, older); - assert_eq!( - result, - should_be_newer, - "Expected {} {} {} but got {}", - newer, - if should_be_newer { ">" } else { "<=" }, - older, - if result { "true" } else { "false" } - ); - } - } - - #[test] - fn test_check_profile_update_stable_to_stable() { - let updater = AutoUpdater::instance(); - let profile = create_test_profile("test", "firefox", "1.0.0"); + let profile = create_test_profile("test", "wayfern", "138.0.7204.49"); let versions = vec![ - create_test_version_info("1.0.1", false), // stable, newer - create_test_version_info("1.1.0-alpha", true), // alpha, should be ignored - create_test_version_info("0.9.0", false), // stable, older + create_test_version_info("138.0.7204.50"), + create_test_version_info("138.0.7204.48"), ]; let result = updater.check_profile_update(&profile, &versions).unwrap(); assert!(result.is_some()); - - let update = result.unwrap(); - assert_eq!(update.new_version, "1.0.1"); - assert!(update.is_stable_update); - } - - #[test] - fn test_check_profile_update_alpha_to_alpha() { - let updater = AutoUpdater::instance(); - let profile = create_test_profile("test", "firefox", "1.0.0-alpha"); - let versions = vec![ - create_test_version_info("1.0.1", false), // stable, should be included - create_test_version_info("1.1.0-alpha", true), // alpha, newer - create_test_version_info("0.9.0-alpha", true), // alpha, older - ]; - - let result = updater.check_profile_update(&profile, &versions).unwrap(); - assert!(result.is_some()); - - let update = result.unwrap(); - // Should pick the newest version (alpha user can upgrade to stable or newer alpha) - assert_eq!(update.new_version, "1.1.0-alpha"); - assert!(!update.is_stable_update); + assert_eq!(result.unwrap().new_version, "138.0.7204.50"); } #[test] fn test_check_profile_update_no_update_available() { let updater = AutoUpdater::instance(); - let profile = create_test_profile("test", "firefox", "1.0.0"); + let profile = create_test_profile("test", "wayfern", "138.0.7204.50"); let versions = vec![ - create_test_version_info("0.9.0", false), // older - create_test_version_info("1.0.0", false), // same version + create_test_version_info("138.0.7204.49"), + create_test_version_info("138.0.7204.50"), ]; let result = updater.check_profile_update(&profile, &versions).unwrap(); @@ -869,50 +748,27 @@ mod tests { let updater = AutoUpdater::instance(); let notifications = vec![ UpdateNotification { - id: "firefox_1.0.0_to_1.1.0_profile1".to_string(), - browser: "firefox".to_string(), - current_version: "1.0.0".to_string(), - new_version: "1.1.0".to_string(), + id: "wayfern_138.0.7204.49_to_138.0.7204.50_profile1".to_string(), + browser: "wayfern".to_string(), + current_version: "138.0.7204.49".to_string(), + new_version: "138.0.7204.50".to_string(), affected_profiles: vec!["profile1".to_string()], - is_stable_update: true, timestamp: 1000, }, UpdateNotification { - id: "firefox_1.0.0_to_1.1.0_profile2".to_string(), - browser: "firefox".to_string(), - current_version: "1.0.0".to_string(), - new_version: "1.1.0".to_string(), + id: "wayfern_138.0.7204.49_to_138.0.7204.50_profile2".to_string(), + browser: "wayfern".to_string(), + current_version: "138.0.7204.49".to_string(), + new_version: "138.0.7204.50".to_string(), affected_profiles: vec!["profile2".to_string()], - is_stable_update: true, timestamp: 1001, }, - UpdateNotification { - id: "chrome_1.0.0_to_1.1.0-alpha".to_string(), - browser: "chrome".to_string(), - current_version: "1.0.0".to_string(), - new_version: "1.1.0-alpha".to_string(), - affected_profiles: vec!["profile3".to_string()], - is_stable_update: false, - timestamp: 1002, - }, ]; let grouped = updater.group_update_notifications(notifications); - assert_eq!(grouped.len(), 2); - - // Find the Firefox notification - let firefox_notification = grouped.iter().find(|n| n.browser == "firefox").unwrap(); - assert_eq!(firefox_notification.affected_profiles.len(), 2); - assert!(firefox_notification - .affected_profiles - .contains(&"profile1".to_string())); - assert!(firefox_notification - .affected_profiles - .contains(&"profile2".to_string())); - - // Stable updates should come first - assert!(grouped[0].is_stable_update); + assert_eq!(grouped.len(), 1); + assert_eq!(grouped[0].affected_profiles.len(), 2); } #[test] @@ -956,7 +812,6 @@ mod tests { current_version: "1.0.0".to_string(), new_version: "1.1.0".to_string(), affected_profiles: vec!["profile1".to_string()], - is_stable_update: true, timestamp: 1000, }); @@ -1094,7 +949,6 @@ mod tests { current_version: "1.0.0".to_string(), new_version: "1.1.0".to_string(), affected_profiles: vec!["profile1".to_string()], - is_stable_update: true, timestamp: 1000, }); diff --git a/src-tauri/src/browser.rs b/src-tauri/src/browser.rs index a0addb0..6f0654c 100644 --- a/src-tauri/src/browser.rs +++ b/src-tauri/src/browser.rs @@ -13,21 +13,18 @@ pub struct ProxySettings { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub enum BrowserType { - Camoufox, Wayfern, } impl BrowserType { pub fn as_str(&self) -> &'static str { match self { - BrowserType::Camoufox => "camoufox", BrowserType::Wayfern => "wayfern", } } pub fn from_str(s: &str) -> Result { match s { - "camoufox" => Ok(BrowserType::Camoufox), "wayfern" => Ok(BrowserType::Wayfern), _ => Err(format!("Unknown browser type: {s}")), } @@ -54,135 +51,6 @@ pub trait Browser: Send + Sync { mod macos { use super::*; - pub fn get_firefox_executable_path( - install_dir: &Path, - ) -> Result> { - // Find the .app directory - let app_path = std::fs::read_dir(install_dir)? - .filter_map(Result::ok) - .find(|entry| entry.path().extension().is_some_and(|ext| ext == "app")) - .ok_or("Browser app not found")?; - - // Construct the browser executable path - let mut executable_dir = app_path.path(); - executable_dir.push("Contents"); - executable_dir.push("MacOS"); - - // Find executables matching the browser name pattern - let candidates: Vec<_> = std::fs::read_dir(&executable_dir)? - .filter_map(Result::ok) - .filter(|entry| { - let binding = entry.file_name(); - let name = binding.to_string_lossy(); - name.starts_with("firefox") || name.starts_with("camoufox") || name.contains("Browser") - }) - .map(|entry| entry.path()) - .collect(); - - if candidates.is_empty() { - return Err("No executable found in MacOS directory".into()); - } - - // For Camoufox, validate architecture compatibility - let executable_path = if candidates.iter().any(|p| { - p.file_name() - .and_then(|n| n.to_str()) - .map(|n| n.starts_with("camoufox")) - .unwrap_or(false) - }) { - // Find the executable that matches the current architecture - let current_arch = if cfg!(target_arch = "x86_64") { - "x86_64" - } else if cfg!(target_arch = "aarch64") { - "arm64" - } else { - return Err("Unsupported architecture".into()); - }; - - // Try to find an executable that matches the current architecture - // Use file command to check architecture - let mut found_executable = None; - let mut file_command_available = true; - - for candidate in &candidates { - match std::process::Command::new("file").arg(candidate).output() { - Ok(output) => { - if output.status.success() { - if let Ok(output_str) = String::from_utf8(output.stdout) { - let is_compatible = if current_arch == "x86_64" { - output_str.contains("x86_64") || output_str.contains("i386") - } else { - output_str.contains("arm64") || output_str.contains("aarch64") - }; - - if is_compatible { - found_executable = Some(candidate.clone()); - log::info!( - "Found compatible Camoufox executable for {}: {}", - current_arch, - candidate.display() - ); - break; - } else { - log::warn!( - "Skipping incompatible Camoufox executable: {} (architecture: {})", - candidate.display(), - output_str.trim() - ); - } - } - } else { - log::warn!( - "Failed to check architecture for {}: file command returned non-zero exit code", - candidate.display() - ); - } - } - Err(e) => { - log::warn!( - "Failed to check architecture for {} using file command: {}", - candidate.display(), - e - ); - file_command_available = false; - // Continue checking other candidates - } - } - } - - // If no compatible executable found but we have candidates, use the first one - // (fallback for cases where file command isn't available or failed) - if found_executable.is_none() && !candidates.is_empty() { - if !file_command_available { - log::warn!( - "file command not available, using first candidate: {}", - candidates[0].display() - ); - } else { - log::warn!( - "No compatible executable found for architecture {}, using first candidate: {}", - current_arch, - candidates[0].display() - ); - } - found_executable = Some(candidates[0].clone()); - } - - found_executable.ok_or_else(|| { - format!( - "No compatible Camoufox executable found for architecture {}. Available executables: {:?}", - current_arch, - candidates - ) - })? - } else { - // For other browsers, use the first matching executable - candidates[0].clone() - }; - - Ok(executable_path) - } - pub fn get_wayfern_executable_path( install_dir: &Path, ) -> Result> { @@ -224,18 +92,6 @@ mod macos { false } - pub fn is_firefox_version_downloaded(install_dir: &Path) -> bool { - // On macOS, check for .app files - if let Ok(entries) = std::fs::read_dir(install_dir) { - for entry in entries.flatten() { - if entry.path().extension().is_some_and(|ext| ext == "app") { - return true; - } - } - } - false - } - #[allow(dead_code)] pub fn prepare_executable(_executable_path: &Path) -> Result<(), Box> { // On macOS, no special preparation needed @@ -248,43 +104,6 @@ mod linux { use super::*; use std::os::unix::fs::PermissionsExt; - pub fn get_firefox_executable_path( - install_dir: &Path, - browser_type: &BrowserType, - ) -> Result> { - // Expected structure examples: - // - Firefox/Firefox Developer on Linux often extract to: install_dir/firefox/firefox - // - Some archives may extract directly under: install_dir/firefox or install_dir/firefox-bin - // - For some flavors we may have: install_dir// - let _browser_subdir = install_dir.join(browser_type.as_str()); - - // Try common firefox executable locations (nested and flat) - let possible_executables = match browser_type { - BrowserType::Camoufox => { - vec![ - install_dir.join("camoufox-bin"), - install_dir.join("camoufox"), - ] - } - _ => vec![], - }; - - for executable_path in &possible_executables { - if executable_path.exists() && executable_path.is_file() { - return Ok(executable_path.clone()); - } - } - - Err( - format!( - "Executable not found for {} in {}", - browser_type.as_str(), - install_dir.display(), - ) - .into(), - ) - } - pub fn get_chromium_executable_path( install_dir: &Path, browser_type: &BrowserType, @@ -317,32 +136,6 @@ mod linux { ) } - pub fn is_firefox_version_downloaded(install_dir: &Path, browser_type: &BrowserType) -> bool { - // Expected structure (most common): - // install_dir// - // However, Firefox Developer tarballs often extract to a "firefox" subfolder - // rather than "firefox-developer". Support both layouts. - let _browser_subdir = install_dir.join(browser_type.as_str()); - - let possible_executables = match browser_type { - BrowserType::Camoufox => { - vec![ - install_dir.join("camoufox-bin"), - install_dir.join("camoufox"), - ] - } - _ => vec![], - }; - - for exe_path in &possible_executables { - if exe_path.exists() && exe_path.is_file() { - return true; - } - } - - false - } - pub fn is_chromium_version_downloaded(install_dir: &Path, browser_type: &BrowserType) -> bool { let possible_executables = match browser_type { BrowserType::Wayfern => vec![ @@ -391,43 +184,6 @@ mod linux { mod windows { use super::*; - pub fn get_firefox_executable_path( - install_dir: &Path, - ) -> Result> { - // On Windows, look for firefox.exe - let possible_paths = [ - install_dir.join("firefox.exe"), - install_dir.join("firefox").join("firefox.exe"), - install_dir.join("bin").join("firefox.exe"), - ]; - - for path in &possible_paths { - if path.exists() && path.is_file() { - return Ok(path.clone()); - } - } - - // Look for any .exe file that might be the browser - if let Ok(entries) = std::fs::read_dir(install_dir) { - for entry in entries.flatten() { - let path = entry.path(); - if path.extension().is_some_and(|ext| ext == "exe") { - let name = path - .file_stem() - .unwrap_or_default() - .to_string_lossy() - .to_lowercase(); - if name.starts_with("firefox") || name.starts_with("camoufox") || name.contains("browser") - { - return Ok(path); - } - } - } - } - - Err("Firefox executable not found in Windows installation directory".into()) - } - pub fn get_chromium_executable_path( install_dir: &Path, browser_type: &BrowserType, @@ -472,42 +228,6 @@ mod windows { Err("Chromium/Wayfern executable not found in Windows installation directory".into()) } - pub fn is_firefox_version_downloaded(install_dir: &Path) -> bool { - // On Windows, check for .exe files - let possible_executables = [ - install_dir.join("firefox.exe"), - install_dir.join("firefox").join("firefox.exe"), - install_dir.join("bin").join("firefox.exe"), - ]; - - for exe_path in &possible_executables { - if exe_path.exists() && exe_path.is_file() { - return true; - } - } - - // Check for any .exe file that looks like a browser - if let Ok(entries) = std::fs::read_dir(install_dir) { - for entry in entries.flatten() { - let path = entry.path(); - - if path.extension().is_some_and(|ext| ext == "exe") { - let name = path - .file_stem() - .unwrap_or_default() - .to_string_lossy() - .to_lowercase(); - if name.starts_with("firefox") || name.starts_with("camoufox") || name.contains("browser") - { - return true; - } - } - } - } - - false - } - pub fn is_chromium_version_downloaded(install_dir: &Path, browser_type: &BrowserType) -> bool { // On Windows, check for .exe files let possible_executables = match browser_type { @@ -557,94 +277,6 @@ mod windows { } } -pub struct CamoufoxBrowser; - -impl CamoufoxBrowser { - pub fn new() -> Self { - Self - } -} - -impl Browser for CamoufoxBrowser { - fn get_executable_path(&self, install_dir: &Path) -> Result> { - #[cfg(target_os = "macos")] - return macos::get_firefox_executable_path(install_dir); - - #[cfg(target_os = "linux")] - return linux::get_firefox_executable_path(install_dir, &BrowserType::Camoufox); - - #[cfg(target_os = "windows")] - return windows::get_firefox_executable_path(install_dir); - - #[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))] - Err("Unsupported platform".into()) - } - - fn create_launch_args( - &self, - profile_path: &str, - _proxy_settings: Option<&ProxySettings>, - url: Option, - remote_debugging_port: Option, - headless: bool, - ) -> Result, Box> { - // For Camoufox, we handle launching through the camoufox launcher - // This method won't be used directly, but we provide basic Firefox args as fallback - let mut args = vec![ - "-profile".to_string(), - profile_path.to_string(), - "-no-remote".to_string(), - ]; - - // Add remote debugging if requested - if let Some(port) = remote_debugging_port { - args.push("--start-debugger-server".to_string()); - args.push(port.to_string()); - } - - // Add headless mode if requested - if headless { - args.push("--headless".to_string()); - } - - if let Some(url) = url { - args.push(url); - } - - Ok(args) - } - - fn is_version_downloaded(&self, version: &str, binaries_dir: &Path) -> bool { - let install_dir = binaries_dir.join("camoufox").join(version); - - #[cfg(target_os = "macos")] - return macos::is_firefox_version_downloaded(&install_dir); - - #[cfg(target_os = "linux")] - return linux::is_firefox_version_downloaded(&install_dir, &BrowserType::Camoufox); - - #[cfg(target_os = "windows")] - return windows::is_firefox_version_downloaded(&install_dir); - - #[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))] - false - } - - fn prepare_executable(&self, executable_path: &Path) -> Result<(), Box> { - #[cfg(target_os = "macos")] - return macos::prepare_executable(executable_path); - - #[cfg(target_os = "linux")] - return linux::prepare_executable(executable_path); - - #[cfg(target_os = "windows")] - return windows::prepare_executable(executable_path); - - #[cfg(not(any(target_os = "macos", target_os = "linux", target_os = "windows")))] - Err("Unsupported platform".into()) - } -} - /// Wayfern is a Chromium-based anti-detect browser with CDP-based fingerprint injection pub struct WayfernBrowser; @@ -765,7 +397,6 @@ impl BrowserFactory { pub fn create_browser(&self, browser_type: BrowserType) -> Box { match browser_type { - BrowserType::Camoufox => Box::new(CamoufoxBrowser::new()), BrowserType::Wayfern => Box::new(WayfernBrowser::new()), } } @@ -852,292 +483,6 @@ pub struct GithubAsset { #[cfg(test)] mod tests { use super::*; - use std::fs; - use tempfile::TempDir; - - #[test] - fn test_browser_type_conversions() { - // Test as_str - assert_eq!(BrowserType::Camoufox.as_str(), "camoufox"); - assert_eq!(BrowserType::Wayfern.as_str(), "wayfern"); - - // Test from_str - assert_eq!( - BrowserType::from_str("camoufox").expect("camoufox should be valid"), - BrowserType::Camoufox - ); - assert_eq!( - BrowserType::from_str("wayfern").expect("wayfern should be valid"), - BrowserType::Wayfern - ); - - // Test invalid browser type - these should properly fail - let invalid_result = BrowserType::from_str("invalid"); - assert!( - invalid_result.is_err(), - "Invalid browser type should return error" - ); - - let empty_result = BrowserType::from_str(""); - assert!(empty_result.is_err(), "Empty string should return error"); - - assert!( - BrowserType::from_str("firefox").is_err(), - "Removed browser types should return error" - ); - assert!( - BrowserType::from_str("chromium").is_err(), - "Removed browser types should return error" - ); - } - - #[test] - fn test_camoufox_launch_args() { - let browser = CamoufoxBrowser::new(); - let args = browser - .create_launch_args("/path/to/profile", None, None, None, false) - .expect("Failed to create launch args for Camoufox"); - assert!(args.contains(&"-profile".to_string())); - assert!(args.contains(&"/path/to/profile".to_string())); - assert!(args.contains(&"-no-remote".to_string())); - - let args = browser - .create_launch_args( - "/path/to/profile", - None, - Some("https://example.com".to_string()), - None, - false, - ) - .expect("Failed to create launch args for Camoufox with URL"); - assert!(args.contains(&"https://example.com".to_string())); - - // Test with remote debugging - let args = browser - .create_launch_args("/path/to/profile", None, None, Some(9222), false) - .expect("Failed to create launch args for Camoufox with remote debugging"); - assert!(args.contains(&"--start-debugger-server".to_string())); - assert!(args.contains(&"9222".to_string())); - - // Test headless mode - let args = browser - .create_launch_args("/path/to/profile", None, None, None, true) - .expect("Failed to create launch args for Camoufox headless"); - assert!( - args.contains(&"--headless".to_string()), - "Browser should include headless flag when requested" - ); - } - - #[test] - fn test_wayfern_launch_args() { - let browser = WayfernBrowser::new(); - let args = browser - .create_launch_args("/path/to/profile", None, None, None, false) - .expect("Failed to create launch args for Wayfern"); - - assert!( - args.contains(&"--user-data-dir=/path/to/profile".to_string()), - "Wayfern args should contain user-data-dir" - ); - assert!( - args.contains(&"--no-default-browser-check".to_string()), - "Wayfern args should contain no-default-browser-check" - ); - assert!( - args.contains(&"--disable-background-mode".to_string()), - "Wayfern args should contain disable-background-mode" - ); - assert!( - args.contains(&"--disable-component-update".to_string()), - "Wayfern args should contain disable-component-update" - ); - - let args_with_url = browser - .create_launch_args( - "/path/to/profile", - None, - Some("https://example.com".to_string()), - None, - false, - ) - .expect("Failed to create launch args for Wayfern with URL"); - assert!( - args_with_url.contains(&"https://example.com".to_string()), - "Wayfern args should contain the URL" - ); - assert_eq!( - args_with_url.last().expect("Args should not be empty"), - "https://example.com" - ); - - // Test remote debugging - let args_with_debug = browser - .create_launch_args("/path/to/profile", None, None, Some(9222), false) - .expect("Failed to create launch args for Wayfern with remote debugging"); - assert!( - args_with_debug.contains(&"--remote-debugging-port=9222".to_string()), - "Wayfern args should contain remote debugging port" - ); - - // Test headless mode - let args_headless = browser - .create_launch_args("/path/to/profile", None, None, None, true) - .expect("Failed to create launch args for Wayfern headless"); - assert!( - args_headless.contains(&"--headless=new".to_string()), - "Wayfern args should contain headless flag when requested" - ); - } - - #[test] - fn test_proxy_settings_creation() { - let proxy = ProxySettings { - proxy_type: "http".to_string(), - host: "127.0.0.1".to_string(), - port: 8080, - username: None, - password: None, - }; - - assert_eq!(proxy.proxy_type, "http"); - assert_eq!(proxy.host, "127.0.0.1"); - assert_eq!(proxy.port, 8080); - - // Test different proxy types - let socks_proxy = ProxySettings { - proxy_type: "socks5".to_string(), - host: "proxy.example.com".to_string(), - port: 1080, - username: None, - password: None, - }; - - assert_eq!(socks_proxy.proxy_type, "socks5"); - assert_eq!(socks_proxy.host, "proxy.example.com"); - assert_eq!(socks_proxy.port, 1080); - } - - #[test] - fn test_version_downloaded_check() { - let temp_dir = TempDir::new().expect("Failed to create temp directory"); - let binaries_dir = temp_dir.path(); - - // Create a mock Camoufox browser installation - let browser_dir = binaries_dir.join("camoufox").join("135.0.1"); - fs::create_dir_all(&browser_dir).expect("Failed to create browser directory"); - - #[cfg(target_os = "macos")] - { - let app_dir = browser_dir.join("Camoufox.app"); - fs::create_dir_all(&app_dir).expect("Failed to create Camoufox.app directory"); - } - - #[cfg(target_os = "linux")] - { - let executable_path = browser_dir.join("camoufox"); - fs::write(&executable_path, "mock executable").expect("Failed to write mock executable"); - - use std::os::unix::fs::PermissionsExt; - let mut permissions = executable_path - .metadata() - .expect("Failed to get file metadata") - .permissions(); - permissions.set_mode(0o755); - fs::set_permissions(&executable_path, permissions) - .expect("Failed to set executable permissions"); - } - - #[cfg(target_os = "windows")] - { - let executable_path = browser_dir.join("firefox.exe"); - fs::write(&executable_path, "mock executable").expect("Failed to write mock executable"); - } - - let browser = CamoufoxBrowser::new(); - assert!(browser.is_version_downloaded("135.0.1", binaries_dir)); - assert!(!browser.is_version_downloaded("999.0", binaries_dir)); - - // Test with Wayfern browser - let wayfern_dir = binaries_dir.join("wayfern").join("1.0.0"); - fs::create_dir_all(&wayfern_dir).expect("Failed to create wayfern directory"); - - #[cfg(target_os = "macos")] - { - let wayfern_app_dir = wayfern_dir.join("Chromium.app"); - fs::create_dir_all(wayfern_app_dir.join("Contents").join("MacOS")) - .expect("Failed to create Chromium.app structure"); - - let executable_path = wayfern_app_dir - .join("Contents") - .join("MacOS") - .join("Chromium"); - fs::write(&executable_path, "mock executable") - .expect("Failed to write mock Wayfern executable"); - } - - #[cfg(target_os = "linux")] - { - let executable_path = wayfern_dir.join("chromium"); - fs::write(&executable_path, "mock executable") - .expect("Failed to write mock wayfern executable"); - - use std::os::unix::fs::PermissionsExt; - let mut permissions = executable_path - .metadata() - .expect("Failed to get wayfern metadata") - .permissions(); - permissions.set_mode(0o755); - fs::set_permissions(&executable_path, permissions) - .expect("Failed to set wayfern permissions"); - } - - #[cfg(target_os = "windows")] - { - let executable_path = wayfern_dir.join("chromium.exe"); - fs::write(&executable_path, "mock executable").expect("Failed to write mock chromium.exe"); - } - - let wayfern_browser = WayfernBrowser::new(); - assert!( - wayfern_browser.is_version_downloaded("1.0.0", binaries_dir), - "Wayfern version should be detected as downloaded" - ); - assert!( - !wayfern_browser.is_version_downloaded("9.9.9", binaries_dir), - "Non-existent Wayfern version should not be detected as downloaded" - ); - } - - #[test] - fn test_version_downloaded_no_app_directory() { - let temp_dir = TempDir::new().expect("Failed to create temp directory"); - let binaries_dir = temp_dir.path(); - - // Create browser directory but no proper executable structure - let browser_dir = binaries_dir.join("camoufox").join("135.0.1"); - fs::create_dir_all(&browser_dir).expect("Failed to create browser directory"); - - // Create some other files but no proper executable structure - fs::write(browser_dir.join("readme.txt"), "Some content").expect("Failed to write readme file"); - - let browser = CamoufoxBrowser::new(); - assert!( - !browser.is_version_downloaded("135.0.1", binaries_dir), - "Camoufox version should not be detected without proper executable structure" - ); - } - - #[test] - fn test_browser_type_clone_and_debug() { - let browser_type = BrowserType::Camoufox; - let cloned = browser_type.clone(); - assert_eq!(browser_type, cloned); - - // Test Debug trait - let debug_str = format!("{browser_type:?}"); - assert!(debug_str.contains("Camoufox")); - } #[test] fn test_proxy_settings_serialization() { @@ -1177,17 +522,6 @@ mod tests { ); } - #[test] - fn test_camoufox_config_has_no_executable_path() { - // Verify CamoufoxConfig does not store executable_path - let config = crate::camoufox_manager::CamoufoxConfig::default(); - let json = serde_json::to_value(&config).unwrap(); - assert!( - json.get("executable_path").is_none(), - "CamoufoxConfig should not have executable_path field" - ); - } - #[test] fn test_profile_data_path_is_dynamic() { use crate::profile::BrowserProfile; @@ -1203,7 +537,6 @@ mod tests { process_id: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: None, wayfern_config: None, group_id: None, tags: Vec::new(), diff --git a/src-tauri/src/browser_runner.rs b/src-tauri/src/browser_runner.rs index cbe0996..dfa512c 100644 --- a/src-tauri/src/browser_runner.rs +++ b/src-tauri/src/browser_runner.rs @@ -1,22 +1,18 @@ use crate::browser::ProxySettings; -use crate::camoufox_manager::{CamoufoxConfig, CamoufoxManager}; use crate::cloud_auth::CLOUD_AUTH; use crate::downloaded_browsers_registry::DownloadedBrowsersRegistry; use crate::events; -use crate::platform_browser; use crate::profile::{BrowserProfile, ProfileManager}; use crate::proxy_manager::PROXY_MANAGER; use crate::wayfern_manager::{WayfernConfig, WayfernManager}; use serde::Serialize; use std::path::PathBuf; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use sysinfo::System; pub struct BrowserRunner { pub profile_manager: &'static ProfileManager, pub downloaded_browsers_registry: &'static DownloadedBrowsersRegistry, auto_updater: &'static crate::auto_updater::AutoUpdater, - camoufox_manager: &'static CamoufoxManager, wayfern_manager: &'static WayfernManager, } @@ -26,7 +22,6 @@ impl BrowserRunner { profile_manager: ProfileManager::instance(), downloaded_browsers_registry: DownloadedBrowsersRegistry::instance(), auto_updater: crate::auto_updater::AutoUpdater::instance(), - camoufox_manager: CamoufoxManager::instance(), wayfern_manager: WayfernManager::instance(), } } @@ -200,281 +195,6 @@ impl BrowserRunner { remote_debugging_port: Option, headless: bool, ) -> Result> { - // Handle Camoufox profiles using CamoufoxManager - if profile.browser == "camoufox" { - // Get or create camoufox config - let mut camoufox_config = profile.camoufox_config.clone().unwrap_or_else(|| { - log::info!( - "No camoufox config found for profile {}, using default", - profile.name - ); - CamoufoxConfig::default() - }); - - // Always start a local proxy for Camoufox (for traffic monitoring and geoip support) - let mut upstream_proxy = self - .resolve_launch_proxy(profile) - .await - .map_err(|e| -> Box { e.into() })?; - - // If profile has a VPN instead of proxy, start VPN worker and use it as upstream - if upstream_proxy.is_none() { - if let Some(ref vpn_id) = profile.vpn_id { - match crate::vpn_worker_runner::start_vpn_worker(vpn_id).await { - Ok(vpn_worker) => { - if let Some(port) = vpn_worker.local_port { - upstream_proxy = Some(ProxySettings { - proxy_type: "socks5".to_string(), - host: "127.0.0.1".to_string(), - port, - username: None, - password: None, - }); - log::info!("VPN worker started for Camoufox profile on port {}", port); - } - } - Err(e) => { - return Err(format!("Failed to start VPN worker: {e}").into()); - } - } - } - } - - log::info!( - "Starting local proxy for Camoufox profile: {} (upstream: {})", - profile.name, - upstream_proxy - .as_ref() - .map(|p| format!("{}:{}", p.host, p.port)) - .unwrap_or_else(|| "DIRECT".to_string()) - ); - - // Start the proxy and get local proxy settings - // If proxy startup fails, DO NOT launch Camoufox - it requires local proxy - let profile_id_str = profile.id.to_string(); - let blocklist_file = Self::resolve_blocklist_file(profile).await?; - let local_proxy = PROXY_MANAGER - .start_proxy( - app_handle.clone(), - upstream_proxy.as_ref(), - 0, // Use 0 as temporary PID, will be updated later - Some(&profile_id_str), - profile.proxy_bypass_rules.clone(), - blocklist_file, - // Camoufox (Firefox 150, and Firefox 135 on the not-yet-updated - // Windows build) keeps the local HTTP proxy: Firefox's QUIC stack - // bypasses a configured proxy, so QUIC is disabled and HTTP CONNECT - // covers everything. SOCKS5 is reserved for Wayfern. - "http", - ) - .await - .map_err(|e| { - let error_msg = format!("Failed to start local proxy for Camoufox: {e}"); - log::error!("{}", error_msg); - error_msg - })?; - - // Format proxy URL for camoufox - always use HTTP for the local proxy - let proxy_url = format!("http://{}:{}", local_proxy.host, local_proxy.port); - - // Set proxy in camoufox config - camoufox_config.proxy = Some(proxy_url); - - // Ensure geoip is always enabled for proper geolocation spoofing - if camoufox_config.geoip.is_none() { - camoufox_config.geoip = Some(serde_json::Value::Bool(true)); - } - - log::info!( - "Configured local proxy for Camoufox: {:?}, geoip: {:?}", - camoufox_config.proxy, - camoufox_config.geoip - ); - - // Check if we need to generate a new fingerprint on every launch - let mut updated_profile = profile.clone(); - if camoufox_config.randomize_fingerprint_on_launch == Some(true) { - log::info!( - "Generating random fingerprint for Camoufox profile: {}", - profile.name - ); - - // Create a config copy without the existing fingerprint to force generation of a new one - let mut config_for_generation = camoufox_config.clone(); - config_for_generation.fingerprint = None; - - // Generate a new fingerprint - let new_fingerprint = self - .camoufox_manager - .generate_fingerprint_config(&app_handle, profile, &config_for_generation) - .await - .map_err(|e| format!("Failed to generate random fingerprint: {e}"))?; - - log::info!( - "New fingerprint generated, length: {} chars", - new_fingerprint.len() - ); - - // Update the config with the new fingerprint for launching - camoufox_config.fingerprint = Some(new_fingerprint.clone()); - - // Save the updated fingerprint to the profile so it persists - // We need to preserve all existing config fields and only update the fingerprint - let mut updated_camoufox_config = - updated_profile.camoufox_config.clone().unwrap_or_default(); - updated_camoufox_config.fingerprint = Some(new_fingerprint); - // Preserve the randomize flag so it persists across launches - updated_camoufox_config.randomize_fingerprint_on_launch = Some(true); - // Preserve the OS setting so it's used for future fingerprint generation - if camoufox_config.os.is_some() { - updated_camoufox_config.os = camoufox_config.os.clone(); - } - updated_profile.camoufox_config = Some(updated_camoufox_config.clone()); - - log::info!( - "Updated profile camoufox_config with new fingerprint for profile: {}, fingerprint length: {}", - profile.name, - updated_camoufox_config.fingerprint.as_ref().map(|f| f.len()).unwrap_or(0) - ); - } - - // Create ephemeral dir for ephemeral or password-protected profiles - let override_profile_path = if profile.password_protected { - let dir = crate::profile::password::prepare_for_launch(profile) - .map_err(|e| -> Box { e.into() })?; - Some(dir) - } else if profile.ephemeral { - let dir = crate::ephemeral_dirs::create_ephemeral_dir(&profile.id.to_string()) - .map_err(|e| -> Box { e.into() })?; - Some(dir) - } else { - None - }; - - // Install extensions if an extension group is assigned - if updated_profile.extension_group_id.is_some() { - let profiles_dir = self.profile_manager.get_profiles_dir(); - let ext_profile_path = if let Some(ref override_path) = override_profile_path { - override_path.clone() - } else { - updated_profile.get_profile_data_path(&profiles_dir) - }; - let mgr = crate::extension_manager::EXTENSION_MANAGER.lock().unwrap(); - match mgr.install_extensions_for_profile(&updated_profile, &ext_profile_path) { - Ok(paths) => { - if !paths.is_empty() { - log::info!( - "Installed {} Firefox extensions for profile: {}", - paths.len(), - updated_profile.name - ); - } - } - Err(e) => { - log::warn!("Failed to install extensions for Camoufox profile: {e}"); - } - } - } - - // Launch Camoufox browser - log::info!("Launching Camoufox for profile: {}", profile.name); - let camoufox_result = self - .camoufox_manager - .launch_camoufox_profile( - app_handle.clone(), - updated_profile.clone(), - camoufox_config, - url, - override_profile_path, - remote_debugging_port, - headless, - ) - .await - .map_err(|e| -> Box { - format!("Failed to launch Camoufox: {e}").into() - })?; - - // For server-based Camoufox, we use the process_id - let process_id = camoufox_result.processId.unwrap_or(0); - log::info!("Camoufox launched successfully with PID: {process_id}"); - - // Update profile with the process info from camoufox result - updated_profile.process_id = Some(process_id); - updated_profile.last_launch = Some(SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs()); - - // Update the proxy manager with the correct PID - if let Err(e) = PROXY_MANAGER.update_proxy_pid(0, process_id) { - log::warn!("Warning: Failed to update proxy PID mapping: {e}"); - } else { - log::info!("Updated proxy PID mapping from temp (0) to actual PID: {process_id}"); - } - - // Persist the real browser PID so the detached proxy worker self-reaps - // when this browser dies, even after the GUI exits/restarts. - PROXY_MANAGER.set_browser_pid_for_profile(&updated_profile.id.to_string(), process_id); - - // Save the updated profile (includes new fingerprint if randomize is enabled) - log::info!( - "Saving profile {} with camoufox_config fingerprint length: {}", - updated_profile.name, - updated_profile - .camoufox_config - .as_ref() - .and_then(|c| c.fingerprint.as_ref()) - .map(|f| f.len()) - .unwrap_or(0) - ); - self.save_process_info(&updated_profile)?; - // Ensure tag suggestions include any tags from this profile - let _ = crate::tag_manager::TAG_MANAGER.lock().map(|tm| { - let _ = tm.rebuild_from_profiles(&self.profile_manager.list_profiles().unwrap_or_default()); - }); - log::info!( - "Successfully saved profile with process info: {}", - updated_profile.name - ); - - // Emit profiles-changed to trigger frontend to reload profiles from disk - // This ensures the UI displays the newly generated fingerprint - if let Err(e) = events::emit_empty("profiles-changed") { - log::warn!("Warning: Failed to emit profiles-changed event: {e}"); - } - - log::info!( - "Emitting profile events for successful Camoufox launch: {}", - updated_profile.name - ); - - // Emit profile update event to frontend - if let Err(e) = events::emit("profile-updated", &updated_profile) { - log::warn!("Warning: Failed to emit profile update event: {e}"); - } - - // Emit minimal running changed event to frontend with a small delay - #[derive(Serialize)] - struct RunningChangedPayload { - id: String, - is_running: bool, - } - - let payload = RunningChangedPayload { - id: updated_profile.id.to_string(), - is_running: updated_profile.process_id.is_some(), - }; - - if let Err(e) = events::emit("profile-running-changed", &payload) { - log::warn!("Warning: Failed to emit profile running changed event: {e}"); - } else { - log::info!( - "Successfully emitted profile-running-changed event for Camoufox {}: running={}", - updated_profile.name, - payload.is_running - ); - } - - return Ok(updated_profile); - } - // Handle Wayfern profiles using WayfernManager if profile.browser == "wayfern" { // Get or create wayfern config @@ -838,62 +558,6 @@ impl BrowserRunner { url: &str, _internal_proxy_settings: Option<&ProxySettings>, ) -> Result<(), Box> { - // Handle Camoufox profiles using CamoufoxManager - if profile.browser == "camoufox" { - // Get the profile path based on the UUID - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = - crate::ephemeral_dirs::get_effective_profile_path(profile, &profiles_dir); - let profile_path_str = profile_data_path.to_string_lossy(); - - // Check if the process is running - match self - .camoufox_manager - .find_camoufox_by_profile(&profile_path_str) - .await - { - Ok(Some(_camoufox_process)) => { - log::info!( - "Opening URL in existing Camoufox process for profile: {} (ID: {})", - profile.name, - profile.id - ); - - // Get Camoufox executable path and use Firefox-like remote mechanism - let executable_path = self - .get_browser_executable_path(profile) - .map_err(|e| format!("Failed to get Camoufox executable path: {e}"))?; - - // Launch Camoufox with -profile and -new-tab to open URL in existing instance - // This works because we no longer use -no-remote flag - let output = std::process::Command::new(&executable_path) - .arg("-profile") - .arg(&*profile_path_str) - .arg("-new-tab") - .arg(url) - .output() - .map_err(|e| format!("Failed to execute Camoufox: {e}"))?; - - if output.status.success() { - log::info!("Successfully opened URL in existing Camoufox instance"); - return Ok(()); - } else { - let stderr = String::from_utf8_lossy(&output.stderr); - log::warn!("Camoufox -new-tab command failed: {stderr}"); - return Err( - format!("Failed to open URL in existing Camoufox instance: {stderr}").into(), - ); - } - } - Ok(None) => { - return Err("Camoufox browser is not running".into()); - } - Err(e) => { - return Err(format!("Error checking Camoufox process: {e}").into()); - } - } - } - // Handle Wayfern profiles using WayfernManager if profile.browser == "wayfern" { let profiles_dir = self.profile_manager.get_profiles_dir(); @@ -938,7 +602,7 @@ impl BrowserRunner { remote_debugging_port: Option, headless: bool, ) -> Result> { - // Camoufox and Wayfern start (and PID-reconcile) their own local proxy + // Wayfern starts (and PID-reconciles) its own local proxy // inside `launch_browser_internal`, so we hand it None here rather than // staging a second, orphaned proxy worker. self @@ -1105,478 +769,6 @@ impl BrowserRunner { app_handle: tauri::AppHandle, profile: &BrowserProfile, ) -> Result<(), Box> { - // Handle Camoufox profiles using CamoufoxManager - if profile.browser == "camoufox" { - // Search by profile path to find the running Camoufox instance - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = - crate::ephemeral_dirs::get_effective_profile_path(profile, &profiles_dir); - let profile_path_str = profile_data_path.to_string_lossy(); - - log::info!( - "Attempting to kill Camoufox process for profile: {} (ID: {})", - profile.name, - profile.id - ); - - // Stop the proxy associated with this profile first - let profile_id_str = profile.id.to_string(); - if let Err(e) = PROXY_MANAGER - .stop_proxy_by_profile_id(app_handle.clone(), &profile_id_str) - .await - { - log::warn!( - "Warning: Failed to stop proxy for profile {}: {e}", - profile_id_str - ); - } - - let mut process_actually_stopped = false; - match self - .camoufox_manager - .find_camoufox_by_profile(&profile_path_str) - .await - { - Ok(Some(camoufox_process)) => { - log::info!( - "Found Camoufox process: {} (PID: {:?})", - camoufox_process.id, - camoufox_process.processId - ); - - match self - .camoufox_manager - .stop_camoufox(&app_handle, &camoufox_process.id) - .await - { - Ok(stopped) => { - if let Some(pid) = camoufox_process.processId { - if stopped { - // Verify the process actually died by checking after a short delay - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - - if process_actually_stopped { - log::info!( - "Successfully stopped Camoufox process: {} (PID: {:?}) - verified process is dead", - camoufox_process.id, - pid - ); - } else { - log::warn!( - "Camoufox stop command returned success but process {} (PID: {:?}) is still running - forcing kill", - camoufox_process.id, - pid - ); - // Force kill the process - #[cfg(target_os = "macos")] - { - use crate::platform_browser; - if let Err(e) = platform_browser::macos::kill_browser_process_impl( - pid, - Some(&profile_path_str), - ) - .await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = - system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - #[cfg(target_os = "linux")] - { - use crate::platform_browser; - if let Err(e) = platform_browser::linux::kill_browser_process_impl( - pid, - Some(&profile_path_str), - ) - .await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = - system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - #[cfg(target_os = "windows")] - { - use crate::platform_browser; - if let Err(e) = - platform_browser::windows::kill_browser_process_impl(pid).await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = - system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - } - } else { - // stop_camoufox returned false, try to force kill the process - log::warn!( - "Camoufox stop command returned false for process {} (PID: {:?}) - attempting force kill", - camoufox_process.id, - pid - ); - #[cfg(target_os = "macos")] - { - use crate::platform_browser; - if let Err(e) = platform_browser::macos::kill_browser_process_impl( - pid, - Some(&profile_path_str), - ) - .await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - #[cfg(target_os = "linux")] - { - use crate::platform_browser; - if let Err(e) = platform_browser::linux::kill_browser_process_impl( - pid, - Some(&profile_path_str), - ) - .await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - #[cfg(target_os = "windows")] - { - use crate::platform_browser; - if let Err(e) = platform_browser::windows::kill_browser_process_impl(pid).await - { - log::error!("Failed to force kill Camoufox process {}: {}", pid, e); - } else { - // Verify the process is actually dead after force kill - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - if process_actually_stopped { - log::info!( - "Successfully force killed Camoufox process {} (PID: {:?})", - camoufox_process.id, - pid - ); - } - } - } - } - } else { - // No PID available, assume stopped if stop_camoufox returned true - process_actually_stopped = stopped; - if !stopped { - log::warn!( - "Failed to stop Camoufox process {} but no PID available for force kill", - camoufox_process.id - ); - } - } - } - Err(e) => { - log::error!( - "Error stopping Camoufox process {}: {}", - camoufox_process.id, - e - ); - // Try to force kill if we have a PID - if let Some(pid) = camoufox_process.processId { - log::info!( - "Attempting force kill after stop_camoufox error for PID: {}", - pid - ); - #[cfg(target_os = "macos")] - { - use crate::platform_browser; - if let Err(kill_err) = - platform_browser::macos::kill_browser_process_impl(pid, Some(&profile_path_str)) - .await - { - log::error!( - "Failed to force kill Camoufox process {}: {}", - pid, - kill_err - ); - } else { - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - } - } - #[cfg(target_os = "linux")] - { - use crate::platform_browser; - if let Err(kill_err) = - platform_browser::linux::kill_browser_process_impl(pid, Some(&profile_path_str)) - .await - { - log::error!( - "Failed to force kill Camoufox process {}: {}", - pid, - kill_err - ); - } else { - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - } - } - #[cfg(target_os = "windows")] - { - use crate::platform_browser; - if let Err(kill_err) = - platform_browser::windows::kill_browser_process_impl(pid).await - { - log::error!( - "Failed to force kill Camoufox process {}: {}", - pid, - kill_err - ); - } else { - use tokio::time::{sleep, Duration}; - sleep(Duration::from_millis(500)).await; - use sysinfo::{Pid, System}; - let system = System::new_all(); - process_actually_stopped = system.process(Pid::from(pid as usize)).is_none(); - } - } - } - } - } - } - Ok(None) => { - log::info!( - "No running Camoufox process found for profile: {} (ID: {})", - profile.name, - profile.id - ); - process_actually_stopped = true; // No process found, consider it stopped - } - Err(e) => { - log::error!( - "Error finding Camoufox process for profile {}: {}", - profile.name, - e - ); - } - } - - // If process wasn't confirmed stopped, return an error - if !process_actually_stopped { - log::error!( - "Failed to stop Camoufox process for profile: {} (ID: {}) - process may still be running", - profile.name, - profile.id - ); - return Err( - format!( - "Failed to stop Camoufox process for profile {} - process may still be running", - profile.name - ) - .into(), - ); - } - - // Clear the process ID from the profile and save immediately so that - // subsequent calls to update_profile_version (which re-reads from disk) - // see the cleared process_id. - let mut updated_profile = profile.clone(); - updated_profile.process_id = None; - self - .save_process_info(&updated_profile) - .map_err(|e| format!("Failed to update profile: {e}"))?; - - // Check for pending updates and apply them for Camoufox profiles too - if let Ok(Some(pending_update)) = self - .auto_updater - .get_pending_update(&profile.browser, &profile.version) - { - log::info!( - "Found pending update for Camoufox profile {}: {} -> {}", - profile.name, - profile.version, - pending_update.new_version - ); - - match self.profile_manager.update_profile_version( - &app_handle, - &profile.id.to_string(), - &pending_update.new_version, - ) { - Ok(updated_profile_after_update) => { - log::info!( - "Successfully updated Camoufox profile {} from version {} to {}", - profile.name, - profile.version, - pending_update.new_version - ); - updated_profile = updated_profile_after_update; - - if let Err(e) = self - .auto_updater - .dismiss_update_notification(&pending_update.id) - { - log::warn!("Warning: Failed to dismiss pending update notification: {e}"); - } - } - Err(e) => { - log::error!( - "Failed to apply pending update for Camoufox profile {}: {}", - profile.name, - e - ); - } - } - } - - // If no pending update was applied, check if a newer installed version exists - if updated_profile.version == profile.version { - if let Some(p) = self - .auto_updater - .update_profile_to_latest_installed(&app_handle, &updated_profile) - { - updated_profile = p; - } - } - - log::info!( - "Emitting profile events for successful Camoufox kill: {}", - updated_profile.name - ); - - // Emit profile update event to frontend - if let Err(e) = events::emit("profile-updated", &updated_profile) { - log::warn!("Warning: Failed to emit profile update event: {e}"); - } - - // Emit minimal running changed event to frontend immediately - #[derive(Serialize)] - struct RunningChangedPayload { - id: String, - is_running: bool, - } - let payload = RunningChangedPayload { - id: updated_profile.id.to_string(), - is_running: false, // Explicitly set to false since we just killed it - }; - - if let Err(e) = events::emit("profile-running-changed", &payload) { - log::warn!("Warning: Failed to emit profile running changed event: {e}"); - } else { - log::info!( - "Successfully emitted profile-running-changed event for Camoufox {}: running={}", - updated_profile.name, - payload.is_running - ); - } - - if profile.password_protected { - // Await the re-encryption so the queued sync (released later by - // `mark_profile_stopped` in `kill_browser`) sees fresh ciphertext on - // disk instead of the previous snapshot. - crate::profile::password::complete_after_quit_and_wait(profile).await; - } else if profile.ephemeral { - crate::ephemeral_dirs::remove_ephemeral_dir(&profile.id.to_string()); - } - - log::info!( - "Camoufox process cleanup completed for profile: {} (ID: {})", - profile.name, - profile.id - ); - - // Consolidate browser versions after stopping a browser - if let Ok(consolidated) = self - .downloaded_browsers_registry - .consolidate_browser_versions(&app_handle) - { - if !consolidated.is_empty() { - log::info!("Post-stop version consolidation results:"); - for action in &consolidated { - log::info!(" {action}"); - } - } - } - - return Ok(()); - } - // Handle Wayfern profiles using WayfernManager if profile.browser == "wayfern" { let profiles_dir = self.profile_manager.get_profiles_dir(); @@ -1922,394 +1114,10 @@ impl BrowserRunner { return Ok(()); } - // For non-camoufox/wayfern browsers, use the existing logic - let pid = if let Some(pid) = profile.process_id { - // First verify the stored PID is still valid and belongs to our profile - let system = System::new_all(); - if let Some(process) = system.process(sysinfo::Pid::from(pid as usize)) { - let cmd = process.cmd(); - let exe_name = process.name().to_string_lossy(); - - // Verify this process is actually our browser - let is_correct_browser = match profile.browser.as_str() { - "firefox" => { - exe_name.contains("firefox") - && !exe_name.contains("developer") - && !exe_name.contains("camoufox") - } - "firefox-developer" => { - // More flexible detection for Firefox Developer Edition - (exe_name.contains("firefox") && exe_name.contains("developer")) - || (exe_name.contains("firefox") - && cmd.iter().any(|arg| { - let arg_str = arg.to_str().unwrap_or(""); - arg_str.contains("Developer") - || arg_str.contains("developer") - || arg_str.contains("FirefoxDeveloperEdition") - || arg_str.contains("firefox-developer") - })) - || exe_name == "firefox" // Firefox Developer might just show as "firefox" - } - "zen" => exe_name.contains("zen"), - "chromium" => exe_name.contains("chromium") || exe_name.contains("chrome"), - "brave" => exe_name.contains("brave") || exe_name.contains("Brave"), - _ => false, - }; - - if is_correct_browser { - // Verify profile path match - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = profile.get_profile_data_path(&profiles_dir); - let profile_data_path_str = profile_data_path.to_string_lossy(); - - let profile_path_match = if matches!( - profile.browser.as_str(), - "firefox" | "firefox-developer" | "zen" - ) { - // Firefox-based browsers: look for -profile argument followed by path - let mut found_profile_arg = false; - for (i, arg) in cmd.iter().enumerate() { - if let Some(arg_str) = arg.to_str() { - if arg_str == "-profile" && i + 1 < cmd.len() { - if let Some(next_arg) = cmd.get(i + 1).and_then(|a| a.to_str()) { - if next_arg == profile_data_path_str { - found_profile_arg = true; - break; - } - } - } - // Also check for combined -profile=path format - if arg_str == format!("-profile={profile_data_path_str}") { - found_profile_arg = true; - break; - } - // Check if the argument is the profile path directly - if arg_str == profile_data_path_str { - found_profile_arg = true; - break; - } - } - } - found_profile_arg - } else { - // Chromium-based browsers: look for --user-data-dir argument - cmd.iter().any(|s| { - if let Some(arg) = s.to_str() { - arg == format!("--user-data-dir={profile_data_path_str}") - || arg == profile_data_path_str - } else { - false - } - }) - }; - - if profile_path_match { - log::info!( - "Verified stored PID {} is valid for profile {} (ID: {})", - pid, - profile.name, - profile.id - ); - pid - } else { - log::info!("Stored PID {} doesn't match profile path for {} (ID: {}), searching for correct process", pid, profile.name, profile.id); - // Fall through to search for correct process - self.find_browser_process_by_profile(profile)? - } - } else { - log::info!("Stored PID {} doesn't match browser type for {} (ID: {}), searching for correct process", pid, profile.name, profile.id); - // Fall through to search for correct process - self.find_browser_process_by_profile(profile)? - } - } else { - log::info!( - "Stored PID {} is no longer valid for profile {} (ID: {}), searching for correct process", - pid, - profile.name, - profile.id - ); - // Fall through to search for correct process - self.find_browser_process_by_profile(profile)? - } - } else { - // No stored PID, search for the process - self.find_browser_process_by_profile(profile)? - }; - - log::info!("Attempting to kill browser process with PID: {pid}"); - - // Stop any associated proxy first - if let Err(e) = PROXY_MANAGER.stop_proxy(app_handle.clone(), pid).await { - log::warn!("Warning: Failed to stop proxy for PID {pid}: {e}"); - } - - #[cfg(target_os = "macos")] - { - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = profile.get_profile_data_path(&profiles_dir); - let profile_path_str = profile_data_path.to_string_lossy().to_string(); - platform_browser::macos::kill_browser_process_impl(pid, Some(&profile_path_str)).await?; - } - - #[cfg(target_os = "windows")] - platform_browser::windows::kill_browser_process_impl(pid).await?; - - #[cfg(target_os = "linux")] - { - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = profile.get_profile_data_path(&profiles_dir); - let profile_path_str = profile_data_path.to_string_lossy().to_string(); - platform_browser::linux::kill_browser_process_impl(pid, Some(&profile_path_str)).await?; - } - - #[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))] - return Err("Unsupported platform".into()); - - let system = System::new_all(); - if system.process(sysinfo::Pid::from(pid as usize)).is_some() { - log::error!( - "Browser process {} is still running after kill attempt for profile: {} (ID: {})", - pid, - profile.name, - profile.id - ); - return Err( - format!( - "Browser process {} is still running after kill attempt", - pid - ) - .into(), - ); - } - - log::info!( - "Verified browser process {} is terminated for profile: {} (ID: {})", - pid, - profile.name, - profile.id - ); - - // Clear the process ID from the profile and save immediately so that - // subsequent calls to update_profile_version (which re-reads from disk) - // see the cleared process_id. - let mut updated_profile = profile.clone(); - updated_profile.process_id = None; - self - .save_process_info(&updated_profile) - .map_err(|e| format!("Failed to update profile: {e}"))?; - - // Check for pending updates and apply them - if let Ok(Some(pending_update)) = self - .auto_updater - .get_pending_update(&profile.browser, &profile.version) - { - log::info!( - "Found pending update for profile {}: {} -> {}", - profile.name, - profile.version, - pending_update.new_version - ); - - match self.profile_manager.update_profile_version( - &app_handle, - &profile.id.to_string(), - &pending_update.new_version, - ) { - Ok(updated_profile_after_update) => { - log::info!( - "Successfully updated profile {} from version {} to {}", - profile.name, - profile.version, - pending_update.new_version - ); - updated_profile = updated_profile_after_update; - - if let Err(e) = self - .auto_updater - .dismiss_update_notification(&pending_update.id) - { - log::warn!("Warning: Failed to dismiss pending update notification: {e}"); - } - } - Err(e) => { - log::error!( - "Failed to apply pending update for profile {}: {}", - profile.name, - e - ); - } - } - } - - // If no pending update was applied, check if a newer installed version exists - if updated_profile.version == profile.version { - if let Some(p) = self - .auto_updater - .update_profile_to_latest_installed(&app_handle, &updated_profile) - { - updated_profile = p; - } - } - - log::info!( - "Emitting profile events for successful kill: {}", - updated_profile.name - ); - - // Emit profile update event to frontend - if let Err(e) = events::emit("profile-updated", &updated_profile) { - log::warn!("Warning: Failed to emit profile update event: {e}"); - } - - // Emit minimal running changed event to frontend immediately - #[derive(Serialize)] - struct RunningChangedPayload { - id: String, - is_running: bool, - } - let payload = RunningChangedPayload { - id: updated_profile.id.to_string(), - is_running: false, // Explicitly set to false since we just killed it - }; - - if let Err(e) = events::emit("profile-running-changed", &payload) { - log::warn!("Warning: Failed to emit profile running changed event: {e}"); - } else { - log::info!( - "Successfully emitted profile-running-changed event for {}: running={}", - updated_profile.name, - payload.is_running - ); - } - - // Consolidate browser versions after stopping a browser - if let Ok(consolidated) = self - .downloaded_browsers_registry - .consolidate_browser_versions(&app_handle) - { - if !consolidated.is_empty() { - log::info!("Post-stop version consolidation results:"); - for action in &consolidated { - log::info!(" {action}"); - } - } - } - - Ok(()) - } - - /// Helper method to find browser process by profile path - fn find_browser_process_by_profile( - &self, - profile: &BrowserProfile, - ) -> Result> { - let system = System::new_all(); - let profiles_dir = self.profile_manager.get_profiles_dir(); - let profile_data_path = profile.get_profile_data_path(&profiles_dir); - let profile_data_path_str = profile_data_path.to_string_lossy(); - - log::info!( - "Searching for {} browser process with profile path: {}", - profile.browser, - profile_data_path_str - ); - - for (pid, process) in system.processes() { - let cmd = process.cmd(); - if cmd.is_empty() { - continue; - } - - // Check if this is the right browser executable first - let exe_name = process.name().to_string_lossy().to_lowercase(); - let is_correct_browser = match profile.browser.as_str() { - "firefox" => { - exe_name.contains("firefox") - && !exe_name.contains("developer") - && !exe_name.contains("camoufox") - } - "firefox-developer" => { - // More flexible detection for Firefox Developer Edition - (exe_name.contains("firefox") && exe_name.contains("developer")) - || (exe_name.contains("firefox") - && cmd.iter().any(|arg| { - let arg_str = arg.to_str().unwrap_or(""); - arg_str.contains("Developer") - || arg_str.contains("developer") - || arg_str.contains("FirefoxDeveloperEdition") - || arg_str.contains("firefox-developer") - })) - || exe_name == "firefox" // Firefox Developer might just show as "firefox" - } - "zen" => exe_name.contains("zen"), - "chromium" => exe_name.contains("chromium") || exe_name.contains("chrome"), - "brave" => exe_name.contains("brave") || exe_name.contains("Brave"), - _ => false, - }; - - if !is_correct_browser { - continue; - } - - // Check for profile path match with improved logic - let profile_path_match = if matches!( - profile.browser.as_str(), - "firefox" | "firefox-developer" | "zen" - ) { - // Firefox-based browsers: look for -profile argument followed by path - let mut found_profile_arg = false; - for (i, arg) in cmd.iter().enumerate() { - if let Some(arg_str) = arg.to_str() { - if arg_str == "-profile" && i + 1 < cmd.len() { - if let Some(next_arg) = cmd.get(i + 1).and_then(|a| a.to_str()) { - if next_arg == profile_data_path_str { - found_profile_arg = true; - break; - } - } - } - // Also check for combined -profile=path format - if arg_str == format!("-profile={profile_data_path_str}") { - found_profile_arg = true; - break; - } - // Check if the argument is the profile path directly - if arg_str == profile_data_path_str { - found_profile_arg = true; - break; - } - } - } - found_profile_arg - } else { - // Chromium-based browsers: look for --user-data-dir argument - cmd.iter().any(|s| { - if let Some(arg) = s.to_str() { - arg == format!("--user-data-dir={profile_data_path_str}") - || arg == profile_data_path_str - } else { - false - } - }) - }; - - if profile_path_match { - let pid_u32 = pid.as_u32(); - log::info!( - "Found matching {} browser process with PID: {} for profile: {} (ID: {})", - profile.browser, - pid_u32, - profile.name, - profile.id - ); - return Ok(pid_u32); - } - } - Err( format!( - "No running {} browser process found for profile: {} (ID: {})", - profile.browser, profile.name, profile.id + "Unsupported browser '{}' for profile '{}' — only Wayfern is supported", + profile.browser, profile.name ) .into(), ) @@ -2427,10 +1235,9 @@ pub async fn launch_browser_profile_impl( profile_for_launch.id ); - // Launch browser or open URL in existing instance. Camoufox and Wayfern - // start their own local proxies inside `launch_browser_internal`; any - // other browser type is rejected there (we only support those for import, - // not launch), so no proxy needs to be staged here. + // Launch browser or open URL in existing instance. Wayfern starts its + // own local proxy inside `launch_browser_internal`; other browser types + // are rejected there, so no proxy needs to be staged here. // // `force_new` callers (API/MCP) always start a fresh instance with the // requested debug port and headless mode, bypassing the "open URL in the @@ -2485,7 +1292,7 @@ pub async fn launch_browser_profile_impl( // Now update the proxy with the correct PID if we have one if let Some(actual_pid) = updated_profile.process_id { - // Update the proxy manager with the correct PID (we always started with temp pid 1 for non-Camoufox) + // Update the proxy manager with the correct PID (we always started with temp pid 1) let _ = PROXY_MANAGER.update_proxy_pid(1u32, actual_pid); } diff --git a/src-tauri/src/browser_version_manager.rs b/src-tauri/src/browser_version_manager.rs index 23893dc..af13b1c 100644 --- a/src-tauri/src/browser_version_manager.rs +++ b/src-tauri/src/browser_version_manager.rs @@ -1,12 +1,10 @@ use crate::api_client::{sort_versions, ApiClient, BrowserRelease}; -use crate::browser::GithubRelease; use serde::{Deserialize, Serialize}; use std::collections::HashSet; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct BrowserVersionInfo { pub version: String, - pub is_prerelease: bool, pub date: String, } @@ -20,7 +18,6 @@ pub struct BrowserVersionsResult { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct BrowserReleaseTypes { pub stable: Option, - pub nightly: Option, } #[derive(Debug, Serialize, Deserialize, Clone)] @@ -53,33 +50,8 @@ impl BrowserVersionManager { let (os, arch) = Self::get_platform_info(); match browser { - "firefox" | "firefox-developer" => Ok(true), - "zen" => { - // Zen supports all platforms and architectures - Ok(true) - } - "brave" => { - // Brave supports all platforms and architectures - Ok(true) - } - "chromium" => { - // Chromium doesn't support ARM64 on Linux - if arch == "arm64" && os == "linux" { - Ok(false) - } else { - Ok(true) - } - } - "camoufox" => { - // Camoufox supports all platforms and architectures according to the JS code - Ok(true) - } "wayfern" => { - // Wayfern support depends on version.json downloads availability - // Currently supports macos-arm64 and linux-x64 let platform_key = format!("{os}-{arch}"); - // Check dynamically, but allow the browser to appear even if platform not available yet - // The actual download will fail gracefully if not supported Ok(matches!( platform_key.as_str(), "macos-arm64" @@ -96,15 +68,7 @@ impl BrowserVersionManager { /// Get list of browsers supported on the current platform pub fn get_supported_browsers(&self) -> Vec { - let all_browsers = vec![ - "firefox", - "firefox-developer", - "zen", - "brave", - "chromium", - "camoufox", - "wayfern", - ]; + let all_browsers = vec!["wayfern"]; all_browsers .into_iter() @@ -115,13 +79,6 @@ impl BrowserVersionManager { /// Get cached browser versions immediately (returns None if no cache exists) pub fn get_cached_browser_versions(&self, browser: &str) -> Option> { - if browser == "brave" { - return self - .api_client - .get_cached_github_releases("brave") - .map(|releases| releases.into_iter().map(|r| r.tag_name).collect()); - } - self .api_client .load_cached_versions(browser) @@ -133,20 +90,6 @@ impl BrowserVersionManager { &self, browser: &str, ) -> Option> { - if browser == "brave" { - if let Some(releases) = self.api_client.get_cached_github_releases("brave") { - let detailed_info: Vec = releases - .into_iter() - .map(|r| BrowserVersionInfo { - version: r.tag_name, - is_prerelease: r.is_nightly, - date: r.published_at, - }) - .collect(); - return Some(detailed_info); - } - } - let cached_releases = self.api_client.load_cached_versions(browser)?; // Convert cached versions to detailed info (without dates since cache doesn't store them) @@ -154,7 +97,6 @@ impl BrowserVersionManager { .into_iter() .map(|r| BrowserVersionInfo { version: r.version, - is_prerelease: r.is_prerelease, date: r.date, }) .collect(); @@ -167,44 +109,25 @@ impl BrowserVersionManager { self.api_client.is_cache_expired(browser) } - /// Get latest stable and nightly versions for a browser (cached first) + /// Get the latest Wayfern version (cached first) pub async fn get_browser_release_types( &self, browser: &str, ) -> Result> { - // Try to get from cache first + if browser != "wayfern" { + return Err(format!("Unsupported browser: {browser}").into()); + } + if let Some(cached_versions) = self.get_cached_browser_versions_detailed(browser) { - let latest_stable = cached_versions - .iter() - .find(|v| !v.is_prerelease) - .map(|v| v.version.clone()); - - let latest_nightly = cached_versions - .iter() - .find(|v| v.is_prerelease) - .map(|v| v.version.clone()); - return Ok(BrowserReleaseTypes { - stable: latest_stable, - nightly: latest_nightly, + stable: cached_versions.first().map(|v| v.version.clone()), }); } let detailed_versions = self.fetch_browser_versions_detailed(browser, false).await?; - let latest_stable = detailed_versions - .iter() - .find(|v| !v.is_prerelease) - .map(|v| v.version.clone()); - - let latest_nightly = detailed_versions - .iter() - .find(|v| v.is_prerelease) - .map(|v| v.version.clone()); - Ok(BrowserReleaseTypes { - stable: latest_stable, - nightly: latest_nightly, + stable: detailed_versions.first().map(|v| v.version.clone()), }) } @@ -235,12 +158,6 @@ impl BrowserVersionManager { // Fetch fresh versions from API let fresh_versions = match browser { - "firefox" => self.fetch_firefox_versions(true).await?, // Always fetch fresh for merging - "firefox-developer" => self.fetch_firefox_developer_versions(true).await?, - "zen" => self.fetch_zen_versions(true).await?, - "brave" => self.fetch_brave_versions(true).await?, - "chromium" => self.fetch_chromium_versions(true).await?, - "camoufox" => self.fetch_camoufox_versions(true).await?, "wayfern" => self.fetch_wayfern_versions(true).await?, _ => return Err(format!("Unsupported browser: {browser}").into()), }; @@ -262,13 +179,12 @@ impl BrowserVersionManager { crate::api_client::sort_versions(&mut merged_versions); // Save the merged cache (unless explicitly bypassing cache) - if !no_caching && browser != "brave" { + if !no_caching { let merged_releases: Vec = merged_versions .iter() .map(|v| BrowserRelease { version: v.clone(), date: "".to_string(), - is_prerelease: crate::api_client::is_browser_version_nightly(browser, v, None), }) .collect(); if let Err(e) = self @@ -305,157 +221,14 @@ impl BrowserVersionManager { // Since we don't have detailed date/prerelease info for cached versions, // we'll fetch fresh detailed info and map it to our merged versions let detailed_info: Vec = match browser { - "firefox" => { - let releases = self.fetch_firefox_releases_detailed(true).await?; - merged_versions - .into_iter() - .map(|version| { - // Try to find matching release info, otherwise create basic info - if let Some(release) = releases.iter().find(|r| r.version == version) { - BrowserVersionInfo { - version: release.version.clone(), - is_prerelease: release.is_prerelease, - date: release.date.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: crate::api_client::is_browser_version_nightly( - "firefox", &version, None, - ), - date: "".to_string(), - } - } - }) - .collect() - } - "firefox-developer" => { - let releases = self.fetch_firefox_developer_releases_detailed(true).await?; - merged_versions - .into_iter() - .map(|version| { - if let Some(release) = releases.iter().find(|r| r.version == version) { - BrowserVersionInfo { - version: release.version.clone(), - is_prerelease: release.is_prerelease, - date: release.date.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: crate::api_client::is_browser_version_nightly( - "firefox-developer", - &version, - None, - ), - date: "".to_string(), - } - } - }) - .collect() - } - "zen" => { - let releases = self.fetch_zen_releases_detailed(true).await?; - merged_versions - .into_iter() - // Filter out twilight releases at the detailed level too - .filter(|version| version.to_lowercase() != "twilight") - .map(|version| { - if let Some(release) = releases.iter().find(|r| r.tag_name == version) { - BrowserVersionInfo { - version: release.tag_name.clone(), - is_prerelease: release.is_nightly, - date: release.published_at.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: crate::api_client::is_browser_version_nightly("zen", &version, None), - date: "".to_string(), - } - } - }) - .collect() - } - "brave" => { - let releases = self.fetch_brave_releases_detailed(true).await?; - merged_versions - .into_iter() - .map(|version| { - if let Some(release) = releases.iter().find(|r| r.tag_name == version) { - BrowserVersionInfo { - version: release.tag_name.clone(), - is_prerelease: release.is_nightly, - date: release.published_at.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: crate::api_client::is_browser_version_nightly( - "brave", &version, None, - ), - date: "".to_string(), - } - } - }) - .collect() - } - "chromium" => { - let releases = self.fetch_chromium_releases_detailed(true).await?; - merged_versions - .into_iter() - .map(|version| { - if let Some(release) = releases.iter().find(|r| r.version == version) { - BrowserVersionInfo { - version: release.version.clone(), - is_prerelease: release.is_prerelease, - date: release.date.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: false, // Chromium usually stable releases - date: "".to_string(), - } - } - }) - .collect() - } - "camoufox" => { - let releases = self.fetch_camoufox_releases_detailed(true).await?; - merged_versions - .into_iter() - .map(|version| { - if let Some(release) = releases.iter().find(|r| r.tag_name == version) { - BrowserVersionInfo { - version: release.tag_name.clone(), - is_prerelease: release.is_nightly, - date: release.published_at.clone(), - } - } else { - BrowserVersionInfo { - version: version.clone(), - is_prerelease: false, // Camoufox usually stable releases - date: "".to_string(), - } - } - }) - .collect() - } - "wayfern" => { - // Wayfern only has one version from version.json - merged_versions - .into_iter() - .map(|version| BrowserVersionInfo { - version: version.clone(), - is_prerelease: false, // Wayfern releases are always stable - date: "".to_string(), - }) - .collect() - } - _ => { - return Err(format!("Unsupported browser: {browser}").into()); - } + "wayfern" => merged_versions + .into_iter() + .map(|version| BrowserVersionInfo { + version: version.clone(), + date: "".to_string(), + }) + .collect(), + _ => return Err(format!("Unsupported browser: {browser}").into()), }; Ok(detailed_info) @@ -493,7 +266,6 @@ impl BrowserVersionManager { .map(|v| BrowserRelease { version: v.clone(), date: "".to_string(), - is_prerelease: crate::api_client::is_browser_version_nightly(browser, v, None), }) .collect(); if let Err(e) = self.api_client.save_cached_versions(browser, &releases) { @@ -512,170 +284,6 @@ impl BrowserVersionManager { let (os, arch) = Self::get_platform_info(); match browser { - "firefox" => { - let (platform_path, filename, is_archive) = match (&os[..], &arch[..]) { - ("windows", "x64") => ("win64", format!("Firefox Setup {version}.exe"), false), - ("windows", "arm64") => ( - "win64-aarch64", - format!("Firefox Setup {version}.exe"), - false, - ), - ("linux", "x64") => ("linux-x86_64", format!("firefox-{version}.tar.xz"), true), - ("linux", "arm64") => ("linux-aarch64", format!("firefox-{version}.tar.xz"), true), - ("macos", _) => ("mac", format!("Firefox {version}.dmg"), true), - _ => { - return Err( - format!("Unsupported platform/architecture for Firefox: {os}/{arch}").into(), - ) - } - }; - - Ok(DownloadInfo { - url: format!( - "https://download-installer.cdn.mozilla.net/pub/firefox/releases/{version}/{platform_path}/en-US/{filename}" - ), - filename, - is_archive, - }) - } - "firefox-developer" => { - let (platform_path, filename, is_archive) = match (&os[..], &arch[..]) { - ("windows", "x64") => ("win64", format!("Firefox Setup {version}.exe"), false), - ("windows", "arm64") => ( - "win64-aarch64", - format!("Firefox Setup {version}.exe"), - false, - ), - ("linux", "x64") => ("linux-x86_64", format!("firefox-{version}.tar.xz"), true), - ("linux", "arm64") => ("linux-aarch64", format!("firefox-{version}.tar.xz"), true), - ("macos", _) => ("mac", format!("Firefox {version}.dmg"), true), - _ => { - return Err( - format!("Unsupported platform/architecture for Firefox Developer: {os}/{arch}") - .into(), - ) - } - }; - - Ok(DownloadInfo { - url: format!( - "https://download-installer.cdn.mozilla.net/pub/devedition/releases/{version}/{platform_path}/en-US/{filename}" - ), - filename, - is_archive, - }) - } - "zen" => { - let (asset_name, filename, is_archive) = match (&os[..], &arch[..]) { - ("windows", "x64") => ("zen.installer.exe", format!("zen-{version}.exe"), false), - ("windows", "arm64") => ( - "zen.installer-arm64.exe", - format!("zen-{version}-arm64.exe"), - false, - ), - ("linux", "x64") => ( - "zen.linux-x86_64.tar.xz", - format!("zen-{version}-x86_64.tar.xz"), - true, - ), - ("linux", "arm64") => ( - "zen.linux-aarch64.tar.xz", - format!("zen-{version}-aarch64.tar.xz"), - true, - ), - ("macos", _) => ( - "zen.macos-universal.dmg", - format!("zen-{version}.dmg"), - true, - ), - _ => { - return Err(format!("Unsupported platform/architecture for Zen: {os}/{arch}").into()) - } - }; - - Ok(DownloadInfo { - url: format!( - "https://github.com/zen-browser/desktop/releases/download/{version}/{asset_name}" - ), - filename, - is_archive, - }) - } - "brave" => { - let (filename, is_archive) = match (&os[..], &arch[..]) { - ("windows", _) => (format!("brave-{version}.exe"), false), - ("linux", "x64") => (format!("brave-browser-{version}-linux-amd64.zip"), true), - ("linux", "arm64") => (format!("brave-browser-{version}-linux-arm64.zip"), true), - ("macos", _) => ("Brave-Browser-universal.dmg".to_string(), true), - _ => { - return Err(format!("Unsupported platform/architecture for Brave: {os}/{arch}").into()) - } - }; - - Ok(DownloadInfo { - url: format!( - "https://github.com/brave/brave-browser/releases/download/{version}/{filename}" - ), - filename, - is_archive, - }) - } - "chromium" => { - let platform_str = match (&os[..], &arch[..]) { - ("windows", "x64") => "Win_x64", - ("windows", "arm64") => "Win_Arm64", - ("linux", "x64") => "Linux_x64", - ("linux", "arm64") => return Err("Chromium doesn't support ARM64 on Linux".into()), - ("macos", "x64") => "Mac", - ("macos", "arm64") => "Mac_Arm", - _ => { - return Err( - format!("Unsupported platform/architecture for Chromium: {os}/{arch}").into(), - ) - } - }; - - let (archive_name, filename) = match os.as_str() { - "windows" => ("chrome-win.zip", format!("chromium-{version}-win.zip")), - "linux" => ("chrome-linux.zip", format!("chromium-{version}-linux.zip")), - "macos" => ("chrome-mac.zip", format!("chromium-{version}-mac.zip")), - _ => return Err(format!("Unsupported platform for Chromium: {os}").into()), - }; - - Ok(DownloadInfo { - url: format!( - "https://commondatastorage.googleapis.com/chromium-browser-snapshots/{platform_str}/{version}/{archive_name}" - ), - filename, - is_archive: true, - }) - } - "camoufox" => { - // Camoufox downloads from GitHub releases with pattern: camoufox-{version}-{release}-{os}.{arch}.zip - let (os_name, arch_name) = match (&os[..], &arch[..]) { - ("windows", "x64") => ("win", "x86_64"), - ("windows", "arm64") => ("win", "arm64"), - ("linux", "x64") => ("lin", "x86_64"), - ("linux", "arm64") => ("lin", "arm64"), - ("macos", "x64") => ("mac", "x86_64"), - ("macos", "arm64") => ("mac", "arm64"), - _ => { - return Err( - format!("Unsupported platform/architecture for Camoufox: {os}/{arch}").into(), - ) - } - }; - - // Note: We provide a placeholder URL here since Camoufox requires dynamic resolution - // The actual URL will be resolved in download.rs resolve_download_url - Ok(DownloadInfo { - url: format!( - "https://github.com/daijro/camoufox/releases/download/{version}/camoufox-{{version}}-{{release}}-{os_name}.{arch_name}.zip" - ), - filename: format!("camoufox-{version}-{os_name}.{arch_name}.zip"), - is_archive: true, - }) - } "wayfern" => { // Wayfern downloads from https://download.wayfern.com/ // File naming: wayfern-{chromium_version}-{platform}-{arch}.{ext} @@ -728,153 +336,6 @@ impl BrowserVersionManager { (os.to_string(), arch.to_string()) } - // Private helper methods for each browser type - - async fn fetch_firefox_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self.fetch_firefox_releases_detailed(no_caching).await?; - Ok(releases.into_iter().map(|r| r.version).collect()) - } - - async fn fetch_firefox_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - self - .api_client - .fetch_firefox_releases_with_caching(no_caching) - .await - } - - async fn fetch_firefox_developer_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self - .fetch_firefox_developer_releases_detailed(no_caching) - .await?; - Ok(releases.into_iter().map(|r| r.version).collect()) - } - - async fn fetch_firefox_developer_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - self - .api_client - .fetch_firefox_developer_releases_with_caching(no_caching) - .await - } - - async fn fetch_zen_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self.fetch_zen_releases_detailed(no_caching).await?; - Ok( - releases - .into_iter() - .filter(|r| r.tag_name.to_lowercase() != "twilight") - .map(|r| r.tag_name) - .collect(), - ) - } - - async fn fetch_zen_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - self - .api_client - .fetch_zen_releases_with_caching(no_caching) - .await - } - - async fn fetch_brave_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self.fetch_brave_releases_detailed(no_caching).await?; - // Persist a lightweight versions cache with accurate prerelease info for Brave - let converted: Vec = releases - .iter() - .map(|r| BrowserRelease { - version: r.tag_name.clone(), - date: r.published_at.clone(), - is_prerelease: r.is_nightly, - }) - .collect(); - // Always save so that other callers without release_name can classify correctly - if let Err(e) = self.api_client.save_cached_versions("brave", &converted) { - log::error!("Failed to persist Brave versions cache: {e}"); - } - - Ok(releases.into_iter().map(|r| r.tag_name).collect()) - } - - async fn fetch_brave_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self - .api_client - .fetch_brave_releases_with_caching(no_caching) - .await?; - - // Save a parallel versions cache for Brave with accurate prerelease flags - let converted: Vec = releases - .iter() - .map(|r| BrowserRelease { - version: r.tag_name.clone(), - date: r.published_at.clone(), - is_prerelease: r.is_nightly, - }) - .collect(); - if let Err(e) = self.api_client.save_cached_versions("brave", &converted) { - log::error!("Failed to persist Brave versions cache: {e}"); - } - - Ok(releases) - } - - async fn fetch_chromium_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self.fetch_chromium_releases_detailed(no_caching).await?; - Ok(releases.into_iter().map(|r| r.version).collect()) - } - - async fn fetch_chromium_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - self - .api_client - .fetch_chromium_releases_with_caching(no_caching) - .await - } - - async fn fetch_camoufox_versions( - &self, - no_caching: bool, - ) -> Result, Box> { - let releases = self.fetch_camoufox_releases_detailed(no_caching).await?; - Ok(releases.into_iter().map(|r| r.tag_name).collect()) - } - - async fn fetch_camoufox_releases_detailed( - &self, - no_caching: bool, - ) -> Result, Box> { - self - .api_client - .fetch_camoufox_releases_with_caching(no_caching) - .await - } - async fn fetch_wayfern_versions( &self, no_caching: bool, @@ -912,37 +373,14 @@ pub async fn get_browser_release_types( mod tests { use super::*; - use wiremock::MockServer; - - async fn setup_mock_server() -> MockServer { - MockServer::start().await - } - - fn create_test_api_client(server: &MockServer) -> ApiClient { - let base_url = server.uri(); - ApiClient::new_with_base_urls( - base_url.clone(), // firefox_api_base - base_url.clone(), // firefox_dev_api_base - base_url.clone(), // github_api_base - base_url.clone(), // chromium_api_base - ) - } - - fn create_test_service(_api_client: ApiClient) -> &'static BrowserVersionManager { - BrowserVersionManager::instance() - } - #[tokio::test] async fn test_browser_version_manager_creation() { let _ = BrowserVersionManager::instance(); - // Test passes if we can create the service without panicking } #[tokio::test] async fn test_unsupported_browser() { - let server = setup_mock_server().await; - let api_client = create_test_api_client(&server); - let service = create_test_service(api_client); + let service = BrowserVersionManager::instance(); let result = service.fetch_browser_versions("unsupported", false).await; assert!( @@ -962,141 +400,48 @@ mod tests { fn test_get_download_info() { let service = BrowserVersionManager::instance(); - // Test Firefox - platform-specific expectations - let firefox_info = service.get_download_info("firefox", "139.0").unwrap(); + let wayfern_info = service.get_download_info("wayfern", "1.0.0").unwrap(); - #[cfg(target_os = "macos")] + #[cfg(all(target_os = "macos", target_arch = "aarch64"))] { - assert_eq!(firefox_info.filename, "Firefox 139.0.dmg"); - assert!(firefox_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-macos-arm64.dmg"); + assert!(wayfern_info.is_archive); } - #[cfg(target_os = "linux")] + #[cfg(all(target_os = "macos", target_arch = "x86_64"))] { - assert_eq!(firefox_info.filename, "firefox-139.0.tar.xz"); - assert!(firefox_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-macos-x64.dmg"); + assert!(wayfern_info.is_archive); } - #[cfg(target_os = "windows")] + #[cfg(all(target_os = "linux", target_arch = "x86_64"))] { - assert_eq!(firefox_info.filename, "Firefox Setup 139.0.exe"); - assert!(!firefox_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-linux-x64.tar.xz"); + assert!(wayfern_info.is_archive); } - assert!(firefox_info - .url - .contains("download-installer.cdn.mozilla.net")); - assert!(firefox_info.url.contains("/pub/firefox/releases/139.0/")); - - // Test Firefox Developer - let firefox_dev_info = service - .get_download_info("firefox-developer", "139.0b1") - .unwrap(); - - #[cfg(target_os = "macos")] + #[cfg(all(target_os = "linux", target_arch = "aarch64"))] { - assert_eq!(firefox_dev_info.filename, "Firefox 139.0b1.dmg"); - assert!(firefox_dev_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-linux-arm64.tar.xz"); + assert!(wayfern_info.is_archive); } - #[cfg(target_os = "linux")] + #[cfg(all(target_os = "windows", target_arch = "x86_64"))] { - assert_eq!(firefox_dev_info.filename, "firefox-139.0b1.tar.xz"); - assert!(firefox_dev_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-windows-x64.zip"); + assert!(wayfern_info.is_archive); } - #[cfg(target_os = "windows")] + #[cfg(all(target_os = "windows", target_arch = "aarch64"))] { - assert_eq!(firefox_dev_info.filename, "Firefox Setup 139.0b1.exe"); - assert!(!firefox_dev_info.is_archive); + assert_eq!(wayfern_info.filename, "wayfern-1.0.0-windows-arm64.zip"); + assert!(wayfern_info.is_archive); } - assert!(firefox_dev_info - .url - .contains("download-installer.cdn.mozilla.net")); - assert!(firefox_dev_info - .url - .contains("/pub/devedition/releases/139.0b1/")); + assert!(wayfern_info.url.contains("download.wayfern.com")); - // Test Zen Browser - let zen_info = service.get_download_info("zen", "1.11b").unwrap(); - - #[cfg(target_os = "macos")] - { - assert_eq!(zen_info.filename, "zen-1.11b.dmg"); - assert!(zen_info.url.contains("zen.macos-universal.dmg")); - assert!(zen_info.is_archive); - } - - #[cfg(target_os = "linux")] - { - assert_eq!(zen_info.filename, "zen-1.11b-x86_64.tar.xz"); - assert!(zen_info.url.contains("zen.linux-x86_64.tar.xz")); - assert!(zen_info.is_archive); - } - - #[cfg(target_os = "windows")] - { - assert_eq!(zen_info.filename, "zen-1.11b.exe"); - assert!(zen_info.url.contains("zen.installer.exe")); - assert!(!zen_info.is_archive); - } - - // Test Chromium - let chromium_info = service.get_download_info("chromium", "1465660").unwrap(); - - #[cfg(target_os = "macos")] - { - assert_eq!(chromium_info.filename, "chromium-1465660-mac.zip"); - assert!(chromium_info.url.contains("chrome-mac.zip")); - } - - #[cfg(target_os = "linux")] - { - assert_eq!(chromium_info.filename, "chromium-1465660-linux.zip"); - assert!(chromium_info.url.contains("chrome-linux.zip")); - } - - #[cfg(target_os = "windows")] - { - assert_eq!(chromium_info.filename, "chromium-1465660-win.zip"); - assert!(chromium_info.url.contains("chrome-win.zip")); - } - - assert!(chromium_info.is_archive); - - // Test Brave - Note: Brave uses dynamic URL resolution, so get_download_info provides a template URL - let brave_info = service.get_download_info("brave", "v1.81.9").unwrap(); - - #[cfg(target_os = "macos")] - { - assert_eq!(brave_info.filename, "Brave-Browser-universal.dmg"); - assert_eq!(brave_info.url, "https://github.com/brave/brave-browser/releases/download/v1.81.9/Brave-Browser-universal.dmg"); - assert!(brave_info.is_archive); - } - - #[cfg(target_os = "linux")] - { - assert_eq!(brave_info.filename, "brave-browser-v1.81.9-linux-amd64.zip"); - assert_eq!(brave_info.url, "https://github.com/brave/brave-browser/releases/download/v1.81.9/brave-browser-v1.81.9-linux-amd64.zip"); - assert!(brave_info.is_archive); - } - - #[cfg(target_os = "windows")] - { - assert_eq!(brave_info.filename, "brave-v1.81.9.exe"); - assert_eq!( - brave_info.url, - "https://github.com/brave/brave-browser/releases/download/v1.81.9/brave-v1.81.9.exe" - ); - assert!(!brave_info.is_archive); - } - - // Test unsupported browser - let unsupported_result = service.get_download_info("unsupported", "1.0.0"); + let unsupported_result = service.get_download_info("firefox", "1.0.0"); assert!(unsupported_result.is_err()); - - log::info!("Download info test passed for all browsers"); } } diff --git a/src-tauri/src/camoufox/config.rs b/src-tauri/src/camoufox/config.rs deleted file mode 100644 index 1942d16..0000000 --- a/src-tauri/src/camoufox/config.rs +++ /dev/null @@ -1,677 +0,0 @@ -//! Camoufox configuration builder. -//! -//! Converts fingerprints to Camoufox configuration format and builds launch options. - -use rand::RngExt; -use serde_yaml; -use std::collections::HashMap; -use std::path::Path; - -use crate::camoufox::data; -use crate::camoufox::env_vars; -use crate::camoufox::fingerprint::types::*; -use crate::camoufox::fonts; -use crate::camoufox::geolocation; -use crate::camoufox::presets; -use crate::camoufox::webgl; - -/// Browserforge mapping from YAML. -type BrowserforgeMapping = HashMap; - -/// Load the browserforge mapping from embedded YAML. -fn load_browserforge_mapping() -> BrowserforgeMapping { - serde_yaml::from_str(data::BROWSERFORGE_YML).unwrap_or_default() -} - -/// Convert a fingerprint to Camoufox configuration. -pub fn from_browserforge( - fingerprint: &Fingerprint, - ff_version: Option, -) -> HashMap { - let mapping = load_browserforge_mapping(); - let mut config = HashMap::new(); - - // Convert fingerprint to a JSON value for easier traversal - let fp_json = serde_json::to_value(fingerprint).unwrap_or_default(); - - // Apply mappings recursively - cast_to_properties(&mut config, &mapping, &fp_json, ff_version); - - // Handle window.screenX and window.screenY - handle_screen_xy(&mut config, &fingerprint.screen); - - config -} - -/// Recursively cast fingerprint properties to Camoufox config format. -fn cast_to_properties( - config: &mut HashMap, - mapping: &BrowserforgeMapping, - fingerprint: &serde_json::Value, - ff_version: Option, -) { - if let serde_json::Value::Object(fp_obj) = fingerprint { - for (key, mapping_value) in mapping { - let fp_value = fp_obj.get(key); - - match mapping_value { - serde_yaml::Value::String(target_key) => { - if let Some(value) = fp_value { - let mut final_value = value.clone(); - - // Handle negative screen values - if target_key.starts_with("screen.") { - if let Some(num) = final_value.as_i64() { - if num < 0 { - final_value = serde_json::json!(0); - } - } - } - - // Replace Firefox version in user agent strings - if let (Some(version), Some(s)) = (ff_version, final_value.as_str()) { - let replaced = replace_ff_version(s, version); - final_value = serde_json::json!(replaced); - } - - config.insert(target_key.clone(), final_value); - } - } - serde_yaml::Value::Mapping(nested_mapping) => { - if let Some(nested_fp) = fp_value { - let nested: BrowserforgeMapping = nested_mapping - .iter() - .filter_map(|(k, v)| k.as_str().map(|ks| (ks.to_string(), v.clone()))) - .collect(); - cast_to_properties(config, &nested, nested_fp, ff_version); - } - } - _ => {} - } - } - } -} - -/// Replace Firefox version in user agent and related strings. -fn replace_ff_version(s: &str, version: u32) -> String { - // Match patterns like "135.0" (Firefox version) and replace with new version - let re = regex_lite::Regex::new(r"(?, screen: &ScreenFingerprint) { - if config.contains_key("window.screenY") { - return; - } - - let screen_x = screen.screen_x; - if screen_x == 0 { - config.insert("window.screenX".to_string(), serde_json::json!(0)); - config.insert("window.screenY".to_string(), serde_json::json!(0)); - return; - } - - if (-50..=50).contains(&screen_x) { - config.insert("window.screenY".to_string(), serde_json::json!(screen_x)); - return; - } - - let screen_y = screen.avail_height as i32 - screen.outer_height as i32; - let mut rng = rand::rng(); - - let y = if screen_y == 0 { - 0 - } else if screen_y > 0 { - rng.random_range(0..=screen_y) - } else { - rng.random_range(screen_y..=0) - }; - - config.insert("window.screenY".to_string(), serde_json::json!(y)); -} - -/// GeoIP option - can be an IP address string or auto-detect. -#[derive(Debug, Clone)] -pub enum GeoIPOption { - /// Auto-detect IP (fetch public IP, optionally through proxy) - Auto, - /// Use a specific IP address - IP(String), -} - -/// Configuration builder for Camoufox launch. -#[derive(Debug, Clone)] -pub struct CamoufoxConfigBuilder { - fingerprint: Option, - operating_system: Option, - screen_constraints: Option, - block_images: bool, - block_webrtc: bool, - block_webgl: bool, - custom_fonts: Option>, - custom_fonts_only: bool, - firefox_prefs: HashMap, - proxy: Option, - headless: bool, - ff_version: Option, - extra_config: HashMap, - geoip: Option, -} - -/// Proxy configuration. -#[derive(Debug, Clone)] -pub struct ProxyConfig { - pub server: String, - pub username: Option, - pub password: Option, - pub bypass: Option, -} - -impl ProxyConfig { - /// Parse a proxy URL string into ProxyConfig. - /// Supports formats like: - /// - "http://host:port" - /// - "http://user:pass@host:port" - /// - "socks5://user:pass@host:port" - pub fn from_url(url: &str) -> Result { - let parsed = url::Url::parse(url).map_err(|e| ConfigError::InvalidProxy(e.to_string()))?; - - let host = parsed - .host_str() - .ok_or_else(|| ConfigError::InvalidProxy("Missing host".to_string()))?; - - let port = parsed.port().unwrap_or(8080); - let scheme = parsed.scheme(); - - let server = format!("{scheme}://{host}:{port}"); - - let username = if !parsed.username().is_empty() { - Some(parsed.username().to_string()) - } else { - None - }; - - let password = parsed.password().map(String::from); - - Ok(Self { - server, - username, - password, - bypass: None, - }) - } -} - -impl Default for CamoufoxConfigBuilder { - fn default() -> Self { - Self::new() - } -} - -impl CamoufoxConfigBuilder { - pub fn new() -> Self { - Self { - fingerprint: None, - operating_system: None, - screen_constraints: None, - block_images: false, - block_webrtc: false, - block_webgl: false, - custom_fonts: None, - custom_fonts_only: false, - firefox_prefs: HashMap::new(), - proxy: None, - headless: false, - ff_version: None, - extra_config: HashMap::new(), - geoip: None, - } - } - - pub fn fingerprint(mut self, fp: Fingerprint) -> Self { - self.fingerprint = Some(fp); - self - } - - pub fn operating_system(mut self, os: &str) -> Self { - self.operating_system = Some(os.to_string()); - self - } - - pub fn screen_constraints(mut self, constraints: ScreenConstraints) -> Self { - self.screen_constraints = Some(constraints); - self - } - - pub fn block_images(mut self, block: bool) -> Self { - self.block_images = block; - self - } - - pub fn block_webrtc(mut self, block: bool) -> Self { - self.block_webrtc = block; - self - } - - pub fn block_webgl(mut self, block: bool) -> Self { - self.block_webgl = block; - self - } - - pub fn custom_fonts(mut self, fonts: Vec) -> Self { - self.custom_fonts = Some(fonts); - self - } - - pub fn custom_fonts_only(mut self, only: bool) -> Self { - self.custom_fonts_only = only; - self - } - - pub fn firefox_pref>(mut self, key: &str, value: V) -> Self { - self.firefox_prefs.insert(key.to_string(), value.into()); - self - } - - pub fn proxy(mut self, proxy: ProxyConfig) -> Self { - self.proxy = Some(proxy); - self - } - - pub fn headless(mut self, headless: bool) -> Self { - self.headless = headless; - self - } - - pub fn ff_version(mut self, version: u32) -> Self { - self.ff_version = Some(version); - self - } - - pub fn extra_config>(mut self, key: &str, value: V) -> Self { - self.extra_config.insert(key.to_string(), value.into()); - self - } - - /// Set GeoIP option for geolocation-based fingerprinting. - /// Use `GeoIPOption::Auto` to auto-detect public IP (optionally through proxy). - /// Use `GeoIPOption::IP(ip_string)` to use a specific IP address. - pub fn geoip(mut self, option: GeoIPOption) -> Self { - self.geoip = Some(option); - self - } - - /// Build the complete Camoufox launch configuration. - /// - /// Prefers a real-fingerprint preset (matched against the Camoufox build's - /// Firefox version via `presets::preset_line_for`) when no explicit - /// fingerprint was passed. Falls back to the Bayesian network-based - /// synthesizer when presets are unavailable, so callers without a known - /// Firefox version (or with no preset for the requested OS) still get a - /// valid config — matching pre-v150 behaviour byte-for-byte. - pub fn build(self) -> Result { - let mut rng = rand::rng(); - let ff_version = self.ff_version; - - // 1) The caller supplied a fingerprint outright — honour it and skip - // presets entirely. This is the path tests and advanced consumers - // use to inject deterministic fixtures. - // 2) Otherwise, try a bundled preset for the requested OS / FF line. - // 3) Fall back to the Bayesian generator. This is also the path that - // runs for users whose Camoufox binary has no readable `version.json` - // (`ff_version == None`), or whose OS has no presets bundled. - let (mut config, target_os) = if let Some(fp) = self.fingerprint { - let target_os = env_vars::determine_ua_os(&fp.navigator.user_agent); - // `from_browserforge` already runs `handle_screen_xy` internally. - let config = from_browserforge(&fp, ff_version); - (config, target_os) - } else if let Some(preset) = - presets::get_random_preset(self.operating_system.as_deref(), ff_version) - { - let mut config = presets::from_preset(&preset, ff_version); - let target_os = config - .get("navigator.userAgent") - .and_then(|v| v.as_str()) - .map(env_vars::determine_ua_os) - .or_else(|| { - // Last-resort heuristic from the platform string — keeps target_os - // sensible even if a preset somehow omits the user agent. - config - .get("navigator.platform") - .and_then(|v| v.as_str()) - .map(|p| match p { - "Win32" => "windows", - "MacIntel" => "macos", - _ => "linux", - }) - }) - .unwrap_or("macos"); - // Presets don't carry multi-monitor offsets, so default screenX/Y to - // (0, 0) — matches what real single-display users send. - config - .entry("window.screenX".to_string()) - .or_insert(serde_json::json!(0)); - config - .entry("window.screenY".to_string()) - .or_insert(serde_json::json!(0)); - (config, target_os) - } else { - let generator = crate::camoufox::fingerprint::FingerprintGenerator::new()?; - let options = FingerprintOptions { - operating_system: self.operating_system.clone(), - browsers: Some(vec!["firefox".to_string()]), - devices: Some(vec!["desktop".to_string()]), - screen: self.screen_constraints, - ..Default::default() - }; - let fingerprint = generator.get_fingerprint(&options)?.fingerprint; - let target_os = env_vars::determine_ua_os(&fingerprint.navigator.user_agent); - let config = from_browserforge(&fingerprint, ff_version); - (config, target_os) - }; - - // Note: we used to spoof `window.history.length` to a random value in - // [1, 5] here. Newer Camoufox builds clamp the docShell session history - // to this value, which disables the toolbar back/forward buttons when - // the spoof rolls a small number. The fingerprint value drifts on every - // user navigation anyway, so a constant spoof is detectable and not - // worth the broken navigation UX. - - // Add fonts - if !self.custom_fonts_only { - let system_fonts = fonts::get_fonts_for_os(target_os); - let fonts = if let Some(custom) = &self.custom_fonts { - let mut all_fonts = system_fonts; - for font in custom { - if !all_fonts.contains(font) { - all_fonts.push(font.clone()); - } - } - all_fonts - } else { - system_fonts - }; - config.insert("fonts".to_string(), serde_json::json!(fonts)); - } else if let Some(custom) = &self.custom_fonts { - config.insert("fonts".to_string(), serde_json::json!(custom)); - } - - // Add font spacing seed - config.insert( - "fonts:spacing_seed".to_string(), - serde_json::json!(rng.random_range(0..1_073_741_824u32)), - ); - - // Build Firefox preferences - let mut firefox_prefs = self.firefox_prefs; - - if self.block_images { - firefox_prefs.insert( - "permissions.default.image".to_string(), - serde_json::json!(2), - ); - } - - if self.block_webrtc { - firefox_prefs.insert( - "media.peerconnection.enabled".to_string(), - serde_json::json!(false), - ); - } - - if self.block_webgl { - firefox_prefs.insert("webgl.disabled".to_string(), serde_json::json!(true)); - } else { - // Sample and add WebGL configuration - match webgl::sample_webgl(target_os, None, None) { - Ok(webgl_data) => { - for (key, value) in webgl_data.config { - config.insert(key, value); - } - firefox_prefs.insert("webgl.force-enabled".to_string(), serde_json::json!(true)); - } - Err(e) => { - log::warn!("Failed to sample WebGL config: {}", e); - } - } - } - - // Canvas anti-fingerprinting - config.insert( - "canvas:aaOffset".to_string(), - serde_json::json!(rng.random_range(-50..=50)), - ); - config.insert("canvas:aaCapOffset".to_string(), serde_json::json!(true)); - - // Add extra config (user-provided) - for (key, value) in self.extra_config { - config.insert(key, value); - } - - // Hardcoded Camoufox settings (cannot be overridden) - // Disable theming to prevent fingerprinting via browser theme - config.insert("disableTheming".to_string(), serde_json::json!(true)); - // Hide cursor in headless mode - config.insert("showcursor".to_string(), serde_json::json!(false)); - - Ok(CamoufoxLaunchConfig { - fingerprint_config: config, - firefox_prefs, - proxy: self.proxy, - headless: self.headless, - target_os: target_os.to_string(), - }) - } - - /// Build the complete Camoufox launch configuration with async geolocation support. - /// This method should be used when geoip option is set to Auto. - pub async fn build_async(self) -> Result { - // Get full proxy URL (with credentials) for IP detection - let proxy_url = self.proxy.as_ref().map(|p| { - if let (Some(user), Some(pass)) = (&p.username, &p.password) { - // Reconstruct URL with credentials: scheme://user:pass@host:port - if let Ok(mut parsed) = url::Url::parse(&p.server) { - let _ = parsed.set_username(user); - let _ = parsed.set_password(Some(pass)); - parsed.to_string() - } else { - p.server.clone() - } - } else if let Some(user) = &p.username { - if let Ok(mut parsed) = url::Url::parse(&p.server) { - let _ = parsed.set_username(user); - parsed.to_string() - } else { - p.server.clone() - } - } else { - p.server.clone() - } - }); - let geoip_option = self.geoip.clone(); - let block_webrtc = self.block_webrtc; - - // Build base config first - let mut launch_config = self.build()?; - - // Handle geolocation if geoip option is set - if let Some(geoip) = geoip_option { - let ip = match geoip { - GeoIPOption::Auto => { - // Fetch public IP, optionally through proxy - geolocation::fetch_public_ip(proxy_url.as_deref()) - .await - .map_err(geolocation::GeolocationError::from)? - } - GeoIPOption::IP(ip_str) => { - if !geolocation::validate_ip(&ip_str) { - return Err(ConfigError::Geolocation( - geolocation::GeolocationError::InvalidIP(ip_str), - )); - } - ip_str - } - }; - - // Get geolocation from IP - match geolocation::get_geolocation(&ip) { - Ok(geo) => { - // Add geolocation config - for (key, value) in geo.as_config() { - launch_config.fingerprint_config.insert(key, value); - } - - // Add WebRTC IP spoofing if not blocked - if !block_webrtc { - if geolocation::is_ipv4(&ip) { - launch_config - .fingerprint_config - .insert("webrtc:ipv4".to_string(), serde_json::json!(ip)); - } else if geolocation::is_ipv6(&ip) { - launch_config - .fingerprint_config - .insert("webrtc:ipv6".to_string(), serde_json::json!(ip)); - } - } - - log::info!( - "Applied geolocation from IP {}: {} ({})", - ip, - geo.locale.as_string(), - geo.timezone - ); - } - Err(e) => { - log::warn!("Failed to get geolocation for IP {}: {}", ip, e); - // Continue without geolocation rather than failing - } - } - } - - Ok(launch_config) - } -} - -/// Complete Camoufox launch configuration. -#[derive(Debug, Clone)] -pub struct CamoufoxLaunchConfig { - pub fingerprint_config: HashMap, - pub firefox_prefs: HashMap, - pub proxy: Option, - pub headless: bool, - pub target_os: String, -} - -impl CamoufoxLaunchConfig { - /// Get environment variables for launching Camoufox. - pub fn get_env_vars(&self) -> Result, serde_json::Error> { - env_vars::config_to_env_vars(&self.fingerprint_config) - } - - /// Get the config as JSON string. - pub fn config_json(&self) -> Result { - serde_json::to_string(&self.fingerprint_config) - } -} - -/// Error type for configuration operations. -#[derive(Debug, thiserror::Error)] -pub enum ConfigError { - #[error("Fingerprint generation error: {0}")] - Fingerprint(#[from] crate::camoufox::fingerprint::FingerprintError), - - #[error("JSON error: {0}")] - Json(#[from] serde_json::Error), - - #[error("WebGL error: {0}")] - WebGL(#[from] webgl::WebGLError), - - #[error("Invalid proxy configuration: {0}")] - InvalidProxy(String), - - #[error("Geolocation error: {0}")] - Geolocation(#[from] crate::camoufox::geolocation::GeolocationError), -} - -/// Get Firefox version from executable path. -pub fn get_firefox_version(executable_path: &Path) -> Option { - // Try to read version.json from the same directory - let version_path = executable_path.parent()?.join("version.json"); - - if let Ok(content) = std::fs::read_to_string(&version_path) { - if let Ok(json) = serde_json::from_str::(&content) { - if let Some(version_str) = json.get("version").and_then(|v| v.as_str()) { - // Parse major version from "135.0" or similar - let major: u32 = version_str.split('.').next()?.parse().ok()?; - return Some(major); - } - } - } - - None -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_config_builder() { - let config = CamoufoxConfigBuilder::new() - .operating_system("windows") - .block_images(true) - .build(); - - assert!(config.is_ok()); - let config = config.unwrap(); - assert!(config - .firefox_prefs - .contains_key("permissions.default.image")); - } - - #[test] - fn test_replace_ff_version() { - let ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"; - let replaced = replace_ff_version(ua, 140); - assert!(replaced.contains("140.0")); - } - - #[test] - fn test_from_browserforge() { - let fingerprint = Fingerprint { - screen: ScreenFingerprint { - width: 1920, - height: 1080, - avail_width: 1920, - avail_height: 1040, - color_depth: 24, - pixel_depth: 24, - inner_width: 1903, - inner_height: 969, - outer_width: 1920, - outer_height: 1040, - ..Default::default() - }, - navigator: NavigatorFingerprint { - user_agent: "Mozilla/5.0 Firefox/135.0".to_string(), - platform: "Win32".to_string(), - language: "en-US".to_string(), - languages: vec!["en-US".to_string()], - hardware_concurrency: 8, - ..Default::default() - }, - ..Default::default() - }; - - let config = from_browserforge(&fingerprint, Some(140)); - - assert!(config.contains_key("navigator.userAgent")); - assert!(config.contains_key("screen.width")); - } -} diff --git a/src-tauri/src/camoufox/data/browser-helper-file.json b/src-tauri/src/camoufox/data/browser-helper-file.json deleted file mode 100644 index 49c114a..0000000 --- a/src-tauri/src/camoufox/data/browser-helper-file.json +++ /dev/null @@ -1,120 +0,0 @@ -[ - "chrome/143.0.0.0|2", - "safari/18.3.1|2", - "chrome/101.0.4951.54|2", - "chrome/139.0.0.0|2", - "safari/16.6|2", - "safari/26.2|2", - "safari/18.6|2", - "safari/26.1|2", - "chrome/142.0.0.0|2", - "chrome/141.0.0.0|2", - "safari/18.7.3|2", - "edge/143.0.0.0|2", - "safari/18.4|2", - "safari/17.3.1|2", - "chrome/135.0.0.0|2", - "safari/18.5|2", - "safari/18.7.2|2", - "chrome/143.0.0.0|1", - "chrome/128.0.0.0|2", - "chrome/131.0.0.0|2", - "safari/26.3|2", - "safari/26.0.1|2", - "chrome/114.0.0.0|2", - "safari/18.1|2", - "firefox/147.0|2", - "safari/17.5|2", - "chrome/140.0.0.0|2", - "safari/16.6.1|2", - "firefox/146.0|2", - "chrome/124.0.0.0|1", - "chrome/34.0.1847.114|2", - "chrome/130.0.0.0|2", - "safari/15.6.7|2", - "chrome/144.0.0.0|2", - "safari/18.3|2", - "safari/16.4|2", - "chrome/141.0.7390.122|1", - "firefox/140.0|2", - "chrome/138.0.0.0|2", - "firefox/135.0|2", - "safari/17.6|2", - "chrome/132.0.0.0|2", - "chrome/109.0.0.0|2", - "chrome/92.0.4515.131|2", - "chrome/136.0.0.0|2", - "edge/142.0.0.0|2", - "chrome/125.0.0.0|2", - "safari/17.8|2", - "edge/143.0.0.0|1", - "chrome/123.0.0.0|2", - "chrome/137.0.0.0|2", - "chrome/129.0.0.0|2", - "chrome/126.0.0.0|2", - "safari/26.0|2", - "chrome/133.0.0.0|2", - "chrome/119.0.0.0|2", - "chrome/145.0.0.0|2", - "firefox/145.0|2", - "safari/17.3|2", - "safari/18.2|2", - "safari/16.5.2|2", - "safari/17.4|2", - "chrome/120.0.0.0|2", - "chrome/116.0.0.0|2", - "firefox/141.0|2", - "safari/17.4.1|2", - "chrome/134.0.0.0|2", - "safari/15.4|2", - "safari/18.1.1|2", - "edge/144.0.0.0|2", - "firefox/144.0|2", - "safari/16.3|2", - "safari/13.0.3|2", - "chrome/131.0.6778.33|2", - "edge/145.0.0.0|2", - "edge/139.0.0.0|2", - "safari/17.1|2", - "chrome/133.0.0.0|1", - "chrome/121.0.0.0|2", - "chrome/124.0.0.0|2", - "chrome/127.0.0.0|2", - "chrome/122.0.6261.95|2", - "chrome/91.0.4450.0|2", - "edge/134.0.0.0|2", - "chrome/134.0.6998.179|2", - "chrome/122.0.0.0|2", - "firefox/128.0|2", - "chrome/142.0.0.0|1", - "safari/18.7|2", - "safari/17.8.1|2", - "firefox/115.0|2", - "safari/17.2|2", - "chrome/117.0.0.0|2", - "safari/18.0.1|2", - "chrome/139.0.7258.5|2", - "edge/140.0.0.0|2", - "safari/16.5|2", - "safari/18.6.2|2", - "firefox/136.0|2", - "safari/17.2.1|2", - "safari/18.0|2", - "safari/15.6.1|2", - "safari/26.2|1", - "safari/17.1.2|2", - "safari/17.7|2", - "safari/16.2|2", - "edge/122.0.0.0|2", - "chrome/139.0.0.0|1", - "safari/17.0|2", - "firefox/139.0|2", - "chrome/101.0.9316.173|2", - "chrome/101.0.4951.64|2", - "chrome/141.0.0.0|1", - "safari/15.5|2", - "safari/18.6|1", - "chrome/112.0.0.0|2", - "edge/135.0.0.0|2", - "chrome/140.0.0.0|1" -] diff --git a/src-tauri/src/camoufox/data/browserforge.yml b/src-tauri/src/camoufox/data/browserforge.yml deleted file mode 100644 index 7f7df90..0000000 --- a/src-tauri/src/camoufox/data/browserforge.yml +++ /dev/null @@ -1,68 +0,0 @@ -# Mappings of Browserforge fingerprints to Camoufox config properties. - -navigator: - # Note: Browserforge tends to have outdated UAs. - # The version will be replaced in Camoufox. - userAgent: navigator.userAgent - # userAgentData not in Firefox - doNotTrack: navigator.doNotTrack - appCodeName: navigator.appCodeName - appName: navigator.appName - appVersion: navigator.appVersion - oscpu: navigator.oscpu - # webdriver is always True - # Locale is now implemented separately: - # language: navigator.language - # languages: navigator.languages - platform: navigator.platform - # deviceMemory not in Firefox - hardwareConcurrency: navigator.hardwareConcurrency - product: navigator.product - # Never override productSub #105 - # productSub: navigator.productSub - # vendor is not necessary - # vendorSub is not necessary - maxTouchPoints: navigator.maxTouchPoints - extraProperties: - # Note: Changing pdfViewerEnabled is not recommended. This will be kept to True. - globalPrivacyControl: navigator.globalPrivacyControl - -screen: - # hasHDR is not implemented in Camoufox - availLeft: screen.availLeft - availTop: screen.availTop - availWidth: screen.availWidth - availHeight: screen.availHeight - height: screen.height - width: screen.width - colorDepth: screen.colorDepth - pixelDepth: screen.pixelDepth - # devicePixelRatio is not recommended. Any value other than 1.0 is suspicious. - pageXOffset: screen.pageXOffset - pageYOffset: screen.pageYOffset - outerHeight: window.outerHeight - outerWidth: window.outerWidth - innerHeight: window.innerHeight - innerWidth: window.innerWidth - screenX: window.screenX - screenY: window.screenY - # Tends to generate out of bounds (network inconsistencies): - # clientWidth: document.body.clientWidth - # clientHeight: document.body.clientHeight - -# videoCard: -# renderer: webgl:renderer -# vendor: webgl:vendor - -headers: - # headers.User-Agent is redundant with navigator.userAgent - # headers.Accept-Language is redundant with locale:* - Accept-Encoding: headers.Accept-Encoding - -battery: - charging: battery:charging - chargingTime: battery:chargingTime - dischargingTime: battery:dischargingTime - -# Unsupported: videoCodecs, audioCodecs, pluginsData, multimediaDevices -# Fonts are listed through the launcher. diff --git a/src-tauri/src/camoufox/data/fingerprint-network-definition.zip b/src-tauri/src/camoufox/data/fingerprint-network-definition.zip deleted file mode 100644 index 06000f9066cb13c1e159396094f7a075be841d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 601335 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 kkK&r*H(iu2_TMJS~$b=<81{*cEY_7 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�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%0Do7v(m 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⩔2hH- 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

- - { - setCamoufoxConfigDialogOpen(false); + setWayfernConfigDialogOpen(false); }} - profile={currentProfileForCamoufoxConfig} - onSave={handleSaveCamoufoxConfig} - onSaveWayfern={handleSaveWayfernConfig} + profile={currentProfileForWayfernConfig} + onSave={handleSaveWayfernConfig} isRunning={ - currentProfileForCamoufoxConfig - ? runningProfiles.has(currentProfileForCamoufoxConfig.id) + currentProfileForWayfernConfig + ? runningProfiles.has(currentProfileForWayfernConfig.id) : false } crossOsUnlocked={crossOsUnlocked} @@ -2116,7 +2044,6 @@ export default function Home() { { setWindowResizeWarningOpen(false); windowResizeWarningResolver.current?.(proceed); diff --git a/src/components/camoufox-config-dialog.tsx b/src/components/camoufox-config-dialog.tsx deleted file mode 100644 index 086aa8d..0000000 --- a/src/components/camoufox-config-dialog.tsx +++ /dev/null @@ -1,213 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { SharedCamoufoxConfigForm } from "@/components/shared-camoufox-config-form"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import { ScrollArea } from "@/components/ui/scroll-area"; -import { WayfernConfigForm } from "@/components/wayfern-config-form"; -import type { - BrowserProfile, - CamoufoxConfig, - CamoufoxOS, - WayfernConfig, -} from "@/types"; - -const getCurrentOS = (): CamoufoxOS => { - if (typeof navigator === "undefined") return "linux"; - const platform = navigator.platform.toLowerCase(); - if (platform.includes("win")) return "windows"; - if (platform.includes("mac")) return "macos"; - return "linux"; -}; - -import { LoadingButton } from "./loading-button"; -import { RippleButton } from "./ui/ripple"; - -interface CamoufoxConfigDialogProps { - isOpen: boolean; - onClose: () => void; - profile: BrowserProfile | null; - onSave: (profile: BrowserProfile, config: CamoufoxConfig) => Promise; - onSaveWayfern?: ( - profile: BrowserProfile, - config: CamoufoxConfig, - ) => Promise; - isRunning?: boolean; - crossOsUnlocked?: boolean; -} - -export function CamoufoxConfigDialog({ - isOpen, - onClose, - profile, - onSave, - onSaveWayfern, - isRunning = false, - crossOsUnlocked = false, -}: CamoufoxConfigDialogProps) { - const { t } = useTranslation(); - // Use union type to support both Camoufox and Wayfern configs - const [config, setConfig] = useState(() => ({ - geoip: true, - os: getCurrentOS(), - })); - const [isSaving, setIsSaving] = useState(false); - - const isAntiDetectBrowser = - profile?.browser === "camoufox" || profile?.browser === "wayfern"; - - // Initialize config when profile changes - useEffect(() => { - if (profile && isAntiDetectBrowser) { - const profileConfig = - profile.browser === "wayfern" - ? profile.wayfern_config - : profile.camoufox_config; - setConfig( - profileConfig || { - geoip: true, - os: getCurrentOS(), - }, - ); - } - }, [profile, isAntiDetectBrowser]); - - const updateConfig = ( - key: keyof CamoufoxConfig | keyof WayfernConfig, - value: unknown, - ) => { - setConfig((prev) => ({ ...prev, [key]: value })); - }; - - const handleSave = async () => { - if (!profile) return; - - // Validate fingerprint JSON if it exists - if (config.fingerprint) { - try { - JSON.parse(config.fingerprint); - } catch (_error) { - const { toast } = await import("sonner"); - toast.error(t("camoufoxDialog.invalidFingerprint"), { - description: t("camoufoxDialog.invalidFingerprintDescription"), - }); - return; - } - } - - setIsSaving(true); - try { - if (profile.browser === "wayfern" && onSaveWayfern) { - await onSaveWayfern(profile, config as CamoufoxConfig); - } else { - await onSave(profile, config as CamoufoxConfig); - } - onClose(); - } catch (error) { - console.error("Failed to save config:", error); - const { toast } = await import("sonner"); - toast.error(t("camoufoxDialog.saveFailed"), { - description: - error instanceof Error - ? error.message - : t("camoufoxDialog.unknownError"), - }); - } finally { - setIsSaving(false); - } - }; - - const handleClose = () => { - // Reset config to original when closing without saving - if (profile && isAntiDetectBrowser) { - const profileConfig = - profile.browser === "wayfern" - ? profile.wayfern_config - : profile.camoufox_config; - setConfig( - profileConfig || { - geoip: true, - os: getCurrentOS(), - }, - ); - } - onClose(); - }; - - if (!profile || !isAntiDetectBrowser) { - return null; - } - - const browserName = profile.browser === "wayfern" ? "Wayfern" : "Camoufox"; - - return ( - - - - - {isRunning - ? t("camoufoxDialog.titleView", { - name: profile.name, - browser: browserName, - }) - : t("camoufoxDialog.titleConfigure", { - name: profile.name, - browser: browserName, - })} - - - - -
- {profile.browser === "wayfern" ? ( - - ) : ( - - )} -
-
- - - - {isRunning ? t("common.buttons.close") : t("common.buttons.cancel")} - - {!isRunning && ( - - {t("common.buttons.save")} - - )} - -
-
- ); -} diff --git a/src/components/camoufox-deprecation-dialog.tsx b/src/components/camoufox-deprecation-dialog.tsx deleted file mode 100644 index e901aff..0000000 --- a/src/components/camoufox-deprecation-dialog.tsx +++ /dev/null @@ -1,78 +0,0 @@ -"use client"; - -import { openUrl } from "@tauri-apps/plugin-opener"; -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { LuTriangleAlert } from "react-icons/lu"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; -import type { BrowserProfile } from "@/types"; -import { RippleButton } from "./ui/ripple"; - -interface CamoufoxDeprecationDialogProps { - profiles: BrowserProfile[]; -} - -/** - * Warns users who still have Camoufox profiles that Camoufox support is ending. - * Shown once per app session (this component mounts for the app lifetime), only - * when at least one Camoufox profile exists. Not a toast — a blocking dialog so - * the deprecation can't be missed. - */ -export function CamoufoxDeprecationDialog({ - profiles, -}: CamoufoxDeprecationDialogProps) { - const { t } = useTranslation(); - const [isOpen, setIsOpen] = useState(false); - const [shown, setShown] = useState(false); - - useEffect(() => { - if (shown) return; - const hasCamoufox = profiles.some((p) => p.browser === "camoufox"); - if (hasCamoufox) { - setIsOpen(true); - setShown(true); - } - }, [profiles, shown]); - - return ( - - - - - - {t("camoufoxDeprecation.title")} - - - {t("camoufoxDeprecation.description")} - - - - { - void openUrl( - "https://github.com/zhom/donutbrowser/discussions/426", - ); - }} - > - {t("common.buttons.learnMore")} - - { - setIsOpen(false); - }} - > - {t("camoufoxDeprecation.acknowledge")} - - - - - ); -} diff --git a/src/components/cookie-copy-dialog.tsx b/src/components/cookie-copy-dialog.tsx index aa37139..6005d6f 100644 --- a/src/components/cookie-copy-dialog.tsx +++ b/src/components/cookie-copy-dialog.tsx @@ -84,9 +84,7 @@ export function CookieCopyDialog({ // dead-end state (source picked = target list empty = copy button disabled). const eligibleSourceProfiles = useMemo(() => { return profiles.filter( - (p) => - !selectedProfiles.includes(p.id) && - (p.browser === "wayfern" || p.browser === "camoufox"), + (p) => !selectedProfiles.includes(p.id) && p.browser === "wayfern", ); }, [profiles, selectedProfiles]); @@ -95,7 +93,7 @@ export function CookieCopyDialog({ (p) => selectedProfiles.includes(p.id) && p.id !== sourceProfileId && - (p.browser === "wayfern" || p.browser === "camoufox"), + p.browser === "wayfern", ); }, [profiles, selectedProfiles, sourceProfileId]); diff --git a/src/components/create-profile-dialog.tsx b/src/components/create-profile-dialog.tsx index afc19a4..d00800e 100644 --- a/src/components/create-profile-dialog.tsx +++ b/src/components/create-profile-dialog.tsx @@ -66,7 +66,7 @@ const getCurrentOS = (): WayfernOS => { import { RippleButton } from "./ui/ripple"; -type BrowserTypeString = "camoufox" | "wayfern"; +type BrowserTypeString = "wayfern"; interface CreateProfileDialogProps { isOpen: boolean; @@ -113,8 +113,8 @@ export function CreateProfileDialog({ const proxyListboxIdAntiDetect = useId(); const proxyListboxIdRegular = useId(); const [profileName, setProfileName] = useState(""); - // Camoufox is deprecated: only Wayfern profiles can be created, so the dialog - // opens straight into the Wayfern config step (no browser-selection screen). + // Only Wayfern profiles can be created, so the dialog opens straight into + // the Wayfern config step (no browser-selection screen). const [currentStep, setCurrentStep] = useState< "browser-selection" | "browser-config" >("browser-config"); @@ -139,8 +139,7 @@ export function CreateProfileDialog({ setCurrentStep("browser-config"); }; - // Reset the form fields without leaving the Wayfern config step — Camoufox is - // deprecated, so there is no browser-selection screen to go back to. + // Reset the form fields without leaving the Wayfern config step. const resetForm = () => { setSelectedBrowser("wayfern"); setProfileName(""); @@ -286,8 +285,7 @@ export function CreateProfileDialog({ useEffect(() => { if (isOpen) { void loadSupportedBrowsers(); - // Load downloaded Wayfern versions up front so the availability gate is - // accurate. Camoufox is deprecated and no longer creatable. + // Load downloaded Wayfern versions up front so the availability gate is accurate. void loadDownloadedVersions("wayfern"); // Load release types when a browser is selected if (selectedBrowser) { @@ -395,7 +393,7 @@ export function CreateProfileDialog({ : undefined; try { if (activeTab === "anti-detect") { - // Camoufox is deprecated — only Wayfern anti-detect profiles are created. + // Only Wayfern anti-detect profiles are created. const bestWayfernVersion = getCreatableVersion("wayfern"); if (!bestWayfernVersion) { console.error("No Wayfern version available"); @@ -430,7 +428,7 @@ export function CreateProfileDialog({ return; } - // Use the best available version (stable preferred, nightly as fallback) + // Use the latest available Wayfern version const bestVersion = getCreatableVersion(selectedBrowser); if (!bestVersion) { console.error("No version available"); @@ -465,8 +463,7 @@ export function CreateProfileDialog({ // Cancel any ongoing loading loadingBrowserRef.current = null; - // Reset all states. Stay on the Wayfern config step — Camoufox is - // deprecated, so the browser-selection screen is gone. + // Reset all states. Stay on the Wayfern config step. setProfileName(""); setCurrentStep("browser-config"); setActiveTab("anti-detect"); @@ -535,10 +532,7 @@ export function CreateProfileDialog({ {currentStep === "browser-selection" ? t("createProfile.title") : t("createProfile.configureTitle", { - browser: - selectedBrowser === "wayfern" - ? t("createProfile.chromiumLabel") - : t("createProfile.firefoxLabel"), + browser: t("createProfile.chromiumLabel"), })} @@ -591,9 +585,6 @@ export function CreateProfileDialog({
- {/* Camoufox is deprecated — no longer offered for new - profiles. Only Wayfern can be created. */} - {!getCreatableVersion("wayfern") && (

{t("createProfile.browsersDownloading")} @@ -616,7 +607,6 @@ export function CreateProfileDialog({

{regularBrowsers.map((browser) => { - if (browser.value === "camoufox") return null; // Skip camoufox as it's handled in anti-detect tab const IconComponent = getBrowserIcon(browser.value); return (
) : ( - // Regular Browser Configuration (should not happen in - // the anti-detect tab; Camoufox creation is removed). + // Regular Browser Configuration (should not happen in the anti-detect tab).
{selectedBrowser && (
diff --git a/src/components/extension-management-dialog.tsx b/src/components/extension-management-dialog.tsx index d588ea6..35cfa5d 100644 --- a/src/components/extension-management-dialog.tsx +++ b/src/components/extension-management-dialog.tsx @@ -13,7 +13,7 @@ import { invoke } from "@tauri-apps/api/core"; import { listen } from "@tauri-apps/api/event"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { FaChrome, FaFirefox } from "react-icons/fa"; +import { FaChrome } from "react-icons/fa"; import { GoPlus } from "react-icons/go"; import { LuChevronDown, @@ -652,34 +652,19 @@ export function ExtensionManagementDialog({ const renderCompatIcons = useCallback( (compat: string[]) => { const hasChromium = compat.includes("chromium"); - const hasFirefox = compat.includes("firefox"); - if (!hasChromium && !hasFirefox) return null; + if (!hasChromium) return null; return (
- {hasChromium && ( - - - - - - - - {t("extensions.compatibility.chromium")} - - - )} - {hasFirefox && ( - - - - - - - - {t("extensions.compatibility.firefox")} - - - )} + + + + + + + + {t("extensions.compatibility.chromium")} + +
); }, diff --git a/src/components/import-profile-dialog.tsx b/src/components/import-profile-dialog.tsx index 401aa20..b87639f 100644 --- a/src/components/import-profile-dialog.tsx +++ b/src/components/import-profile-dialog.tsx @@ -39,9 +39,7 @@ import { cn } from "@/lib/utils"; import type { DetectedProfile, WayfernConfig } from "@/types"; import { RippleButton } from "./ui/ripple"; -const getMappedBrowser = (browser: string): "camoufox" | "wayfern" => { - if (["firefox", "firefox-developer", "zen"].includes(browser)) - return "camoufox"; +const getMappedBrowser = (_browser: string): "wayfern" => { return "wayfern"; }; @@ -90,8 +88,7 @@ export function ImportProfileDialog({ useBrowserSupport(); const { storedProxies } = useProxyEvents(); - // Firefox-based browsers map to the deprecated Camoufox and can no longer be - // imported (the backend rejects them); only offer Chromium-family sources. + // Only Chromium-family browsers can be imported as Wayfern profiles. const importableBrowsers = supportedBrowsers.filter( (browser) => getMappedBrowser(browser) === "wayfern", ); @@ -189,8 +186,6 @@ export function ImportProfileDialog({ browserType, newProfileName, proxyId: selectedProxyId ?? null, - // Camoufox import is deprecated/blocked; only Wayfern configs are sent. - camoufoxConfig: null, wayfernConfig: mappedBrowser === "wayfern" ? wayfernConfig : null, }); @@ -587,8 +582,6 @@ export function ImportProfileDialog({
- {/* Only Wayfern profiles are importable now (Camoufox/Firefox - import is deprecated and blocked). */} { diff --git a/src/components/profile-data-table.tsx b/src/components/profile-data-table.tsx index 374be8c..2d3920d 100644 --- a/src/components/profile-data-table.tsx +++ b/src/components/profile-data-table.tsx @@ -209,7 +209,7 @@ interface TableMeta { // Overflow actions onAssignProfilesToGroup?: (profileIds: string[]) => void; - onConfigureCamoufox?: (profile: BrowserProfile) => void; + onConfigureWayfern?: (profile: BrowserProfile) => void; onCloneProfile?: (profile: BrowserProfile) => void; onCopyCookiesToProfile?: (profile: BrowserProfile) => void; onOpenCookieManagement?: (profile: BrowserProfile) => void; @@ -1127,7 +1127,7 @@ interface ProfilesDataTableProps { onCloneProfile: (profile: BrowserProfile) => void | Promise; onDeleteProfile: (profile: BrowserProfile) => void | Promise; onRenameProfile: (profileId: string, newName: string) => Promise; - onConfigureCamoufox: (profile: BrowserProfile) => void; + onConfigureWayfern: (profile: BrowserProfile) => void; onCopyCookiesToProfile?: (profile: BrowserProfile) => void; onOpenCookieManagement?: (profile: BrowserProfile) => void; runningProfiles: Set; @@ -1177,7 +1177,7 @@ export function ProfilesDataTable({ onCloneProfile, onDeleteProfile, onRenameProfile, - onConfigureCamoufox, + onConfigureWayfern, onCopyCookiesToProfile, onOpenCookieManagement, runningProfiles, @@ -1952,7 +1952,7 @@ export function ProfilesDataTable({ void onCloneProfile(profile); } : undefined, - onConfigureCamoufox, + onConfigureWayfern, onCopyCookiesToProfile, onOpenCookieManagement, @@ -2030,7 +2030,7 @@ export function ProfilesDataTable({ onLaunchProfile, onAssignProfilesToGroup, onCloneProfile, - onConfigureCamoufox, + onConfigureWayfern, onCopyCookiesToProfile, onOpenCookieManagement, syncStatuses, @@ -2086,10 +2086,7 @@ export function ProfilesDataTable({ // Cross-OS profiles: show OS icon when checkboxes aren't visible, show checkbox when they are if (isCrossOs && !meta.showCheckboxes && !isSelected) { - const resolvedOs = - profile.host_os || - profile.camoufox_config?.os || - profile.wayfern_config?.os; + const resolvedOs = profile.host_os || profile.wayfern_config?.os; const osName = resolvedOs ? getOSDisplayName(resolvedOs) : "another OS"; @@ -2128,10 +2125,7 @@ export function ProfilesDataTable({ // Cross-OS profiles with checkboxes visible: show checkbox (selectable for bulk delete) if (isCrossOs && (meta.showCheckboxes || isSelected)) { - const resolvedOs = - profile.host_os || - profile.camoufox_config?.os || - profile.wayfern_config?.os; + const resolvedOs = profile.host_os || profile.wayfern_config?.os; const osName = resolvedOs ? getOSDisplayName(resolvedOs) : "another OS"; @@ -3183,7 +3177,6 @@ export function ProfilesDataTable({ ? t("crossOs.viewOnly", { os: getOSDisplayName( row.original.host_os || - row.original.camoufox_config?.os || row.original.wayfern_config?.os || "", ), @@ -3273,7 +3266,7 @@ export function ProfilesDataTable({ }} onOpenProfileSyncDialog={onOpenProfileSyncDialog} onAssignProfilesToGroup={onAssignProfilesToGroup} - onConfigureCamoufox={onConfigureCamoufox} + onConfigureWayfern={onConfigureWayfern} onCopyCookiesToProfile={onCopyCookiesToProfile} onOpenCookieManagement={onOpenCookieManagement} onAssignExtensionGroup={onAssignExtensionGroup} diff --git a/src/components/profile-info-dialog.tsx b/src/components/profile-info-dialog.tsx index df58615..14cad66 100644 --- a/src/components/profile-info-dialog.tsx +++ b/src/components/profile-info-dialog.tsx @@ -33,7 +33,7 @@ import { LuUsers, LuX, } from "react-icons/lu"; -import { SharedCamoufoxConfigForm } from "@/components/shared-camoufox-config-form"; +import { SharedFingerprintConfigForm } from "@/components/shared-fingerprint-config-form"; import { Button } from "@/components/ui/button"; import { ColorPicker, @@ -71,7 +71,6 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { WayfernConfigForm } from "@/components/wayfern-config-form"; import { translateBackendError } from "@/lib/backend-errors"; import { getProfileIcon } from "@/lib/browser-utils"; import { formatRelativeTime } from "@/lib/flag-utils"; @@ -79,7 +78,6 @@ import { showErrorToast, showSuccessToast } from "@/lib/toast-utils"; import { cn } from "@/lib/utils"; import type { BrowserProfile, - CamoufoxConfig, ProfileGroup, StoredProxy, VpnConfig, @@ -95,7 +93,7 @@ interface ProfileInfoDialogProps { onOpenTrafficDialog?: (profileId: string) => void; onOpenProfileSyncDialog?: (profile: BrowserProfile) => void; onAssignProfilesToGroup?: (profileIds: string[]) => void; - onConfigureCamoufox?: (profile: BrowserProfile) => void; + onConfigureWayfern?: (profile: BrowserProfile) => void; onCopyCookiesToProfile?: (profile: BrowserProfile) => void; onOpenCookieManagement?: (profile: BrowserProfile) => void; onAssignExtensionGroup?: (profileIds: string[]) => void; @@ -271,7 +269,7 @@ export function ProfileInfoDialog({ onOpenTrafficDialog, onOpenProfileSyncDialog, onAssignProfilesToGroup, - onConfigureCamoufox, + onConfigureWayfern, onCopyCookiesToProfile, onOpenCookieManagement, onAssignExtensionGroup, @@ -340,8 +338,7 @@ export function ProfileInfoDialog({ if (!profile) return null; const ProfileIcon = getProfileIcon(profile); - const isCamoufoxOrWayfern = - profile.browser === "camoufox" || profile.browser === "wayfern"; + const isWayfern = profile.browser === "wayfern"; const isDeleteDisabled = isRunning; const proxyName = profile.proxy_id @@ -435,13 +432,13 @@ export function ProfileInfoDialog({ icon: , label: t("profiles.actions.changeFingerprint"), onClick: () => { - handleAction(() => onConfigureCamoufox?.(profile)); + handleAction(() => onConfigureWayfern?.(profile)); }, // Viewing and editing fingerprints both require an active paid plan. disabled: isDisabled || !crossOsUnlocked, proBadge: !crossOsUnlocked, runningBadge: isRunning, - hidden: !isCamoufoxOrWayfern || !onConfigureCamoufox, + hidden: !isWayfern || !onConfigureWayfern, }, { icon: , @@ -463,9 +460,7 @@ export function ProfileInfoDialog({ disabled: isDisabled, runningBadge: isRunning, hidden: - !isCamoufoxOrWayfern || - profile.ephemeral === true || - !onCopyCookiesToProfile, + !isWayfern || profile.ephemeral === true || !onCopyCookiesToProfile, }, { id: "cookiesManage", @@ -477,9 +472,7 @@ export function ProfileInfoDialog({ disabled: isDisabled, runningBadge: isRunning, hidden: - !isCamoufoxOrWayfern || - profile.ephemeral === true || - !onOpenCookieManagement, + !isWayfern || profile.ephemeral === true || !onOpenCookieManagement, }, { icon: , @@ -1772,9 +1765,8 @@ function CookiesSectionInline({ // Inline password set / change / remove form. Replaces three separate // nested modal dialogs with one in-page form that branches on the current // `password_protected` state of the profile. -// Inline fingerprint editor. Reuses SharedCamoufoxConfigForm (Camoufox/Firefox -// engine) and WayfernConfigForm (Chromium engine) so the same field set as -// the standalone dialog is available without opening a nested modal. +// Inline fingerprint editor. Reuses SharedFingerprintConfigForm so the same +// field set as the standalone dialog is available without opening a nested modal. function FingerprintSectionInline({ profile, isDisabled, @@ -1788,9 +1780,6 @@ function FingerprintSectionInline({ onSaved: () => void; t: (key: string, options?: Record) => string; }) { - const [camoufoxConfig, setCamoufoxConfig] = React.useState( - () => profile.camoufox_config ?? {}, - ); const [wayfernConfig, setWayfernConfig] = React.useState( () => profile.wayfern_config ?? {}, ); @@ -1798,19 +1787,15 @@ function FingerprintSectionInline({ const [error, setError] = React.useState(null); const [success, setSuccess] = React.useState(null); - // When the underlying profile changes (e.g. a different profile is opened - // in the dialog) reset the local form state to match. React.useEffect(() => { - setCamoufoxConfig(profile.camoufox_config ?? {}); setWayfernConfig(profile.wayfern_config ?? {}); setError(null); setSuccess(null); - }, [profile.camoufox_config, profile.wayfern_config]); + }, [profile.wayfern_config]); - const isCamoufox = profile.browser === "camoufox"; const isWayfern = profile.browser === "wayfern"; - if (!isCamoufox && !isWayfern) { + if (!isWayfern) { return (
@@ -1824,9 +1809,6 @@ function FingerprintSectionInline({ ); } - // Viewing and editing fingerprints both require an active paid plan - // (`crossOsUnlocked` is that paid flag here). Render a locked state instead of - // the editor so free users can neither see nor change the fingerprint. if (!crossOsUnlocked) { return (
@@ -1841,10 +1823,6 @@ function FingerprintSectionInline({ ); } - const onCamoufoxChange = (key: keyof CamoufoxConfig, value: unknown) => { - setCamoufoxConfig((prev) => ({ ...prev, [key]: value })); - setSuccess(null); - }; const onWayfernChange = (key: keyof WayfernConfig, value: unknown) => { setWayfernConfig((prev) => ({ ...prev, [key]: value })); setSuccess(null); @@ -1855,19 +1833,11 @@ function FingerprintSectionInline({ setError(null); setSuccess(null); try { - if (isCamoufox) { - await invoke("update_camoufox_config", { - profileId: profile.id, - config: camoufoxConfig, - }); - } else { - await invoke("update_wayfern_config", { - profileId: profile.id, - config: wayfernConfig, - }); - } + await invoke("update_wayfern_config", { + profileId: profile.id, + config: wayfernConfig, + }); setSuccess(t("common.buttons.saved")); - // Close the dialog once the fingerprint is saved. onSaved(); } catch (e) { setError(translateBackendError(t as never, e)); @@ -1876,12 +1846,8 @@ function FingerprintSectionInline({ } }; - const initial = isCamoufox - ? JSON.stringify(profile.camoufox_config ?? {}) - : JSON.stringify(profile.wayfern_config ?? {}); - const current = isCamoufox - ? JSON.stringify(camoufoxConfig) - : JSON.stringify(wayfernConfig); + const initial = JSON.stringify(profile.wayfern_config ?? {}); + const current = JSON.stringify(wayfernConfig); const dirty = current !== initial; return ( @@ -1894,30 +1860,16 @@ function FingerprintSectionInline({ {t("profileInfo.sectionDesc.fingerprint")}

- {isCamoufox && ( - - )} - {isWayfern && ( - - )} + {error &&

{error}

} {success && !error &&

{success}

} @@ -1939,7 +1891,6 @@ function FingerprintSectionInline({ variant="ghost" className="h-7 text-xs" onClick={() => { - setCamoufoxConfig(profile.camoufox_config ?? {}); setWayfernConfig(profile.wayfern_config ?? {}); setError(null); setSuccess(null); diff --git a/src/components/release-type-selector.tsx b/src/components/release-type-selector.tsx deleted file mode 100644 index 669a3b1..0000000 --- a/src/components/release-type-selector.tsx +++ /dev/null @@ -1,200 +0,0 @@ -"use client"; - -import { useId, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { LuCheck, LuChevronsUpDown, LuDownload } from "react-icons/lu"; -import { LoadingButton } from "@/components/loading-button"; -import { Badge } from "@/components/ui/badge"; -import { - Command, - CommandEmpty, - CommandGroup, - CommandItem, - CommandList, -} from "@/components/ui/command"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { cn } from "@/lib/utils"; -import type { BrowserReleaseTypes } from "@/types"; -import { RippleButton } from "./ui/ripple"; - -interface ReleaseTypeSelectorProps { - selectedReleaseType: "stable" | "nightly" | null; - onReleaseTypeSelect: (releaseType: "stable" | "nightly" | null) => void; - availableReleaseTypes: BrowserReleaseTypes; - isDownloading: boolean; - onDownload: () => void; - placeholder?: string; - showDownloadButton?: boolean; - downloadedVersions?: string[]; -} - -export function ReleaseTypeSelector({ - selectedReleaseType, - onReleaseTypeSelect, - availableReleaseTypes, - isDownloading, - onDownload, - placeholder, - showDownloadButton = true, - downloadedVersions = [], -}: ReleaseTypeSelectorProps) { - const { t } = useTranslation(); - const [popoverOpen, setPopoverOpen] = useState(false); - const listboxId = useId(); - const effectivePlaceholder = - placeholder ?? t("releaseTypeSelector.placeholder"); - - const releaseOptions = [ - ...(availableReleaseTypes.stable - ? [{ type: "stable" as const, version: availableReleaseTypes.stable }] - : []), - ...(availableReleaseTypes.nightly - ? [{ type: "nightly" as const, version: availableReleaseTypes.nightly }] - : []), - ]; - - // Only show dropdown if there are multiple release types available - const showDropdown = releaseOptions.length > 1; - - // If only one release type is available, auto-select it - if (!showDropdown && releaseOptions.length === 1 && !selectedReleaseType) { - setTimeout(() => { - onReleaseTypeSelect(releaseOptions[0].type); - }, 0); - } - - const selectedDisplayText = selectedReleaseType - ? selectedReleaseType === "stable" - ? t("releaseTypeSelector.stable") - : t("releaseTypeSelector.nightly") - : effectivePlaceholder; - - const selectedVersion = - selectedReleaseType === "stable" - ? availableReleaseTypes.stable - : selectedReleaseType === "nightly" - ? availableReleaseTypes.nightly - : null; - - const isVersionDownloaded = - selectedVersion && downloadedVersions.includes(selectedVersion); - - return ( -
- {showDropdown ? ( - - - - {selectedDisplayText} - - - - - - - {t("releaseTypeSelector.noReleaseTypes")} - - - - {releaseOptions.map((option) => { - const isDownloaded = downloadedVersions.includes( - option.version, - ); - return ( - { - const selectedType = currentValue as - | "stable" - | "nightly"; - onReleaseTypeSelect( - selectedType === selectedReleaseType - ? null - : selectedType, - ); - setPopoverOpen(false); - }} - > - -
- {option.type} - {option.type === "nightly" && ( - - {t("releaseTypeSelector.nightly")} - - )} - - {option.version} - - {isDownloaded && ( - - {t("releaseTypeSelector.downloaded")} - - )} -
-
- ); - })} -
-
-
-
-
- ) : ( - // Show a simple display when only one release type is available - releaseOptions.length === 1 && ( -
- - {releaseOptions[0].type} - - - {releaseOptions[0].version} - - {downloadedVersions.includes(releaseOptions[0].version) && ( - - {t("releaseTypeSelector.downloaded")} - - )} -
- ) - )} - - {showDownloadButton && - selectedReleaseType && - selectedVersion && - !isVersionDownloaded && ( - { - onDownload(); - }} - variant="outline" - className="w-full" - > - - {isDownloading - ? t("releaseTypeSelector.downloading") - : t("releaseTypeSelector.downloadBrowser")} - - )} -
- ); -} diff --git a/src/components/shared-camoufox-config-form.tsx b/src/components/shared-camoufox-config-form.tsx deleted file mode 100644 index a87055b..0000000 --- a/src/components/shared-camoufox-config-form.tsx +++ /dev/null @@ -1,1382 +0,0 @@ -"use client"; - -import { invoke } from "@tauri-apps/api/core"; -import { useEffect, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { LoadingButton } from "@/components/loading-button"; -import MultipleSelector, { type Option } from "@/components/multiple-selector"; -import { Alert, AlertDescription } from "@/components/ui/alert"; -import { Checkbox } from "@/components/ui/checkbox"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; -import { ProBadge } from "@/components/ui/pro-badge"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { Textarea } from "@/components/ui/textarea"; -import type { - CamoufoxConfig, - CamoufoxFingerprintConfig, - CamoufoxOS, -} from "@/types"; - -interface SharedCamoufoxConfigFormProps { - config: CamoufoxConfig; - onConfigChange: (key: keyof CamoufoxConfig, value: unknown) => void; - className?: string; - isCreating?: boolean; // Flag to indicate if this is for creating a new profile - forceAdvanced?: boolean; // Force advanced mode (for editing) - readOnly?: boolean; // Flag to indicate if the form should be read-only - browserType?: "camoufox" | "wayfern"; // Browser type to customize form options - crossOsUnlocked?: boolean; // Allow selecting non-current OS (paid feature) - limitedMode?: boolean; // Blur and disable advanced fields while keeping basic options accessible - profileVersion?: string; - profileBrowser?: string; -} - -// Determine if fingerprint editing should be disabled -const isFingerprintEditingDisabled = (config: CamoufoxConfig): boolean => { - return config.randomize_fingerprint_on_launch === true; -}; - -// Detect the current operating system -const getCurrentOS = (): CamoufoxOS => { - if (typeof navigator === "undefined") return "linux"; - const platform = navigator.platform.toLowerCase(); - if (platform.includes("win")) return "windows"; - if (platform.includes("mac")) return "macos"; - return "linux"; -}; - -// OS display labels -const osLabels: Record = { - windows: "Windows", - macos: "macOS", - linux: "Linux", -}; - -// Component for editing nested objects like webGl:parameters -interface ObjectEditorProps { - value: Record | undefined; - onChange: (value: Record | undefined) => void; - title: string; - readOnly?: boolean; -} - -function ObjectEditor({ - value, - onChange, - title, - readOnly = false, -}: ObjectEditorProps) { - const { t } = useTranslation(); - const [jsonString, setJsonString] = useState(""); - - useEffect(() => { - setJsonString(JSON.stringify(value ?? {}, null, 2)); - }, [value]); - - const handleChange = (newValue: string) => { - if (readOnly) return; - setJsonString(newValue); - try { - if (newValue.trim() === "" || newValue.trim() === "{}") { - onChange(undefined); // Treat empty objects as undefined - return; - } - const parsed = JSON.parse(newValue); - if ( - typeof parsed === "object" && - parsed !== null && - Object.keys(parsed).length === 0 - ) { - onChange(undefined); - return; - } - onChange(parsed as Record); - } catch (err) { - console.warn("Invalid JSON:", err); - } - }; - - return ( -
- -

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 Tlz*MUzb&D+fAQNbIJo}+6l)s& diff --git a/src-tauri/src/camoufox/data/fingerprint-presets-v135.json b/src-tauri/src/camoufox/data/fingerprint-presets-v135.json deleted file mode 100644 index 004d323..0000000 --- a/src-tauri/src/camoufox/data/fingerprint-presets-v135.json +++ /dev/null @@ -1,6029 +0,0 @@ -{ - "version": 1, - "generated_at": "2026-03-11T00:45:14.521Z", - "presets": { - "macos": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (U.K.)):en-GB:local", - "Eddy (English (U.S.)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (U.K.)):en-GB:local", - "Flo (English (U.S.)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (U.K.)):en-GB:local", - "Grandma (English (U.S.)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (U.K.)):en-GB:local", - "Grandpa (English (U.S.)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (U.K.)):en-GB:local", - "Reed (English (U.S.)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (U.K.)):en-GB:local", - "Rocko (English (U.S.)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (U.K.)):en-GB:local", - "Sandy (English (U.S.)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (U.K.)):en-GB:local", - "Shelley (English (U.S.)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1170 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 985 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 30, - "availWidth": 2048, - "availHeight": 1045, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (U.K.)):en-GB:local", - "Eddy (English (U.S.)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (U.K.)):en-GB:local", - "Flo (English (U.S.)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (U.K.)):en-GB:local", - "Grandma (English (U.S.)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (U.K.)):en-GB:local", - "Grandpa (English (U.S.)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (U.K.)):en-GB:local", - "Reed (English (U.S.)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (U.K.)):en-GB:local", - "Rocko (English (U.S.)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (U.K.)):en-GB:local", - "Sandy (English (U.S.)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (U.K.)):en-GB:local", - "Shelley (English (U.S.)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:109.0) Gecko/20100101 Firefox/115.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 714 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1800, - "height": 1169, - "colorDepth": 24, - "availWidth": 1800, - "availHeight": 1169, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 832, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 746, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1470, - "height": 956, - "colorDepth": 30, - "availWidth": 1470, - "availHeight": 923, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1011 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 480, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "MacIntel", - "hardwareConcurrency": 14, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1512, - "height": 982, - "colorDepth": 30, - "availWidth": 1512, - "availHeight": 886, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1050 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1470, - "height": 956, - "colorDepth": 30, - "availWidth": 1470, - "availHeight": 923, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1710, - "height": 1107, - "colorDepth": 30, - "availWidth": 1710, - "availHeight": 1068, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1440 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1055, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 827, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "MacIntel", - "hardwareConcurrency": 14, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1355, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 987 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1440 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1330, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1415 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 30, - "availWidth": 1680, - "availHeight": 947, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 870, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1792, - "height": 1120, - "colorDepth": 30, - "availWidth": 1792, - "availHeight": 1090, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1470, - "height": 956, - "colorDepth": 30, - "availWidth": 1470, - "availHeight": 924, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1170, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "MacIntel", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 1117, - "colorDepth": 30, - "availWidth": 1728, - "availHeight": 1084, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - } - ], - "windows": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1112, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 14, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 912, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1392 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 5 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 912, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1160 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1248, - "height": 702, - "colorDepth": 24, - "availWidth": 1248, - "availHeight": 663, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1632, - "height": 918, - "colorDepth": 24, - "availWidth": 1632, - "availHeight": 877, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 972, - "colorDepth": 24, - "availWidth": 1728, - "availHeight": 936 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Asaf - Hebrew (Israel):he-IL:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1024, - "height": 768, - "colorDepth": 24, - "availWidth": 1024, - "availHeight": 728 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Win32", - "hardwareConcurrency": 24, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 860 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Jakub - Czech (Czech Republic):cs-CZ:local", - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Stefanos - Greek (Greece):el-GR:local", - "Microsoft Naayf - Arabic (Saudi):ar-SA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Cosimo - Italian (Italy):it-IT:local", - "Microsoft Elsa - Italian (Italy):it-IT:local", - "Microsoft Frank - Dutch (Netherlands):nl-NL:local", - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Helia - Portuguese (Portugal):pt-PT:local", - "Microsoft Tolga - Turkish (Turkey):tr-TR:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Elsa Desktop - Italian (Italy):it-IT:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1504, - "height": 1003, - "colorDepth": 24, - "availWidth": 1504, - "availHeight": 955, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Huihui - Chinese (Simplified, PRC):zh-CN:local", - "Microsoft Kangkang - Chinese (Simplified, PRC):zh-CN:local", - "Microsoft Yaoyao - Chinese (Simplified, PRC):zh-CN:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Huihui Desktop - Chinese (Simplified):zh-CN:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel 945GM Direct3D11 vs_4_0 ps_4_0)" - }, - "speechVoices": ["Microsoft Anna - English (United States):en-US:local"] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 760, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1392, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1400, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 900 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 875, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 875, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Mozilla", - "unmaskedRenderer": "Mozilla" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 860 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1010 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_4_0 ps_4_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft James - English (Australia):en-AU:local", - "Microsoft Linda - English (Canada):en-CA:local", - "Microsoft Richard - English (Canada):en-CA:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Sean - English (Ireland):en-IE:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft Catherine - English (Australia):en-AU:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft George - English (Great Britain):en-GB:local", - "Microsoft Sarah Mobile - English (Great Britain):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 680, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1104, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1400, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1696, - "height": 954, - "colorDepth": 24, - "availWidth": 1696, - "availHeight": 910, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1963, - "height": 1104, - "colorDepth": 24, - "availWidth": 1963, - "availHeight": 1067, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2400, - "height": 1200, - "colorDepth": 24, - "availWidth": 2400, - "availHeight": 1200, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Mozilla", - "unmaskedRenderer": "Mozilla" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2293, - "height": 960, - "colorDepth": 24, - "availWidth": 2293, - "availHeight": 928, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 680, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1080, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1032, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 1 - }, - "screen": { - "width": 2400, - "height": 1350, - "colorDepth": 24, - "availWidth": 2400, - "availHeight": 1290 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 860 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1184, - "height": 666, - "colorDepth": 24, - "availWidth": 1184, - "availHeight": 636, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1382, - "height": 864, - "colorDepth": 24, - "availWidth": 1382, - "availHeight": 816, - "devicePixelRatio": 2.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2432, - "height": 1368, - "colorDepth": 24, - "availWidth": 2432, - "availHeight": 1307, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1360, - "height": 768, - "colorDepth": 24, - "availWidth": 1360, - "availHeight": 720 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 680, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Adam - Polish (Poland):pl-PL:local", - "Microsoft Paulina - Polish (Poland):pl-PL:local", - "Microsoft Paulina Desktop - Polish:pl-PL:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Adam - Polish (Poland):pl-PL:local", - "Microsoft Paulina - Polish (Poland):pl-PL:local", - "Microsoft Paulina Desktop - Polish:pl-PL:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Naayf - Arabic (Saudi):ar-SA:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Frank - Dutch (Netherlands):nl-NL:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Frank - Dutch (Netherlands):nl-NL:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - } - ], - "linux": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1368, - "height": 912, - "colorDepth": 24, - "availWidth": 1368, - "availHeight": 912, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1531, - "height": 957, - "colorDepth": 24, - "availWidth": 1531, - "availHeight": 957, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 5120, - "height": 1440, - "colorDepth": 24, - "availWidth": 5120, - "availHeight": 1440 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - }, - "speechVoices": ["dummy:en:remote"] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1854, - "availHeight": 1048 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 760, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1010 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "GeForce GTX 480, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 685 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 735 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 1152, - "colorDepth": 24, - "availWidth": 1728, - "availHeight": 1152, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1408 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - } - ] - } -} diff --git a/src-tauri/src/camoufox/data/fingerprint-presets-v150.json b/src-tauri/src/camoufox/data/fingerprint-presets-v150.json deleted file mode 100644 index ce31510..0000000 --- a/src-tauri/src/camoufox/data/fingerprint-presets-v150.json +++ /dev/null @@ -1,16511 +0,0 @@ -{ - "version": 1, - "generated_at": "2026-05-11T18:23:31.169717Z", - "source": "roverfox_fingerprints", - "min_firefox_version": 149, - "presets": { - "macos": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko/20100101 Firefox/151.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 720, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 800, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2240, - "height": 1260, - "colorDepth": 30, - "availWidth": 2240, - "availHeight": 1230, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1849, - "availHeight": 1050, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3200, - "height": 1800, - "colorDepth": 30, - "availWidth": 3200, - "availHeight": 1680, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 832, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 726, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 736, - "height": 414, - "colorDepth": 30, - "availWidth": 736, - "availHeight": 414, - "devicePixelRatio": 2.60869565217391 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2056, - "height": 1329, - "colorDepth": 30, - "availWidth": 2056, - "availHeight": 1253, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1410, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3360, - "height": 1890, - "colorDepth": 30, - "availWidth": 3360, - "availHeight": 1865, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 1117, - "colorDepth": 30, - "availWidth": 1728, - "availHeight": 1010, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1344, - "height": 840, - "colorDepth": 30, - "availWidth": 1344, - "availHeight": 764, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1170, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 30, - "availWidth": 2048, - "availHeight": 1122, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 30, - "availWidth": 3440, - "availHeight": 1364, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1360, - "height": 768, - "colorDepth": 30, - "availWidth": 1360, - "availHeight": 676, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 18, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 2160, - "colorDepth": 30, - "availWidth": 3840, - "availHeight": 2052, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1710, - "height": 1107, - "colorDepth": 30, - "availWidth": 1710, - "availHeight": 1031, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 715, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1710, - "height": 1107, - "colorDepth": 30, - "availWidth": 1710, - "availHeight": 1074, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 730, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko/20100101 Firefox/151.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 2560, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 2484, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Brutte notizie:en-US:local", - "Bahh:en-US:local", - "Campane:en-US:local", - "Boing:en-US:local", - "Bollicine:en-US:local", - "Carmit:he-IL:local", - "Violoncelli:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Tremolio:en-US:local", - "Eddy (Tedesco (Germania)):de-DE:local", - "Eddy (Inglese (UK)):en-GB:local", - "Eddy (Inglese (USA)):en-US:local", - "Eddy (Spagnolo (Spagna)):es-ES:local", - "Eddy (Spagnolo (Messico)):es-MX:local", - "Eddy (Finlandese (Finlandia)):fi-FI:local", - "Eddy (Francese (Canada)):fr-CA:local", - "Eddy (Francese (Francia)):fr-FR:local", - "Eddy (Italiano (Italia)):it-IT:local", - "Eddy (Giapponese (Giappone)):ja-JP:local", - "Eddy (Coreano (Corea del Sud)):ko-KR:local", - "Eddy (Portoghese (Brasile)):pt-BR:local", - "Eddy (Cinese (Cina continentale)):zh-CN:local", - "Eddy (Cinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (Tedesco (Germania)):de-DE:local", - "Flo (Inglese (UK)):en-GB:local", - "Flo (Inglese (USA)):en-US:local", - "Flo (Spagnolo (Spagna)):es-ES:local", - "Flo (Spagnolo (Messico)):es-MX:local", - "Flo (Finlandese (Finlandia)):fi-FI:local", - "Flo (Francese (Canada)):fr-CA:local", - "Flo (Francese (Francia)):fr-FR:local", - "Flo (Italiano (Italia)):it-IT:local", - "Flo (Giapponese (Giappone)):ja-JP:local", - "Flo (Coreano (Corea del Sud)):ko-KR:local", - "Flo (Portoghese (Brasile)):pt-BR:local", - "Flo (Cinese (Cina continentale)):zh-CN:local", - "Flo (Cinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Buone notizie:en-US:local", - "Grandma (Tedesco (Germania)):de-DE:local", - "Grandma (Inglese (UK)):en-GB:local", - "Grandma (Inglese (USA)):en-US:local", - "Grandma (Spagnolo (Spagna)):es-ES:local", - "Grandma (Spagnolo (Messico)):es-MX:local", - "Grandma (Finlandese (Finlandia)):fi-FI:local", - "Grandma (Francese (Canada)):fr-CA:local", - "Grandma (Francese (Francia)):fr-FR:local", - "Grandma (Italiano (Italia)):it-IT:local", - "Grandma (Giapponese (Giappone)):ja-JP:local", - "Grandma (Coreano (Corea del Sud)):ko-KR:local", - "Grandma (Portoghese (Brasile)):pt-BR:local", - "Grandma (Cinese (Cina continentale)):zh-CN:local", - "Grandma (Cinese (Taiwan)):zh-TW:local", - "Grandpa (Tedesco (Germania)):de-DE:local", - "Grandpa (Inglese (UK)):en-GB:local", - "Grandpa (Inglese (USA)):en-US:local", - "Grandpa (Spagnolo (Spagna)):es-ES:local", - "Grandpa (Spagnolo (Messico)):es-MX:local", - "Grandpa (Finlandese (Finlandia)):fi-FI:local", - "Grandpa (Francese (Canada)):fr-CA:local", - "Grandpa (Francese (Francia)):fr-FR:local", - "Grandpa (Italiano (Italia)):it-IT:local", - "Grandpa (Giapponese (Giappone)):ja-JP:local", - "Grandpa (Coreano (Corea del Sud)):ko-KR:local", - "Grandpa (Portoghese (Brasile)):pt-BR:local", - "Grandpa (Cinese (Cina continentale)):zh-CN:local", - "Grandpa (Cinese (Taiwan)):zh-TW:local", - "Giullare:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organo:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (Tedesco (Germania)):de-DE:local", - "Reed (Inglese (UK)):en-GB:local", - "Reed (Inglese (USA)):en-US:local", - "Reed (Spagnolo (Spagna)):es-ES:local", - "Reed (Spagnolo (Messico)):es-MX:local", - "Reed (Finlandese (Finlandia)):fi-FI:local", - "Reed (Francese (Canada)):fr-CA:local", - "Reed (Italiano (Italia)):it-IT:local", - "Reed (Giapponese (Giappone)):ja-JP:local", - "Reed (Coreano (Corea del Sud)):ko-KR:local", - "Reed (Portoghese (Brasile)):pt-BR:local", - "Reed (Cinese (Cina continentale)):zh-CN:local", - "Reed (Cinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (Tedesco (Germania)):de-DE:local", - "Rocko (Inglese (UK)):en-GB:local", - "Rocko (Inglese (USA)):en-US:local", - "Rocko (Spagnolo (Spagna)):es-ES:local", - "Rocko (Spagnolo (Messico)):es-MX:local", - "Rocko (Finlandese (Finlandia)):fi-FI:local", - "Rocko (Francese (Canada)):fr-CA:local", - "Rocko (Francese (Francia)):fr-FR:local", - "Rocko (Italiano (Italia)):it-IT:local", - "Rocko (Giapponese (Giappone)):ja-JP:local", - "Rocko (Coreano (Corea del Sud)):ko-KR:local", - "Rocko (Portoghese (Brasile)):pt-BR:local", - "Rocko (Cinese (Cina continentale)):zh-CN:local", - "Rocko (Cinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (Tedesco (Germania)):de-DE:local", - "Sandy (Inglese (UK)):en-GB:local", - "Sandy (Inglese (USA)):en-US:local", - "Sandy (Spagnolo (Spagna)):es-ES:local", - "Sandy (Spagnolo (Messico)):es-MX:local", - "Sandy (Finlandese (Finlandia)):fi-FI:local", - "Sandy (Francese (Canada)):fr-CA:local", - "Sandy (Francese (Francia)):fr-FR:local", - "Sandy (Italiano (Italia)):it-IT:local", - "Sandy (Giapponese (Giappone)):ja-JP:local", - "Sandy (Coreano (Corea del Sud)):ko-KR:local", - "Sandy (Portoghese (Brasile)):pt-BR:local", - "Sandy (Cinese (Cina continentale)):zh-CN:local", - "Sandy (Cinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (Tedesco (Germania)):de-DE:local", - "Shelley (Inglese (UK)):en-GB:local", - "Shelley (Inglese (USA)):en-US:local", - "Shelley (Spagnolo (Spagna)):es-ES:local", - "Shelley (Spagnolo (Messico)):es-MX:local", - "Shelley (Finlandese (Finlandia)):fi-FI:local", - "Shelley (Francese (Canada)):fr-CA:local", - "Shelley (Francese (Francia)):fr-FR:local", - "Shelley (Italiano (Italia)):it-IT:local", - "Shelley (Giapponese (Giappone)):ja-JP:local", - "Shelley (Coreano (Corea del Sud)):ko-KR:local", - "Shelley (Portoghese (Brasile)):pt-BR:local", - "Shelley (Cinese (Cina continentale)):zh-CN:local", - "Shelley (Cinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Ting-Ting:zh-CN:local", - "Trinoid:en-US:local", - "Vani:ta-IN:local", - "Sussurro:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 870, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1792, - "height": 1120, - "colorDepth": 30, - "availWidth": 1792, - "availHeight": 1010, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 960, - "height": 540, - "colorDepth": 30, - "availWidth": 960, - "availHeight": 528, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 30, - "availWidth": 2048, - "availHeight": 1033, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 800, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel 945GM, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1080, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1080, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1512, - "height": 982, - "colorDepth": 30, - "availWidth": 1512, - "availHeight": 893, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1470, - "height": 956, - "colorDepth": 30, - "availWidth": 1470, - "availHeight": 880, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 18, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1410, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Ellen:nl-BE:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1055, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Malas noticias:en-US:local", - "Bahh:en-US:local", - "Campanas:en-US:local", - "Boing:en-US:local", - "Burbujas:en-US:local", - "Carmit:he-IL:local", - "Violonchelos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (Alemán (Alemania)):de-DE:local", - "Eddy (Inglés (RU)):en-GB:local", - "Eddy (Inglés (EE. UU.)):en-US:local", - "Eddy (Español (España)):es-ES:local", - "Eddy (Español (México)):es-MX:local", - "Eddy (Finés (Finlandia)):fi-FI:local", - "Eddy (Francés (Canadá)):fr-CA:local", - "Eddy (Francés (Francia)):fr-FR:local", - "Eddy (Italiano (Italia)):it-IT:local", - "Eddy (Portugués (Brasil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (Alemán (Alemania)):de-DE:local", - "Flo (Inglés (RU)):en-GB:local", - "Flo (Inglés (EE. UU.)):en-US:local", - "Flo (Español (España)):es-ES:local", - "Flo (Español (México)):es-MX:local", - "Flo (Finés (Finlandia)):fi-FI:local", - "Flo (Francés (Canadá)):fr-CA:local", - "Flo (Francés (Francia)):fr-FR:local", - "Flo (Italiano (Italia)):it-IT:local", - "Flo (Portugués (Brasil)):pt-BR:local", - "Fred:en-US:local", - "Buenas noticias:en-US:local", - "Grandma (Alemán (Alemania)):de-DE:local", - "Grandma (Inglés (RU)):en-GB:local", - "Grandma (Inglés (EE. UU.)):en-US:local", - "Grandma (Español (España)):es-ES:local", - "Grandma (Español (México)):es-MX:local", - "Grandma (Finés (Finlandia)):fi-FI:local", - "Grandma (Francés (Canadá)):fr-CA:local", - "Grandma (Francés (Francia)):fr-FR:local", - "Grandma (Italiano (Italia)):it-IT:local", - "Grandma (Portugués (Brasil)):pt-BR:local", - "Grandpa (Alemán (Alemania)):de-DE:local", - "Grandpa (Inglés (RU)):en-GB:local", - "Grandpa (Inglés (EE. UU.)):en-US:local", - "Grandpa (Español (España)):es-ES:local", - "Grandpa (Español (México)):es-MX:local", - "Grandpa (Finés (Finlandia)):fi-FI:local", - "Grandpa (Francés (Canadá)):fr-CA:local", - "Grandpa (Francés (Francia)):fr-FR:local", - "Grandpa (Italiano (Italia)):it-IT:local", - "Grandpa (Portugués (Brasil)):pt-BR:local", - "Bufón:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Órgano:en-US:local", - "Paulina:es-MX:local", - "Superestrella:en-US:local", - "Ralph:en-US:local", - "Reed (Alemán (Alemania)):de-DE:local", - "Reed (Inglés (RU)):en-GB:local", - "Reed (Inglés (EE. UU.)):en-US:local", - "Reed (Español (España)):es-ES:local", - "Reed (Español (México)):es-MX:local", - "Reed (Finés (Finlandia)):fi-FI:local", - "Reed (Francés (Canadá)):fr-CA:local", - "Reed (Italiano (Italia)):it-IT:local", - "Reed (Portugués (Brasil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (Alemán (Alemania)):de-DE:local", - "Rocko (Inglés (RU)):en-GB:local", - "Rocko (Inglés (EE. UU.)):en-US:local", - "Rocko (Español (España)):es-ES:local", - "Rocko (Español (México)):es-MX:local", - "Rocko (Finés (Finlandia)):fi-FI:local", - "Rocko (Francés (Canadá)):fr-CA:local", - "Rocko (Francés (Francia)):fr-FR:local", - "Rocko (Italiano (Italia)):it-IT:local", - "Rocko (Portugués (Brasil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (Alemán (Alemania)):de-DE:local", - "Sandy (Inglés (RU)):en-GB:local", - "Sandy (Inglés (EE. UU.)):en-US:local", - "Sandy (Español (España)):es-ES:local", - "Sandy (Español (México)):es-MX:local", - "Sandy (Finés (Finlandia)):fi-FI:local", - "Sandy (Francés (Canadá)):fr-CA:local", - "Sandy (Francés (Francia)):fr-FR:local", - "Sandy (Italiano (Italia)):it-IT:local", - "Sandy (Portugués (Brasil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (Alemán (Alemania)):de-DE:local", - "Shelley (Inglés (RU)):en-GB:local", - "Shelley (Inglés (EE. UU.)):en-US:local", - "Shelley (Español (España)):es-ES:local", - "Shelley (Español (México)):es-MX:local", - "Shelley (Finés (Finlandia)):fi-FI:local", - "Shelley (Francés (Canadá)):fr-CA:local", - "Shelley (Francés (Francia)):fr-FR:local", - "Shelley (Italiano (Italia)):it-IT:local", - "Shelley (Portugués (Brasil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Susurro:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1600, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1480, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 1117, - "colorDepth": 30, - "availWidth": 1728, - "availHeight": 1083, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 832, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 803, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Malas noticias:en-US:local", - "Bahh:en-US:local", - "Campanas:en-US:local", - "Boing:en-US:local", - "Burbujas:en-US:local", - "Carmit:he-IL:local", - "Violonchelos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (Alemán (Alemania)):de-DE:local", - "Eddy (Inglés (RU)):en-GB:local", - "Eddy (Inglés (EE. UU.)):en-US:local", - "Eddy (Español (España)):es-ES:local", - "Eddy (Español (México)):es-MX:local", - "Eddy (Finés (Finlandia)):fi-FI:local", - "Eddy (Francés (Canadá)):fr-CA:local", - "Eddy (Francés (Francia)):fr-FR:local", - "Eddy (Italiano (Italia)):it-IT:local", - "Eddy (Japonés (Japón)):ja-JP:local", - "Eddy (Coreano (Corea del Sur)):ko-KR:local", - "Eddy (Portugués (Brasil)):pt-BR:local", - "Eddy (Chino (China continental)):zh-CN:local", - "Eddy (Chino (Taiwán)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (Alemán (Alemania)):de-DE:local", - "Flo (Inglés (RU)):en-GB:local", - "Flo (Inglés (EE. UU.)):en-US:local", - "Flo (Español (España)):es-ES:local", - "Flo (Español (México)):es-MX:local", - "Flo (Finés (Finlandia)):fi-FI:local", - "Flo (Francés (Canadá)):fr-CA:local", - "Flo (Francés (Francia)):fr-FR:local", - "Flo (Italiano (Italia)):it-IT:local", - "Flo (Japonés (Japón)):ja-JP:local", - "Flo (Coreano (Corea del Sur)):ko-KR:local", - "Flo (Portugués (Brasil)):pt-BR:local", - "Flo (Chino (China continental)):zh-CN:local", - "Flo (Chino (Taiwán)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Buenas noticias:en-US:local", - "Grandma (Alemán (Alemania)):de-DE:local", - "Grandma (Inglés (RU)):en-GB:local", - "Grandma (Inglés (EE. UU.)):en-US:local", - "Grandma (Español (España)):es-ES:local", - "Grandma (Español (México)):es-MX:local", - "Grandma (Finés (Finlandia)):fi-FI:local", - "Grandma (Francés (Canadá)):fr-CA:local", - "Grandma (Francés (Francia)):fr-FR:local", - "Grandma (Italiano (Italia)):it-IT:local", - "Grandma (Japonés (Japón)):ja-JP:local", - "Grandma (Coreano (Corea del Sur)):ko-KR:local", - "Grandma (Portugués (Brasil)):pt-BR:local", - "Grandma (Chino (China continental)):zh-CN:local", - "Grandma (Chino (Taiwán)):zh-TW:local", - "Grandpa (Alemán (Alemania)):de-DE:local", - "Grandpa (Inglés (RU)):en-GB:local", - "Grandpa (Inglés (EE. UU.)):en-US:local", - "Grandpa (Español (España)):es-ES:local", - "Grandpa (Español (México)):es-MX:local", - "Grandpa (Finés (Finlandia)):fi-FI:local", - "Grandpa (Francés (Canadá)):fr-CA:local", - "Grandpa (Francés (Francia)):fr-FR:local", - "Grandpa (Italiano (Italia)):it-IT:local", - "Grandpa (Japonés (Japón)):ja-JP:local", - "Grandpa (Coreano (Corea del Sur)):ko-KR:local", - "Grandpa (Portugués (Brasil)):pt-BR:local", - "Grandpa (Chino (China continental)):zh-CN:local", - "Grandpa (Chino (Taiwán)):zh-TW:local", - "Bufón:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Órgano:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superestrella:en-US:local", - "Ralph:en-US:local", - "Reed (Alemán (Alemania)):de-DE:local", - "Reed (Inglés (RU)):en-GB:local", - "Reed (Inglés (EE. UU.)):en-US:local", - "Reed (Español (España)):es-ES:local", - "Reed (Español (México)):es-MX:local", - "Reed (Finés (Finlandia)):fi-FI:local", - "Reed (Francés (Canadá)):fr-CA:local", - "Reed (Italiano (Italia)):it-IT:local", - "Reed (Japonés (Japón)):ja-JP:local", - "Reed (Coreano (Corea del Sur)):ko-KR:local", - "Reed (Portugués (Brasil)):pt-BR:local", - "Reed (Chino (China continental)):zh-CN:local", - "Reed (Chino (Taiwán)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (Alemán (Alemania)):de-DE:local", - "Rocko (Inglés (RU)):en-GB:local", - "Rocko (Inglés (EE. UU.)):en-US:local", - "Rocko (Español (España)):es-ES:local", - "Rocko (Español (México)):es-MX:local", - "Rocko (Finés (Finlandia)):fi-FI:local", - "Rocko (Francés (Canadá)):fr-CA:local", - "Rocko (Francés (Francia)):fr-FR:local", - "Rocko (Italiano (Italia)):it-IT:local", - "Rocko (Japonés (Japón)):ja-JP:local", - "Rocko (Coreano (Corea del Sur)):ko-KR:local", - "Rocko (Portugués (Brasil)):pt-BR:local", - "Rocko (Chino (China continental)):zh-CN:local", - "Rocko (Chino (Taiwán)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (Alemán (Alemania)):de-DE:local", - "Sandy (Inglés (RU)):en-GB:local", - "Sandy (Inglés (EE. UU.)):en-US:local", - "Sandy (Español (España)):es-ES:local", - "Sandy (Español (México)):es-MX:local", - "Sandy (Finés (Finlandia)):fi-FI:local", - "Sandy (Francés (Canadá)):fr-CA:local", - "Sandy (Francés (Francia)):fr-FR:local", - "Sandy (Italiano (Italia)):it-IT:local", - "Sandy (Japonés (Japón)):ja-JP:local", - "Sandy (Coreano (Corea del Sur)):ko-KR:local", - "Sandy (Portugués (Brasil)):pt-BR:local", - "Sandy (Chino (China continental)):zh-CN:local", - "Sandy (Chino (Taiwán)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (Alemán (Alemania)):de-DE:local", - "Shelley (Inglés (RU)):en-GB:local", - "Shelley (Inglés (EE. UU.)):en-US:local", - "Shelley (Español (España)):es-ES:local", - "Shelley (Español (México)):es-MX:local", - "Shelley (Finés (Finlandia)):fi-FI:local", - "Shelley (Francés (Canadá)):fr-CA:local", - "Shelley (Francés (Francia)):fr-FR:local", - "Shelley (Italiano (Italia)):it-IT:local", - "Shelley (Japonés (Japón)):ja-JP:local", - "Shelley (Coreano (Corea del Sur)):ko-KR:local", - "Shelley (Portugués (Brasil)):pt-BR:local", - "Shelley (Chino (China continental)):zh-CN:local", - "Shelley (Chino (Taiwán)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Susurro:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 30, - "availWidth": 1680, - "availHeight": 934, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:152.0) Gecko/20100101 Firefox/152.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 1004, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 719, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 984, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1710, - "height": 1112, - "colorDepth": 30, - "availWidth": 1710, - "availHeight": 1073, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman (English (India)):en-IN:local", - "Aman (English (India)):en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Yelda:tr-TR:local", - "Ioana:ro-RO:local", - "Yuna:ko-KR:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Krzysztof (Enhanced):pl-PL:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona ((null)):lt-LT:local", - "Ona ((null)):lt-LT:local", - "Organ:en-US:local", - "Piya:bn-IN:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 824, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko/20100101 Firefox/151.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 30, - "availWidth": 1680, - "availHeight": 974, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1080, - "colorDepth": 30, - "availWidth": 2048, - "availHeight": 1080, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1080, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 957, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1024, - "height": 768, - "colorDepth": 30, - "availWidth": 1024, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2304, - "height": 1296, - "colorDepth": 30, - "availWidth": 2304, - "availHeight": 1266, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1512, - "height": 982, - "colorDepth": 30, - "availWidth": 1512, - "availHeight": 860, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1935, - "height": 1251, - "colorDepth": 30, - "availWidth": 1935, - "availHeight": 1160, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1710, - "height": 1112, - "colorDepth": 30, - "availWidth": 1710, - "availHeight": 1112, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1470, - "height": 956, - "colorDepth": 30, - "availWidth": 1470, - "availHeight": 849, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 30, - "availWidth": 1440, - "availHeight": 824, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2056, - "height": 1329, - "colorDepth": 30, - "availWidth": 2056, - "availHeight": 1285, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 30, - "availWidth": 1280, - "availHeight": 720, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel (English (UK)):en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 5120, - "height": 1440, - "colorDepth": 30, - "availWidth": 5120, - "availHeight": 1364, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Soumya:kn-IN:local", - "Alva:sv-SE:local", - "Aman:en-IN:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Aru:kk-KZ:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Geeta:te-IN:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Ona:lt-LT:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Piya:bn-IN:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tara:en-IN:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 30, - "availWidth": 1536, - "availHeight": 935, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1800, - "height": 1169, - "colorDepth": 30, - "availWidth": 1800, - "availHeight": 1061, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 30, - "availWidth": 2560, - "availHeight": 1415, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2133, - "height": 1200, - "colorDepth": 30, - "availWidth": 2133, - "availHeight": 1179, - "devicePixelRatio": 2.4 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 30, - "availWidth": 1920, - "availHeight": 984, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel 945GM, or similar" - }, - "speechVoices": [ - "Alex:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amelie:fr-CA:local", - "Anna:de-DE:local", - "Carmit:he-IL:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Diego:es-AR:local", - "Ellen:nl-BE:local", - "Fiona:en-scotland:local", - "Fred:en-US:local", - "Ioana:ro-RO:local", - "Joana:pt-PT:local", - "Jorge:es-ES:local", - "Juan:es-MX:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kyoko:ja-JP:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Luca:it-IT:local", - "Luciana:pt-BR:local", - "Maged:ar-SA:local", - "Mariska:hu-HU:local", - "Mei-Jia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Monica:es-ES:local", - "Nora:nb-NO:local", - "Paulina:es-MX:local", - "Rishi:en-IN:local", - "Samantha:en-US:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Sin-ji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Ting-Ting:zh-CN:local", - "Veena:en-IN:local", - "Victoria:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Yuri:ru-RU:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 30, - "availWidth": 2048, - "availHeight": 1026, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "ATI Technologies Inc.", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Vani:ta-IN:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 30, - "availWidth": 1366, - "availHeight": 670, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Inc.", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "MacIntel", - "hardwareConcurrency": 10, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1225, - "height": 797, - "colorDepth": 30, - "availWidth": 1225, - "availHeight": 765, - "devicePixelRatio": 2.4 - }, - "webgl": { - "unmaskedVendor": "Apple", - "unmaskedRenderer": "Apple M1, or similar" - }, - "speechVoices": [ - "Albert:en-US:local", - "Alice:it-IT:local", - "Alva:sv-SE:local", - "Amélie:fr-CA:local", - "Amira:ms-MY:local", - "Anna:de-DE:local", - "Bad News:en-US:local", - "Bahh:en-US:local", - "Bells:en-US:local", - "Boing:en-US:local", - "Bubbles:en-US:local", - "Carmit:he-IL:local", - "Cellos:en-US:local", - "Damayanti:id-ID:local", - "Daniel:en-GB:local", - "Daria:bg-BG:local", - "Wobble:en-US:local", - "Eddy (German (Germany)):de-DE:local", - "Eddy (English (UK)):en-GB:local", - "Eddy (English (US)):en-US:local", - "Eddy (Spanish (Spain)):es-ES:local", - "Eddy (Spanish (Mexico)):es-MX:local", - "Eddy (Finnish (Finland)):fi-FI:local", - "Eddy (French (Canada)):fr-CA:local", - "Eddy (French (France)):fr-FR:local", - "Eddy (Italian (Italy)):it-IT:local", - "Eddy (Japanese (Japan)):ja-JP:local", - "Eddy (Korean (South Korea)):ko-KR:local", - "Eddy (Portuguese (Brazil)):pt-BR:local", - "Eddy (Chinese (China mainland)):zh-CN:local", - "Eddy (Chinese (Taiwan)):zh-TW:local", - "Ellen:nl-BE:local", - "Flo (German (Germany)):de-DE:local", - "Flo (English (UK)):en-GB:local", - "Flo (English (US)):en-US:local", - "Flo (Spanish (Spain)):es-ES:local", - "Flo (Spanish (Mexico)):es-MX:local", - "Flo (Finnish (Finland)):fi-FI:local", - "Flo (French (Canada)):fr-CA:local", - "Flo (French (France)):fr-FR:local", - "Flo (Italian (Italy)):it-IT:local", - "Flo (Japanese (Japan)):ja-JP:local", - "Flo (Korean (South Korea)):ko-KR:local", - "Flo (Portuguese (Brazil)):pt-BR:local", - "Flo (Chinese (China mainland)):zh-CN:local", - "Flo (Chinese (Taiwan)):zh-TW:local", - "Fred:en-US:local", - "Good News:en-US:local", - "Grandma (German (Germany)):de-DE:local", - "Grandma (English (UK)):en-GB:local", - "Grandma (English (US)):en-US:local", - "Grandma (Spanish (Spain)):es-ES:local", - "Grandma (Spanish (Mexico)):es-MX:local", - "Grandma (Finnish (Finland)):fi-FI:local", - "Grandma (French (Canada)):fr-CA:local", - "Grandma (French (France)):fr-FR:local", - "Grandma (Italian (Italy)):it-IT:local", - "Grandma (Japanese (Japan)):ja-JP:local", - "Grandma (Korean (South Korea)):ko-KR:local", - "Grandma (Portuguese (Brazil)):pt-BR:local", - "Grandma (Chinese (China mainland)):zh-CN:local", - "Grandma (Chinese (Taiwan)):zh-TW:local", - "Grandpa (German (Germany)):de-DE:local", - "Grandpa (English (UK)):en-GB:local", - "Grandpa (English (US)):en-US:local", - "Grandpa (Spanish (Spain)):es-ES:local", - "Grandpa (Spanish (Mexico)):es-MX:local", - "Grandpa (Finnish (Finland)):fi-FI:local", - "Grandpa (French (Canada)):fr-CA:local", - "Grandpa (French (France)):fr-FR:local", - "Grandpa (Italian (Italy)):it-IT:local", - "Grandpa (Japanese (Japan)):ja-JP:local", - "Grandpa (Korean (South Korea)):ko-KR:local", - "Grandpa (Portuguese (Brazil)):pt-BR:local", - "Grandpa (Chinese (China mainland)):zh-CN:local", - "Grandpa (Chinese (Taiwan)):zh-TW:local", - "Jester:en-US:local", - "Ioana:ro-RO:local", - "Jacques:fr-FR:local", - "Joana:pt-PT:local", - "Junior:en-US:local", - "Kanya:th-TH:local", - "Karen:en-AU:local", - "Kathy:en-US:local", - "Kyoko:ja-JP:local", - "Lana:hr-HR:local", - "Laura:sk-SK:local", - "Lekha:hi-IN:local", - "Lesya:uk-UA:local", - "Linh:vi-VN:local", - "Luciana:pt-BR:local", - "Majed:ar-001:local", - "Tünde:hu-HU:local", - "Meijia:zh-TW:local", - "Melina:el-GR:local", - "Milena:ru-RU:local", - "Moira:en-IE:local", - "Mónica:es-ES:local", - "Montse:ca-ES:local", - "Nora:nb-NO:local", - "Organ:en-US:local", - "Paulina:es-MX:local", - "Superstar:en-US:local", - "Ralph:en-US:local", - "Reed (German (Germany)):de-DE:local", - "Reed (English (UK)):en-GB:local", - "Reed (English (US)):en-US:local", - "Reed (Spanish (Spain)):es-ES:local", - "Reed (Spanish (Mexico)):es-MX:local", - "Reed (Finnish (Finland)):fi-FI:local", - "Reed (French (Canada)):fr-CA:local", - "Reed (Italian (Italy)):it-IT:local", - "Reed (Japanese (Japan)):ja-JP:local", - "Reed (Korean (South Korea)):ko-KR:local", - "Reed (Portuguese (Brazil)):pt-BR:local", - "Reed (Chinese (China mainland)):zh-CN:local", - "Reed (Chinese (Taiwan)):zh-TW:local", - "Rishi:en-IN:local", - "Rocko (German (Germany)):de-DE:local", - "Rocko (English (UK)):en-GB:local", - "Rocko (English (US)):en-US:local", - "Rocko (Spanish (Spain)):es-ES:local", - "Rocko (Spanish (Mexico)):es-MX:local", - "Rocko (Finnish (Finland)):fi-FI:local", - "Rocko (French (Canada)):fr-CA:local", - "Rocko (French (France)):fr-FR:local", - "Rocko (Italian (Italy)):it-IT:local", - "Rocko (Japanese (Japan)):ja-JP:local", - "Rocko (Korean (South Korea)):ko-KR:local", - "Rocko (Portuguese (Brazil)):pt-BR:local", - "Rocko (Chinese (China mainland)):zh-CN:local", - "Rocko (Chinese (Taiwan)):zh-TW:local", - "Samantha:en-US:local", - "Sandy (German (Germany)):de-DE:local", - "Sandy (English (UK)):en-GB:local", - "Sandy (English (US)):en-US:local", - "Sandy (Spanish (Spain)):es-ES:local", - "Sandy (Spanish (Mexico)):es-MX:local", - "Sandy (Finnish (Finland)):fi-FI:local", - "Sandy (French (Canada)):fr-CA:local", - "Sandy (French (France)):fr-FR:local", - "Sandy (Italian (Italy)):it-IT:local", - "Sandy (Japanese (Japan)):ja-JP:local", - "Sandy (Korean (South Korea)):ko-KR:local", - "Sandy (Portuguese (Brazil)):pt-BR:local", - "Sandy (Chinese (China mainland)):zh-CN:local", - "Sandy (Chinese (Taiwan)):zh-TW:local", - "Sara:da-DK:local", - "Satu:fi-FI:local", - "Shelley (German (Germany)):de-DE:local", - "Shelley (English (UK)):en-GB:local", - "Shelley (English (US)):en-US:local", - "Shelley (Spanish (Spain)):es-ES:local", - "Shelley (Spanish (Mexico)):es-MX:local", - "Shelley (Finnish (Finland)):fi-FI:local", - "Shelley (French (Canada)):fr-CA:local", - "Shelley (French (France)):fr-FR:local", - "Shelley (Italian (Italy)):it-IT:local", - "Shelley (Japanese (Japan)):ja-JP:local", - "Shelley (Korean (South Korea)):ko-KR:local", - "Shelley (Portuguese (Brazil)):pt-BR:local", - "Shelley (Chinese (China mainland)):zh-CN:local", - "Shelley (Chinese (Taiwan)):zh-TW:local", - "Sinji:zh-HK:local", - "Tessa:en-ZA:local", - "Thomas:fr-FR:local", - "Tina:sl-SI:local", - "Tingting:zh-CN:local", - "Trinoids:en-US:local", - "Whisper:en-US:local", - "Xander:nl-NL:local", - "Yelda:tr-TR:local", - "Yuna:ko-KR:local", - "Zarvox:en-US:local", - "Zosia:pl-PL:local", - "Zuzana:cs-CZ:local" - ] - } - ], - "windows": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 2 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1632, - "height": 918, - "colorDepth": 24, - "availWidth": 1632, - "availHeight": 918, - "devicePixelRatio": 1.17647058823529 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Tolga - Turkish (Turkey):tr-TR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Naayf - Arabic (Saudi):ar-SA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1027, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 5 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Jakub - Czech (Czech Republic):cs-CZ:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1152, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 1080, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 5 - }, - "screen": { - "width": 1280, - "height": 853, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 805, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Caroline - French (Canada):fr-CA:local", - "Microsoft Claude - French (Canada):fr-CA:local", - "Microsoft Nathalie - French (Canada):fr-CA:local", - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1408, - "height": 792, - "colorDepth": 24, - "availWidth": 1408, - "availHeight": 748, - "devicePixelRatio": 1.36363636363636 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1728, - "height": 972, - "colorDepth": 24, - "availWidth": 1728, - "availHeight": 921, - "devicePixelRatio": 1.11111111111111 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 920, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Heami - Korean (Korean):ko-KR:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Heami Desktop - Korean:ko-KR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1718, - "height": 1277, - "colorDepth": 24, - "availWidth": 1718, - "availHeight": 1277, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Mozilla", - "unmaskedRenderer": "Mozilla" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1472, - "height": 828, - "colorDepth": 24, - "availWidth": 1472, - "availHeight": 791, - "devicePixelRatio": 1.30434782608696 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 1024, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 984, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1002, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 852, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hoda - Arabic (Egypt):ar-EG:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Cosimo - Italian (Italy):it-IT:local", - "Microsoft Elsa - Italian (Italy):it-IT:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Elsa Desktop - Italian (Italy):it-IT:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1392, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 912, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1451, - "height": 907, - "colorDepth": 24, - "availWidth": 1451, - "availHeight": 907, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 840, - "devicePixelRatio": 1.2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 900, - "devicePixelRatio": 1.2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 1 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 800, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1600, - "height": 1000, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 940, - "devicePixelRatio": 1.2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2293, - "height": 960, - "colorDepth": 24, - "availWidth": 2293, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Ivan - Bulgarian (Bulgaria):bg-BG:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1664, - "height": 936, - "colorDepth": 24, - "availWidth": 1664, - "availHeight": 894, - "devicePixelRatio": 1.15384615384615 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_4_0 ps_4_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1360, - "height": 768, - "colorDepth": 24, - "availWidth": 1360, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 860, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Richard - English (Canada):en-CA:local", - "Microsoft Linda - English (Canada):en-CA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1344, - "height": 756, - "colorDepth": 24, - "availWidth": 1344, - "availHeight": 714, - "devicePixelRatio": 1.42857142857143 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1504, - "height": 846, - "colorDepth": 24, - "availWidth": 1504, - "availHeight": 846, - "devicePixelRatio": 1.27659574468085 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3456, - "height": 1440, - "colorDepth": 24, - "availWidth": 3456, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 960, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_4_1 ps_4_1), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 900, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1278, - "height": 852, - "colorDepth": 24, - "availWidth": 1278, - "availHeight": 805, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hortense Desktop - French:fr-FR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2293, - "height": 960, - "colorDepth": 24, - "availWidth": 2293, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1792, - "height": 1008, - "colorDepth": 24, - "availWidth": 1792, - "availHeight": 1008, - "devicePixelRatio": 2.14285714285714 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 1000, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 952, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Adam - Polish (Poland):pl-PL:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Paulina - Polish (Poland):pl-PL:local", - "Microsoft Paulina Desktop - Polish:pl-PL:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1160, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1216, - "height": 684, - "colorDepth": 24, - "availWidth": 1216, - "availHeight": 646, - "devicePixelRatio": 1.57894736842105 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helia - Portuguese (Portugal):pt-PT:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0 AtContent/93.5.6604.5", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 834, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1451, - "height": 907, - "colorDepth": 24, - "availWidth": 1451, - "availHeight": 859, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 1024, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 984, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1080, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1088, - "height": 614, - "colorDepth": 24, - "availWidth": 1088, - "availHeight": 566, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 40 - }, - "screen": { - "width": 1360, - "height": 768, - "colorDepth": 24, - "availWidth": 1360, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2176, - "height": 1224, - "colorDepth": 24, - "availWidth": 2176, - "availHeight": 1176, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1500, - "height": 1000, - "colorDepth": 24, - "availWidth": 1500, - "availHeight": 952, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2112, - "height": 1320, - "colorDepth": 24, - "availWidth": 2112, - "availHeight": 1320, - "devicePixelRatio": 1.36363636363636 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Stefanos - Greek (Greece):el-GR:local", - "Microsoft Tolga - Turkish (Turkey):tr-TR:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1824, - "height": 1026, - "colorDepth": 24, - "availWidth": 1824, - "availHeight": 980, - "devicePixelRatio": 1.05263157894737 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Heera - English (India):en-IN:local", - "Microsoft Ravi - English (India):en-IN:local", - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 5120, - "height": 1440, - "colorDepth": 24, - "availWidth": 5120, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1440, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 900, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1296, - "height": 810, - "colorDepth": 24, - "availWidth": 1296, - "availHeight": 810, - "devicePixelRatio": 2.22222222222222 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Richard - English (Canada):en-CA:local", - "Microsoft Linda - English (Canada):en-CA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 852, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1360, - "height": 768, - "colorDepth": 24, - "availWidth": 1360, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 852, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 852, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1299, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_4_1 ps_4_1), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1088, - "height": 612, - "colorDepth": 24, - "availWidth": 1088, - "availHeight": 564, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Heami - Korean (Korean):ko-KR:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Heami Desktop - Korean:ko-KR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2560, - "height": 1080, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1112, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 5 - }, - "screen": { - "width": 2731, - "height": 768, - "colorDepth": 24, - "availWidth": 2731, - "availHeight": 730, - "devicePixelRatio": 1.875 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Jakub - Czech (Czech Republic):cs-CZ:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1010, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_4_0 ps_4_0), or similar" - }, - "speechVoices": [ - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 1600, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 1552, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1152, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_4_1 ps_4_1), or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2176, - "height": 1224, - "colorDepth": 24, - "availWidth": 2176, - "availHeight": 1224, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Cosimo - Italian (Italy):it-IT:local", - "Microsoft Elsa - Italian (Italy):it-IT:local", - "Microsoft Elsa Desktop - Italian (Italy):it-IT:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1093, - "height": 614, - "colorDepth": 24, - "availWidth": 1093, - "availHeight": 566, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 5850 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1184, - "height": 666, - "colorDepth": 24, - "availWidth": 1184, - "availHeight": 629, - "devicePixelRatio": 1.62162162162162 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 920, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce 8800 GTX Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Guillaume - French (Switzerland):fr-CH:local", - "Microsoft Karsten - German (Switzerland):de-CH:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hortense Desktop - French:fr-FR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1152, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1760, - "height": 990, - "colorDepth": 24, - "availWidth": 1760, - "availHeight": 953, - "devicePixelRatio": 1.09090909090909 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Hedda Desktop - German:de-DE:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1696, - "height": 954, - "colorDepth": 24, - "availWidth": 1696, - "availHeight": 901, - "devicePixelRatio": 1.13207547169811 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 5 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 912, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 5 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1728, - "height": 972, - "colorDepth": 24, - "availWidth": 1728, - "availHeight": 929, - "devicePixelRatio": 1.11111111111111 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1696, - "height": 954, - "colorDepth": 24, - "availWidth": 1696, - "availHeight": 954, - "devicePixelRatio": 1.13207547169811 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1504, - "height": 846, - "colorDepth": 24, - "availWidth": 1504, - "availHeight": 846, - "devicePixelRatio": 1.27659574468085 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 28, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1200, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1440, - "height": 900, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 852, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft David Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Richard - English (Canada):en-CA:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Linda - English (Canada):en-CA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Caroline - French (Canada):fr-CA:local", - "Microsoft Claude - French (Canada):fr-CA:local", - "Microsoft Nathalie - French (Canada):fr-CA:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1343, - "height": 755, - "colorDepth": 24, - "availWidth": 1343, - "availHeight": 726, - "devicePixelRatio": 1.01694915254237 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 1024, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 984, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1152, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1122, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena Mobile - Spanish (Spain):es-ES:local", - "Microsoft Laura Mobile - Spanish (Spain):es-ES:local", - "Microsoft Pablo Mobile - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1138, - "height": 640, - "colorDepth": 24, - "availWidth": 1138, - "availHeight": 600, - "devicePixelRatio": 1.2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1184, - "height": 666, - "colorDepth": 24, - "availWidth": 1184, - "availHeight": 666, - "devicePixelRatio": 1.62162162162162 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Stefanos - Greek (Greece):el-GR:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Unknown)", - "unmaskedRenderer": "ANGLE (Unknown, Generic Renderer Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Karsten - German (Switzerland):de-CH:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Guillaume - French (Switzerland):fr-CH:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1010, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Unknown)", - "unmaskedRenderer": "ANGLE (Unknown, Adreno (TM) 650 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Jon - Norwegian (Bokmål):nb-NO:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 5120, - "height": 1440, - "colorDepth": 24, - "availWidth": 5120, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2049, - "height": 1152, - "colorDepth": 24, - "availWidth": 2049, - "availHeight": 1092, - "devicePixelRatio": 0.666666666666667 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 860, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 1 - }, - "screen": { - "width": 1707, - "height": 1067, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 1019, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 14, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1408, - "height": 880, - "colorDepth": 24, - "availWidth": 1408, - "availHeight": 827, - "devicePixelRatio": 1.36363636363636 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1010, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1400, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 22, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1600, - "height": 1000, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 952, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 1080, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 1032, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Karsten - German (Switzerland):de-CH:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Guillaume - French (Switzerland):fr-CH:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 720, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Microsoft)", - "unmaskedRenderer": "ANGLE (Microsoft, Microsoft Basic Render Driver Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 912, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1112, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Szabolcs - Hungarian (Hungary):hu-HU:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Andika - Indonesian (Indonesia):id-ID:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1504, - "height": 1003, - "colorDepth": 24, - "availWidth": 1504, - "availHeight": 1003, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1440, - "height": 960, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 912, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Unknown)", - "unmaskedRenderer": "ANGLE (Unknown, Generic Renderer Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_4_0 ps_4_0), or similar" - }, - "speechVoices": [ - "Microsoft Raul - Spanish (Mexico):es-MX:local", - "Microsoft Sabina - Spanish (Mexico):es-MX:local", - "Microsoft Sabina Desktop - Spanish (Mexico):es-MX:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 816, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Unknown)", - "unmaskedRenderer": "ANGLE (Unknown, Adreno (TM) 650 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) Arc(TM) A750 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Hortense Desktop - French:fr-FR:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 912, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 20, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3096, - "height": 1296, - "colorDepth": 24, - "availWidth": 3096, - "availHeight": 1248, - "devicePixelRatio": 1.11111111111111 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 1 - }, - "screen": { - "width": 2859, - "height": 1608, - "colorDepth": 24, - "availWidth": 2859, - "availHeight": 1608, - "devicePixelRatio": 0.895522388059702 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Michael - German (Austria):de-AT:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1275, - "height": 717, - "colorDepth": 24, - "availWidth": 1275, - "availHeight": 672, - "devicePixelRatio": 1.07142857142857 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1392, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1525, - "height": 858, - "colorDepth": 24, - "availWidth": 1525, - "availHeight": 858, - "devicePixelRatio": 0.895522388059702 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1088, - "height": 612, - "colorDepth": 24, - "availWidth": 1088, - "availHeight": 578, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Cosimo - Italian (Italy):it-IT:local", - "Microsoft Stefanos - Greek (Greece):el-GR:local", - "Microsoft Elsa - Italian (Italy):it-IT:local", - "Microsoft Elsa Desktop - Italian (Italy):it-IT:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 672, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 920, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Hedda - German (Germany):de-DE:local", - "Microsoft Naayf - Arabic (Saudi):ar-SA:local", - "Microsoft Katja - German (Germany):de-DE:local", - "Microsoft Stefan - German (Germany):de-DE:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Hortense - French (France):fr-FR:local", - "Microsoft Julie - French (France):fr-FR:local", - "Microsoft Paul - French (France):fr-FR:local", - "Microsoft Adam - Polish (Poland):pl-PL:local", - "Microsoft Paulina - Polish (Poland):pl-PL:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft Tolga - Turkish (Turkey):tr-TR:local", - "Microsoft Hedda Desktop - German:de-DE:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Hortense Desktop - French:fr-FR:local", - "Microsoft Paulina Desktop - Polish:pl-PL:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 10 - }, - "screen": { - "width": 2144, - "height": 1340, - "colorDepth": 24, - "availWidth": 2144, - "availHeight": 1307, - "devicePixelRatio": 0.895522388059702 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft James - English (Australia):en-AU:local", - "Microsoft Catherine - English (Australia):en-AU:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1248, - "height": 702, - "colorDepth": 24, - "availWidth": 1248, - "availHeight": 663, - "devicePixelRatio": 1.53846153846154 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1392, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1400, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon HD 3200 Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Daniel - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria - Portuguese (Brazil):pt-BR:local", - "Microsoft Maria Desktop - Portuguese(Brazil):pt-BR:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 800, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 752, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (AMD)", - "unmaskedRenderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Hoda - Arabic (Egypt):ar-EG:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 2, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1504, - "height": 1003, - "colorDepth": 24, - "availWidth": 1504, - "availHeight": 1003, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Karsten - German (Switzerland):de-CH:local", - "Microsoft George - English (United Kingdom):en-GB:local", - "Microsoft Hazel - English (United Kingdom):en-GB:local", - "Microsoft Susan - English (United Kingdom):en-GB:local", - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Hazel Desktop - English (Great Britain):en-GB:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 28, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 1200, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 1152, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 980 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Richard - English (Canada):en-CA:local", - "Microsoft Linda - English (Canada):en-CA:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1040, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (NVIDIA)", - "unmaskedRenderer": "ANGLE (NVIDIA, NVIDIA GeForce GTX 480 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Helena - Spanish (Spain):es-ES:local", - "Microsoft Laura - Spanish (Spain):es-ES:local", - "Microsoft Pablo - Spanish (Spain):es-ES:local", - "Microsoft Helena Desktop - Spanish (Spain):es-ES:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1408, - "height": 792, - "colorDepth": 24, - "availWidth": 1408, - "availHeight": 748, - "devicePixelRatio": 1.36363636363636 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 14, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1104, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft David - English (United States):en-US:local", - "Microsoft Mark - English (United States):en-US:local", - "Microsoft Zira - English (United States):en-US:local", - "Microsoft David Desktop - English (United States):en-US:local", - "Microsoft Zira Desktop - English (United States):en-US:local" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Win32", - "hardwareConcurrency": 8, - "maxTouchPoints": 10 - }, - "screen": { - "width": 1088, - "height": 612, - "colorDepth": 24, - "availWidth": 1088, - "availHeight": 571, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Google Inc. (Intel)", - "unmaskedRenderer": "ANGLE (Intel, Intel(R) HD Graphics 400 Direct3D11 vs_5_0 ps_5_0), or similar" - }, - "speechVoices": [ - "Microsoft Szabolcs - Hungarian (Hungary):hu-HU:local", - "Microsoft Irina - Russian (Russia):ru-RU:local", - "Microsoft Pavel - Russian (Russia):ru-RU:local", - "Microsoft Zira Desktop - English (United States):en-US:local", - "Microsoft Irina Desktop - Russian:ru-RU:local" - ] - } - ], - "linux": [ - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce 8800 GTX, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1200, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1575, - "availHeight": 880, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:152.0) Gecko/20100101 Firefox/152.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1760, - "height": 990, - "colorDepth": 24, - "availWidth": 1760, - "availHeight": 990, - "devicePixelRatio": 1.09090909090909 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1400, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 32, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 2160, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 2160, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 712, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 6, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 5120, - "height": 1440, - "colorDepth": 24, - "availWidth": 5120, - "availHeight": 1408, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1368, - "height": 768, - "colorDepth": 24, - "availWidth": 1368, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Mesa", - "unmaskedRenderer": "GeForce 8800 GTX, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1408, - "height": 792, - "colorDepth": 24, - "availWidth": 1408, - "availHeight": 792, - "devicePixelRatio": 1.36363636363636 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 717, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Open Source Technology Center", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - }, - "speechVoices": [ - "Catalan:ca:remote", - "Bishnupriya Manipuri:bpy:remote", - "Nahuatl (Classical):nci:remote", - "Dutch:nl:remote", - "Azerbaijani:az:remote", - "Kyrgyz:ky:remote", - "English (Great Britain):en:remote", - "Chinese (Cantonese):yue:remote", - "English (Lancaster):en:remote", - "Vietnamese (Northern):vi:remote", - "Amharic:am:remote", - "Gaelic (Irish):ga:remote", - "Latvian:lv:remote", - "Swahili:sw:remote", - "Afrikaans:af:remote", - "Malay:ms:remote", - "Tatar:tt:remote", - "Nepali:ne:remote", - "Serbian:sr:remote", - "Oriya:or:remote", - "Arabic:ar:remote", - "Interlingua:ia:remote", - "Italian:it:remote", - "Aragonese:an:remote", - "German:de:remote", - "Assamese:as:remote", - "Bengali:bn:remote", - "Georgian:ka:remote", - "Lithuanian:lt:remote", - "Danish:da:remote", - "English (Caribbean):en:remote", - "Papiamento:pap:remote", - "Chinese (Mandarin):cmn:remote", - "Bosnian:bs:remote", - "Guarani:gn:remote", - "Marathi:mr:remote", - "Persian:fa:remote", - "Hindi:hi:remote", - "Bulgarian:bg:remote", - "Lingua Franca Nova:lfn:remote", - "Hungarian:hu:remote", - "Icelandic:is:remote", - "Burmese:my:remote", - "Maltese:mt:remote", - "Esperanto:eo:remote", - "Portuguese (Portugal):pt:remote", - "Spanish (Spain):es:remote", - "Kurdish:ku:remote", - "Lojban:jbo:remote", - "Czech:cs:remote", - "Turkish:tr:remote", - "Tamil:ta:remote", - "Spanish (Latin America):es:remote", - "Indonesian:id:remote", - "Armenian (West Armenia):hy:remote", - "Kannada:kn:remote", - "Greek (Ancient):grc:remote", - "Armenian (East Armenia):hy:remote", - "Greenlandic:kl:remote", - "French (Switzerland):fr:remote", - "Norwegian Bokmål:nb:remote", - "Portuguese (Brazil):pt:remote", - "Urdu:ur:remote", - "Punjabi:pa:remote", - "Japanese:ja:remote", - "Romanian:ro:remote", - "Gujarati:gu:remote", - "Latin:la:remote", - "Polish:pl:remote", - "French (France):fr:remote", - "Slovenian:sl:remote", - "Malayalam:ml:remote", - "Russian:ru:remote", - "Croatian:hr:remote", - "Korean:ko:remote", - "Welsh:cy:remote", - "Slovak:sk:remote", - "poz/mi:mi:remote", - "English (Scotland):en:remote", - "Vietnamese (Southern):vi:remote", - "English (West Midlands):en:remote", - "Persian (Pinglish):fa:remote", - "Albanian:sq:remote", - "Finnish:fi:remote", - "English (Received Pronunciation):en:remote", - "Greek:el:remote", - "French (Belgium):fr:remote", - "Gaelic (Scottish):gd:remote", - "Telugu:te:remote", - "Konkani:kok:remote", - "Sindhi:sd:remote", - "Estonian:et:remote", - "Basque:eu:remote", - "Oromo:om:remote", - "English (America):en:remote", - "Swedish:sv:remote", - "Macedonian:mk:remote", - "Setswana:tn:remote", - "Sinhala:si:remote", - "Vietnamese (Central):vi:remote" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1760, - "height": 990, - "colorDepth": 24, - "availWidth": 1760, - "availHeight": 990, - "devicePixelRatio": 1.09090909090909 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 728, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1664, - "height": 936, - "colorDepth": 24, - "availWidth": 1664, - "availHeight": 936, - "devicePixelRatio": 1.15384615384615 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 718, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel Open Source Technology Center", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3072, - "height": 1728, - "colorDepth": 24, - "availWidth": 3072, - "availHeight": 1728, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce 8800 GTX, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 768, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 24, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2048, - "height": 1152, - "colorDepth": 24, - "availWidth": 2048, - "availHeight": 1152, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 2 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3440, - "height": 1440, - "colorDepth": 24, - "availWidth": 3440, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Mesa", - "unmaskedRenderer": "llvmpipe, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 28, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 1080, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1600, - "height": 900, - "colorDepth": 24, - "availWidth": 1600, - "availHeight": 900, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - }, - "speechVoices": ["en_US-ryan-high:en-US:remote"] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1200, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1680, - "height": 1050, - "colorDepth": 24, - "availWidth": 1680, - "availHeight": 1050, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1200, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1200, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1620, - "height": 1080, - "colorDepth": 24, - "availWidth": 1620, - "availHeight": 1080, - "devicePixelRatio": 1.33333333333333 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 720, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 22, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1088, - "height": 612, - "colorDepth": 24, - "availWidth": 1088, - "availHeight": 612, - "devicePixelRatio": 1.76470588235294 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3840, - "height": 1080, - "colorDepth": 24, - "availWidth": 3840, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Mesa", - "unmaskedRenderer": "llvmpipe, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1280, - "height": 720, - "colorDepth": 24, - "availWidth": 1280, - "availHeight": 720, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1440, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - }, - "speechVoices": [ - "virginie:fr-FR:remote", - "isabel:es-ES:remote", - "serena:en-GB:remote", - "samantha:en-US:remote", - "sabrina:de-DE:remote", - "silvia:it-IT:remote" - ] - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 22, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 960, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 960, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 712, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1760, - "height": 990, - "colorDepth": 24, - "availWidth": 1760, - "availHeight": 953, - "devicePixelRatio": 1.09090909090909 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1536, - "availHeight": 864, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 3200, - "height": 1800, - "colorDepth": 24, - "availWidth": 3200, - "availHeight": 1800, - "devicePixelRatio": 1.2 - }, - "webgl": { - "unmaskedVendor": "NVIDIA Corporation", - "unmaskedRenderer": "NVIDIA GeForce GTX 980, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 12, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1862, - "availHeight": 1048, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon R9 200 Series, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1707, - "height": 960, - "colorDepth": 24, - "availWidth": 1707, - "availHeight": 960, - "devicePixelRatio": 1.5 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1440, - "height": 810, - "colorDepth": 24, - "availWidth": 1440, - "availHeight": 810, - "devicePixelRatio": 1.33333333333333 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 2, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1366, - "availHeight": 735, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Mesa", - "unmaskedRenderer": "Radeon HD 5850, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 2560, - "height": 1440, - "colorDepth": 24, - "availWidth": 2560, - "availHeight": 1413, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 4, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1525, - "height": 858, - "colorDepth": 24, - "availWidth": 1525, - "availHeight": 813, - "devicePixelRatio": 0.895522388059702 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1536, - "height": 864, - "colorDepth": 24, - "availWidth": 1483, - "availHeight": 832, - "devicePixelRatio": 1.25 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 8, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1366, - "height": 768, - "colorDepth": 24, - "availWidth": 1296, - "availHeight": 741, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "Intel", - "unmaskedRenderer": "Intel(R) HD Graphics 400, or similar" - } - }, - { - "navigator": { - "userAgent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:149.0) Gecko/20100101 Firefox/149.0", - "platform": "Linux x86_64", - "hardwareConcurrency": 16, - "maxTouchPoints": 0 - }, - "screen": { - "width": 1920, - "height": 1080, - "colorDepth": 24, - "availWidth": 1920, - "availHeight": 1080, - "devicePixelRatio": 1 - }, - "webgl": { - "unmaskedVendor": "AMD", - "unmaskedRenderer": "Radeon HD 3200 Graphics, or similar" - } - } - ] - } -} diff --git a/src-tauri/src/camoufox/data/fonts.json b/src-tauri/src/camoufox/data/fonts.json deleted file mode 100644 index 0f16348..0000000 --- a/src-tauri/src/camoufox/data/fonts.json +++ /dev/null @@ -1,822 +0,0 @@ -{ - "win": [ - "Arial", - "Arial Black", - "Bahnschrift", - "Calibri", - "Calibri Light", - "Cambria", - "Cambria Math", - "Candara", - "Candara Light", - "Comic Sans MS", - "Consolas", - "Constantia", - "Corbel", - "Corbel Light", - "Courier New", - "Ebrima", - "Franklin Gothic Medium", - "Gabriola", - "Gadugi", - "Georgia", - "HoloLens MDL2 Assets", - "Impact", - "Ink Free", - "Javanese Text", - "Leelawadee UI", - "Leelawadee UI Semilight", - "Lucida Console", - "Lucida Sans Unicode", - "MS Gothic", - "MS PGothic", - "MS UI Gothic", - "MV Boli", - "Malgun Gothic", - "Malgun Gothic Semilight", - "Marlett", - "Microsoft Himalaya", - "Microsoft JhengHei", - "Microsoft JhengHei Light", - "Microsoft JhengHei UI", - "Microsoft JhengHei UI Light", - "Microsoft New Tai Lue", - "Microsoft PhagsPa", - "Microsoft Sans Serif", - "Microsoft Tai Le", - "Microsoft YaHei", - "Microsoft YaHei Light", - "Microsoft YaHei UI", - "Microsoft YaHei UI Light", - "Microsoft Yi Baiti", - "MingLiU-ExtB", - "MingLiU_HKSCS-ExtB", - "Mongolian Baiti", - "Myanmar Text", - "NSimSun", - "Nirmala UI", - "Nirmala UI Semilight", - "PMingLiU-ExtB", - "Palatino Linotype", - "Segoe Fluent Icons", - "Segoe MDL2 Assets", - "Segoe Print", - "Segoe Script", - "Segoe UI", - "Segoe UI Black", - "Segoe UI Emoji", - "Segoe UI Historic", - "Segoe UI Light", - "Segoe UI Semibold", - "Segoe UI Semilight", - "Segoe UI Symbol", - "Segoe UI Variable", - "SimSun", - "SimSun-ExtB", - "Sitka", - "Sitka Text", - "Sylfaen", - "Symbol", - "Tahoma", - "Times New Roman", - "Trebuchet MS", - "Twemoji Mozilla", - "Verdana", - "Webdings", - "Wingdings", - "Yu Gothic", - "Yu Gothic Light", - "Yu Gothic Medium", - "Yu Gothic UI", - "Yu Gothic UI Light", - "Yu Gothic UI Semibold", - "Yu Gothic UI Semilight", - "\u5b8b\u4f53", - "\u5fae\u8edf\u6b63\u9ed1\u9ad4", - "\u5fae\u8edf\u6b63\u9ed1\u9ad4 Light", - "\u5fae\u8f6f\u96c5\u9ed1", - "\u5fae\u8f6f\u96c5\u9ed1 Light", - "\u65b0\u5b8b\u4f53", - "\u65b0\u7d30\u660e\u9ad4-ExtB", - "\u6e38\u30b4\u30b7\u30c3\u30af", - "\u6e38\u30b4\u30b7\u30c3\u30af Light", - "\u6e38\u30b4\u30b7\u30c3\u30af Medium", - "\u7d30\u660e\u9ad4-ExtB", - "\u7d30\u660e\u9ad4_HKSCS-ExtB", - "\ub9d1\uc740 \uace0\ub515", - "\ub9d1\uc740 \uace0\ub515 Semilight", - "\uff2d\uff33 \u30b4\u30b7\u30c3\u30af", - "\uff2d\uff33 \uff30\u30b4\u30b7\u30c3\u30af" - ], - "mac": [ - ".Al Bayan PUA", - ".Al Nile PUA", - ".Al Tarikh PUA", - ".Apple Color Emoji UI", - ".Apple SD Gothic NeoI", - ".Aqua Kana", - ".Aqua Kana Bold", - ".Aqua \u304b\u306a", - ".Aqua \u304b\u306a \u30dc\u30fc\u30eb\u30c9", - ".Arial Hebrew Desk Interface", - ".Baghdad PUA", - ".Beirut PUA", - ".Damascus PUA", - ".DecoType Naskh PUA", - ".Diwan Kufi PUA", - ".Farah PUA", - ".Geeza Pro Interface", - ".Geeza Pro PUA", - ".Helvetica LT MM", - ".Hiragino Kaku Gothic Interface", - ".Hiragino Sans GB Interface", - ".Keyboard", - ".KufiStandardGK PUA", - ".LastResort", - ".Lucida Grande UI", - ".Muna PUA", - ".Nadeem PUA", - ".New York", - ".Noto Nastaliq Urdu UI", - ".PingFang HK", - ".PingFang SC", - ".PingFang TC", - ".SF Arabic", - ".SF Arabic Rounded", - ".SF Compact", - ".SF Compact Rounded", - ".SF NS", - ".SF NS Mono", - ".SF NS Rounded", - ".Sana PUA", - ".Savoye LET CC.", - ".ThonburiUI", - ".ThonburiUIWatch", - ".\u82f9\u65b9-\u6e2f", - ".\u82f9\u65b9-\u7b80", - ".\u82f9\u65b9-\u7e41", - ".\u860b\u65b9-\u6e2f", - ".\u860b\u65b9-\u7c21", - ".\u860b\u65b9-\u7e41", - "Academy Engraved LET", - "Al Bayan", - "Al Nile", - "Al Tarikh", - "American Typewriter", - "Andale Mono", - "Apple Braille", - "Apple Chancery", - "Apple Color Emoji", - "Apple SD Gothic Neo", - "Apple SD \uc0b0\ub3cc\uace0\ub515 Neo", - "Apple Symbols", - "AppleGothic", - "AppleMyungjo", - "Arial", - "Arial Black", - "Arial Hebrew", - "Arial Hebrew Scholar", - "Arial Narrow", - "Arial Rounded MT Bold", - "Arial Unicode MS", - "Athelas", - "Avenir", - "Avenir Black", - "Avenir Black Oblique", - "Avenir Book", - "Avenir Heavy", - "Avenir Light", - "Avenir Medium", - "Avenir Next", - "Avenir Next Condensed", - "Avenir Next Condensed Demi Bold", - "Avenir Next Condensed Heavy", - "Avenir Next Condensed Medium", - "Avenir Next Condensed Ultra Light", - "Avenir Next Demi Bold", - "Avenir Next Heavy", - "Avenir Next Medium", - "Avenir Next Ultra Light", - "Ayuthaya", - "Baghdad", - "Bangla MN", - "Bangla Sangam MN", - "Baskerville", - "Beirut", - "Big Caslon", - "Bodoni 72", - "Bodoni 72 Oldstyle", - "Bodoni 72 Smallcaps", - "Bodoni Ornaments", - "Bradley Hand", - "Brush Script MT", - "Chalkboard", - "Chalkboard SE", - "Chalkduster", - "Charter", - "Charter Black", - "Cochin", - "Comic Sans MS", - "Copperplate", - "Corsiva Hebrew", - "Courier", - "Courier New", - "Czcionka systemowa", - "DIN Alternate", - "DIN Condensed", - "Damascus", - "DecoType Naskh", - "Devanagari MT", - "Devanagari Sangam MN", - "Didot", - "Diwan Kufi", - "Diwan Thuluth", - "Euphemia UCAS", - "Farah", - "Farisi", - "Font Sistem", - "Font de sistem", - "Font di sistema", - "Font sustava", - "Fonte do Sistema", - "Futura", - "GB18030 Bitmap", - "Galvji", - "Geeza Pro", - "Geneva", - "Georgia", - "Gill Sans", - "Grantha Sangam MN", - "Gujarati MT", - "Gujarati Sangam MN", - "Gurmukhi MN", - "Gurmukhi MT", - "Gurmukhi Sangam MN", - "Heiti SC", - "Heiti TC", - "Heiti-\uac04\uccb4", - "Heiti-\ubc88\uccb4", - "Helvetica", - "Helvetica Neue", - "Herculanum", - "Hiragino Kaku Gothic Pro", - "Hiragino Kaku Gothic Pro W3", - "Hiragino Kaku Gothic Pro W6", - "Hiragino Kaku Gothic ProN", - "Hiragino Kaku Gothic ProN W3", - "Hiragino Kaku Gothic ProN W6", - "Hiragino Kaku Gothic Std", - "Hiragino Kaku Gothic Std W8", - "Hiragino Kaku Gothic StdN", - "Hiragino Kaku Gothic StdN W8", - "Hiragino Maru Gothic Pro", - "Hiragino Maru Gothic Pro W4", - "Hiragino Maru Gothic ProN", - "Hiragino Maru Gothic ProN W4", - "Hiragino Mincho Pro", - "Hiragino Mincho Pro W3", - "Hiragino Mincho Pro W6", - "Hiragino Mincho ProN", - "Hiragino Mincho ProN W3", - "Hiragino Mincho ProN W6", - "Hiragino Sans", - "Hiragino Sans GB", - "Hiragino Sans GB W3", - "Hiragino Sans GB W6", - "Hiragino Sans W0", - "Hiragino Sans W1", - "Hiragino Sans W2", - "Hiragino Sans W3", - "Hiragino Sans W4", - "Hiragino Sans W5", - "Hiragino Sans W6", - "Hiragino Sans W7", - "Hiragino Sans W8", - "Hiragino Sans W9", - "Hoefler Text", - "Hoefler Text Ornaments", - "ITF Devanagari", - "ITF Devanagari Marathi", - "Impact", - "InaiMathi", - "Iowan Old Style", - "Iowan Old Style Black", - "J\u00e4rjestelm\u00e4fontti", - "Kailasa", - "Kannada MN", - "Kannada Sangam MN", - "Kefa", - "Khmer MN", - "Khmer Sangam MN", - "Kohinoor Bangla", - "Kohinoor Devanagari", - "Kohinoor Gujarati", - "Kohinoor Telugu", - "Kokonor", - "Krungthep", - "KufiStandardGK", - "Lao MN", - "Lao Sangam MN", - "Lucida Grande", - "Luminari", - "Malayalam MN", - "Malayalam Sangam MN", - "Marion", - "Marker Felt", - "Menlo", - "Microsoft Sans Serif", - "Mishafi", - "Mishafi Gold", - "Monaco", - "Mshtakan", - "Mukta Mahee", - "MuktaMahee Bold", - "MuktaMahee ExtraBold", - "MuktaMahee ExtraLight", - "MuktaMahee Light", - "MuktaMahee Medium", - "MuktaMahee Regular", - "MuktaMahee SemiBold", - "Muna", - "Myanmar MN", - "Myanmar Sangam MN", - "Nadeem", - "New Peninim MT", - "Noteworthy", - "Noto Nastaliq Urdu", - "Noto Sans Adlam", - "Noto Sans Armenian", - "Noto Sans Armenian Blk", - "Noto Sans Armenian ExtBd", - "Noto Sans Armenian ExtLt", - "Noto Sans Armenian Light", - "Noto Sans Armenian Med", - "Noto Sans Armenian SemBd", - "Noto Sans Armenian Thin", - "Noto Sans Avestan", - "Noto Sans Bamum", - "Noto Sans Bassa Vah", - "Noto Sans Batak", - "Noto Sans Bhaiksuki", - "Noto Sans Brahmi", - "Noto Sans Buginese", - "Noto Sans Buhid", - "Noto Sans CanAborig", - "Noto Sans Canadian Aboriginal", - "Noto Sans Carian", - "Noto Sans CaucAlban", - "Noto Sans Caucasian Albanian", - "Noto Sans Chakma", - "Noto Sans Cham", - "Noto Sans Coptic", - "Noto Sans Cuneiform", - "Noto Sans Cypriot", - "Noto Sans Duployan", - "Noto Sans EgyptHiero", - "Noto Sans Egyptian Hieroglyphs", - "Noto Sans Elbasan", - "Noto Sans Glagolitic", - "Noto Sans Gothic", - "Noto Sans Gunjala Gondi", - "Noto Sans Hanifi Rohingya", - "Noto Sans HanifiRohg", - "Noto Sans Hanunoo", - "Noto Sans Hatran", - "Noto Sans ImpAramaic", - "Noto Sans Imperial Aramaic", - "Noto Sans InsPahlavi", - "Noto Sans InsParthi", - "Noto Sans Inscriptional Pahlavi", - "Noto Sans Inscriptional Parthian", - "Noto Sans Javanese", - "Noto Sans Kaithi", - "Noto Sans Kannada", - "Noto Sans Kannada Black", - "Noto Sans Kannada ExtraBold", - "Noto Sans Kannada ExtraLight", - "Noto Sans Kannada Light", - "Noto Sans Kannada Medium", - "Noto Sans Kannada SemiBold", - "Noto Sans Kannada Thin", - "Noto Sans Kayah Li", - "Noto Sans Kharoshthi", - "Noto Sans Khojki", - "Noto Sans Khudawadi", - "Noto Sans Lepcha", - "Noto Sans Limbu", - "Noto Sans Linear A", - "Noto Sans Linear B", - "Noto Sans Lisu", - "Noto Sans Lycian", - "Noto Sans Lydian", - "Noto Sans Mahajani", - "Noto Sans Mandaic", - "Noto Sans Manichaean", - "Noto Sans Marchen", - "Noto Sans Masaram Gondi", - "Noto Sans Meetei Mayek", - "Noto Sans Mende Kikakui", - "Noto Sans Meroitic", - "Noto Sans Miao", - "Noto Sans Modi", - "Noto Sans Mongolian", - "Noto Sans Mro", - "Noto Sans Multani", - "Noto Sans Myanmar", - "Noto Sans Myanmar Blk", - "Noto Sans Myanmar ExtBd", - "Noto Sans Myanmar ExtLt", - "Noto Sans Myanmar Light", - "Noto Sans Myanmar Med", - "Noto Sans Myanmar SemBd", - "Noto Sans Myanmar Thin", - "Noto Sans NKo", - "Noto Sans Nabataean", - "Noto Sans New Tai Lue", - "Noto Sans Newa", - "Noto Sans Ol Chiki", - "Noto Sans Old Hungarian", - "Noto Sans Old Italic", - "Noto Sans Old North Arabian", - "Noto Sans Old Permic", - "Noto Sans Old Persian", - "Noto Sans Old South Arabian", - "Noto Sans Old Turkic", - "Noto Sans OldHung", - "Noto Sans OldNorArab", - "Noto Sans OldSouArab", - "Noto Sans Oriya", - "Noto Sans Osage", - "Noto Sans Osmanya", - "Noto Sans Pahawh Hmong", - "Noto Sans Palmyrene", - "Noto Sans Pau Cin Hau", - "Noto Sans PhagsPa", - "Noto Sans Phoenician", - "Noto Sans PsaPahlavi", - "Noto Sans Psalter Pahlavi", - "Noto Sans Rejang", - "Noto Sans Samaritan", - "Noto Sans Saurashtra", - "Noto Sans Sharada", - "Noto Sans Siddham", - "Noto Sans Sora Sompeng", - "Noto Sans SoraSomp", - "Noto Sans Sundanese", - "Noto Sans Syloti Nagri", - "Noto Sans Syriac", - "Noto Sans Tagalog", - "Noto Sans Tagbanwa", - "Noto Sans Tai Le", - "Noto Sans Tai Tham", - "Noto Sans Tai Viet", - "Noto Sans Takri", - "Noto Sans Thaana", - "Noto Sans Tifinagh", - "Noto Sans Tirhuta", - "Noto Sans Ugaritic", - "Noto Sans Vai", - "Noto Sans Wancho", - "Noto Sans Warang Citi", - "Noto Sans Yi", - "Noto Sans Zawgyi", - "Noto Sans Zawgyi Blk", - "Noto Sans Zawgyi ExtBd", - "Noto Sans Zawgyi ExtLt", - "Noto Sans Zawgyi Light", - "Noto Sans Zawgyi Med", - "Noto Sans Zawgyi SemBd", - "Noto Sans Zawgyi Thin", - "Noto Serif Ahom", - "Noto Serif Balinese", - "Noto Serif Hmong Nyiakeng", - "Noto Serif Myanmar", - "Noto Serif Myanmar Blk", - "Noto Serif Myanmar ExtBd", - "Noto Serif Myanmar ExtLt", - "Noto Serif Myanmar Light", - "Noto Serif Myanmar Med", - "Noto Serif Myanmar SemBd", - "Noto Serif Myanmar Thin", - "Noto Serif Yezidi", - "Optima", - "Oriya MN", - "Oriya Sangam MN", - "PT Mono", - "PT Sans", - "PT Sans Caption", - "PT Sans Narrow", - "PT Serif", - "PT Serif Caption", - "Palatino", - "Papyrus", - "Party LET", - "Phosphate", - "Ph\u00f4ng ch\u1eef H\u1ec7 th\u1ed1ng", - "PingFang HK", - "PingFang SC", - "PingFang TC", - "Plantagenet Cherokee", - "Police syst\u00e8me", - "Raanana", - "Rendszerbet\u0171t\u00edpus", - "Rockwell", - "STIX Two Math", - "STIX Two Text", - "STIXGeneral", - "STIXIntegralsD", - "STIXIntegralsSm", - "STIXIntegralsUp", - "STIXIntegralsUpD", - "STIXIntegralsUpSm", - "STIXNonUnicode", - "STIXSizeFiveSym", - "STIXSizeFourSym", - "STIXSizeOneSym", - "STIXSizeThreeSym", - "STIXSizeTwoSym", - "STIXVariants", - "STSong", - "Sana", - "Sathu", - "Savoye LET", - "Seravek", - "Seravek ExtraLight", - "Seravek Light", - "Seravek Medium", - "Shree Devanagari 714", - "SignPainter", - "SignPainter-HouseScript", - "Silom", - "Sinhala MN", - "Sinhala Sangam MN", - "Sistem Fontu", - "Skia", - "Snell Roundhand", - "Songti SC", - "Songti TC", - "Sukhumvit Set", - "Superclarendon", - "Symbol", - "Systeemlettertype", - "System Font", - "Systemschrift", - "Systemskrift", - "Systemtypsnitt", - "Syst\u00e9mov\u00e9 p\u00edsmo", - "Tahoma", - "Tamil MN", - "Tamil Sangam MN", - "Telugu MN", - "Telugu Sangam MN", - "Thonburi", - "Times", - "Times New Roman", - "Tipo de letra del sistema", - "Tipo de letra do sistema", - "Tipus de lletra del sistema", - "Trattatello", - "Trebuchet MS", - "Verdana", - "Waseem", - "Webdings", - "Wingdings", - "Wingdings 2", - "Wingdings 3", - "Zapf Dingbats", - "Zapfino", - "\u0393\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2", - "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u0439 \u0448\u0440\u0438\u0444\u0442", - "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442", - "\u05d2\u05d5\u05e4\u05df \u05de\u05e2\u05e8\u05db\u05ea", - "\u0627\u0644\u0628\u064a\u0627\u0646", - "\u0627\u0644\u062a\u0627\u0631\u064a\u062e", - "\u0627\u0644\u0646\u064a\u0644", - "\u0628\u063a\u062f\u0627\u062f", - "\u0628\u064a\u0631\u0648\u062a", - "\u062c\u064a\u0632\u0629", - "\u062e\u0637 \u0627\u0644\u0646\u0638\u0627\u0645", - "\u062f\u0645\u0634\u0642", - "\u062f\u064a\u0648\u0627\u0646 \u062b\u0644\u062b", - "\u062f\u064a\u0648\u0627\u0646 \u0643\u0648\u0641\u064a", - "\u0635\u0646\u0639\u0627\u0621", - "\u0641\u0627\u0631\u0633\u064a", - "\u0641\u0631\u062d", - "\u0643\u0648\u0641\u064a", - "\u0645\u0646\u0649", - "\u0645\u0650\u0635\u062d\u0641\u064a", - "\u0645\u0650\u0635\u062d\u0641\u064a \u0630\u0647\u0628\u064a", - "\u0646\u062f\u064a\u0645", - "\u0646\u0633\u062e", - "\u0648\u0633\u064a\u0645", - "\u0906\u0908\u0970\u091f\u0940\u0970\u090f\u092b\u093c\u0970 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940", - "\u0906\u0908\u0970\u091f\u0940\u0970\u090f\u092b\u093c\u0970 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u092e\u0930\u093e\u0920\u0940", - "\u0915\u094b\u0939\u093f\u0928\u0942\u0930 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940", - "\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u090f\u092e\u0970\u091f\u0940\u0970", - "\u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u0938\u0902\u0917\u092e \u090f\u092e\u0970\u090f\u0928\u0970", - "\u0936\u094d\u0930\u0940 \u0926\u0947\u0935\u0928\u093e\u0917\u0930\u0940 \u096d\u0967\u096a", - "\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e01\u0e29\u0e23\u0e23\u0e30\u0e1a\u0e1a", - "\u2e41\u7175\u6120\u82a9\u82c8", - "\u30b7\u30b9\u30c6\u30e0\u30d5\u30a9\u30f3\u30c8", - "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 Pro", - "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 Pro W4", - "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 ProN", - "\u30d2\u30e9\u30ae\u30ce\u4e38\u30b4 ProN W4", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro W3", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d Pro W6", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN W3", - "\u30d2\u30e9\u30ae\u30ce\u660e\u671d ProN W6", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro W3", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Pro W6", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN W3", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 ProN W6", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Std", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 Std W8", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 StdN", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 StdN W8", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587 W3", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4 \u7c21\u4f53\u4e2d\u6587 W6", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W0", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W1", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W2", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W3", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W4", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W5", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W6", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W7", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W8", - "\u30d2\u30e9\u30ae\u30ce\u89d2\u30b4\u30b7\u30c3\u30af W9", - "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587", - "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587 W3", - "\u51ac\u9752\u9ed1\u4f53\u7b80\u4f53\u4e2d\u6587 W6", - "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587", - "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587 W3", - "\u51ac\u9752\u9ed1\u9ad4\u7c21\u9ad4\u4e2d\u6587 W6", - "\u5b8b\u4f53-\u7b80", - "\u5b8b\u4f53-\u7e41", - "\u5b8b\u9ad4-\u7c21", - "\u5b8b\u9ad4-\u7e41", - "\u7cfb\u7d71\u5b57\u9ad4", - "\u7cfb\u7edf\u5b57\u4f53", - "\u82f9\u65b9-\u6e2f", - "\u82f9\u65b9-\u7b80", - "\u82f9\u65b9-\u7e41", - "\u8371\u8389\u834d\u836d\u8a70\u8353\u2050\u726f", - "\u8371\u8389\u834d\u836d\u8a70\u8353\u2053\u7464", - "\u8371\u8389\u834d\u836d\u8a70\u8353\u8356\u8362\u834e", - "\u8371\u8389\u834d\u836d\u8adb\u8353\u2050\u726f", - "\u8371\u8389\u834d\u836d\u96be\u92a9\u2050\u726f", - "\u860b\u65b9-\u6e2f", - "\u860b\u65b9-\u7c21", - "\u860b\u65b9-\u7e41", - "\u9ed1\u4f53-\u7b80", - "\u9ed1\u4f53-\u7e41", - "\u9ed1\u9ad4-\u7c21", - "\u9ed1\u9ad4-\u7e41", - "\u9ed2\u4f53-\u7c21", - "\u9ed2\u4f53-\u7e41", - "\uc2dc\uc2a4\ud15c \uc11c\uccb4" - ], - "lin": [ - "Arimo", - "Cousine", - "Noto Naskh Arabic", - "Noto Sans Adlam", - "Noto Sans Armenian", - "Noto Sans Balinese", - "Noto Sans Bamum", - "Noto Sans Bassa Vah", - "Noto Sans Batak", - "Noto Sans Bengali", - "Noto Sans Buginese", - "Noto Sans Buhid", - "Noto Sans Canadian Aboriginal", - "Noto Sans Chakma", - "Noto Sans Cham", - "Noto Sans Cherokee", - "Noto Sans Coptic", - "Noto Sans Deseret", - "Noto Sans Devanagari", - "Noto Sans Elbasan", - "Noto Sans Ethiopic", - "Noto Sans Georgian", - "Noto Sans Grantha", - "Noto Sans Gujarati", - "Noto Sans Gunjala Gondi", - "Noto Sans Gurmukhi", - "Noto Sans Hanifi Rohingya", - "Noto Sans Hanunoo", - "Noto Sans Hebrew", - "Noto Sans JP", - "Noto Sans Javanese", - "Noto Sans KR", - "Noto Sans Kannada", - "Noto Sans Kayah Li", - "Noto Sans Khmer", - "Noto Sans Khojki", - "Noto Sans Khudawadi", - "Noto Sans Lao", - "Noto Sans Lepcha", - "Noto Sans Limbu", - "Noto Sans Lisu", - "Noto Sans Mahajani", - "Noto Sans Malayalam", - "Noto Sans Mandaic", - "Noto Sans Masaram Gondi", - "Noto Sans Medefaidrin", - "Noto Sans Meetei Mayek", - "Noto Sans Mende Kikakui", - "Noto Sans Miao", - "Noto Sans Modi", - "Noto Sans Mongolian", - "Noto Sans Mro", - "Noto Sans Multani", - "Noto Sans Myanmar", - "Noto Sans NKo", - "Noto Sans New Tai Lue", - "Noto Sans Newa", - "Noto Sans Ol Chiki", - "Noto Sans Oriya", - "Noto Sans Osage", - "Noto Sans Osmanya", - "Noto Sans Pahawh Hmong", - "Noto Sans Pau Cin Hau", - "Noto Sans Rejang", - "Noto Sans Runic", - "Noto Sans SC", - "Noto Sans Samaritan", - "Noto Sans Saurashtra", - "Noto Sans Sharada", - "Noto Sans Shavian", - "Noto Sans Sinhala", - "Noto Sans Sora Sompeng", - "Noto Sans Soyombo", - "Noto Sans Sundanese", - "Noto Sans Syloti Nagri", - "Noto Sans Symbols", - "Noto Sans Symbols 2", - "Noto Sans Syriac", - "Noto Sans TC", - "Noto Sans Tagalog", - "Noto Sans Tagbanwa", - "Noto Sans Tai Le", - "Noto Sans Tai Tham", - "Noto Sans Tai Viet", - "Noto Sans Takri", - "Noto Sans Tamil", - "Noto Sans Telugu", - "Noto Sans Thaana", - "Noto Sans Thai", - "Noto Sans Tifinagh", - "Noto Sans Tifinagh APT", - "Noto Sans Tifinagh Adrar", - "Noto Sans Tifinagh Agraw Imazighen", - "Noto Sans Tifinagh Ahaggar", - "Noto Sans Tifinagh Air", - "Noto Sans Tifinagh Azawagh", - "Noto Sans Tifinagh Ghat", - "Noto Sans Tifinagh Hawad", - "Noto Sans Tifinagh Rhissa Ixa", - "Noto Sans Tifinagh SIL", - "Noto Sans Tifinagh Tawellemmet", - "Noto Sans Tirhuta", - "Noto Sans Vai", - "Noto Sans Wancho", - "Noto Sans Warang Citi", - "Noto Sans Yi", - "Noto Sans Zanabazar Square", - "Noto Serif Armenian", - "Noto Serif Balinese", - "Noto Serif Bengali", - "Noto Serif Devanagari", - "Noto Serif Dogra", - "Noto Serif Ethiopic", - "Noto Serif Georgian", - "Noto Serif Grantha", - "Noto Serif Gujarati", - "Noto Serif Gurmukhi", - "Noto Serif Hebrew", - "Noto Serif Kannada", - "Noto Serif Khmer", - "Noto Serif Khojki", - "Noto Serif Lao", - "Noto Serif Malayalam", - "Noto Serif Myanmar", - "Noto Serif NP Hmong", - "Noto Serif Sinhala", - "Noto Serif Tamil", - "Noto Serif Telugu", - "Noto Serif Thai", - "Noto Serif Tibetan", - "Noto Serif Yezidi", - "STIX Two Math", - "Tinos", - "Twemoji Mozilla" - ] -} diff --git a/src-tauri/src/camoufox/data/header-network-definition.zip b/src-tauri/src/camoufox/data/header-network-definition.zip deleted file mode 100644 index 423228a4cb4375c207870502f7ce7a8dd7a2f9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40135 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�i|sjofyAP-~h(gOfTXlihC7d5Ej_IaXQTio)!WOP&noiFhn;Nhch+ z?uzP)%;gzQR7{My?;4Z^pLudUL~Er?`>YBWshG*X-|uo-QlkhVltiPyguUsm$D(m7 zWPASKRsAh*M9SCwgH&gX@^eDbY;!X2Ri^A~b^eSkYh4L%c!<+6mc>|<3FT_$UOahIg;`%gr0Jgm3>+@j^=pd zr}JA7YI#@(KXSR(PQ2Un#>nxS(BGS_MYjXO0qU%=PqV$4oOt2IJzSQ)nylcTj=` zyD%Lk>n#BU9;PERYhoCD{0>+TE6#um@gwk-I*haQ_vF{!0;OP_d~tOZ+%Mn>U;|1R z=Yid|RU#Jx=B-+05f=JuhF+Brh=uN0>2nwqx{4#jbl-5ia^?3&uO(xO$_riK z{VXajy(MPVj3TG7L}03muqiI>of%K2a*y5q^cXmks;A+)3d%+J!J83ZyjNw$L3jb_ zbw)|x@UfVNDkv*~u?wm>lSUWZ^8y2@Dx^d+KfiI*w&G~xRKU@#QR>0-rbq^@I9BDu z7r1ui;}^Kj(07&CK=gw#57NO3XlA_=r0mJMLP48<3|dit*1$r0srmQ%d;8V2K`9m=t5P5ojf+5f+Mi{bSDTIkTs979KB~ zfo^IsA4nF6#w*@dVlfC+IAUMzKBwdXl`36-XzUlk)>cZ)E!noN6>(Py@cFZ5%b7*@ z!*JF8z&{qjjrx&6+_w)dwn`)m&hacR9p_~&vG#zC{eNCaKWk2)5h31+lNO>aElaW# z{LThyaTs$9-1(vveR$|~>rxpuO@A)>t>9h3p3#ePW*fd$J5HF|$*zNse~dPH2N}<)y3RsDD*4x-5KHtVw8sj&AXu#)g|nm?{KRKIz*3 z`GPSqQqL5hejT-sH~U?_TvqNc-ceC~eA!X(ttf${a-(bWWx!!?5oiJW+6laqYd8uC z&A2mS9?Ak5aSF`b5`-#mvtc^9i30YdN zJaB@{o1cqL=TL<1&G**3Sb=bXdT<&gC_SzZuKg}G=XF19JA6f(Z;>yU=cv_Om2qLR zAQ85x%EiUi9)2ldVn9U9O!A)v_^$*1cYS*PulT<@Y+^u0{;wU;-&X#cH-EJm0QfJj CA#Cda diff --git a/src-tauri/src/camoufox/data/mod.rs b/src-tauri/src/camoufox/data/mod.rs deleted file mode 100644 index 9d9d111..0000000 --- a/src-tauri/src/camoufox/data/mod.rs +++ /dev/null @@ -1,27 +0,0 @@ -pub const FINGERPRINT_NETWORK_ZIP: &[u8] = include_bytes!("fingerprint-network-definition.zip"); -pub const INPUT_NETWORK_ZIP: &[u8] = include_bytes!("input-network-definition.zip"); -pub const HEADER_NETWORK_ZIP: &[u8] = include_bytes!("header-network-definition.zip"); -pub const BROWSER_HELPER_JSON: &str = include_str!("browser-helper-file.json"); -pub const HEADERS_ORDER_JSON: &str = include_str!("headers-order.json"); -pub const FONTS_JSON: &str = include_str!("fonts.json"); -pub const BROWSERFORGE_YML: &str = include_str!("browserforge.yml"); -pub const WEBGL_DATA_DB: &[u8] = include_bytes!("webgl_data.db"); -pub const TERRITORY_INFO_XML: &str = include_str!("territoryInfo.xml"); - -/// Real fingerprint presets bundled with the original Camoufox v135 line -/// (Firefox <= 148). Frozen upstream — kept around so users who haven't -/// upgraded their Camoufox binary keep getting matched fingerprints. -/// Mirrors `pythonlib/camoufox/fingerprint-presets.json` upstream. -pub const FINGERPRINT_PRESETS_V135_JSON: &str = include_str!("fingerprint-presets-v135.json"); - -/// Real fingerprint presets for every Camoufox release after the v135 line -/// (currently Firefox 149+ via the v150 build). This file is expected to -/// be refreshed regularly as upstream Camoufox tracks newer Firefox -/// releases — we keep the upstream filename here so each refresh is a -/// straight `cp` from `pythonlib/camoufox/fingerprint-presets-v150.json`. -pub const FINGERPRINT_PRESETS_NEWER_JSON: &str = include_str!("fingerprint-presets-v150.json"); - -/// Firefox major version at which the newer preset bundle takes over from -/// the frozen v135 bundle. Matches `PRESETS_V150_MIN_FF` in -/// `pythonlib/camoufox/fingerprints.py`. -pub const PRESETS_NEWER_MIN_FF: u32 = 149; diff --git a/src-tauri/src/camoufox/data/webgl_data.db b/src-tauri/src/camoufox/data/webgl_data.db deleted file mode 100644 index f8448aab92ea813fe576d34c404c3c75b0546740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266240 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%0D;2QNYIX|Cax^{QqSB|H9g% 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 diff --git a/src-tauri/src/camoufox/env_vars.rs b/src-tauri/src/camoufox/env_vars.rs deleted file mode 100644 index 09b3489..0000000 --- a/src-tauri/src/camoufox/env_vars.rs +++ /dev/null @@ -1,142 +0,0 @@ -//! Environment variable handling for Camoufox configuration. -//! -//! Camoufox reads its configuration from environment variables named CAMOU_CONFIG_1, CAMOU_CONFIG_2, etc. -//! The configuration JSON is chunked to fit within environment variable size limits. - -use std::collections::HashMap; - -/// Maximum chunk size for environment variables on Windows. -const CHUNK_SIZE_WINDOWS: usize = 2047; - -/// Maximum chunk size for environment variables on Unix systems. -const CHUNK_SIZE_UNIX: usize = 32767; - -/// Get the chunk size for the current platform. -fn get_chunk_size() -> usize { - if cfg!(windows) { - CHUNK_SIZE_WINDOWS - } else { - CHUNK_SIZE_UNIX - } -} - -/// Convert a Camoufox config map to environment variables. -/// -/// The config is serialized to JSON and split into chunks that fit within -/// environment variable size limits. Each chunk is stored in a variable -/// named CAMOU_CONFIG_1, CAMOU_CONFIG_2, etc. -pub fn config_to_env_vars( - config: &HashMap, -) -> Result, serde_json::Error> { - let config_json = serde_json::to_string(config)?; - Ok(chunk_config_string(&config_json)) -} - -/// Split a config string into chunks and create environment variable map. -pub fn chunk_config_string(config_str: &str) -> HashMap { - let chunk_size = get_chunk_size(); - let mut env_vars = HashMap::new(); - - for (i, chunk) in config_str.as_bytes().chunks(chunk_size).enumerate() { - let chunk_str = String::from_utf8_lossy(chunk).to_string(); - let env_name = format!("CAMOU_CONFIG_{}", i + 1); - env_vars.insert(env_name, chunk_str); - } - - env_vars -} - -/// Determine the target OS from a user agent string. -pub fn determine_ua_os(user_agent: &str) -> &'static str { - let ua_lower = user_agent.to_lowercase(); - - if ua_lower.contains("mac os") || ua_lower.contains("macos") || ua_lower.contains("macintosh") { - "mac" - } else if ua_lower.contains("windows") { - "win" - } else { - "lin" - } -} - -/// Get the fontconfig path environment variable for Linux. -pub fn get_fontconfig_env(target_os: &str, camoufox_path: &std::path::Path) -> Option { - if cfg!(target_os = "linux") { - let fontconfig_dir = camoufox_path.join("fontconfig").join(target_os); - if fontconfig_dir.exists() { - return Some(fontconfig_dir.to_string_lossy().to_string()); - } - } - None -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_chunk_small_config() { - let config = r#"{"navigator.userAgent": "Mozilla/5.0"}"#; - let env_vars = chunk_config_string(config); - - assert_eq!(env_vars.len(), 1); - assert!(env_vars.contains_key("CAMOU_CONFIG_1")); - assert_eq!(env_vars.get("CAMOU_CONFIG_1").unwrap(), config); - } - - #[test] - fn test_chunk_large_config() { - // Create a config string larger than the chunk size - let chunk_size = get_chunk_size(); - let large_value = "x".repeat(chunk_size * 2 + 100); - let config = format!(r#"{{"key": "{}"}}"#, large_value); - - let env_vars = chunk_config_string(&config); - - // Should have at least 2 chunks - assert!(env_vars.len() >= 2); - assert!(env_vars.contains_key("CAMOU_CONFIG_1")); - assert!(env_vars.contains_key("CAMOU_CONFIG_2")); - - // Reconstruct and verify - let mut reconstructed = String::new(); - let mut i = 1; - while let Some(chunk) = env_vars.get(&format!("CAMOU_CONFIG_{}", i)) { - reconstructed.push_str(chunk); - i += 1; - } - assert_eq!(reconstructed, config); - } - - #[test] - fn test_determine_ua_os_windows() { - let ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"; - assert_eq!(determine_ua_os(ua), "win"); - } - - #[test] - fn test_determine_ua_os_macos() { - let ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0"; - assert_eq!(determine_ua_os(ua), "mac"); - } - - #[test] - fn test_determine_ua_os_linux() { - let ua = "Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0"; - assert_eq!(determine_ua_os(ua), "lin"); - } - - #[test] - fn test_config_to_env_vars() { - let mut config = HashMap::new(); - config.insert( - "navigator.userAgent".to_string(), - serde_json::json!("Mozilla/5.0 Firefox/135.0"), - ); - config.insert("screen.width".to_string(), serde_json::json!(1920)); - - let env_vars = config_to_env_vars(&config).unwrap(); - assert!(!env_vars.is_empty()); - assert!(env_vars.contains_key("CAMOU_CONFIG_1")); - } -} diff --git a/src-tauri/src/camoufox/fingerprint/bayesian_network.rs b/src-tauri/src/camoufox/fingerprint/bayesian_network.rs deleted file mode 100644 index 75cce0c..0000000 --- a/src-tauri/src/camoufox/fingerprint/bayesian_network.rs +++ /dev/null @@ -1,198 +0,0 @@ -//! Bayesian network for fingerprint generation. -//! -//! Loads pre-trained probability distributions from ZIP files and samples fingerprints. - -use super::bayesian_node::{BayesianNode, NodeDefinition}; -use serde::Deserialize; -use std::collections::HashMap; -use std::io::{Cursor, Read}; -use zip::ZipArchive; - -/// Network definition structure from the ZIP file. -#[derive(Debug, Deserialize)] -pub struct NetworkDefinition { - pub nodes: Vec, -} - -/// A Bayesian network for generating consistent fingerprints. -pub struct BayesianNetwork { - nodes_in_sampling_order: Vec, - nodes_by_name: HashMap, -} - -impl BayesianNetwork { - /// Load a Bayesian network from embedded ZIP file bytes. - pub fn from_zip_bytes(zip_bytes: &[u8]) -> Result { - let cursor = Cursor::new(zip_bytes); - let mut archive = ZipArchive::new(cursor)?; - - // Find and read the JSON file from the ZIP - let mut json_content = String::new(); - for i in 0..archive.len() { - let mut file = archive.by_index(i)?; - if file.name().ends_with(".json") { - file.read_to_string(&mut json_content)?; - break; - } - } - - if json_content.is_empty() { - return Err(BayesianNetworkError::NoJsonInZip); - } - - let definition: NetworkDefinition = serde_json::from_str(&json_content)?; - - let mut nodes_in_sampling_order = Vec::with_capacity(definition.nodes.len()); - let mut nodes_by_name = HashMap::with_capacity(definition.nodes.len()); - - for (i, node_def) in definition.nodes.into_iter().enumerate() { - nodes_by_name.insert(node_def.name.clone(), i); - nodes_in_sampling_order.push(BayesianNode::new(node_def)); - } - - Ok(Self { - nodes_in_sampling_order, - nodes_by_name, - }) - } - - /// Get a node by name. - pub fn get_node(&self, name: &str) -> Option<&BayesianNode> { - self - .nodes_by_name - .get(name) - .map(|&i| &self.nodes_in_sampling_order[i]) - } - - /// Get possible values for a node. - pub fn get_possible_values(&self, name: &str) -> Option> { - self - .get_node(name) - .map(|node| node.possible_values().to_vec()) - } - - /// Generate a random sample from the network. - /// - /// `input_values` contains already known node values that should not be overwritten. - pub fn generate_sample(&self, input_values: &HashMap) -> HashMap { - let mut sample = input_values.clone(); - - for node in &self.nodes_in_sampling_order { - if !sample.contains_key(node.name()) { - let value = node.sample(&sample); - sample.insert(node.name().to_string(), value); - } - } - - sample - } - - /// Generate a random sample consistent with the given value restrictions. - /// - /// Uses backtracking to find a valid configuration. - /// Returns `None` if no consistent sample can be generated. - pub fn generate_consistent_sample_when_possible( - &self, - value_possibilities: &HashMap>, - ) -> Option> { - self.recursively_generate_consistent_sample(HashMap::new(), value_possibilities, 0) - } - - fn recursively_generate_consistent_sample( - &self, - sample_so_far: HashMap, - value_possibilities: &HashMap>, - depth: usize, - ) -> Option> { - if depth >= self.nodes_in_sampling_order.len() { - return Some(sample_so_far); - } - - let node = &self.nodes_in_sampling_order[depth]; - let mut banned_values: Vec = Vec::new(); - let mut sample_so_far = sample_so_far; - - loop { - let sample_value = node.sample_according_to_restrictions( - &sample_so_far, - value_possibilities.get(node.name()).map(|v| v.as_slice()), - &banned_values, - ); - - let Some(value) = sample_value else { - break; - }; - - sample_so_far.insert(node.name().to_string(), value.clone()); - - if let Some(complete_sample) = self.recursively_generate_consistent_sample( - sample_so_far.clone(), - value_possibilities, - depth + 1, - ) { - return Some(complete_sample); - } - - banned_values.push(value); - } - - None - } -} - -/// Errors that can occur when working with Bayesian networks. -#[derive(Debug, thiserror::Error)] -pub enum BayesianNetworkError { - #[error("ZIP file error: {0}")] - Zip(#[from] zip::result::ZipError), - - #[error("IO error: {0}")] - Io(#[from] std::io::Error), - - #[error("JSON parsing error: {0}")] - Json(#[from] serde_json::Error), - - #[error("No JSON file found in ZIP archive")] - NoJsonInZip, -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_load_input_network() { - let zip_bytes = include_bytes!("../data/input-network-definition.zip"); - let network = BayesianNetwork::from_zip_bytes(zip_bytes); - assert!( - network.is_ok(), - "Failed to load input network: {:?}", - network.err() - ); - } - - #[test] - fn test_generate_sample_from_input_network() { - let zip_bytes = include_bytes!("../data/input-network-definition.zip"); - let network = BayesianNetwork::from_zip_bytes(zip_bytes).unwrap(); - - let sample = network.generate_sample(&HashMap::new()); - assert!(!sample.is_empty(), "Sample should not be empty"); - } - - #[test] - fn test_generate_consistent_sample() { - let zip_bytes = include_bytes!("../data/input-network-definition.zip"); - let network = BayesianNetwork::from_zip_bytes(zip_bytes).unwrap(); - - let mut constraints = HashMap::new(); - constraints.insert("*OPERATING_SYSTEM".to_string(), vec!["windows".to_string()]); - - let sample = network.generate_consistent_sample_when_possible(&constraints); - assert!(sample.is_some(), "Should generate a consistent sample"); - - if let Some(s) = sample { - assert_eq!(s.get("*OPERATING_SYSTEM"), Some(&"windows".to_string())); - } - } -} diff --git a/src-tauri/src/camoufox/fingerprint/bayesian_node.rs b/src-tauri/src/camoufox/fingerprint/bayesian_node.rs deleted file mode 100644 index 44bdbdf..0000000 --- a/src-tauri/src/camoufox/fingerprint/bayesian_node.rs +++ /dev/null @@ -1,231 +0,0 @@ -//! Bayesian network node implementation for fingerprint generation. -//! -//! Implements weighted random sampling from conditional probability distributions. - -use rand::RngExt; -use serde::Deserialize; -use std::collections::HashMap; - -/// Node definition from the network JSON file. -#[derive(Debug, Clone, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct NodeDefinition { - pub name: String, - pub parent_names: Vec, - pub possible_values: Vec, - pub conditional_probabilities: ConditionalProbabilities, -} - -/// Conditional probability structure - can be nested or terminal. -#[derive(Debug, Clone, Deserialize)] -pub struct ConditionalProbabilities { - #[serde(default)] - pub deeper: Option>, - #[serde(default)] - pub skip: Option>, - #[serde(flatten)] - pub probabilities: HashMap, -} - -impl ConditionalProbabilities { - /// Check if this is a terminal node (has actual probabilities, not deeper nesting) - pub fn is_terminal(&self) -> bool { - self.deeper.is_none() - } -} - -/// A single node in the Bayesian network. -pub struct BayesianNode { - definition: NodeDefinition, -} - -impl BayesianNode { - pub fn new(definition: NodeDefinition) -> Self { - Self { definition } - } - - pub fn name(&self) -> &str { - &self.definition.name - } - - pub fn parent_names(&self) -> &[String] { - &self.definition.parent_names - } - - pub fn possible_values(&self) -> &[String] { - &self.definition.possible_values - } - - /// Get the probability distribution given parent node values. - fn get_probabilities_given_known_values( - &self, - parent_values: &HashMap, - ) -> HashMap { - let mut probabilities = &self.definition.conditional_probabilities; - - for parent_name in &self.definition.parent_names { - if let Some(deeper) = &probabilities.deeper { - if let Some(parent_value) = parent_values.get(parent_name) { - if let Some(next_level) = deeper.get(parent_value) { - probabilities = next_level; - continue; - } - } - // Use skip if parent value not found in deeper - if let Some(skip) = &probabilities.skip { - probabilities = skip; - } - } - } - - probabilities.probabilities.clone() - } - - /// Randomly sample from the given values using the given probabilities. - fn sample_random_value_from_possibilities( - possible_values: &[String], - total_probability: f64, - probabilities: &HashMap, - ) -> String { - if possible_values.is_empty() { - return String::new(); - } - - let mut rng = rand::rng(); - let anchor = rng.random::() * total_probability; - let mut cumulative = 0.0; - - for value in possible_values { - if let Some(&prob) = probabilities.get(value) { - cumulative += prob; - if cumulative > anchor { - return value.clone(); - } - } - } - - possible_values.first().cloned().unwrap_or_default() - } - - /// Sample a value from the conditional distribution given parent values. - pub fn sample(&self, parent_values: &HashMap) -> String { - let probabilities = self.get_probabilities_given_known_values(parent_values); - let possible_values: Vec = probabilities.keys().cloned().collect(); - - Self::sample_random_value_from_possibilities(&possible_values, 1.0, &probabilities) - } - - /// Sample according to restrictions on possible values. - /// - /// Returns `None` if no valid value can be sampled. - pub fn sample_according_to_restrictions( - &self, - parent_values: &HashMap, - value_possibilities: Option<&[String]>, - banned_values: &[String], - ) -> Option { - let probabilities = self.get_probabilities_given_known_values(parent_values); - let values_in_distribution: Vec = probabilities.keys().cloned().collect(); - - let possible_values = value_possibilities.unwrap_or(&values_in_distribution); - - let mut valid_values = Vec::new(); - let mut total_probability = 0.0; - - for value in possible_values { - if !banned_values.contains(value) && values_in_distribution.contains(value) { - if let Some(&prob) = probabilities.get(value) { - valid_values.push(value.clone()); - total_probability += prob; - } - } - } - - if valid_values.is_empty() { - return None; - } - - Some(Self::sample_random_value_from_possibilities( - &valid_values, - total_probability, - &probabilities, - )) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - fn create_test_node() -> BayesianNode { - let mut probs = HashMap::new(); - probs.insert("1920".to_string(), 0.5); - probs.insert("1366".to_string(), 0.3); - probs.insert("1536".to_string(), 0.2); - - let definition = NodeDefinition { - name: "screen.width".to_string(), - parent_names: vec![], - possible_values: vec!["1920".to_string(), "1366".to_string(), "1536".to_string()], - conditional_probabilities: ConditionalProbabilities { - deeper: None, - skip: None, - probabilities: probs, - }, - }; - - BayesianNode::new(definition) - } - - #[test] - fn test_sample_returns_valid_value() { - let node = create_test_node(); - let parent_values = HashMap::new(); - - for _ in 0..100 { - let value = node.sample(&parent_values); - assert!( - node.possible_values().contains(&value), - "Sampled value '{}' not in possible values", - value - ); - } - } - - #[test] - fn test_sample_with_restrictions() { - let node = create_test_node(); - let parent_values = HashMap::new(); - - let allowed = vec!["1920".to_string()]; - let banned = vec![]; - - let value = node.sample_according_to_restrictions(&parent_values, Some(&allowed), &banned); - - assert_eq!(value, Some("1920".to_string())); - } - - #[test] - fn test_sample_with_banned_values() { - let node = create_test_node(); - let parent_values = HashMap::new(); - - let banned = vec!["1920".to_string(), "1366".to_string()]; - - for _ in 0..100 { - let value = node.sample_according_to_restrictions(&parent_values, None, &banned); - assert_eq!(value, Some("1536".to_string())); - } - } - - #[test] - fn test_sample_returns_none_when_all_banned() { - let node = create_test_node(); - let parent_values = HashMap::new(); - - let banned = vec!["1920".to_string(), "1366".to_string(), "1536".to_string()]; - - let value = node.sample_according_to_restrictions(&parent_values, None, &banned); - assert!(value.is_none()); - } -} diff --git a/src-tauri/src/camoufox/fingerprint/mod.rs b/src-tauri/src/camoufox/fingerprint/mod.rs deleted file mode 100644 index 52c8e5f..0000000 --- a/src-tauri/src/camoufox/fingerprint/mod.rs +++ /dev/null @@ -1,569 +0,0 @@ -//! Fingerprint generation module. -//! -//! Generates realistic browser fingerprints using Bayesian networks trained on real browser data. - -pub mod bayesian_network; -pub mod bayesian_node; -pub mod types; - -use bayesian_network::{BayesianNetwork, BayesianNetworkError}; -use std::collections::HashMap; -use types::*; - -use crate::camoufox::data; - -/// Fingerprint generator using Bayesian networks. -pub struct FingerprintGenerator { - fingerprint_network: BayesianNetwork, - input_network: BayesianNetwork, - header_network: BayesianNetwork, - browser_helper: Vec, - headers_order: HashMap>, -} - -/// Parsed browser/HTTP version info. -#[derive(Debug, Clone)] -pub struct BrowserHttpInfo { - pub name: String, - pub version: Vec, - pub http_version: String, - pub complete_string: String, -} - -impl BrowserHttpInfo { - fn parse(s: &str) -> Option { - if s == MISSING_VALUE_DATASET_TOKEN { - return None; - } - - let parts: Vec<&str> = s.split('|').collect(); - if parts.len() != 2 { - return None; - } - - let browser_string = parts[0]; - let http_version = parts[1].to_string(); - - let browser_parts: Vec<&str> = browser_string.split('/').collect(); - if browser_parts.len() != 2 { - return None; - } - - let name = browser_parts[0].to_string(); - let version: Vec = browser_parts[1] - .split('.') - .filter_map(|v| v.parse().ok()) - .collect(); - - Some(Self { - name, - version, - http_version, - complete_string: s.to_string(), - }) - } - - pub fn major_version(&self) -> u32 { - self.version.first().copied().unwrap_or(0) - } -} - -/// Error type for fingerprint generation. -#[derive(Debug, thiserror::Error)] -pub enum FingerprintError { - #[error("Bayesian network error: {0}")] - Network(#[from] BayesianNetworkError), - - #[error("JSON parsing error: {0}")] - Json(#[from] serde_json::Error), - - #[error("Failed to generate consistent fingerprint after {0} attempts")] - GenerationFailed(u32), - - #[error("No valid fingerprint generated")] - NoValidFingerprint, -} - -impl FingerprintGenerator { - /// Create a new fingerprint generator. - pub fn new() -> Result { - let fingerprint_network = BayesianNetwork::from_zip_bytes(data::FINGERPRINT_NETWORK_ZIP)?; - let input_network = BayesianNetwork::from_zip_bytes(data::INPUT_NETWORK_ZIP)?; - let header_network = BayesianNetwork::from_zip_bytes(data::HEADER_NETWORK_ZIP)?; - - let browser_strings: Vec = serde_json::from_str(data::BROWSER_HELPER_JSON)?; - let browser_helper: Vec = browser_strings - .iter() - .filter_map(|s| BrowserHttpInfo::parse(s)) - .collect(); - - let headers_order: HashMap> = - serde_json::from_str(data::HEADERS_ORDER_JSON)?; - - Ok(Self { - fingerprint_network, - input_network, - header_network, - browser_helper, - headers_order, - }) - } - - /// Generate a fingerprint with matching headers. - pub fn get_fingerprint( - &self, - options: &FingerprintOptions, - ) -> Result { - const MAX_RETRIES: u32 = 10; - - // Build constraints from options - let mut value_possibilities = self.build_constraints(options); - - // Handle screen constraints - let screen_values = if let Some(screen_constraints) = &options.screen { - self.filter_screen_values(screen_constraints) - } else { - None - }; - - if let Some(sv) = screen_values { - value_possibilities.insert("screen".to_string(), sv); - } - - for attempt in 0..MAX_RETRIES { - // Generate input sample consistent with constraints - let input_sample = self - .input_network - .generate_consistent_sample_when_possible(&value_possibilities); - - let Some(input_sample) = input_sample else { - continue; - }; - - // Generate header sample from input - let header_sample = self.header_network.generate_sample(&input_sample); - - // Extract user agent - let user_agent = header_sample - .get("user-agent") - .or_else(|| header_sample.get("User-Agent")) - .cloned() - .unwrap_or_default(); - - // Build fingerprint constraints with the generated user agent - let mut fp_constraints = value_possibilities.clone(); - fp_constraints.insert("userAgent".to_string(), vec![user_agent.clone()]); - - // Generate fingerprint sample - let fingerprint_sample = self - .fingerprint_network - .generate_consistent_sample_when_possible(&fp_constraints); - - let Some(fp_sample) = fingerprint_sample else { - log::debug!( - "Failed to generate fingerprint on attempt {}, retrying", - attempt + 1 - ); - continue; - }; - - // Transform the sample to a Fingerprint struct - match self.transform_sample(&fp_sample, &header_sample, options) { - Ok(result) => return Ok(result), - Err(e) => { - log::debug!( - "Failed to transform fingerprint on attempt {}: {}", - attempt + 1, - e - ); - continue; - } - } - } - - Err(FingerprintError::GenerationFailed(MAX_RETRIES)) - } - - /// Build constraint map from options. - fn build_constraints(&self, options: &FingerprintOptions) -> HashMap> { - let mut constraints = HashMap::new(); - - // Operating system constraint - if let Some(os) = &options.operating_system { - constraints.insert(OPERATING_SYSTEM_NODE_NAME.to_string(), vec![os.clone()]); - } - - // Device constraint (default to desktop) - let devices = options - .devices - .clone() - .unwrap_or_else(|| vec!["desktop".to_string()]); - constraints.insert(DEVICE_NODE_NAME.to_string(), devices); - - // Browser constraint - let browsers = options - .browsers - .clone() - .unwrap_or_else(|| SUPPORTED_BROWSERS.iter().map(|s| s.to_string()).collect()); - - let http_version = options - .http_version - .clone() - .unwrap_or_else(|| "2".to_string()); - - // Filter browser helper entries by browser names and HTTP version - let browser_http_values: Vec = self - .browser_helper - .iter() - .filter(|bh| browsers.contains(&bh.name) && bh.http_version == http_version) - .map(|bh| bh.complete_string.clone()) - .collect(); - - if !browser_http_values.is_empty() { - constraints.insert(BROWSER_HTTP_NODE_NAME.to_string(), browser_http_values); - } - - constraints - } - - /// Filter screen values based on constraints. - fn filter_screen_values(&self, constraints: &ScreenConstraints) -> Option> { - let possible_values = self.fingerprint_network.get_possible_values("screen")?; - - let filtered: Vec = possible_values - .into_iter() - .filter(|screen_str| { - // Screen values are stored as "*STRINGIFIED*{...json...}" - if let Some(json_str) = screen_str.strip_prefix(STRINGIFIED_PREFIX) { - if let Ok(screen) = serde_json::from_str::(json_str) { - let width = screen["width"].as_u64().unwrap_or(0) as u32; - let height = screen["height"].as_u64().unwrap_or(0) as u32; - return constraints.matches(width, height); - } - } - true - }) - .collect(); - - if filtered.is_empty() { - None - } else { - Some(filtered) - } - } - - /// Transform raw sample data into a Fingerprint struct. - fn transform_sample( - &self, - fp_sample: &HashMap, - header_sample: &HashMap, - options: &FingerprintOptions, - ) -> Result { - // Parse values, handling STRINGIFIED prefix and MISSING_VALUE token - let mut parsed: HashMap = HashMap::new(); - - for (key, value) in fp_sample { - if value == MISSING_VALUE_DATASET_TOKEN { - continue; - } - - let parsed_value = if let Some(json_str) = value.strip_prefix(STRINGIFIED_PREFIX) { - serde_json::from_str(json_str)? - } else { - serde_json::Value::String(value.clone()) - }; - - parsed.insert(key.clone(), parsed_value); - } - - // Check if screen was generated - let screen_value = parsed.get("screen"); - if screen_value.is_none() { - return Err(FingerprintError::NoValidFingerprint); - } - - // Extract screen fingerprint - let screen = if let Some(screen_val) = screen_value { - serde_json::from_value(screen_val.clone()).unwrap_or_default() - } else { - ScreenFingerprint::default() - }; - - // Build languages from Accept-Language header - let accept_language = header_sample - .get("accept-language") - .or_else(|| header_sample.get("Accept-Language")) - .cloned() - .unwrap_or_else(|| "en-US".to_string()); - - let languages: Vec = accept_language - .split(',') - .map(|s| s.split(';').next().unwrap_or(s).trim().to_string()) - .collect(); - - let language = languages - .first() - .cloned() - .unwrap_or_else(|| "en-US".to_string()); - - // Build navigator fingerprint - let navigator = NavigatorFingerprint { - user_agent: get_string(&parsed, "userAgent"), - user_agent_data: parsed - .get("userAgentData") - .and_then(|v| serde_json::from_value(v.clone()).ok()), - do_not_track: parsed - .get("doNotTrack") - .and_then(|v| v.as_str().map(String::from)), - app_code_name: get_string_or(&parsed, "appCodeName", "Mozilla"), - app_name: get_string_or(&parsed, "appName", "Netscape"), - app_version: get_string(&parsed, "appVersion"), - oscpu: parsed - .get("oscpu") - .and_then(|v| v.as_str().map(String::from)), - webdriver: parsed - .get("webdriver") - .and_then(|v| v.as_str().map(String::from)), - language, - languages, - platform: get_string(&parsed, "platform"), - device_memory: parsed - .get("deviceMemory") - .and_then(|v| v.as_str()) - .and_then(|s| s.parse().ok()), - hardware_concurrency: parsed - .get("hardwareConcurrency") - .and_then(|v| v.as_str()) - .and_then(|s| s.parse().ok()) - .unwrap_or(4), - product: get_string_or(&parsed, "product", "Gecko"), - product_sub: get_string(&parsed, "productSub"), - vendor: get_string(&parsed, "vendor"), - vendor_sub: get_string(&parsed, "vendorSub"), - max_touch_points: parsed - .get("maxTouchPoints") - .and_then(|v| v.as_str()) - .and_then(|s| s.parse().ok()) - .unwrap_or(0), - extra_properties: parsed - .get("extraProperties") - .and_then(|v| serde_json::from_value(v.clone()).ok()), - }; - - // Build video card (will be filled later by WebGL sampler) - let video_card = parsed - .get("videoCard") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - // Build other components - let audio_codecs = parsed - .get("audioCodecs") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - let video_codecs = parsed - .get("videoCodecs") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - let plugins_data = parsed - .get("pluginsData") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - let battery = parsed - .get("battery") - .and_then(|v| serde_json::from_value(v.clone()).ok()); - - let multimedia_devices = parsed - .get("multimediaDevices") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - let fonts = parsed - .get("fonts") - .and_then(|v| serde_json::from_value(v.clone()).ok()) - .unwrap_or_default(); - - let fingerprint = Fingerprint { - screen, - navigator, - video_codecs, - audio_codecs, - plugins_data, - battery, - video_card, - multimedia_devices, - fonts, - mock_web_rtc: options.mock_web_rtc, - slim: options.slim, - }; - - // Build headers (filter out internal nodes and missing values) - let headers: Headers = header_sample - .iter() - .filter(|(k, v)| !k.starts_with('*') && *v != MISSING_VALUE_DATASET_TOKEN) - .map(|(k, v)| (k.clone(), v.clone())) - .collect(); - - // Order headers - let ordered_headers = self.order_headers(&headers, &fingerprint.navigator.user_agent); - - Ok(FingerprintWithHeaders { - fingerprint, - headers: ordered_headers, - }) - } - - /// Order headers according to browser-specific ordering. - fn order_headers(&self, headers: &Headers, user_agent: &str) -> Headers { - let browser = detect_browser_from_ua(user_agent); - let order = self.headers_order.get(browser).cloned().unwrap_or_default(); - - let mut ordered = HashMap::new(); - - // Add headers in order - for header_name in &order { - if let Some(value) = headers.get(header_name) { - ordered.insert(header_name.clone(), value.clone()); - } - } - - // Add remaining headers not in order - for (key, value) in headers { - if !order.contains(key) { - ordered.insert(key.clone(), value.clone()); - } - } - - ordered - } -} - -fn get_string(map: &HashMap, key: &str) -> String { - map - .get(key) - .and_then(|v| v.as_str()) - .map(String::from) - .unwrap_or_default() -} - -fn get_string_or(map: &HashMap, key: &str, default: &str) -> String { - map - .get(key) - .and_then(|v| v.as_str()) - .map(String::from) - .unwrap_or_else(|| default.to_string()) -} - -fn detect_browser_from_ua(user_agent: &str) -> &str { - let ua_lower = user_agent.to_lowercase(); - if ua_lower.contains("firefox") { - "firefox" - } else if ua_lower.contains("edg/") || ua_lower.contains("edge") { - "edge" - } else if ua_lower.contains("chrome") { - "chrome" - } else if ua_lower.contains("safari") { - "safari" - } else { - "chrome" - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_create_generator() { - let generator = FingerprintGenerator::new(); - assert!( - generator.is_ok(), - "Failed to create generator: {:?}", - generator.err() - ); - } - - #[test] - fn test_generate_fingerprint() { - let generator = FingerprintGenerator::new().unwrap(); - let options = FingerprintOptions::default(); - - let result = generator.get_fingerprint(&options); - assert!( - result.is_ok(), - "Failed to generate fingerprint: {:?}", - result.err() - ); - - if let Ok(fp) = result { - assert!(!fp.fingerprint.navigator.user_agent.is_empty()); - assert!(fp.fingerprint.screen.width > 0); - assert!(fp.fingerprint.screen.height > 0); - } - } - - #[test] - fn test_generate_firefox_fingerprint() { - let generator = FingerprintGenerator::new().unwrap(); - let options = FingerprintOptions { - browsers: Some(vec!["firefox".to_string()]), - ..Default::default() - }; - - let result = generator.get_fingerprint(&options); - assert!(result.is_ok(), "Failed to generate Firefox fingerprint"); - - if let Ok(fp) = result { - assert!( - fp.fingerprint - .navigator - .user_agent - .to_lowercase() - .contains("firefox"), - "User agent should contain Firefox: {}", - fp.fingerprint.navigator.user_agent - ); - } - } - - #[test] - fn test_generate_with_screen_constraints() { - let generator = FingerprintGenerator::new().unwrap(); - let options = FingerprintOptions { - screen: Some(ScreenConstraints { - min_width: Some(1900), - max_width: Some(1920), - min_height: Some(1000), - max_height: Some(1100), - }), - ..Default::default() - }; - - let result = generator.get_fingerprint(&options); - assert!( - result.is_ok(), - "Failed to generate fingerprint with screen constraints" - ); - - if let Ok(fp) = result { - assert!( - fp.fingerprint.screen.width >= 1900 && fp.fingerprint.screen.width <= 1920, - "Screen width {} should be between 1900 and 1920", - fp.fingerprint.screen.width - ); - } - } - - #[test] - fn test_browser_http_info_parse() { - let info = BrowserHttpInfo::parse("chrome/143.0.0.0|2"); - assert!(info.is_some()); - let info = info.unwrap(); - assert_eq!(info.name, "chrome"); - assert_eq!(info.major_version(), 143); - assert_eq!(info.http_version, "2"); - } -} diff --git a/src-tauri/src/camoufox/fingerprint/types.rs b/src-tauri/src/camoufox/fingerprint/types.rs deleted file mode 100644 index e348ef4..0000000 --- a/src-tauri/src/camoufox/fingerprint/types.rs +++ /dev/null @@ -1,302 +0,0 @@ -//! Fingerprint type definitions. -//! -//! These types represent browser fingerprints that can be injected into Camoufox. - -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; - -/// A complete browser fingerprint. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct Fingerprint { - pub screen: ScreenFingerprint, - pub navigator: NavigatorFingerprint, - #[serde(default)] - pub video_codecs: HashMap, - #[serde(default)] - pub audio_codecs: HashMap, - #[serde(default)] - pub plugins_data: HashMap, - #[serde(default)] - pub battery: Option, - pub video_card: VideoCard, - #[serde(default)] - pub multimedia_devices: Vec, - #[serde(default)] - pub fonts: Vec, - #[serde(default)] - pub mock_web_rtc: bool, - #[serde(default)] - pub slim: bool, -} - -/// Screen-related fingerprint properties. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct ScreenFingerprint { - pub width: u32, - pub height: u32, - pub avail_width: u32, - pub avail_height: u32, - #[serde(default)] - pub avail_top: u32, - #[serde(default)] - pub avail_left: u32, - pub color_depth: u32, - pub pixel_depth: u32, - #[serde(default = "default_device_pixel_ratio")] - pub device_pixel_ratio: f64, - #[serde(default)] - pub page_x_offset: f64, - #[serde(default)] - pub page_y_offset: f64, - pub inner_width: u32, - pub inner_height: u32, - pub outer_width: u32, - pub outer_height: u32, - #[serde(default)] - pub screen_x: i32, - #[serde(default)] - pub screen_y: i32, - #[serde(default)] - pub client_width: Option, - #[serde(default)] - pub client_height: Option, - #[serde(default)] - pub has_hdr: bool, -} - -fn default_device_pixel_ratio() -> f64 { - 1.0 -} - -/// Brand information for User-Agent Client Hints. -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Brand { - pub brand: String, - pub version: String, -} - -/// User-Agent Client Hints data. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct UserAgentData { - #[serde(default)] - pub brands: Vec, - #[serde(default)] - pub mobile: bool, - #[serde(default)] - pub platform: String, - #[serde(default)] - pub architecture: String, - #[serde(default)] - pub bitness: String, - #[serde(default)] - pub full_version_list: Vec, - #[serde(default)] - pub model: String, - #[serde(default)] - pub platform_version: String, - #[serde(default)] - pub ua_full_version: String, -} - -/// Extra navigator properties. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct ExtraProperties { - #[serde(default)] - pub vendor_flavors: Vec, - #[serde(default)] - pub is_bluetooth_supported: bool, - #[serde(default)] - pub global_privacy_control: Option, - #[serde(default = "default_pdf_viewer_enabled")] - pub pdf_viewer_enabled: bool, - #[serde(default)] - pub installed_apps: Vec, -} - -fn default_pdf_viewer_enabled() -> bool { - true -} - -/// Navigator-related fingerprint properties. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[serde(rename_all = "camelCase")] -pub struct NavigatorFingerprint { - pub user_agent: String, - #[serde(default)] - pub user_agent_data: Option, - #[serde(default)] - pub do_not_track: Option, - #[serde(default = "default_app_code_name")] - pub app_code_name: String, - #[serde(default = "default_app_name")] - pub app_name: String, - #[serde(default)] - pub app_version: String, - #[serde(default)] - pub oscpu: Option, - #[serde(default)] - pub webdriver: Option, - pub language: String, - pub languages: Vec, - pub platform: String, - #[serde(default)] - pub device_memory: Option, - pub hardware_concurrency: u32, - #[serde(default = "default_product")] - pub product: String, - #[serde(default)] - pub product_sub: String, - #[serde(default)] - pub vendor: String, - #[serde(default)] - pub vendor_sub: String, - #[serde(default)] - pub max_touch_points: u32, - #[serde(default)] - pub extra_properties: Option, -} - -fn default_app_code_name() -> String { - "Mozilla".to_string() -} - -fn default_app_name() -> String { - "Netscape".to_string() -} - -fn default_product() -> String { - "Gecko".to_string() -} - -/// WebGL video card information. -#[derive(Debug, Clone, Serialize, Deserialize, Default)] -pub struct VideoCard { - pub vendor: String, - pub renderer: String, -} - -/// Battery status fingerprint. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct BatteryFingerprint { - pub charging: bool, - pub charging_time: f64, - pub discharging_time: f64, - pub level: f64, -} - -/// HTTP headers for a fingerprint. -pub type Headers = HashMap; - -/// A fingerprint combined with matching HTTP headers. -#[derive(Debug, Clone)] -pub struct FingerprintWithHeaders { - pub fingerprint: Fingerprint, - pub headers: Headers, -} - -/// Options for generating fingerprints. -#[derive(Debug, Clone, Default)] -pub struct FingerprintOptions { - /// Target operating system: "windows", "macos", "linux" - pub operating_system: Option, - /// Target browser: "firefox", "chrome", "safari", "edge" - pub browsers: Option>, - /// Target device type: "desktop", "mobile" - pub devices: Option>, - /// Locales for Accept-Language header - pub locales: Option>, - /// HTTP version: "1" or "2" - pub http_version: Option, - /// Screen dimension constraints - pub screen: Option, - /// Whether to mock WebRTC - pub mock_web_rtc: bool, - /// Slim mode (fewer evasions) - pub slim: bool, -} - -/// Constraints for screen dimensions. -#[derive(Debug, Clone, Default)] -pub struct ScreenConstraints { - pub min_width: Option, - pub max_width: Option, - pub min_height: Option, - pub max_height: Option, -} - -impl ScreenConstraints { - pub fn new() -> Self { - Self::default() - } - - pub fn with_min_width(mut self, width: u32) -> Self { - self.min_width = Some(width); - self - } - - pub fn with_max_width(mut self, width: u32) -> Self { - self.max_width = Some(width); - self - } - - pub fn with_min_height(mut self, height: u32) -> Self { - self.min_height = Some(height); - self - } - - pub fn with_max_height(mut self, height: u32) -> Self { - self.max_height = Some(height); - self - } - - /// Check if a screen size matches these constraints. - pub fn matches(&self, width: u32, height: u32) -> bool { - if let Some(min_w) = self.min_width { - if width < min_w { - return false; - } - } - if let Some(max_w) = self.max_width { - if width > max_w { - return false; - } - } - if let Some(min_h) = self.min_height { - if height < min_h { - return false; - } - } - if let Some(max_h) = self.max_height { - if height > max_h { - return false; - } - } - true - } -} - -/// Constants used in fingerprint generation. -pub const MISSING_VALUE_DATASET_TOKEN: &str = "*MISSING_VALUE*"; -pub const STRINGIFIED_PREFIX: &str = "*STRINGIFIED*"; - -/// Special node names in the Bayesian networks. -pub const BROWSER_HTTP_NODE_NAME: &str = "*BROWSER_HTTP"; -pub const OPERATING_SYSTEM_NODE_NAME: &str = "*OPERATING_SYSTEM"; -pub const DEVICE_NODE_NAME: &str = "*DEVICE"; - -/// Supported browsers. -pub const SUPPORTED_BROWSERS: &[&str] = &["chrome", "firefox", "safari", "edge"]; - -/// Supported operating systems. -pub const SUPPORTED_OPERATING_SYSTEMS: &[&str] = &["windows", "macos", "linux", "android", "ios"]; - -/// Supported devices. -pub const SUPPORTED_DEVICES: &[&str] = &["desktop", "mobile"]; - -/// Supported HTTP versions. -pub const SUPPORTED_HTTP_VERSIONS: &[&str] = &["1", "2"]; diff --git a/src-tauri/src/camoufox/fonts.rs b/src-tauri/src/camoufox/fonts.rs deleted file mode 100644 index 2a4c2b5..0000000 --- a/src-tauri/src/camoufox/fonts.rs +++ /dev/null @@ -1,83 +0,0 @@ -//! OS-specific font lists for Camoufox. -//! -//! Provides default system fonts for Windows, macOS, and Linux. - -use std::collections::HashMap; - -use crate::camoufox::data; - -/// Get fonts for the target OS. -pub fn get_fonts_for_os(target_os: &str) -> Vec { - let fonts_map: HashMap> = - serde_json::from_str(data::FONTS_JSON).unwrap_or_default(); - - let os_key = match target_os { - "win" | "windows" => "win", - "mac" | "macos" => "mac", - "lin" | "linux" => "lin", - _ => "win", // Default to Windows fonts - }; - - fonts_map.get(os_key).cloned().unwrap_or_default() -} - -/// Get fonts for the target OS with additional custom fonts. -pub fn get_fonts_with_custom(target_os: &str, custom_fonts: Option<&[String]>) -> Vec { - let mut fonts = get_fonts_for_os(target_os); - - if let Some(custom) = custom_fonts { - // Add custom fonts, avoiding duplicates - for font in custom { - if !fonts.contains(font) { - fonts.push(font.clone()); - } - } - } - - fonts -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_get_fonts_for_windows() { - let fonts = get_fonts_for_os("win"); - assert!(!fonts.is_empty()); - assert!(fonts.contains(&"Arial".to_string())); - assert!(fonts.contains(&"Calibri".to_string())); - } - - #[test] - fn test_get_fonts_for_macos() { - let fonts = get_fonts_for_os("mac"); - assert!(!fonts.is_empty()); - assert!(fonts.contains(&"Helvetica".to_string())); - } - - #[test] - fn test_get_fonts_for_linux() { - let fonts = get_fonts_for_os("lin"); - assert!(!fonts.is_empty()); - } - - #[test] - fn test_get_fonts_with_custom() { - let custom = vec!["MyCustomFont".to_string()]; - let fonts = get_fonts_with_custom("win", Some(&custom)); - - assert!(fonts.contains(&"MyCustomFont".to_string())); - assert!(fonts.contains(&"Arial".to_string())); - } - - #[test] - fn test_fonts_no_duplicates() { - let custom = vec!["Arial".to_string()]; // Arial already exists in Windows fonts - let fonts = get_fonts_with_custom("win", Some(&custom)); - - // Count occurrences of Arial - let arial_count = fonts.iter().filter(|f| *f == "Arial").count(); - assert_eq!(arial_count, 1); - } -} diff --git a/src-tauri/src/camoufox/launcher.rs b/src-tauri/src/camoufox/launcher.rs deleted file mode 100644 index 99c13be..0000000 --- a/src-tauri/src/camoufox/launcher.rs +++ /dev/null @@ -1,338 +0,0 @@ -//! Camoufox browser launcher using playwright-rust. -//! -//! Provides functionality to launch Camoufox browser instances with fingerprint injection. - -use std::collections::HashMap; -use std::path::{Path, PathBuf}; -use std::sync::Arc; - -use playwright::api::{Browser, BrowserContext, Playwright, ProxySettings}; -use playwright::Error as PlaywrightError; - -use crate::camoufox::config::{CamoufoxConfigBuilder, CamoufoxLaunchConfig, ProxyConfig}; -use crate::camoufox::fingerprint::types::{Fingerprint, ScreenConstraints}; - -/// Camoufox launcher for creating browser instances. -pub struct CamoufoxLauncher { - playwright: Arc, - executable_path: PathBuf, -} - -/// Error type for launcher operations. -#[derive(Debug, thiserror::Error)] -pub enum LauncherError { - #[error("Playwright error: {0}")] - Playwright(PlaywrightError), - - #[error("Playwright Arc error: {0}")] - PlaywrightArc(#[from] Arc), - - #[error("Configuration error: {0}")] - Config(#[from] crate::camoufox::config::ConfigError), - - #[error("IO error: {0}")] - Io(#[from] std::io::Error), - - #[error("Camoufox executable not found at: {0}")] - ExecutableNotFound(PathBuf), - - #[error("Failed to generate environment variables: {0}")] - EnvVars(#[from] serde_json::Error), -} - -/// Options for launching Camoufox. -#[derive(Debug, Clone, Default)] -pub struct LaunchOptions { - /// Operating system to spoof: "windows", "macos", "linux" - pub os: Option, - /// Block all images - pub block_images: bool, - /// Block WebRTC entirely - pub block_webrtc: bool, - /// Block WebGL (not recommended unless necessary) - pub block_webgl: bool, - /// Screen dimension constraints - pub screen: Option, - /// Fixed window size [width, height] - pub window: Option<(u32, u32)>, - /// Custom fingerprint (if not provided, one will be generated) - pub fingerprint: Option, - /// Run in headless mode - pub headless: bool, - /// Custom fonts to load - pub fonts: Option>, - /// Only use custom fonts (disable OS fonts) - pub custom_fonts_only: bool, - /// Firefox user preferences - pub firefox_user_prefs: Option>, - /// Proxy configuration - pub proxy: Option, - /// Additional browser arguments - pub args: Option>, - /// Additional environment variables - pub env: Option>, - /// Profile/user data directory - pub user_data_dir: Option, - /// Enable debug output - pub debug: bool, -} - -impl CamoufoxLauncher { - /// Create a new Camoufox launcher. - pub async fn new(executable_path: impl AsRef) -> Result { - let executable_path = executable_path.as_ref().to_path_buf(); - - if !executable_path.exists() { - return Err(LauncherError::ExecutableNotFound(executable_path)); - } - - let playwright = Playwright::initialize() - .await - .map_err(LauncherError::Playwright)?; - - Ok(Self { - playwright: Arc::new(playwright), - executable_path, - }) - } - - /// Launch a new Camoufox browser instance. - pub async fn launch(&self, options: LaunchOptions) -> Result { - let config = self.build_config(&options)?; - - if options.debug { - log::debug!("Camoufox config: {:?}", config.fingerprint_config); - } - - // Get environment variables - let env_vars = config.get_env_vars()?; - - // Build launch arguments - let mut args = options.args.clone().unwrap_or_default(); - - // Add headless flag if needed - if options.headless { - args.push("--headless".to_string()); - } - - // Merge environment variables - let mut env = options.env.clone().unwrap_or_default(); - for (key, value) in env_vars { - env.insert(key, value); - } - - // Handle fontconfig on Linux - if cfg!(target_os = "linux") { - if let Some(fontconfig_path) = - crate::camoufox::env_vars::get_fontconfig_env(&config.target_os, &self.executable_path) - { - env.insert("FONTCONFIG_PATH".to_string(), fontconfig_path); - } - } - - // Build Firefox user prefs - let mut firefox_prefs = config.firefox_prefs.clone(); - if let Some(user_prefs) = options.firefox_user_prefs { - for (key, value) in user_prefs { - firefox_prefs.insert(key, value); - } - } - - // Get the Firefox browser type - let firefox = self.playwright.firefox(); - - // Build launch options - let mut launch_options = firefox.launcher(); - launch_options = launch_options.executable(&self.executable_path); - launch_options = launch_options.headless(options.headless); - - // Add args - if !args.is_empty() { - launch_options = launch_options.args(&args); - } - - // Add environment as serde_json::Map - if !env.is_empty() { - let env_map: serde_json::Map = env - .into_iter() - .map(|(k, v)| (k, serde_json::Value::String(v))) - .collect(); - launch_options = launch_options.env(env_map); - } - - // Add proxy if configured - if let Some(proxy) = &config.proxy { - let proxy_settings = ProxySettings { - server: proxy.server.clone(), - username: proxy.username.clone(), - password: proxy.password.clone(), - bypass: proxy.bypass.clone(), - }; - launch_options = launch_options.proxy(proxy_settings); - } - - // Add Firefox preferences - if !firefox_prefs.is_empty() { - let prefs_map: serde_json::Map = - firefox_prefs.into_iter().collect(); - launch_options = launch_options.firefox_user_prefs(prefs_map); - } - - // Launch the browser - let browser = launch_options.launch().await?; - - Ok(browser) - } - - /// Launch a persistent browser context. - pub async fn launch_persistent_context( - &self, - user_data_dir: impl AsRef, - options: LaunchOptions, - ) -> Result { - let config = self.build_config(&options)?; - - if options.debug { - log::debug!("Camoufox config: {:?}", config.fingerprint_config); - } - - // Get environment variables - let env_vars = config.get_env_vars()?; - - // Build launch arguments - let mut args = options.args.clone().unwrap_or_default(); - - if options.headless { - args.push("--headless".to_string()); - } - - // Merge environment variables - let mut env = options.env.clone().unwrap_or_default(); - for (key, value) in env_vars { - env.insert(key, value); - } - - // Handle fontconfig on Linux - if cfg!(target_os = "linux") { - if let Some(fontconfig_path) = - crate::camoufox::env_vars::get_fontconfig_env(&config.target_os, &self.executable_path) - { - env.insert("FONTCONFIG_PATH".to_string(), fontconfig_path); - } - } - - // Build Firefox user prefs - let mut firefox_prefs = config.firefox_prefs.clone(); - if let Some(user_prefs) = options.firefox_user_prefs { - for (key, value) in user_prefs { - firefox_prefs.insert(key, value); - } - } - - // Get the Firefox browser type - let firefox = self.playwright.firefox(); - - // Build persistent context options - let mut context_options = firefox.persistent_context_launcher(user_data_dir.as_ref()); - context_options = context_options.executable(&self.executable_path); - context_options = context_options.headless(options.headless); - - // Add args - if !args.is_empty() { - context_options = context_options.args(&args); - } - - // Add environment as serde_json::Map - if !env.is_empty() { - let env_map: serde_json::Map = env - .into_iter() - .map(|(k, v)| (k, serde_json::Value::String(v))) - .collect(); - context_options = context_options.env(env_map); - } - - // Add proxy if configured - if let Some(proxy) = &config.proxy { - let proxy_settings = ProxySettings { - server: proxy.server.clone(), - username: proxy.username.clone(), - password: proxy.password.clone(), - bypass: proxy.bypass.clone(), - }; - context_options = context_options.proxy(proxy_settings); - } - - // Note: PersistentContextLauncher doesn't support firefox_user_prefs - // Firefox preferences should be set via about:config or prefs.js in the profile - - // Launch the persistent context - let context = context_options.launch().await?; - - Ok(context) - } - - /// Build Camoufox configuration from launch options. - fn build_config(&self, options: &LaunchOptions) -> Result { - let mut builder = CamoufoxConfigBuilder::new(); - - if let Some(os) = &options.os { - builder = builder.operating_system(os); - } - - if let Some(screen) = &options.screen { - builder = builder.screen_constraints(screen.clone()); - } - - if let Some(fingerprint) = &options.fingerprint { - builder = builder.fingerprint(fingerprint.clone()); - } - - builder = builder.block_images(options.block_images); - builder = builder.block_webrtc(options.block_webrtc); - builder = builder.block_webgl(options.block_webgl); - builder = builder.headless(options.headless); - - if let Some(fonts) = &options.fonts { - builder = builder.custom_fonts(fonts.clone()); - } - - builder = builder.custom_fonts_only(options.custom_fonts_only); - - if let Some(proxy) = &options.proxy { - builder = builder.proxy(proxy.clone()); - } - - // Get Firefox version from executable - if let Some(version) = crate::camoufox::config::get_firefox_version(&self.executable_path) { - builder = builder.ff_version(version); - } - - Ok(builder.build()?) - } - - /// Get the executable path. - pub fn executable_path(&self) -> &Path { - &self.executable_path - } -} - -/// Convenience function to launch Camoufox with default settings. -pub async fn launch_camoufox( - executable_path: impl AsRef, - options: LaunchOptions, -) -> Result { - let launcher = CamoufoxLauncher::new(executable_path).await?; - launcher.launch(options).await -} - -/// Convenience function to launch a persistent Camoufox context. -pub async fn launch_persistent_camoufox( - executable_path: impl AsRef, - user_data_dir: impl AsRef, - options: LaunchOptions, -) -> Result { - let launcher = CamoufoxLauncher::new(executable_path).await?; - launcher - .launch_persistent_context(user_data_dir, options) - .await -} diff --git a/src-tauri/src/camoufox/mod.rs b/src-tauri/src/camoufox/mod.rs deleted file mode 100644 index e4b43d8..0000000 --- a/src-tauri/src/camoufox/mod.rs +++ /dev/null @@ -1,155 +0,0 @@ -//! Camoufox browser integration module. -//! -//! Provides native Rust support for launching Camoufox browsers with realistic -//! fingerprint injection using playwright-rust. -//! -//! # Overview -//! -//! This module replaces the previous Node.js-based nodecar implementation with -//! a pure Rust solution. Key components: -//! -//! - **Fingerprint Generation**: Bayesian network-based fingerprint generation -//! - **WebGL Sampling**: Realistic WebGL configurations from a SQLite database -//! - **Configuration Builder**: Converts fingerprints to Camoufox config format -//! - **Launcher**: playwright-rust integration for browser launching -//! -//! # Example -//! -//! ```rust,ignore -//! use donutbrowser_lib::camoufox::{CamoufoxLauncher, LaunchOptions}; -//! -//! async fn launch_browser() -> Result<(), Box> { -//! let launcher = CamoufoxLauncher::new("/path/to/camoufox").await?; -//! -//! let options = LaunchOptions { -//! os: Some("windows".to_string()), -//! headless: false, -//! ..Default::default() -//! }; -//! -//! let browser = launcher.launch(options).await?; -//! -//! // Use the browser... -//! -//! browser.close().await?; -//! Ok(()) -//! } -//! ``` - -pub mod config; -pub mod data; -pub mod env_vars; -pub mod fingerprint; -pub mod fonts; -pub mod geolocation; -pub mod launcher; -pub mod presets; -pub mod webgl; - -// Re-export main types for convenience -pub use config::{ - CamoufoxConfigBuilder, CamoufoxLaunchConfig, ConfigError, GeoIPOption, ProxyConfig, -}; -pub use fingerprint::types::{ - Fingerprint, FingerprintOptions, FingerprintWithHeaders, NavigatorFingerprint, ScreenConstraints, - ScreenFingerprint, VideoCard, -}; -pub use fingerprint::{FingerprintError, FingerprintGenerator}; -pub use geolocation::{ - fetch_public_ip, get_geolocation, is_geoip_available, is_ipv4, is_ipv6, validate_ip, Geolocation, - GeolocationError, Locale, LocaleSelector, -}; -pub use launcher::{ - launch_camoufox, launch_persistent_camoufox, CamoufoxLauncher, LaunchOptions, LauncherError, -}; -pub use webgl::{sample_webgl, WebGLData, WebGLError}; - -/// Unified error type for all Camoufox operations. -#[derive(Debug, thiserror::Error)] -pub enum CamoufoxError { - #[error("Launcher error: {0}")] - Launcher(#[from] LauncherError), - - #[error("Configuration error: {0}")] - Config(#[from] ConfigError), - - #[error("Fingerprint error: {0}")] - Fingerprint(#[from] FingerprintError), - - #[error("WebGL error: {0}")] - WebGL(#[from] WebGLError), - - #[error("Geolocation error: {0}")] - Geolocation(#[from] GeolocationError), - - #[error("IO error: {0}")] - Io(#[from] std::io::Error), -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_fingerprint_generation() { - let generator = FingerprintGenerator::new().unwrap(); - let options = FingerprintOptions { - browsers: Some(vec!["firefox".to_string()]), - operating_system: Some("windows".to_string()), - ..Default::default() - }; - - let result = generator.get_fingerprint(&options); - assert!(result.is_ok()); - - let fp = result.unwrap(); - assert!(!fp.fingerprint.navigator.user_agent.is_empty()); - assert!(fp.fingerprint.screen.width > 0); - } - - #[test] - fn test_config_builder() { - let config = CamoufoxConfigBuilder::new() - .operating_system("windows") - .block_images(false) - .build(); - - assert!(config.is_ok()); - - let config = config.unwrap(); - assert!(!config.fingerprint_config.is_empty()); - assert!(config - .fingerprint_config - .contains_key("navigator.userAgent")); - } - - #[test] - fn test_webgl_sampling() { - let result = webgl::sample_webgl("win", None, None); - assert!(result.is_ok()); - - let webgl_data = result.unwrap(); - assert!(!webgl_data.vendor.is_empty()); - assert!(!webgl_data.renderer.is_empty()); - } - - #[test] - fn test_fonts() { - let fonts = fonts::get_fonts_for_os("win"); - assert!(!fonts.is_empty()); - assert!(fonts.contains(&"Arial".to_string())); - } - - #[test] - fn test_env_vars() { - let mut config = std::collections::HashMap::new(); - config.insert( - "navigator.userAgent".to_string(), - serde_json::json!("Mozilla/5.0"), - ); - - let env_vars = env_vars::config_to_env_vars(&config).unwrap(); - assert!(!env_vars.is_empty()); - assert!(env_vars.contains_key("CAMOU_CONFIG_1")); - } -} diff --git a/src-tauri/src/camoufox/presets.rs b/src-tauri/src/camoufox/presets.rs deleted file mode 100644 index eaecd48..0000000 --- a/src-tauri/src/camoufox/presets.rs +++ /dev/null @@ -1,405 +0,0 @@ -//! Real-fingerprint preset support for Camoufox. -//! -//! Mirrors the preset-selection logic from -//! `pythonlib/camoufox/fingerprints.py` (`_select_presets_file`, -//! `load_presets`, `get_random_preset`, `from_preset`). -//! -//! Camoufox ships two bundled preset files: -//! - `fingerprint-presets-v135.json` — real fingerprints harvested from -//! browsers running Firefox ≤148. The frozen "v135 line" — kept around -//! so users who haven't upgraded their Camoufox binary keep getting -//! consistent fingerprints. -//! - `fingerprint-presets-v150.json` — the *newer* bundle, refreshed by -//! upstream as Camoufox tracks newer Firefox versions. This is the -//! bundle every newer Camoufox release uses; we make no assumption that -//! Firefox 150 is the ceiling. -//! -//! At launch we know the bundled Firefox version (see -//! `config::get_firefox_version`) and pick `v135` or `newer` accordingly. -//! The split point lives in `data::PRESETS_NEWER_MIN_FF` (currently 149) -//! and is the only number we hard-code — anything ≥ that gets the newer -//! bundle, regardless of how far Firefox itself has moved on. -//! -//! Falling back to Bayesian-network synthesis (the previous default) is -//! still possible when no preset matches the requested OS. - -use rand::prelude::IndexedRandom; -use regex_lite::Regex; -use serde::Deserialize; -use std::collections::HashMap; -use std::sync::OnceLock; - -use crate::camoufox::data; - -#[derive(Debug, Clone, Deserialize)] -pub struct Navigator { - #[serde(rename = "userAgent")] - pub user_agent: Option, - pub platform: Option, - #[serde(rename = "hardwareConcurrency")] - pub hardware_concurrency: Option, - #[serde(rename = "maxTouchPoints")] - pub max_touch_points: Option, - pub oscpu: Option, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct Screen { - pub width: Option, - pub height: Option, - #[serde(rename = "colorDepth")] - pub color_depth: Option, - #[serde(rename = "availWidth")] - pub avail_width: Option, - #[serde(rename = "availHeight")] - pub avail_height: Option, - #[serde(rename = "devicePixelRatio")] - pub device_pixel_ratio: Option, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct WebGl { - #[serde(rename = "unmaskedVendor")] - pub unmasked_vendor: Option, - #[serde(rename = "unmaskedRenderer")] - pub unmasked_renderer: Option, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct Preset { - #[serde(default)] - pub navigator: Option, - #[serde(default)] - pub screen: Option, - #[serde(default)] - pub webgl: Option, - #[serde(default)] - pub timezone: Option, - #[serde(default)] - pub fonts: Option>, - #[serde(rename = "speechVoices", default)] - pub speech_voices: Option>, -} - -#[derive(Debug, Clone, Deserialize)] -pub struct PresetBundle { - /// Bundle schema version — upstream writes this as a JSON integer (e.g. - /// `1`), so we accept any JSON shape here and ignore it. Only the - /// `presets` map matters at runtime. - #[allow(dead_code)] - #[serde(default)] - pub version: Option, - #[serde(default)] - pub presets: HashMap>, -} - -/// Which Camoufox release line the active binary belongs to. Determines -/// which preset bundle to load. The set is intentionally just two-valued: -/// the legacy v135 line and "everything newer" — upstream refreshes the -/// newer bundle as Firefox versions advance, but our routing logic stays -/// the same. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum PresetLine { - V135, - Newer, -} - -/// Pick the preset line that matches a Firefox major version, mirroring -/// `_select_presets_file` in the Python lib. Unknown / very old versions -/// fall back to the v135 bundle so the older Camoufox builds keep working. -pub fn preset_line_for(ff_version: Option) -> PresetLine { - match ff_version { - Some(v) if v >= data::PRESETS_NEWER_MIN_FF => PresetLine::Newer, - _ => PresetLine::V135, - } -} - -/// Cache the parsed bundles forever — they're static, embedded data and -/// parsing the newer file twice would waste a few megs of CPU work on -/// every launch. -static V135_BUNDLE: OnceLock> = OnceLock::new(); -static NEWER_BUNDLE: OnceLock> = OnceLock::new(); - -fn parse_bundle(json: &str) -> Option { - match serde_json::from_str::(json) { - Ok(b) => Some(b), - Err(e) => { - log::warn!("camoufox preset bundle failed to parse: {e}"); - None - } - } -} - -pub fn load_presets(line: PresetLine) -> Option<&'static PresetBundle> { - let slot = match line { - PresetLine::V135 => &V135_BUNDLE, - PresetLine::Newer => &NEWER_BUNDLE, - }; - slot - .get_or_init(|| match line { - PresetLine::V135 => parse_bundle(data::FINGERPRINT_PRESETS_V135_JSON), - PresetLine::Newer => parse_bundle(data::FINGERPRINT_PRESETS_NEWER_JSON), - }) - .as_ref() -} - -/// Normalize the OS string the rest of the codebase uses ("macos", "windows", -/// "linux") to the preset key. Returns `None` for OSes that don't have any -/// presets bundled. -fn normalize_os(os: &str) -> Option<&'static str> { - match os { - "windows" | "win" => Some("windows"), - "macos" | "mac" | "darwin" => Some("macos"), - "linux" | "lin" => Some("linux"), - _ => None, - } -} - -/// Pick a random preset for the requested OS. `None` if there are no -/// presets bundled for that OS (which can happen in tests with reduced -/// fixtures, or if a new OS is added before its preset bundle ships). -pub fn get_random_preset(os: Option<&str>, ff_version: Option) -> Option { - let bundle = load_presets(preset_line_for(ff_version))?; - - let candidates: Vec<&Preset> = match os.and_then(normalize_os) { - Some(os_key) => bundle.presets.get(os_key).map(|v| v.iter().collect())?, - None => bundle.presets.values().flatten().collect(), - }; - if candidates.is_empty() { - return None; - } - candidates.choose(&mut rand::rng()).map(|p| (*p).clone()) -} - -/// Match python's `from_preset` — translate a real-fingerprint preset into -/// the CAMOU_CONFIG-style HashMap the rest of the launcher expects. -/// -/// The caller is responsible for filling in fonts, voices, and the random -/// seeds; those are intentionally left out here so each call site can layer -/// its own RNG and font policy. -pub fn from_preset(preset: &Preset, ff_version: Option) -> HashMap { - let mut config: HashMap = HashMap::new(); - - if let Some(nav) = &preset.navigator { - if let Some(ua) = &nav.user_agent { - let ua = if let Some(v) = ff_version { - rewrite_ua_firefox_version(ua, v) - } else { - ua.clone() - }; - config.insert("navigator.userAgent".to_string(), serde_json::json!(ua)); - } - if let Some(p) = &nav.platform { - config.insert("navigator.platform".to_string(), serde_json::json!(p)); - } - if let Some(hc) = nav.hardware_concurrency { - config.insert( - "navigator.hardwareConcurrency".to_string(), - serde_json::json!(hc), - ); - } - if let Some(mtp) = nav.max_touch_points { - config.insert( - "navigator.maxTouchPoints".to_string(), - serde_json::json!(mtp), - ); - } - // navigator.oscpu — explicit, or derived from the platform. - let oscpu = nav.oscpu.clone().or_else(|| { - nav.platform.as_deref().and_then(|plat| match plat { - "MacIntel" => Some("Intel Mac OS X 10.15".to_string()), - "Win32" => Some("Windows NT 10.0; Win64; x64".to_string()), - p if p.to_ascii_lowercase().contains("linux") => Some("Linux x86_64".to_string()), - _ => None, - }) - }); - if let Some(o) = oscpu { - config.insert("navigator.oscpu".to_string(), serde_json::json!(o)); - } - } - - if let Some(s) = &preset.screen { - if let Some(w) = s.width { - config.insert("screen.width".to_string(), serde_json::json!(w)); - } - if let Some(h) = s.height { - config.insert("screen.height".to_string(), serde_json::json!(h)); - } - if let Some(cd) = s.color_depth { - config.insert("screen.colorDepth".to_string(), serde_json::json!(cd)); - config.insert("screen.pixelDepth".to_string(), serde_json::json!(cd)); - } - if let Some(aw) = s.avail_width { - config.insert("screen.availWidth".to_string(), serde_json::json!(aw)); - } - if let Some(ah) = s.avail_height { - config.insert("screen.availHeight".to_string(), serde_json::json!(ah)); - } - } - - if let Some(w) = &preset.webgl { - if let Some(v) = &w.unmasked_vendor { - config.insert("webGl:vendor".to_string(), serde_json::json!(v)); - } - if let Some(r) = &w.unmasked_renderer { - config.insert("webGl:renderer".to_string(), serde_json::json!(r)); - } - } - - if let Some(tz) = &preset.timezone { - config.insert("timezone".to_string(), serde_json::json!(tz)); - } - - config -} - -fn rewrite_ua_firefox_version(ua: &str, version: u32) -> String { - let firefox_re = Regex::new(r"Firefox/\d+\.0").expect("static regex"); - let rv_re = Regex::new(r"rv:\d+\.0").expect("static regex"); - let first = firefox_re.replace_all(ua, format!("Firefox/{version}.0")); - rv_re - .replace_all(&first, format!("rv:{version}.0")) - .into_owned() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn picks_v135_for_old_firefox() { - assert_eq!(preset_line_for(Some(135)), PresetLine::V135); - assert_eq!(preset_line_for(Some(148)), PresetLine::V135); - assert_eq!(preset_line_for(None), PresetLine::V135); - } - - #[test] - fn picks_newer_for_anything_past_the_legacy_line() { - // The threshold is data::PRESETS_NEWER_MIN_FF (currently 149). - // Future Firefox versions all share the same bundle — there's - // intentionally no per-version routing past v135. - assert_eq!(preset_line_for(Some(149)), PresetLine::Newer); - assert_eq!(preset_line_for(Some(150)), PresetLine::Newer); - assert_eq!(preset_line_for(Some(160)), PresetLine::Newer); - assert_eq!(preset_line_for(Some(200)), PresetLine::Newer); - } - - #[test] - fn both_bundles_parse_and_cover_all_platforms() { - for (line, json) in [ - (PresetLine::V135, data::FINGERPRINT_PRESETS_V135_JSON), - (PresetLine::Newer, data::FINGERPRINT_PRESETS_NEWER_JSON), - ] { - let bundle: PresetBundle = - serde_json::from_str(json).unwrap_or_else(|e| panic!("bundle {line:?} parse error: {e}")); - for os in ["macos", "windows", "linux"] { - let presets = bundle.presets.get(os).unwrap_or_else(|| { - panic!("bundle {line:?} is missing presets for {os}"); - }); - assert!( - !presets.is_empty(), - "bundle {line:?} has zero presets for {os}" - ); - } - } - } - - #[test] - fn random_preset_returns_for_each_os() { - for os in ["macos", "windows", "linux"] { - let preset = get_random_preset(Some(os), Some(150)).expect("preset"); - assert!(preset.navigator.is_some(), "navigator present for {os}"); - } - } - - #[test] - fn from_preset_rewrites_firefox_version() { - let preset = Preset { - navigator: Some(Navigator { - user_agent: Some( - "Mozilla/5.0 (X11; Linux x86_64; rv:135.0) Gecko/20100101 Firefox/135.0".to_string(), - ), - platform: Some("Linux x86_64".to_string()), - hardware_concurrency: Some(8), - max_touch_points: Some(0), - oscpu: None, - }), - screen: None, - webgl: None, - timezone: None, - fonts: None, - speech_voices: None, - }; - let config = from_preset(&preset, Some(150)); - let ua = config - .get("navigator.userAgent") - .and_then(|v| v.as_str()) - .unwrap(); - assert!(ua.contains("Firefox/150.0"), "got: {ua}"); - assert!(ua.contains("rv:150.0"), "got: {ua}"); - // oscpu derived from "Linux x86_64" platform - assert_eq!( - config - .get("navigator.oscpu") - .and_then(|v| v.as_str()) - .unwrap(), - "Linux x86_64" - ); - } - - #[test] - fn from_preset_derives_oscpu_for_mac_and_win() { - let mut preset = Preset { - navigator: Some(Navigator { - user_agent: None, - platform: Some("MacIntel".to_string()), - hardware_concurrency: None, - max_touch_points: None, - oscpu: None, - }), - screen: None, - webgl: None, - timezone: None, - fonts: None, - speech_voices: None, - }; - assert_eq!( - from_preset(&preset, None) - .get("navigator.oscpu") - .and_then(|v| v.as_str()) - .unwrap(), - "Intel Mac OS X 10.15" - ); - preset.navigator.as_mut().unwrap().platform = Some("Win32".to_string()); - assert_eq!( - from_preset(&preset, None) - .get("navigator.oscpu") - .and_then(|v| v.as_str()) - .unwrap(), - "Windows NT 10.0; Win64; x64" - ); - } - - #[test] - fn screen_color_depth_fills_both_keys() { - let preset = Preset { - navigator: None, - screen: Some(Screen { - width: Some(1920), - height: Some(1080), - color_depth: Some(24), - avail_width: Some(1920), - avail_height: Some(1050), - device_pixel_ratio: Some(1.0), - }), - webgl: None, - timezone: None, - fonts: None, - speech_voices: None, - }; - let config = from_preset(&preset, None); - assert_eq!(config.get("screen.colorDepth").unwrap(), 24); - assert_eq!(config.get("screen.pixelDepth").unwrap(), 24); - assert_eq!(config.get("screen.availWidth").unwrap(), 1920); - } -} diff --git a/src-tauri/src/camoufox/webgl.rs b/src-tauri/src/camoufox/webgl.rs deleted file mode 100644 index 7cf5597..0000000 --- a/src-tauri/src/camoufox/webgl.rs +++ /dev/null @@ -1,251 +0,0 @@ -//! WebGL fingerprint sampling from SQLite database. -//! -//! Samples realistic WebGL configurations based on OS-specific probability distributions. - -use rand::RngExt; -use rusqlite::{Connection, Result as SqliteResult}; -use std::collections::HashMap; -use std::io::Write; -use tempfile::NamedTempFile; - -use crate::camoufox::data; - -/// WebGL fingerprint data. -#[derive(Debug, Clone)] -pub struct WebGLData { - pub vendor: String, - pub renderer: String, - pub config: HashMap, -} - -/// Error type for WebGL operations. -#[derive(Debug, thiserror::Error)] -pub enum WebGLError { - #[error("SQLite error: {0}")] - Sqlite(#[from] rusqlite::Error), - - #[error("JSON parsing error: {0}")] - Json(#[from] serde_json::Error), - - #[error("IO error: {0}")] - Io(#[from] std::io::Error), - - #[error("No WebGL data found for OS: {0}")] - NoDataForOS(String), - - #[error("Invalid vendor/renderer combination for OS {os}: {vendor}/{renderer}")] - InvalidCombination { - os: String, - vendor: String, - renderer: String, - }, -} - -/// Sample a WebGL configuration for the given OS. -/// -/// If `vendor` and `renderer` are provided, returns the specific configuration. -/// Otherwise, randomly samples based on OS-specific probability weights. -pub fn sample_webgl( - os: &str, - vendor: Option<&str>, - renderer: Option<&str>, -) -> Result { - // Write embedded database to a temporary file - let mut temp_file = NamedTempFile::new()?; - temp_file.write_all(data::WEBGL_DATA_DB)?; - let db_path = temp_file.path(); - - let conn = Connection::open(db_path)?; - - // Validate OS - let os_column = match os { - "win" | "windows" => "win", - "mac" | "macos" => "mac", - "lin" | "linux" => "lin", - _ => return Err(WebGLError::NoDataForOS(os.to_string())), - }; - - if let (Some(v), Some(r)) = (vendor, renderer) { - sample_specific(&conn, os_column, v, r) - } else { - sample_random(&conn, os_column) - } -} - -fn sample_specific( - conn: &Connection, - os_column: &str, - vendor: &str, - renderer: &str, -) -> Result { - let query = format!( - "SELECT vendor, renderer, data, {} FROM webgl_fingerprints WHERE vendor = ?1 AND renderer = ?2", - os_column - ); - - let mut stmt = conn.prepare(&query)?; - let mut rows = stmt.query([vendor, renderer])?; - - if let Some(row) = rows.next()? { - let weight: f64 = row.get(3)?; - if weight <= 0.0 { - return Err(WebGLError::InvalidCombination { - os: os_column.to_string(), - vendor: vendor.to_string(), - renderer: renderer.to_string(), - }); - } - - let data_json: String = row.get(2)?; - let config: HashMap = serde_json::from_str(&data_json)?; - - Ok(WebGLData { - vendor: vendor.to_string(), - renderer: renderer.to_string(), - config, - }) - } else { - Err(WebGLError::InvalidCombination { - os: os_column.to_string(), - vendor: vendor.to_string(), - renderer: renderer.to_string(), - }) - } -} - -fn sample_random(conn: &Connection, os_column: &str) -> Result { - let query = format!( - "SELECT vendor, renderer, data, {} FROM webgl_fingerprints WHERE {} > 0", - os_column, os_column - ); - - let mut stmt = conn.prepare(&query)?; - let rows: Vec<(String, String, String, f64)> = stmt - .query_map([], |row| { - Ok(( - row.get::<_, String>(0)?, - row.get::<_, String>(1)?, - row.get::<_, String>(2)?, - row.get::<_, f64>(3)?, - )) - })? - .collect::>>()?; - - if rows.is_empty() { - return Err(WebGLError::NoDataForOS(os_column.to_string())); - } - - // Calculate total weight - let total_weight: f64 = rows.iter().map(|(_, _, _, w)| w).sum(); - - // Weighted random selection - let mut rng = rand::rng(); - let threshold = rng.random::() * total_weight; - let mut cumulative = 0.0; - - for (vendor, renderer, data_json, weight) in &rows { - cumulative += *weight; - if cumulative >= threshold { - let config: HashMap = serde_json::from_str(data_json)?; - return Ok(WebGLData { - vendor: vendor.clone(), - renderer: renderer.clone(), - config, - }); - } - } - - // Fallback to last row - let (vendor, renderer, data_json, _) = rows.last().unwrap(); - let config: HashMap = serde_json::from_str(data_json)?; - Ok(WebGLData { - vendor: vendor.clone(), - renderer: renderer.clone(), - config, - }) -} - -/// Get all possible vendor/renderer pairs for each OS. -pub fn get_possible_pairs() -> Result>, WebGLError> { - // Write embedded database to a temporary file - let mut temp_file = NamedTempFile::new()?; - temp_file.write_all(data::WEBGL_DATA_DB)?; - let db_path = temp_file.path(); - - let conn = Connection::open(db_path)?; - let mut result = HashMap::new(); - - for os in &["win", "mac", "lin"] { - let query = format!( - "SELECT DISTINCT vendor, renderer FROM webgl_fingerprints WHERE {} > 0 ORDER BY {} DESC", - os, os - ); - - let mut stmt = conn.prepare(&query)?; - let pairs: Vec<(String, String)> = stmt - .query_map([], |row| { - Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)) - })? - .collect::>>()?; - - result.insert(os.to_string(), pairs); - } - - Ok(result) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_sample_webgl_windows() { - let result = sample_webgl("win", None, None); - assert!( - result.is_ok(), - "Failed to sample WebGL for Windows: {:?}", - result.err() - ); - - let data = result.unwrap(); - assert!(!data.vendor.is_empty()); - assert!(!data.renderer.is_empty()); - assert!(!data.config.is_empty()); - } - - #[test] - fn test_sample_webgl_macos() { - let result = sample_webgl("mac", None, None); - assert!( - result.is_ok(), - "Failed to sample WebGL for macOS: {:?}", - result.err() - ); - } - - #[test] - fn test_sample_webgl_linux() { - let result = sample_webgl("lin", None, None); - assert!( - result.is_ok(), - "Failed to sample WebGL for Linux: {:?}", - result.err() - ); - } - - #[test] - fn test_get_possible_pairs() { - let result = get_possible_pairs(); - assert!( - result.is_ok(), - "Failed to get possible pairs: {:?}", - result.err() - ); - - let pairs = result.unwrap(); - assert!(pairs.contains_key("win")); - assert!(pairs.contains_key("mac")); - assert!(pairs.contains_key("lin")); - assert!(!pairs.get("win").unwrap().is_empty()); - } -} diff --git a/src-tauri/src/camoufox_manager.rs b/src-tauri/src/camoufox_manager.rs deleted file mode 100644 index 6b388a3..0000000 --- a/src-tauri/src/camoufox_manager.rs +++ /dev/null @@ -1,855 +0,0 @@ -use crate::browser_runner::BrowserRunner; -use crate::camoufox::{CamoufoxConfigBuilder, GeoIPOption, ScreenConstraints}; -use crate::profile::BrowserProfile; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::path::PathBuf; -use std::process::Stdio; -use std::sync::Arc; -use tauri::AppHandle; -use tokio::process::Command as TokioCommand; -use tokio::sync::Mutex as AsyncMutex; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct CamoufoxConfig { - pub proxy: Option, - pub screen_max_width: Option, - pub screen_max_height: Option, - pub screen_min_width: Option, - pub screen_min_height: Option, - pub geoip: Option, // Can be String or bool - pub block_images: Option, - pub block_webrtc: Option, - pub block_webgl: Option, - pub fingerprint: Option, // JSON string of the complete fingerprint config - pub randomize_fingerprint_on_launch: Option, // Generate new fingerprint on every launch - pub os: Option, // Operating system for fingerprint generation: "windows", "macos", or "linux" -} - -impl Default for CamoufoxConfig { - fn default() -> Self { - Self { - proxy: None, - screen_max_width: None, - screen_max_height: None, - screen_min_width: None, - screen_min_height: None, - geoip: Some(serde_json::Value::Bool(true)), - block_images: None, - block_webrtc: None, - block_webgl: None, - fingerprint: None, - randomize_fingerprint_on_launch: None, - os: None, - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -#[allow(non_snake_case)] -pub struct CamoufoxLaunchResult { - pub id: String, - #[serde(alias = "process_id")] - pub processId: Option, - #[serde(alias = "profile_path")] - pub profilePath: Option, - pub url: Option, - pub cdp_port: Option, -} - -#[derive(Debug)] -struct CamoufoxInstance { - #[allow(dead_code)] - id: String, - process_id: Option, - profile_path: Option, - url: Option, - cdp_port: Option, -} - -struct CamoufoxManagerInner { - instances: HashMap, -} - -pub struct CamoufoxManager { - inner: Arc>, -} - -impl CamoufoxManager { - fn new() -> Self { - Self { - inner: Arc::new(AsyncMutex::new(CamoufoxManagerInner { - instances: HashMap::new(), - })), - } - } - - pub fn instance() -> &'static CamoufoxManager { - &CAMOUFOX_LAUNCHER - } - - async fn find_free_port() -> Result> { - let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await?; - let port = listener.local_addr()?.port(); - drop(listener); - Ok(port) - } - - #[allow(dead_code)] - pub async fn get_cdp_port(&self, profile_path: &str) -> Option { - let inner = self.inner.lock().await; - let target_path = std::path::Path::new(profile_path) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(profile_path).to_path_buf()); - - for instance in inner.instances.values() { - if let Some(path) = &instance.profile_path { - let instance_path = std::path::Path::new(path) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(path).to_path_buf()); - if instance_path == target_path { - return instance.cdp_port; - } - } - } - None - } - - pub fn get_profiles_dir(&self) -> PathBuf { - crate::app_dirs::profiles_dir() - } - - /// Generate Camoufox fingerprint configuration during profile creation - pub async fn generate_fingerprint_config( - &self, - _app_handle: &AppHandle, - profile: &crate::profile::BrowserProfile, - config: &CamoufoxConfig, - ) -> Result> { - // Get executable path - let executable_path = BrowserRunner::instance() - .get_browser_executable_path(profile) - .map_err(|e| format!("Failed to get Camoufox executable path: {e}"))?; - - // Build the config using CamoufoxConfigBuilder - let mut builder = CamoufoxConfigBuilder::new() - .block_images(config.block_images.unwrap_or(false)) - .block_webrtc(config.block_webrtc.unwrap_or(false)) - .block_webgl(config.block_webgl.unwrap_or(false)); - - // Set operating system - if let Some(os) = &config.os { - builder = builder.operating_system(os); - } - - // Build screen constraints if provided - if config.screen_min_width.is_some() - || config.screen_max_width.is_some() - || config.screen_min_height.is_some() - || config.screen_max_height.is_some() - { - let screen_constraints = ScreenConstraints { - min_width: config.screen_min_width, - max_width: config.screen_max_width, - min_height: config.screen_min_height, - max_height: config.screen_max_height, - }; - builder = builder.screen_constraints(screen_constraints); - } - - // Parse proxy if provided - if let Some(proxy_str) = &config.proxy { - let proxy_config = crate::camoufox::ProxyConfig::from_url(proxy_str) - .map_err(|e| format!("Failed to parse proxy URL: {e}"))?; - builder = builder.proxy(proxy_config); - } - - // Set Firefox version from executable - if let Some(version) = crate::camoufox::config::get_firefox_version(&executable_path) { - builder = builder.ff_version(version); - } - - // Handle geoip option - if let Some(geoip_value) = &config.geoip { - match geoip_value { - serde_json::Value::Bool(true) => { - // Auto-detect IP (through proxy if set) - builder = builder.geoip(GeoIPOption::Auto); - } - serde_json::Value::String(ip) => { - // Use specific IP - builder = builder.geoip(GeoIPOption::IP(ip.clone())); - } - _ => { - // geoip: false or other values - don't apply geolocation - } - } - } - - // Build the config (async to handle geoip) - let launch_config = builder - .build_async() - .await - .map_err(|e| format!("Failed to build Camoufox config: {e}"))?; - - // Return the fingerprint config as JSON - let config_json = serde_json::to_string(&launch_config.fingerprint_config) - .map_err(|e| format!("Failed to serialize config: {e}"))?; - - Ok(config_json) - } - - /// Launch Camoufox browser by directly spawning the process - #[allow(clippy::too_many_arguments)] - pub async fn launch_camoufox( - &self, - _app_handle: &AppHandle, - profile: &crate::profile::BrowserProfile, - profile_path: &str, - config: &CamoufoxConfig, - url: Option<&str>, - remote_debugging_port: Option, - headless: bool, - ) -> Result> { - let custom_config = if let Some(existing_fingerprint) = &config.fingerprint { - log::info!("Using existing fingerprint from profile metadata"); - existing_fingerprint.clone() - } else { - return Err("No fingerprint provided".into()); - }; - - // Get executable path - let executable_path = BrowserRunner::instance() - .get_browser_executable_path(profile) - .map_err(|e| format!("Failed to get Camoufox executable path: {e}"))?; - - // Parse the fingerprint config JSON - let mut fingerprint_config: HashMap = - serde_json::from_str(&custom_config) - .map_err(|e| format!("Failed to parse fingerprint config: {e}"))?; - - // Strip `window.history.length` even when present in a previously-saved - // fingerprint. Newer Camoufox clamps the docShell session history to the - // spoofed value, which disables the toolbar back/forward buttons. See - // the matching note in camoufox/config.rs. - fingerprint_config.remove("window.history.length"); - - // Convert to environment variables using CAMOU_CONFIG chunking - let env_vars = crate::camoufox::env_vars::config_to_env_vars(&fingerprint_config) - .map_err(|e| format!("Failed to convert config to env vars: {e}"))?; - - // Build command arguments - // Note: We intentionally do NOT use -no-remote to allow opening URLs in existing instances - // via Firefox's remote messaging mechanism. This enables "open in new tab" functionality - // when Donut is set as the default browser. - let mut args = vec![ - "-profile".to_string(), - std::path::Path::new(profile_path) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(profile_path).to_path_buf()) - .to_string_lossy() - .to_string(), - ]; - - let cdp_port = match remote_debugging_port { - Some(p) => p, - None => Self::find_free_port().await?, - }; - args.push(format!("--remote-debugging-port={cdp_port}")); - - // Add URL if provided - if let Some(url) = url { - args.push("-new-tab".to_string()); - args.push(url.to_string()); - } - - // Add headless flag when requested via the API or via the CAMOUFOX_HEADLESS - // env var (used by integration tests) - if headless || std::env::var("CAMOUFOX_HEADLESS").is_ok() { - args.push("--headless".to_string()); - } - - log::info!( - "Launching Camoufox: {:?} with args: {:?}", - executable_path, - args - ); - - // Spawn the browser process. Camoufox prints NSS/PSM and proxy failures - // to stderr (e.g. cert errors, CONNECT failures) and the user otherwise - // sees only an opaque "Secure Connection Failed" page — capture stderr - // to a per-launch file so diagnostics survive without a TTY. - let stderr_log_path = std::env::temp_dir().join(format!("camoufox-stderr-{}.log", profile.id)); - let mut command = TokioCommand::new(&executable_path); - command - .args(&args) - .stdin(Stdio::null()) - .stdout(Stdio::null()); - - match std::fs::File::create(&stderr_log_path) { - Ok(file) => { - log::info!( - "Camoufox stderr will be logged to: {}", - stderr_log_path.display() - ); - command.stderr(Stdio::from(file)); - } - Err(e) => { - log::warn!( - "Failed to open Camoufox stderr log {}: {e}", - stderr_log_path.display() - ); - command.stderr(Stdio::null()); - } - } - - // Add environment variables - for (key, value) in &env_vars { - command.env(key, value); - } - - // Handle fontconfig on Linux - if cfg!(target_os = "linux") { - let target_os = config.os.as_deref().unwrap_or("linux"); - if let Some(fontconfig_path) = - crate::camoufox::env_vars::get_fontconfig_env(target_os, &executable_path) - { - command.env("FONTCONFIG_PATH", fontconfig_path); - } - } - - let mut child = command - .spawn() - .map_err(|e| format!("Failed to spawn Camoufox process: {e}"))?; - - let process_id = child.id(); - let instance_id = format!("camoufox_{}", process_id.unwrap_or(0)); - - log::info!("Camoufox launched with PID: {:?}", process_id); - - // Watch the child so its exit status (signal / non-zero code) lands in - // the log. Without this, all we see is "PID X is no longer running" via - // the periodic sysinfo poll, with no clue why it died. - let watch_profile_path = profile_path.to_string(); - tokio::spawn(async move { - match child.wait().await { - Ok(status) => { - if status.success() { - log::info!( - "Camoufox PID {:?} for {} exited cleanly (status=0)", - process_id, - watch_profile_path - ); - } else { - log::warn!( - "Camoufox PID {:?} for {} exited abnormally: {}", - process_id, - watch_profile_path, - status - ); - } - } - Err(e) => { - log::warn!("Failed to await Camoufox PID {:?} exit: {}", process_id, e); - } - } - }); - - // Store the instance - let instance = CamoufoxInstance { - id: instance_id.clone(), - process_id, - profile_path: Some(profile_path.to_string()), - url: url.map(String::from), - cdp_port: Some(cdp_port), - }; - - let launch_result = CamoufoxLaunchResult { - id: instance_id.clone(), - processId: process_id, - profilePath: Some(profile_path.to_string()), - url: url.map(String::from), - cdp_port: Some(cdp_port), - }; - - { - let mut inner = self.inner.lock().await; - inner.instances.insert(instance_id, instance); - } - - Ok(launch_result) - } - - /// Stop a Camoufox process by ID - pub async fn stop_camoufox( - &self, - _app_handle: &AppHandle, - id: &str, - ) -> Result> { - // Get the process ID from our tracking - let process_id = { - let inner = self.inner.lock().await; - inner - .instances - .get(id) - .and_then(|instance| instance.process_id) - }; - - if let Some(pid) = process_id { - // Kill the process - let success = self.kill_process(pid); - - if success { - // Remove from our tracking - let mut inner = self.inner.lock().await; - inner.instances.remove(id); - log::info!("Stopped Camoufox instance {} (PID: {})", id, pid); - } - - Ok(success) - } else { - // No process ID found, just remove from tracking - let mut inner = self.inner.lock().await; - inner.instances.remove(id); - Ok(true) - } - } - - /// Kill a process by PID - fn kill_process(&self, pid: u32) -> bool { - #[cfg(unix)] - { - use std::os::unix::process::ExitStatusExt; - let result = std::process::Command::new("kill") - .args(["-TERM", &pid.to_string()]) - .status(); - - match result { - Ok(status) => status.success() || status.signal() == Some(0), - Err(e) => { - log::warn!("Failed to kill process {}: {}", pid, e); - false - } - } - } - - #[cfg(windows)] - { - use std::os::windows::process::CommandExt; - const CREATE_NO_WINDOW: u32 = 0x08000000; - let result = std::process::Command::new("taskkill") - .args(["/PID", &pid.to_string(), "/T"]) - .creation_flags(CREATE_NO_WINDOW) - .status(); - - match result { - Ok(status) => status.success(), - Err(e) => { - log::warn!("Failed to kill process {}: {}", pid, e); - false - } - } - } - } - - /// Find Camoufox server by profile path (for integration with browser_runner) - /// This method first checks in-memory instances, then scans system processes - /// to detect Camoufox instances that may have been started before the app restarted. - pub async fn find_camoufox_by_profile( - &self, - profile_path: &str, - ) -> Result, Box> { - // First clean up any dead instances - self.cleanup_dead_instances().await?; - - // Convert paths to canonical form for comparison - let target_path = std::path::Path::new(profile_path) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(profile_path).to_path_buf()); - - // Check in-memory instances first - { - let inner = self.inner.lock().await; - - for (id, instance) in inner.instances.iter() { - if let Some(instance_profile_path) = &instance.profile_path { - let instance_path = std::path::Path::new(instance_profile_path) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(instance_profile_path).to_path_buf()); - - if instance_path == target_path { - // Verify the server is actually running by checking the process - if let Some(process_id) = instance.process_id { - if self.is_server_running(process_id).await { - // Found running Camoufox instance - return Ok(Some(CamoufoxLaunchResult { - id: id.clone(), - processId: instance.process_id, - profilePath: instance.profile_path.clone(), - url: instance.url.clone(), - cdp_port: instance.cdp_port, - })); - } - } - } - } - } - } - - // If not found in in-memory instances, scan system processes - // This handles the case where the app was restarted but Camoufox is still running - if let Some((pid, found_profile_path, cdp_port)) = - self.find_camoufox_process_by_profile(&target_path) - { - log::info!( - "Found running Camoufox process (PID: {}) for profile path via system scan", - pid - ); - - // Register this instance in our tracking - let instance_id = format!("recovered_{}", pid); - let mut inner = self.inner.lock().await; - inner.instances.insert( - instance_id.clone(), - CamoufoxInstance { - id: instance_id.clone(), - process_id: Some(pid), - profile_path: Some(found_profile_path.clone()), - url: None, - cdp_port, - }, - ); - - return Ok(Some(CamoufoxLaunchResult { - id: instance_id, - processId: Some(pid), - profilePath: Some(found_profile_path), - url: None, - cdp_port, - })); - } - - Ok(None) - } - - /// Scan system processes to find a Camoufox process using a specific profile path - fn find_camoufox_process_by_profile( - &self, - target_path: &std::path::Path, - ) -> Option<(u32, String, Option)> { - use sysinfo::{ProcessRefreshKind, RefreshKind, System}; - - let system = System::new_with_specifics( - RefreshKind::nothing().with_processes(ProcessRefreshKind::everything()), - ); - - let target_path_str = target_path.to_string_lossy(); - - for (pid, process) in system.processes() { - let cmd = process.cmd(); - if cmd.is_empty() { - continue; - } - - // Check if this is a Camoufox/Firefox process - let exe_name = process.name().to_string_lossy().to_lowercase(); - let is_firefox_like = exe_name.contains("firefox") - || exe_name.contains("camoufox") - || exe_name.contains("firefox-bin"); - - if !is_firefox_like { - continue; - } - - let mut matched = false; - let mut found_profile_path = None; - let mut cdp_port: Option = None; - - // Check if the command line contains our profile path - for (i, arg) in cmd.iter().enumerate() { - if let Some(arg_str) = arg.to_str() { - // Check for -profile argument followed by our path - if arg_str == "-profile" && i + 1 < cmd.len() { - if let Some(next_arg) = cmd.get(i + 1).and_then(|a| a.to_str()) { - let cmd_path = std::path::Path::new(next_arg) - .canonicalize() - .unwrap_or_else(|_| std::path::Path::new(next_arg).to_path_buf()); - - if cmd_path == target_path { - matched = true; - found_profile_path = Some(next_arg.to_string()); - } - } - } - - // Also check if the argument contains the profile path directly - if !matched && arg_str.contains(&*target_path_str) { - matched = true; - found_profile_path = Some(target_path_str.to_string()); - } - - if let Some(port_val) = arg_str.strip_prefix("--remote-debugging-port=") { - cdp_port = port_val.parse().ok(); - } - } - } - - if matched { - if let Some(profile_path) = found_profile_path { - return Some((pid.as_u32(), profile_path, cdp_port)); - } - } - } - - None - } - - /// Check if servers are still alive and clean up dead instances - pub async fn cleanup_dead_instances( - &self, - ) -> Result, Box> { - let mut dead_instances = Vec::new(); - let mut instances_to_remove = Vec::new(); - - { - let inner = self.inner.lock().await; - - for (id, instance) in inner.instances.iter() { - if let Some(process_id) = instance.process_id { - if !self.is_server_running(process_id).await { - log::info!( - "Camoufox instance {} (PID {}) is no longer running; profile_path={:?}", - id, - process_id, - instance.profile_path - ); - dead_instances.push(id.clone()); - instances_to_remove.push(id.clone()); - } - } else { - log::info!("Camoufox instance {} has no PID, marking as dead", id); - dead_instances.push(id.clone()); - instances_to_remove.push(id.clone()); - } - } - } - - if !instances_to_remove.is_empty() { - let mut inner = self.inner.lock().await; - for id in &instances_to_remove { - inner.instances.remove(id); - } - } - - Ok(dead_instances) - } - - /// Check if a Camoufox server is running with the given process ID - async fn is_server_running(&self, process_id: u32) -> bool { - // Check if the process is still running - use sysinfo::{Pid, ProcessRefreshKind, RefreshKind, System}; - - let system = System::new_with_specifics( - RefreshKind::nothing().with_processes(ProcessRefreshKind::everything()), - ); - if let Some(process) = system.process(Pid::from(process_id as usize)) { - // Check if this is actually a Camoufox process by looking at the command line - let cmd = process.cmd(); - let is_camoufox = cmd.iter().any(|arg| { - let arg_str = arg.to_str().unwrap_or(""); - arg_str.contains("camoufox-worker") || arg_str.contains("camoufox") - }); - - if is_camoufox { - // Found running Camoufox process - return true; - } - } - - false - } -} - -impl CamoufoxManager { - #[allow(clippy::too_many_arguments)] - pub async fn launch_camoufox_profile( - &self, - app_handle: AppHandle, - profile: BrowserProfile, - config: CamoufoxConfig, - url: Option, - override_profile_path: Option, - remote_debugging_port: Option, - headless: bool, - ) -> Result { - // Get profile path - let profile_path = if let Some(ref override_path) = override_profile_path { - override_path.clone() - } else { - let profiles_dir = self.get_profiles_dir(); - profile.get_profile_data_path(&profiles_dir) - }; - let profile_path_str = profile_path.to_string_lossy(); - - // Check if there's already a running instance for this profile - if let Ok(Some(existing)) = self.find_camoufox_by_profile(&profile_path_str).await { - // If there's an existing instance, stop it first to avoid conflicts - let _ = self.stop_camoufox(&app_handle, &existing.id).await; - } - - // Clean up any dead instances before launching - let _ = self.cleanup_dead_instances().await; - - // For ephemeral profiles, write Firefox prefs to minimize disk writes - if override_profile_path.is_some() { - let user_js_path = profile_path.join("user.js"); - let prefs = concat!( - "user_pref(\"browser.cache.disk.enable\", false);\n", - "user_pref(\"browser.cache.memory.enable\", true);\n", - "user_pref(\"browser.sessionstore.resume_from_crash\", false);\n", - "user_pref(\"browser.sessionstore.max_tabs_undo\", 0);\n", - "user_pref(\"browser.sessionstore.max_windows_undo\", 0);\n", - "user_pref(\"places.history.enabled\", false);\n", - "user_pref(\"browser.formfill.enable\", false);\n", - "user_pref(\"signon.rememberSignons\", false);\n", - "user_pref(\"browser.bookmarks.max_backups\", 0);\n", - "user_pref(\"browser.shell.checkDefaultBrowser\", false);\n", - "user_pref(\"toolkit.crashreporter.enabled\", false);\n", - "user_pref(\"browser.pagethumbnails.capturing_disabled\", true);\n", - "user_pref(\"browser.download.manager.addToRecentDocs\", false);\n", - ); - if let Err(e) = std::fs::write(&user_js_path, prefs) { - log::warn!("Failed to write ephemeral user.js: {e}"); - } - } - - // Patch user.js with Camoufox-specific overrides on every launch. This - // always runs (not gated on the proxy being set) because Camoufox's - // bundled camoufox.cfg ships defaults that break basic browser features - // and we need to override them per-profile. - { - let user_js_path = profile_path.join("user.js"); - let mut prefs = String::new(); - - // Preserve existing user.js lines, but strip any keys we're about to - // re-emit so they never duplicate. - let managed_keys = [ - "network.proxy.", - "network.http.http3.enable", - "network.http.http3.enabled", - "xpinstall.signatures.required", - "extensions.startupScanScopes", - "browser.sessionhistory.max_entries", - "browser.sessionhistory.max_total_viewers", - ]; - if let Ok(existing) = std::fs::read_to_string(&user_js_path) { - for line in existing.lines() { - if !managed_keys.iter().any(|k| line.contains(k)) { - prefs.push_str(line); - prefs.push('\n'); - } - } - } - - // Camoufox's bundled camoufox.cfg sets these to 0, which makes - // docShell remember zero prior pages and leaves the toolbar - // back/forward buttons permanently disabled no matter how much - // the user navigates. Restore Firefox defaults. - prefs.push_str( - "user_pref(\"browser.sessionhistory.max_entries\", 50);\n\ - user_pref(\"browser.sessionhistory.max_total_viewers\", -1);\n", - ); - - // Required for sideloaded extensions: - // - signatures.required=false accepts unsigned .xpi (Camoufox is built - // without MOZ_REQUIRE_SIGNING so this is honored). - // - startupScanScopes=1 rescans SCOPE_PROFILE on each launch so newly - // dropped .xpi files in /extensions/ get registered. - prefs.push_str( - "user_pref(\"xpinstall.signatures.required\", false);\n\ - user_pref(\"extensions.startupScanScopes\", 1);\n", - ); - - // Disable HTTP/3 / QUIC. Camoufox always sits behind the local - // donut-proxy, and Firefox-150's QUIC stack bypasses configured HTTP - // proxies and goes direct UDP to the remote host. With an upstream - // proxy that's the only allowed egress, that traffic silently fails - // and pages won't load. (Chromium suppresses QUIC under a proxy on - // its own, so Wayfern doesn't need the equivalent toggle.) Both - // pref names are emitted because they've been renamed across FF - // versions and either could be the active one at runtime. - prefs.push_str( - "user_pref(\"network.http.http3.enable\", false);\n\ - user_pref(\"network.http.http3.enabled\", false);\n", - ); - - if let Some(proxy_str) = &config.proxy { - if let Ok(parsed) = url::Url::parse(proxy_str) { - let host = parsed.host_str().unwrap_or("127.0.0.1"); - let port = parsed.port().unwrap_or(8080); - let scheme = parsed.scheme(); - - if scheme == "socks5" || scheme == "socks4" { - prefs.push_str(&format!( - "user_pref(\"network.proxy.type\", 1);\n\ - user_pref(\"network.proxy.socks\", \"{host}\");\n\ - user_pref(\"network.proxy.socks_port\", {port});\n\ - user_pref(\"network.proxy.socks_version\", {});\n\ - user_pref(\"network.proxy.socks_remote_dns\", true);\n", - if scheme == "socks5" { 5 } else { 4 } - )); - } else { - // HTTP/HTTPS proxy - prefs.push_str(&format!( - "user_pref(\"network.proxy.type\", 1);\n\ - user_pref(\"network.proxy.http\", \"{host}\");\n\ - user_pref(\"network.proxy.http_port\", {port});\n\ - user_pref(\"network.proxy.ssl\", \"{host}\");\n\ - user_pref(\"network.proxy.ssl_port\", {port});\n\ - user_pref(\"network.proxy.no_proxies_on\", \"\");\n" - )); - } - } - } - - if let Err(e) = std::fs::write(&user_js_path, prefs) { - log::warn!("Failed to write user.js: {e}"); - } - } - - self - .launch_camoufox( - &app_handle, - &profile, - &profile_path_str, - &config, - url.as_deref(), - remote_debugging_port, - headless, - ) - .await - .map_err(|e| format!("Failed to launch Camoufox: {e}")) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_default_config() { - let default_config = CamoufoxConfig::default(); - - // Verify defaults - assert_eq!(default_config.geoip, Some(serde_json::Value::Bool(true))); - assert_eq!(default_config.proxy, None); - assert_eq!(default_config.fingerprint, None); - assert_eq!(default_config.randomize_fingerprint_on_launch, None); - assert_eq!(default_config.os, None); - } -} - -// Global singleton instance -lazy_static::lazy_static! { - static ref CAMOUFOX_LAUNCHER: CamoufoxManager = CamoufoxManager::new(); -} diff --git a/src-tauri/src/cookie_manager.rs b/src-tauri/src/cookie_manager.rs index 4427995..7c2a009 100644 --- a/src-tauri/src/cookie_manager.rs +++ b/src-tauri/src/cookie_manager.rs @@ -220,14 +220,6 @@ impl CookieManager { Err(format!("Cookie database not found at: {}", path.display())) } } - "camoufox" => { - let path = profile_data_path.join("cookies.sqlite"); - if path.exists() { - Ok(path) - } else { - Err(format!("Cookie database not found at: {}", path.display())) - } - } _ => Err(format!( "Unsupported browser type for cookie operations: {}", profile.browser @@ -253,13 +245,6 @@ impl CookieManager { } Ok(path) } - "camoufox" => { - let path = profile_data_path.join("cookies.sqlite"); - if !path.exists() { - Self::create_empty_firefox_cookies_db(&path)?; - } - Ok(path) - } _ => Err(format!( "Unsupported browser type for cookie operations: {}", profile.browser @@ -318,39 +303,6 @@ impl CookieManager { Ok(()) } - /// Create an empty Firefox-format cookies.sqlite database at `path`. - fn create_empty_firefox_cookies_db(path: &Path) -> Result<(), String> { - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent) - .map_err(|e| format!("Failed to create cookie directory: {e}"))?; - } - let conn = - Connection::open(path).map_err(|e| format!("Failed to create cookie database: {e}"))?; - conn - .execute_batch( - "CREATE TABLE moz_cookies ( - id INTEGER PRIMARY KEY, - originAttributes TEXT NOT NULL DEFAULT '', - name TEXT, - value TEXT, - host TEXT, - path TEXT, - expiry INTEGER, - lastAccessed INTEGER, - creationTime INTEGER, - isSecure INTEGER, - isHttpOnly INTEGER, - inBrowserElement INTEGER DEFAULT 0, - sameSite INTEGER DEFAULT 0, - rawSameSite INTEGER DEFAULT 0, - schemeMap INTEGER DEFAULT 0, - CONSTRAINT moz_uniqueid UNIQUE (name, host, path, originAttributes) - );", - ) - .map_err(|e| format!("Failed to initialize cookie database schema: {e}"))?; - Ok(()) - } - /// Convert Chrome timestamp (Windows epoch, microseconds) to Unix timestamp (seconds) fn chrome_time_to_unix(chrome_time: i64) -> i64 { if chrome_time == 0 { @@ -367,40 +319,6 @@ impl CookieManager { (unix_time + Self::WINDOWS_EPOCH_DIFF) * 1_000_000 } - /// Read cookies from a Firefox/Camoufox profile - fn read_firefox_cookies(db_path: &Path) -> Result, String> { - let conn = Connection::open(db_path).map_err(|e| format!("Failed to open database: {e}"))?; - - let mut stmt = conn - .prepare( - "SELECT name, value, host, path, expiry, isSecure, isHttpOnly, - sameSite, creationTime, lastAccessed - FROM moz_cookies", - ) - .map_err(|e| format!("Failed to prepare statement: {e}"))?; - - let cookies = stmt - .query_map([], |row| { - Ok(UnifiedCookie { - name: row.get(0)?, - value: row.get(1)?, - domain: row.get(2)?, - path: row.get(3)?, - expires: row.get(4)?, - is_secure: row.get::<_, i32>(5)? != 0, - is_http_only: row.get::<_, i32>(6)? != 0, - same_site: row.get(7)?, - creation_time: row.get::<_, i64>(8)? / 1_000_000, - last_accessed: row.get::<_, i64>(9)? / 1_000_000, - }) - }) - .map_err(|e| format!("Failed to query cookies: {e}"))? - .collect::, _>>() - .map_err(|e| format!("Failed to collect cookies: {e}"))?; - - Ok(cookies) - } - /// Read cookies from a Chrome/Wayfern profile. /// Handles encrypted cookies by decrypting encrypted_value using the profile's encryption key. fn read_chrome_cookies( @@ -464,98 +382,6 @@ impl CookieManager { Ok(cookies) } - /// Write cookies to a Firefox/Camoufox profile. - /// - /// Firefox's `moz_cookies.expiry` is "seconds since Unix epoch", so `expiry = 0` - /// is interpreted as 1970-01-01 and purged on read. To let imported session - /// cookies survive browser restart, we rewrite them to a far-future expiry. - /// - /// `schemeMap` is a bitfield (1 = HTTP, 2 = HTTPS, 3 = both). Setting it based - /// on `is_secure` preserves Firefox's scheme-bound cookie enforcement. - fn write_firefox_cookies( - db_path: &Path, - cookies: &[UnifiedCookie], - ) -> Result<(usize, usize), String> { - let conn = Connection::open(db_path).map_err(|e| format!("Failed to open database: {e}"))?; - - let mut copied = 0; - let mut replaced = 0; - - let now = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_secs() as i64; - // Session cookies get 30 days of persistence so they survive restart. - let session_cookie_expiry = now + 30 * 86400; - - for cookie in cookies { - let expiry = if cookie.expires > 0 { - cookie.expires - } else { - session_cookie_expiry - }; - // schemeMap bitfield: 1 = HTTP, 2 = HTTPS - let scheme_map: i32 = if cookie.is_secure { 2 } else { 1 }; - - let existing: Option = conn - .query_row( - "SELECT id FROM moz_cookies WHERE host = ?1 AND name = ?2 AND path = ?3", - params![&cookie.domain, &cookie.name, &cookie.path], - |row| row.get(0), - ) - .ok(); - - if existing.is_some() { - conn - .execute( - "UPDATE moz_cookies SET value = ?1, expiry = ?2, isSecure = ?3, - isHttpOnly = ?4, sameSite = ?5, rawSameSite = ?5, - lastAccessed = ?6, schemeMap = ?7 - WHERE host = ?8 AND name = ?9 AND path = ?10", - params![ - &cookie.value, - expiry, - cookie.is_secure as i32, - cookie.is_http_only as i32, - cookie.same_site, - cookie.last_accessed * 1_000_000, - scheme_map, - &cookie.domain, - &cookie.name, - &cookie.path, - ], - ) - .map_err(|e| format!("Failed to update cookie: {e}"))?; - replaced += 1; - } else { - conn - .execute( - "INSERT INTO moz_cookies - (originAttributes, name, value, host, path, expiry, lastAccessed, - creationTime, isSecure, isHttpOnly, sameSite, rawSameSite, schemeMap) - VALUES ('', ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?10, ?11)", - params![ - &cookie.name, - &cookie.value, - &cookie.domain, - &cookie.path, - expiry, - cookie.last_accessed * 1_000_000, - cookie.creation_time * 1_000_000, - cookie.is_secure as i32, - cookie.is_http_only as i32, - cookie.same_site, - scheme_map, - ], - ) - .map_err(|e| format!("Failed to insert cookie: {e}"))?; - copied += 1; - } - } - - Ok((copied, replaced)) - } - /// Write cookies to a Chrome/Wayfern profile. /// /// Always writes values as plaintext in the `value` column with an empty @@ -578,8 +404,7 @@ impl CookieManager { .duration_since(std::time::UNIX_EPOCH) .unwrap() .as_secs() as i64; - // Session cookies get 30 days of persistence so they survive restart, - // mirroring write_firefox_cookies. A login imported from another browser is + // Session cookies get 30 days of persistence so they survive restart. // routinely exported as a session cookie; writing it as memory-only // (is_persistent = 0) makes Chromium drop it on the next flush, so the // imported account silently signs out on relaunch. Persisting it with a real @@ -684,7 +509,6 @@ impl CookieManager { let db_path = Self::get_cookie_db_path(profile, &profiles_dir)?; let cookies = match profile.browser.as_str() { - "camoufox" => Self::read_firefox_cookies(&db_path)?, "wayfern" => { let key = Self::get_chrome_encryption_key(profile, &profiles_dir); Self::read_chrome_cookies(&db_path, key.as_ref())? @@ -791,10 +615,6 @@ impl CookieManager { let conn = Self::open_cookie_db_readonly(&db_path)?; let (count_sql, domain_sql) = match profile.browser.as_str() { - "camoufox" => ( - "SELECT COUNT(*) FROM moz_cookies", - "SELECT host, COUNT(*) FROM moz_cookies GROUP BY host ORDER BY COUNT(*) DESC, host ASC", - ), "wayfern" => ( "SELECT COUNT(*) FROM cookies", "SELECT host_key, COUNT(*) FROM cookies GROUP BY host_key ORDER BY COUNT(*) DESC, host_key ASC", @@ -869,7 +689,6 @@ impl CookieManager { let source_db_path = Self::get_cookie_db_path(source, &profiles_dir)?; let all_cookies = match source.browser.as_str() { - "camoufox" => Self::read_firefox_cookies(&source_db_path)?, "wayfern" => { let key = Self::get_chrome_encryption_key(source, &profiles_dir); Self::read_chrome_cookies(&source_db_path, key.as_ref())? @@ -941,7 +760,6 @@ impl CookieManager { }; let write_result = match target.browser.as_str() { - "camoufox" => Self::write_firefox_cookies(&target_db_path, &cookies_to_copy), "wayfern" => Self::write_chrome_cookies(&target_db_path, &cookies_to_copy), _ => { results.push(CookieCopyResult { @@ -1207,7 +1025,6 @@ impl CookieManager { let db_path = Self::ensure_cookie_db_path(profile, &profiles_dir)?; let write_result = match profile.browser.as_str() { - "camoufox" => Self::write_firefox_cookies(&db_path, &cookies), "wayfern" => Self::write_chrome_cookies(&db_path, &cookies), _ => return Err(format!("Unsupported browser type: {}", profile.browser)), }; @@ -1504,33 +1321,6 @@ mod tests { .unwrap(); } - /// Set up a minimal Firefox moz_cookies SQLite schema for testing writes. - fn create_firefox_cookies_db(path: &Path) { - let conn = Connection::open(path).unwrap(); - conn - .execute_batch( - "CREATE TABLE moz_cookies ( - id INTEGER PRIMARY KEY, - originAttributes TEXT NOT NULL DEFAULT '', - name TEXT, - value TEXT, - host TEXT, - path TEXT, - expiry INTEGER, - lastAccessed INTEGER, - creationTime INTEGER, - isSecure INTEGER, - isHttpOnly INTEGER, - inBrowserElement INTEGER DEFAULT 0, - sameSite INTEGER DEFAULT 0, - rawSameSite INTEGER DEFAULT 0, - schemeMap INTEGER DEFAULT 0, - CONSTRAINT moz_uniqueid UNIQUE (name, host, path, originAttributes) - );", - ) - .unwrap(); - } - #[test] fn test_write_chrome_cookies_stores_plaintext_values() { let tmp = std::env::temp_dir().join(format!("donut_cookie_test_{}.db", uuid::Uuid::new_v4())); @@ -1692,168 +1482,6 @@ mod tests { let _ = std::fs::remove_file(&tmp); } - /// Wayfern → Camoufox: write cookies to a Chrome DB, read them back, and - /// verify they land in a Firefox DB with values intact, correct schemeMap, - /// and non-expired timestamps. This is the path exercised by the - /// "copy cookies between profiles of different browser types" feature. - #[test] - fn test_wayfern_cookies_transfer_to_camoufox() { - let chrome_db = - std::env::temp_dir().join(format!("donut_xbrowser_chrome_{}.db", uuid::Uuid::new_v4())); - let ff_db = std::env::temp_dir().join(format!("donut_xbrowser_ff_{}.db", uuid::Uuid::new_v4())); - create_chrome_cookies_db(&chrome_db); - create_firefox_cookies_db(&ff_db); - - // Simulate cookies in a Wayfern profile: a persistent cookie and a - // session cookie, both from a real-world HTTPS site. - let source_cookies = vec![ - UnifiedCookie { - name: "c_user".to_string(), - value: "100012345678".to_string(), - domain: ".facebook.com".to_string(), - path: "/".to_string(), - expires: 1900000000, // persistent, far in the future - is_secure: true, - is_http_only: true, - same_site: 0, - creation_time: 1700000000, - last_accessed: 1700000000, - }, - UnifiedCookie { - name: "xs".to_string(), - value: "sessionvalue".to_string(), - domain: ".facebook.com".to_string(), - path: "/".to_string(), - expires: 0, // session cookie - is_secure: true, - is_http_only: true, - same_site: 1, - creation_time: 1700000000, - last_accessed: 1700000000, - }, - ]; - CookieManager::write_chrome_cookies(&chrome_db, &source_cookies).unwrap(); - - // Read back from the Chrome DB (as if reading from the Wayfern profile). - let from_chrome = CookieManager::read_chrome_cookies(&chrome_db, None).unwrap(); - assert_eq!(from_chrome.len(), 2); - let c_user_src = from_chrome.iter().find(|c| c.name == "c_user").unwrap(); - assert_eq!(c_user_src.value, "100012345678"); - let xs_src = from_chrome.iter().find(|c| c.name == "xs").unwrap(); - assert_eq!(xs_src.value, "sessionvalue"); - - // Write them into the Camoufox (Firefox) DB. - let (inserted, replaced) = CookieManager::write_firefox_cookies(&ff_db, &from_chrome).unwrap(); - assert_eq!(inserted, 2); - assert_eq!(replaced, 0); - - // Read back from Firefox and verify values survived the round trip. - let from_ff = CookieManager::read_firefox_cookies(&ff_db).unwrap(); - assert_eq!(from_ff.len(), 2); - let c_user = from_ff.iter().find(|c| c.name == "c_user").unwrap(); - assert_eq!(c_user.value, "100012345678"); - assert_eq!(c_user.domain, ".facebook.com"); - assert!(c_user.is_secure); - assert!(c_user.is_http_only); - let xs = from_ff.iter().find(|c| c.name == "xs").unwrap(); - assert_eq!(xs.value, "sessionvalue"); - - // Raw DB checks against the Firefox schema — these would catch the bugs - // on the Chrome path (plaintext, correct expiry, correct schemeMap). - let conn = Connection::open(&ff_db).unwrap(); - let now = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap() - .as_secs() as i64; - - let (c_user_expiry, c_user_scheme): (i64, i32) = conn - .query_row( - "SELECT expiry, schemeMap FROM moz_cookies WHERE name = ?1", - params!["c_user"], - |row| Ok((row.get(0)?, row.get(1)?)), - ) - .unwrap(); - assert!( - c_user_expiry > now, - "persistent cookie must not be expired in firefox (expiry={c_user_expiry}, now={now})" - ); - assert_eq!(c_user_scheme, 2, "HTTPS cookie must have schemeMap=2"); - - let (xs_expiry, xs_scheme): (i64, i32) = conn - .query_row( - "SELECT expiry, schemeMap FROM moz_cookies WHERE name = ?1", - params!["xs"], - |row| Ok((row.get(0)?, row.get(1)?)), - ) - .unwrap(); - assert!( - xs_expiry > now, - "session cookie must be rewritten to a future expiry (got {xs_expiry}, now={now})" - ); - assert_eq!(xs_scheme, 2); - - let _ = std::fs::remove_file(&chrome_db); - let _ = std::fs::remove_file(&ff_db); - } - - /// Camoufox → Wayfern: the reverse direction. Ensures the Chrome writer - /// still produces plaintext values / empty encrypted_value when fed cookies - /// that originated in Firefox. - #[test] - fn test_camoufox_cookies_transfer_to_wayfern() { - let ff_db = - std::env::temp_dir().join(format!("donut_xbrowser_rev_ff_{}.db", uuid::Uuid::new_v4())); - let chrome_db = std::env::temp_dir().join(format!( - "donut_xbrowser_rev_chrome_{}.db", - uuid::Uuid::new_v4() - )); - create_firefox_cookies_db(&ff_db); - create_chrome_cookies_db(&chrome_db); - - let source_cookies = vec![UnifiedCookie { - name: "sessionid".to_string(), - value: "abc123def456".to_string(), - domain: ".example.com".to_string(), - path: "/".to_string(), - expires: 1900000000, - is_secure: true, - is_http_only: false, - same_site: 1, - creation_time: 1700000000, - last_accessed: 1700000000, - }]; - CookieManager::write_firefox_cookies(&ff_db, &source_cookies).unwrap(); - - let from_ff = CookieManager::read_firefox_cookies(&ff_db).unwrap(); - assert_eq!(from_ff.len(), 1); - assert_eq!(from_ff[0].value, "abc123def456"); - - CookieManager::write_chrome_cookies(&chrome_db, &from_ff).unwrap(); - - let from_chrome = CookieManager::read_chrome_cookies(&chrome_db, None).unwrap(); - assert_eq!(from_chrome.len(), 1); - assert_eq!(from_chrome[0].value, "abc123def456"); - - // Verify the raw DB state on the Chrome side — plaintext value, empty - // encrypted_value, persistent, HTTPS. - let conn = Connection::open(&chrome_db).unwrap(); - let (value, encrypted, is_persistent, source_scheme): (String, Vec, i32, i32) = conn - .query_row( - "SELECT value, encrypted_value, is_persistent, source_scheme - FROM cookies WHERE name = ?1", - params!["sessionid"], - |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?)), - ) - .unwrap(); - assert_eq!(value, "abc123def456"); - assert!(encrypted.is_empty()); - assert_eq!(is_persistent, 1); - assert_eq!(source_scheme, 2); - - let _ = std::fs::remove_file(&ff_db); - let _ = std::fs::remove_file(&chrome_db); - } - /// Regression: decrypting a real v10-encrypted Chromium cookie with the /// correct PBKDF2 iterations and the `SHA-256(host_key)` integrity-prefix /// strip. Captured from a real Wayfern profile: @@ -1975,37 +1603,4 @@ mod tests { let _ = std::fs::remove_dir_all(&dir); } - - /// Same regression, Firefox side: a fresh Camoufox profile has no - /// `cookies.sqlite` until the browser launches. - #[test] - fn test_create_empty_firefox_cookies_db_then_write() { - let dir = std::env::temp_dir().join(format!("donut_empty_ff_{}", uuid::Uuid::new_v4())); - let db_path = dir.join("cookies.sqlite"); - assert!(!db_path.exists()); - - CookieManager::create_empty_firefox_cookies_db(&db_path).unwrap(); - assert!(db_path.exists()); - - let cookies = vec![UnifiedCookie { - name: "sid".to_string(), - value: "ff-session".to_string(), - domain: ".example.org".to_string(), - path: "/".to_string(), - expires: 1900000000, - is_secure: true, - is_http_only: false, - same_site: 1, - creation_time: 1700000000, - last_accessed: 1700000000, - }]; - let (inserted, _) = CookieManager::write_firefox_cookies(&db_path, &cookies).unwrap(); - assert_eq!(inserted, 1); - - let read = CookieManager::read_firefox_cookies(&db_path).unwrap(); - assert_eq!(read.len(), 1); - assert_eq!(read[0].value, "ff-session"); - - let _ = std::fs::remove_dir_all(&dir); - } } diff --git a/src-tauri/src/downloaded_browsers_registry.rs b/src-tauri/src/downloaded_browsers_registry.rs index 95d632c..dc68012 100644 --- a/src-tauri/src/downloaded_browsers_registry.rs +++ b/src-tauri/src/downloaded_browsers_registry.rs @@ -921,9 +921,9 @@ impl DownloadedBrowsersRegistry { } } - // Check if GeoIP database is missing for Camoufox profiles + // Check if GeoIP database is missing for Wayfern profiles if self.geoip_downloader.check_missing_geoip_database()? { - log::info!("GeoIP database is missing for Camoufox profiles, downloading..."); + log::info!("GeoIP database is missing for Wayfern profiles, downloading..."); match self .geoip_downloader @@ -931,7 +931,7 @@ impl DownloadedBrowsersRegistry { .await { Ok(_) => { - downloaded.push("GeoIP database for Camoufox".to_string()); + downloaded.push("GeoIP database".to_string()); log::info!("GeoIP database downloaded successfully"); } Err(e) => { @@ -1265,7 +1265,7 @@ pub async fn ensure_active_browsers_downloaded( let version_manager = crate::browser_version_manager::BrowserVersionManager::instance(); let mut downloaded = Vec::new(); - for browser in &["wayfern", "camoufox"] { + for browser in &["wayfern"] { // Check if any version is already downloaded let existing = registry.get_downloaded_versions(browser); if !existing.is_empty() { @@ -1300,7 +1300,7 @@ pub async fn ensure_active_browsers_downloaded( // Retry transient failures a few times. Each attempt is wrapped in an overall // timeout so that a hang anywhere in the download pipeline (version resolution, // a stalled stream, extraction) cannot block the next browser forever. This is - // the core of the bug fix: Wayfern going first must never starve Camoufox. + // the core of the bug fix: Wayfern downloads proceed independently. const MAX_ATTEMPTS: u32 = 3; const ATTEMPT_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(600); let mut succeeded = false; @@ -1359,7 +1359,7 @@ pub async fn ensure_active_browsers_downloaded( } if !succeeded { - // Do NOT abort the whole routine: continue so the next browser (Camoufox) + // Do NOT abort the whole routine: continue with remaining browsers // still gets its chance even though this one failed/timed out. log::warn!("Giving up on auto-download of {browser} {version} after {MAX_ATTEMPTS} attempts"); } diff --git a/src-tauri/src/downloader.rs b/src-tauri/src/downloader.rs index 779a757..78f8f0e 100644 --- a/src-tauri/src/downloader.rs +++ b/src-tauri/src/downloader.rs @@ -41,7 +41,6 @@ pub struct Downloader { registry: &'static crate::downloaded_browsers_registry::DownloadedBrowsersRegistry, version_service: &'static crate::browser_version_manager::BrowserVersionManager, extractor: &'static crate::extraction::Extractor, - geoip_downloader: &'static crate::geoip_downloader::GeoIPDownloader, } impl Downloader { @@ -60,7 +59,6 @@ impl Downloader { registry: crate::downloaded_browsers_registry::DownloadedBrowsersRegistry::instance(), version_service: crate::browser_version_manager::BrowserVersionManager::instance(), extractor: crate::extraction::Extractor::instance(), - geoip_downloader: crate::geoip_downloader::GeoIPDownloader::instance(), } } @@ -76,7 +74,6 @@ impl Downloader { registry: crate::downloaded_browsers_registry::DownloadedBrowsersRegistry::instance(), version_service: crate::browser_version_manager::BrowserVersionManager::instance(), extractor: crate::extraction::Extractor::instance(), - geoip_downloader: crate::geoip_downloader::GeoIPDownloader::instance(), } } @@ -127,34 +124,6 @@ impl Downloader { _download_info: &DownloadInfo, ) -> Result> { match browser_type { - BrowserType::Camoufox => { - // For Camoufox, verify the asset exists and find the correct download URL - let releases = self - .api_client - .fetch_camoufox_releases_with_caching(true) - .await?; - - let release = releases - .iter() - .find(|r| r.tag_name == version) - .or_else(|| { - log::info!("Camoufox: requested version {version} not found, using latest available"); - releases.first() - }) - .ok_or("No Camoufox releases found".to_string())?; - - // Get platform and architecture info - let (os, arch) = Self::get_platform_info(); - - // Find the appropriate asset - let asset_url = self - .find_camoufox_asset(&release.assets, &os, &arch) - .ok_or(format!( - "No compatible asset found for Camoufox version {version} on {os}/{arch}" - ))?; - - Ok(asset_url) - } BrowserType::Wayfern => { // For Wayfern, get the download URL from version.json let version_info = self @@ -214,97 +183,6 @@ impl Downloader { (os.to_string(), arch.to_string()) } - /// Find the appropriate Camoufox asset for the current platform and architecture - fn find_camoufox_asset( - &self, - assets: &[crate::browser::GithubAsset], - os: &str, - arch: &str, - ) -> Option { - // Camoufox asset naming pattern: camoufox-{version}-beta.{number}-{os}.{arch}.zip - // Example: camoufox-135.0.1-beta.24-lin.x86_64.zip - let (os_name, arch_name) = match (os, arch) { - ("windows", "x64") => ("win", "x86_64"), - ("windows", "arm64") => ("win", "arm64"), - ("linux", "x64") => ("lin", "x86_64"), - ("linux", "arm64") => ("lin", "arm64"), - ("macos", "x64") => ("mac", "x86_64"), - ("macos", "arm64") => ("mac", "arm64"), - _ => return None, - }; - - // Use ends_with for precise matching to avoid false positives - // The separator before OS is a dash: -lin.x86_64.zip, -mac.arm64.zip, etc. - let pattern = format!("-{os_name}.{arch_name}.zip"); - let asset = assets.iter().find(|asset| { - let name = asset.name.to_lowercase(); - name.starts_with("camoufox-") && name.ends_with(&pattern) - }); - - if let Some(asset) = asset { - log::info!( - "Selected Camoufox asset for {}/{}: {}", - os, - arch, - asset.name - ); - Some(asset.browser_download_url.clone()) - } else { - log::warn!( - "No matching Camoufox asset found for {}/{} with pattern '{}'. Available assets: {:?}", - os, - arch, - pattern, - assets.iter().map(|a| &a.name).collect::>() - ); - None - } - } - - /// Ensure version.json exists in the Camoufox installation directory. - /// Creates the file if it doesn't exist, using the version from the tag name. - async fn ensure_camoufox_version_json( - &self, - browser_dir: &Path, - version: &str, - ) -> Result<(), Box> { - // The browser_dir is typically: binaries/camoufox// - // Find the executable directory within it - let version_json_locations = vec![ - browser_dir.join("version.json"), - browser_dir.join("camoufox").join("version.json"), - ]; - - // Check if version.json already exists in any expected location - for location in &version_json_locations { - if location.exists() { - log::info!("version.json already exists at: {}", location.display()); - return Ok(()); - } - } - - // Parse the Firefox version from the Camoufox version tag - // Format: "135.0.1-beta.24" -> Firefox version is "135.0.1" (or just "135.0") - let firefox_version = version.split('-').next().unwrap_or(version); - - // Create version.json in the browser directory - let version_json_path = browser_dir.join("version.json"); - let version_data = serde_json::json!({ - "version": firefox_version - }); - - let version_json_str = serde_json::to_string_pretty(&version_data)?; - tokio::fs::write(&version_json_path, version_json_str).await?; - - log::info!( - "Created version.json at {} with Firefox version: {}", - version_json_path.display(), - firefox_version - ); - - Ok(()) - } - pub async fn download_browser( &self, _app_handle: &tauri::AppHandle, @@ -626,7 +504,7 @@ impl Downloader { return Err("Please accept Wayfern Terms and Conditions before downloading browsers".into()); } - // For Wayfern/Camoufox, resolve the actual available version from the API + // For Wayfern, resolve the actual available version from the API let version = if browser_str == "wayfern" { match self .api_client @@ -642,21 +520,6 @@ impl Downloader { } _ => version, } - } else if browser_str == "camoufox" { - match self - .api_client - .fetch_camoufox_releases_with_caching(true) - .await - { - Ok(releases) if !releases.is_empty() && releases[0].tag_name != version => { - log::info!( - "Camoufox: requested {version}, using available {}", - releases[0].tag_name - ); - releases[0].tag_name.clone() - } - _ => version, - } } else { version }; @@ -681,8 +544,6 @@ impl Downloader { BrowserType::from_str(&browser_str).map_err(|e| format!("Invalid browser type: {e}"))?; let browser = create_browser(browser_type.clone()); - // Use injected registry instance - let binaries_dir = crate::app_dirs::binaries_dir(); // Check if registry thinks it's downloaded, but also verify files actually exist @@ -899,34 +760,6 @@ impl Downloader { error_details.push_str("\nDirectory does not exist!"); } - // For Camoufox on Linux, provide specific expected files - if browser_str == "camoufox" && cfg!(target_os = "linux") { - let camoufox_subdir = browser_dir.join("camoufox"); - error_details.push_str("\nExpected Camoufox executable locations:"); - error_details.push_str(&format!("\n {}/camoufox-bin", camoufox_subdir.display())); - error_details.push_str(&format!("\n {}/camoufox", camoufox_subdir.display())); - - if camoufox_subdir.exists() { - error_details.push_str(&format!( - "\nCamoufox subdirectory exists: {}", - camoufox_subdir.display() - )); - if let Ok(entries) = std::fs::read_dir(&camoufox_subdir) { - error_details.push_str("\nFiles in camoufox subdirectory:"); - for entry in entries.flatten() { - let path = entry.path(); - let file_type = if path.is_dir() { "DIR" } else { "FILE" }; - error_details.push_str(&format!("\n {} {}", file_type, path.display())); - } - } - } else { - error_details.push_str(&format!( - "\nCamoufox subdirectory does not exist: {}", - camoufox_subdir.display() - )); - } - } - // Do not delete files on verification failure; keep archive for manual retry. let _ = self.registry.remove_browser(&browser_str, &version); let _ = self.registry.save(); @@ -979,38 +812,6 @@ impl Downloader { } } - // If this is Camoufox, automatically download GeoIP database and create version.json - if browser_str == "camoufox" { - // Check if GeoIP database is already available - if !crate::geoip_downloader::GeoIPDownloader::is_geoip_database_available() { - log::info!("Downloading GeoIP database for Camoufox..."); - - match self - .geoip_downloader - .download_geoip_database(app_handle) - .await - { - Ok(_) => { - log::info!("GeoIP database downloaded successfully"); - } - Err(e) => { - log::error!("Failed to download GeoIP database: {e}"); - // Don't fail the browser download if GeoIP download fails - } - } - } else { - log::info!("GeoIP database already available"); - } - - // Create version.json if it doesn't exist - if let Err(e) = self - .ensure_camoufox_version_json(&browser_dir, &version) - .await - { - log::warn!("Failed to create version.json for Camoufox: {e}"); - } - } - // Emit completion let progress = DownloadProgress { browser: browser_str.clone(), @@ -1245,7 +1046,7 @@ mod tests { } // A different browser's in-progress state must be left untouched. - let other = "camoufox-9.9.9".to_string(); + let other = "chromium-9.9.9".to_string(); { let mut downloading = DOWNLOADING_BROWSERS.lock().unwrap(); downloading.insert(other.clone()); @@ -1265,12 +1066,13 @@ mod tests { ); } assert!( - is_downloading("camoufox", "9.9.9"), + is_downloading("chromium", "9.9.9"), "unrelated browser's download state must be preserved" ); // Cleanup so we don't leak global state into other tests. - clear_download_state_for_browser("camoufox"); + clear_download_state_for_browser("wayfern"); + clear_download_state_for_browser("chromium"); } } diff --git a/src-tauri/src/ephemeral_dirs.rs b/src-tauri/src/ephemeral_dirs.rs index 04ef1fb..19f2705 100644 --- a/src-tauri/src/ephemeral_dirs.rs +++ b/src-tauri/src/ephemeral_dirs.rs @@ -256,7 +256,7 @@ mod tests { BrowserProfile { id, name: "test".to_string(), - browser: "camoufox".to_string(), + browser: "wayfern".to_string(), version: "1.0".to_string(), proxy_id: None, vpn_id: None, @@ -264,7 +264,6 @@ mod tests { process_id: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: None, wayfern_config: None, group_id: None, tags: Vec::new(), diff --git a/src-tauri/src/extension_manager.rs b/src-tauri/src/extension_manager.rs index 39a2d2d..72166cb 100644 --- a/src-tauri/src/extension_manager.rs +++ b/src-tauri/src/extension_manager.rs @@ -27,11 +27,6 @@ pub struct Extension { pub author: Option, #[serde(default)] pub homepage_url: Option, - /// Firefox extension ID from `browser_specific_settings.gecko.id` (or - /// `applications.gecko.id` in old manifests). Firefox refuses to load a - /// sideloaded .xpi unless the filename matches this value. - #[serde(default)] - pub gecko_id: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -69,9 +64,7 @@ fn extension_groups_file() -> PathBuf { fn determine_browser_compatibility(file_type: &str) -> Vec { match file_type { - "xpi" => vec!["firefox".to_string()], - "crx" => vec!["chromium".to_string()], - "zip" => vec!["chromium".to_string(), "firefox".to_string()], + "crx" | "zip" => vec!["chromium".to_string()], _ => vec![], } } @@ -79,7 +72,7 @@ fn determine_browser_compatibility(file_type: &str) -> Vec { fn get_file_type(file_name: &str) -> Option { let ext = file_name.rsplit('.').next()?.to_lowercase(); match ext.as_str() { - "xpi" | "crx" | "zip" => Some(ext), + "crx" | "zip" => Some(ext), _ => None, } } @@ -162,32 +155,6 @@ fn extract_manifest_metadata( (name, version, description, author, homepage_url) } -/// Read `browser_specific_settings.gecko.id` (or the legacy -/// `applications.gecko.id`) from the extension's manifest.json. Firefox uses -/// this value as the canonical add-on ID; sideloaded .xpi files must be named -/// `.xpi` to be picked up. -fn extract_gecko_id(file_data: &[u8], file_type: &str) -> Option { - let zip_start = if file_type == "crx" { - find_zip_start(file_data) - } else { - 0 - }; - let cursor = std::io::Cursor::new(&file_data[zip_start..]); - let mut archive = zip::ZipArchive::new(cursor).ok()?; - let mut manifest_content = String::new(); - std::io::Read::read_to_string( - &mut archive.by_name("manifest.json").ok()?, - &mut manifest_content, - ) - .ok()?; - let manifest: serde_json::Value = serde_json::from_str(&manifest_content).ok()?; - manifest - .pointer("/browser_specific_settings/gecko/id") - .or_else(|| manifest.pointer("/applications/gecko/id")) - .and_then(|v| v.as_str()) - .map(|s| s.to_string()) -} - fn extract_icon_from_archive(file_data: &[u8], file_type: &str) -> Option<(Vec, String)> { let zip_start = if file_type == "crx" { find_zip_start(file_data) @@ -305,6 +272,9 @@ impl ExtensionManager { get_file_type(&file_name).ok_or_else(|| format!("Unsupported file type: {file_name}"))?; let browser_compatibility = determine_browser_compatibility(&file_type); + if browser_compatibility.is_empty() { + return Err(format!("Unsupported file type: {file_name}").into()); + } let now = now_secs(); let (manifest_name, version, description, author, homepage_url) = @@ -316,7 +286,6 @@ impl ExtensionManager { name }; - let gecko_id = extract_gecko_id(&file_data, &file_type); let ext = Extension { id: uuid::Uuid::new_v4().to_string(), name: final_name, @@ -331,7 +300,6 @@ impl ExtensionManager { description, author, homepage_url, - gecko_id, }; let file_dir = self.get_file_dir(&ext.id); @@ -448,7 +416,6 @@ impl ExtensionManager { ext.name = mn; } } - ext.gecko_id = extract_gecko_id(&data, &new_file_type); if let Some((icon_data, icon_ext)) = extract_icon_from_archive(&data, &new_file_type) { let icon_path = self.get_extension_dir(id).join(format!("icon.{icon_ext}")); @@ -863,7 +830,6 @@ impl ExtensionManager { ) -> Result<(), Box> { let group = self.get_group(group_id)?; let browser_type = match browser { - "camoufox" => "firefox", "wayfern" => "chromium", _ => return Err(format!("Extensions are not supported for browser '{browser}'").into()), }; @@ -892,7 +858,7 @@ impl ExtensionManager { pub fn install_extensions_for_profile( &self, profile: &crate::profile::BrowserProfile, - profile_data_path: &std::path::Path, + _profile_data_path: &std::path::Path, ) -> Result, Box> { let group_id = match &profile.extension_group_id { Some(id) => id, @@ -904,91 +870,40 @@ impl ExtensionManager { return Ok(Vec::new()); } - let browser_type = match profile.browser.as_str() { - "camoufox" => "firefox", - "wayfern" => "chromium", - _ => return Ok(Vec::new()), - }; + if profile.browser.as_str() != "wayfern" { + return Ok(Vec::new()); + } let mut extension_paths = Vec::new(); - match browser_type { - "firefox" => { - let extensions_dir = profile_data_path.join("extensions"); - // Clear existing extensions - if extensions_dir.exists() { - fs::remove_dir_all(&extensions_dir)?; + // Unpack Chromium extensions and return paths for --load-extension + let unpacked_base = extensions_base_dir().join("unpacked"); + if unpacked_base.exists() { + fs::remove_dir_all(&unpacked_base)?; + } + fs::create_dir_all(&unpacked_base)?; + + for ext_id in &group.extension_ids { + if let Ok(ext) = self.get_extension(ext_id) { + if !ext.browser_compatibility.contains(&"chromium".to_string()) { + continue; } - fs::create_dir_all(&extensions_dir)?; + let src_file = self.get_file_dir(ext_id).join(&ext.file_name); + if src_file.exists() { + let unpack_dir = unpacked_base.join(ext_id); + fs::create_dir_all(&unpack_dir)?; - for ext_id in &group.extension_ids { - if let Ok(ext) = self.get_extension(ext_id) { - if !ext.browser_compatibility.contains(&"firefox".to_string()) { - continue; + // Extract .crx or .zip + match Self::unpack_extension(&src_file, &unpack_dir) { + Ok(()) => { + extension_paths.push(unpack_dir.to_string_lossy().to_string()); } - let src_file = self.get_file_dir(ext_id).join(&ext.file_name); - if !src_file.exists() { - continue; - } - - // Firefox/Camoufox only loads sideloaded .xpi files whose filename - // matches `browser_specific_settings.gecko.id` from the manifest. - // Prefer the cached value; fall back to reading the manifest now - // for extensions added before the field existed. - let gecko_id = if let Some(ref id) = ext.gecko_id { - Some(id.clone()) - } else if let Ok(data) = fs::read(&src_file) { - extract_gecko_id(&data, &ext.file_type) - } else { - None - }; - - let Some(gecko_id) = gecko_id else { - log::warn!( - "Skipping Firefox extension '{}': could not determine gecko id from manifest.json", - ext.name - ); - continue; - }; - - let dest = extensions_dir.join(format!("{gecko_id}.xpi")); - fs::copy(&src_file, &dest)?; - extension_paths.push(dest.to_string_lossy().to_string()); - } - } - } - "chromium" => { - // For Chromium, unpack extensions and return paths for --load-extension - let unpacked_base = extensions_base_dir().join("unpacked"); - if unpacked_base.exists() { - fs::remove_dir_all(&unpacked_base)?; - } - fs::create_dir_all(&unpacked_base)?; - - for ext_id in &group.extension_ids { - if let Ok(ext) = self.get_extension(ext_id) { - if !ext.browser_compatibility.contains(&"chromium".to_string()) { - continue; - } - let src_file = self.get_file_dir(ext_id).join(&ext.file_name); - if src_file.exists() { - let unpack_dir = unpacked_base.join(ext_id); - fs::create_dir_all(&unpack_dir)?; - - // Extract .crx or .zip - match Self::unpack_extension(&src_file, &unpack_dir) { - Ok(()) => { - extension_paths.push(unpack_dir.to_string_lossy().to_string()); - } - Err(e) => { - log::warn!("Failed to unpack extension '{}': {}", ext.name, e); - } - } + Err(e) => { + log::warn!("Failed to unpack extension '{}': {}", ext.name, e); } } } } - _ => {} } Ok(extension_paths) @@ -1066,10 +981,8 @@ impl ExtensionManager { } let needs_meta_backfill = ext.version.is_none() && ext.description.is_none(); - let needs_gecko_backfill = - ext.gecko_id.is_none() && ext.browser_compatibility.iter().any(|b| b == "firefox"); - if needs_meta_backfill || needs_gecko_backfill { + if needs_meta_backfill { let file_path = file_dir.join(&ext.file_name); if let Ok(file_data) = fs::read(&file_path) { let mut updated_ext = ext.clone(); @@ -1100,13 +1013,6 @@ impl ExtensionManager { } } - if needs_gecko_backfill { - if let Some(gid) = extract_gecko_id(&file_data, &ext.file_type) { - updated_ext.gecko_id = Some(gid); - changed = true; - } - } - if changed { let metadata_path = self.get_metadata_path(&ext.id); if let Ok(json) = serde_json::to_string_pretty(&updated_ext) { @@ -1321,27 +1227,24 @@ mod tests { #[test] fn test_get_file_type() { - assert_eq!(get_file_type("ublock.xpi"), Some("xpi".to_string())); assert_eq!(get_file_type("ext.crx"), Some("crx".to_string())); assert_eq!(get_file_type("ext.zip"), Some("zip".to_string())); + assert_eq!(get_file_type("ublock.xpi"), None); assert_eq!(get_file_type("readme.txt"), None); assert_eq!(get_file_type("noext"), None); } #[test] fn test_determine_browser_compatibility() { - assert_eq!( - determine_browser_compatibility("xpi"), - vec!["firefox".to_string()] - ); assert_eq!( determine_browser_compatibility("crx"), vec!["chromium".to_string()] ); assert_eq!( determine_browser_compatibility("zip"), - vec!["chromium".to_string(), "firefox".to_string()] + vec!["chromium".to_string()] ); + assert_eq!(determine_browser_compatibility("xpi"), Vec::::new()); } #[test] @@ -1359,13 +1262,13 @@ mod tests { let ext = mgr .add_extension( "Test Ext".to_string(), - "test.xpi".to_string(), + "test.zip".to_string(), vec![0, 1, 2, 3], ) .unwrap(); assert_eq!(ext.name, "Test Ext"); - assert_eq!(ext.file_type, "xpi"); - assert_eq!(ext.browser_compatibility, vec!["firefox".to_string()]); + assert_eq!(ext.file_type, "zip"); + assert_eq!(ext.browser_compatibility, vec!["chromium".to_string()]); // Get let fetched = mgr.get_extension(&ext.id).unwrap(); @@ -1407,7 +1310,7 @@ mod tests { let ext = mgr .add_extension( "Test Ext".to_string(), - "test.xpi".to_string(), + "test.zip".to_string(), vec![0, 1, 2, 3], ) .unwrap(); @@ -1432,26 +1335,21 @@ mod tests { let mgr = ExtensionManager::new(); - let ext = mgr + let chrome_ext = mgr .add_extension( - "Firefox Ext".to_string(), - "test.xpi".to_string(), + "Chromium Ext".to_string(), + "test.crx".to_string(), vec![0, 1, 2, 3], ) .unwrap(); + let chrome_group = mgr.create_group("Chromium Group".to_string()).unwrap(); + mgr + .add_extension_to_group(&chrome_group.id, &chrome_ext.id) + .unwrap(); - let group = mgr.create_group("Firefox Group".to_string()).unwrap(); - mgr.add_extension_to_group(&group.id, &ext.id).unwrap(); - - // Compatible with camoufox (firefox-based) assert!(mgr - .validate_group_compatibility(&group.id, "camoufox") + .validate_group_compatibility(&chrome_group.id, "wayfern") .is_ok()); - - // Incompatible with wayfern (chromium-based) - assert!(mgr - .validate_group_compatibility(&group.id, "wayfern") - .is_err()); } #[test] @@ -1474,7 +1372,7 @@ mod tests { let mgr = ExtensionManager::new(); let ext = mgr - .add_extension("Test".to_string(), "test.xpi".to_string(), vec![0, 1, 2, 3]) + .add_extension("Test".to_string(), "test.zip".to_string(), vec![0, 1, 2, 3]) .unwrap(); let group = mgr.create_group("G1".to_string()).unwrap(); diff --git a/src-tauri/src/extraction.rs b/src-tauri/src/extraction.rs index cb4b5bb..fea8e04 100644 --- a/src-tauri/src/extraction.rs +++ b/src-tauri/src/extraction.rs @@ -67,17 +67,15 @@ impl Extractor { exe_path: &Path, ) -> Result<(), Box> { // Determine browser type from the destination directory path - let browser_type = if dest_dir.to_string_lossy().contains("camoufox") { - "camoufox" - } else if dest_dir.to_string_lossy().contains("wayfern") { + let browser_type = if dest_dir.to_string_lossy().contains("wayfern") { "wayfern" } else { return Ok(()); }; - // For Camoufox and Wayfern on Linux, we expect the executable directly under version directory - // e.g., binaries/camoufox//camoufox, without an extra subdirectory - if browser_type == "camoufox" || browser_type == "wayfern" { + // For Wayfern on Linux, we expect the executable directly under version directory + // e.g., binaries/wayfern//wayfern, without an extra subdirectory + if browser_type == "wayfern" { return Ok(()); } @@ -977,13 +975,7 @@ impl Extractor { ); // Look for .exe files, preferring main browser executables - let priority_exe_names = [ - "firefox.exe", - "chrome.exe", - "chromium.exe", - "camoufox.exe", - "wayfern.exe", - ]; + let priority_exe_names = ["firefox.exe", "chrome.exe", "chromium.exe", "wayfern.exe"]; // First try priority executable names for exe_name in &priority_exe_names { @@ -1049,7 +1041,6 @@ impl Extractor { || file_name.contains("chrome") || file_name.contains("chromium") || file_name.contains("browser") - || file_name.contains("camoufox") || file_name.contains("wayfern") { return Ok(path); @@ -1098,7 +1089,7 @@ impl Extractor { // Enhanced list of common browser executable names let exe_names = [ - // Firefox variants (used by Camoufox) + // Firefox variants "firefox", "firefox-bin", // Chrome/Chromium variants (used by Wayfern) @@ -1106,10 +1097,6 @@ impl Extractor { "chromium", "chromium-browser", "chromium-bin", - // Camoufox variants - "camoufox", - "camoufox-bin", - "camoufox-browser", // Wayfern variants "wayfern", "wayfern-bin", @@ -1136,16 +1123,13 @@ impl Extractor { "firefox", "chrome", "chromium", - "camoufox", "wayfern", ".", "./", "Browser", "browser", - "opt/camoufox", "usr/lib/firefox", "usr/lib/chromium", - "usr/lib/camoufox", "usr/share/applications", "usr/bin", "AppRun", @@ -1239,7 +1223,6 @@ impl Extractor { || name_lower.contains("chrome") || name_lower.contains("brave") || name_lower.contains("zen") - || name_lower.contains("camoufox") || name_lower.contains("wayfern") || name_lower.ends_with(".appimage") || !name_lower.contains('.') @@ -1295,7 +1278,6 @@ impl Extractor { || name_lower.contains("chrome") || name_lower.contains("brave") || name_lower.contains("zen") - || name_lower.contains("camoufox") || name_lower.contains("wayfern") || file_name.ends_with(".AppImage") { diff --git a/src-tauri/src/geoip_downloader.rs b/src-tauri/src/geoip_downloader.rs index 2238203..58cc2d0 100644 --- a/src-tauri/src/geoip_downloader.rs +++ b/src-tauri/src/geoip_downloader.rs @@ -1,7 +1,6 @@ use crate::browser::GithubRelease; use crate::events; use crate::profile::manager::ProfileManager; -use directories::BaseDirs; use reqwest::Client; use serde::{Deserialize, Serialize}; use std::path::PathBuf; @@ -46,30 +45,12 @@ impl GeoIPDownloader { Self { client } } - fn get_cache_dir() -> Result> { - let base_dirs = BaseDirs::new().ok_or("Failed to determine base directories")?; - - #[cfg(target_os = "windows")] - let cache_dir = base_dirs - .data_local_dir() - .join("camoufox") - .join("camoufox") - .join("Cache"); - - #[cfg(target_os = "macos")] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - #[cfg(target_os = "linux")] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - Ok(cache_dir) + fn get_cache_dir() -> PathBuf { + crate::app_dirs::cache_dir() } - fn get_mmdb_file_path() -> Result> { - Ok(Self::get_cache_dir()?.join("GeoLite2-City.mmdb")) + pub fn get_mmdb_file_path() -> Result> { + Ok(Self::get_cache_dir().join("GeoLite2-City.mmdb")) } pub fn is_geoip_database_available() -> bool { @@ -100,7 +81,7 @@ impl GeoIPDownloader { now.saturating_sub(timestamp) > SEVEN_DAYS } - /// Check if GeoIP database is missing or stale for Camoufox profiles + /// Check if GeoIP database is missing or stale for Wayfern fingerprint geo. pub fn check_missing_geoip_database( &self, ) -> Result> { @@ -108,9 +89,9 @@ impl GeoIPDownloader { .list_profiles() .map_err(|e| format!("Failed to list profiles: {e}"))?; - let has_camoufox_profiles = profiles.iter().any(|profile| profile.browser == "camoufox"); + let needs_geoip = profiles.iter().any(|profile| profile.browser == "wayfern"); - if has_camoufox_profiles { + if needs_geoip { return Ok(!Self::is_geoip_database_available() || Self::is_geoip_stale()); } @@ -169,7 +150,7 @@ impl GeoIPDownloader { .ok_or("No compatible GeoIP database asset found")?; // Create cache directory - let cache_dir = Self::get_cache_dir()?; + let cache_dir = Self::get_cache_dir(); fs::create_dir_all(&cache_dir).await?; let mmdb_path = Self::get_mmdb_file_path()?; @@ -406,10 +387,7 @@ mod tests { #[test] fn test_get_cache_dir() { let cache_dir = GeoIPDownloader::get_cache_dir(); - assert!(cache_dir.is_ok()); - - let path = cache_dir.unwrap(); - assert!(path.to_string_lossy().contains("camoufox")); + assert!(!cache_dir.as_os_str().is_empty()); } #[test] diff --git a/src-tauri/src/camoufox/geolocation.rs b/src-tauri/src/geolocation.rs similarity index 63% rename from src-tauri/src/camoufox/geolocation.rs rename to src-tauri/src/geolocation.rs index c95fb99..ce0646d 100644 --- a/src-tauri/src/camoufox/geolocation.rs +++ b/src-tauri/src/geolocation.rs @@ -1,24 +1,19 @@ -//! Geolocation support for Camoufox fingerprinting. -//! -//! This module provides IP-based geolocation lookup using the MaxMind GeoLite2 database, +//! IP-based geolocation lookup using the MaxMind GeoLite2 database, //! and locale generation based on country/territory information. -use crate::camoufox::data; use crate::geoip_downloader::GeoIPDownloader; -use directories::BaseDirs; use maxminddb::{geoip2, Reader}; use quick_xml::events::Event; use quick_xml::Reader as XmlReader; use rand::RngExt; use std::collections::HashMap; use std::net::IpAddr; -use std::path::PathBuf; use std::str::FromStr; -// Re-export IP utilities for backward compatibility -pub use crate::ip_utils::{fetch_public_ip, is_ipv4, is_ipv6, validate_ip, IpError}; +const TERRITORY_INFO_XML: &str = include_str!("territory_info.xml"); + +pub use crate::ip_utils::IpError; -/// Geolocation error type. #[derive(Debug, thiserror::Error)] pub enum GeolocationError { #[error("GeoIP database not found. Please download it first.")] @@ -42,23 +37,17 @@ pub enum GeolocationError { #[error("IO error: {0}")] Io(#[from] std::io::Error), - #[error("Network error: {0}")] - Network(String), - #[error("IP error: {0}")] Ip(#[from] IpError), } -/// Locale information. #[derive(Debug, Clone)] pub struct Locale { pub language: String, pub region: Option, - pub script: Option, } impl Locale { - /// Format locale as a string (e.g., "en-US"). pub fn as_string(&self) -> String { if let Some(region) = &self.region { format!("{}-{}", self.language, region) @@ -66,84 +55,30 @@ impl Locale { self.language.clone() } } - - /// Convert to config format for Camoufox. - pub fn as_config(&self) -> HashMap { - let mut config = HashMap::new(); - - if let Some(region) = &self.region { - config.insert( - "locale:region".to_string(), - serde_json::json!(region.to_uppercase()), - ); - } - - config.insert( - "locale:language".to_string(), - serde_json::json!(self.language.clone()), - ); - - if let Some(script) = &self.script { - config.insert("locale:script".to_string(), serde_json::json!(script)); - } - - config - } } -/// Geolocation information. #[derive(Debug, Clone)] pub struct Geolocation { pub locale: Locale, pub longitude: f64, pub latitude: f64, pub timezone: String, - pub accuracy: Option, } -impl Geolocation { - /// Convert to config format for Camoufox. - pub fn as_config(&self) -> HashMap { - let mut config = self.locale.as_config(); - - config.insert( - "geolocation:longitude".to_string(), - serde_json::json!(self.longitude), - ); - config.insert( - "geolocation:latitude".to_string(), - serde_json::json!(self.latitude), - ); - config.insert("timezone".to_string(), serde_json::json!(self.timezone)); - - if let Some(accuracy) = self.accuracy { - config.insert( - "geolocation:accuracy".to_string(), - serde_json::json!(accuracy), - ); - } - - config - } -} - -/// Territory language population data. struct LanguagePopulation { language: String, population_percent: f64, } -/// Statistical locale selector based on territory language populations. pub struct LocaleSelector { territories: HashMap>, } impl LocaleSelector { - /// Create a new locale selector by parsing territory info XML. pub fn new() -> Result { let mut territories: HashMap> = HashMap::new(); - let mut reader = XmlReader::from_str(data::TERRITORY_INFO_XML); + let mut reader = XmlReader::from_str(TERRITORY_INFO_XML); reader.config_mut().trim_text(true); let mut current_territory: Option = None; @@ -158,14 +93,12 @@ impl LocaleSelector { let name_str = std::str::from_utf8(name.as_ref()).unwrap_or(""); if name_str == "territory" { - // Save previous territory if exists if let Some(code) = current_territory.take() { if !current_languages.is_empty() { territories.insert(code, std::mem::take(&mut current_languages)); } } - // Get territory type attribute for attr in e.attributes().flatten() { if attr.key.as_ref() == b"type" { current_territory = Some(String::from_utf8_lossy(&attr.value).to_uppercase()); @@ -199,7 +132,6 @@ impl LocaleSelector { let name_ref = e.name(); let name = std::str::from_utf8(name_ref.as_ref()).unwrap_or(""); if name == "territory" { - // Save territory if let Some(code) = current_territory.take() { if !current_languages.is_empty() { territories.insert(code, std::mem::take(&mut current_languages)); @@ -220,7 +152,7 @@ impl LocaleSelector { Ok(Self { territories }) } - /// Get a locale for a given region/country code. + #[allow(clippy::wrong_self_convention)] pub fn from_region(&self, region: &str) -> Result { let region_upper = region.to_uppercase(); @@ -233,7 +165,6 @@ impl LocaleSelector { return Err(GeolocationError::NoLanguageData(region.to_string())); } - // Weighted random selection based on population percentage let total: f64 = languages.iter().map(|l| l.population_percent).sum(); let mut rng = rand::rng(); let target = rng.random::() * total; @@ -249,7 +180,6 @@ impl LocaleSelector { } } - // Fallback to first language let first_lang = &languages[0].language; Ok(normalize_locale(&format!( "{}-{}", @@ -266,8 +196,6 @@ impl Default for LocaleSelector { } } -/// Normalize a locale string to standard format. -/// Handles formats like "en-US", "zh-Hant-US", "zh-Hans-CN". fn normalize_locale(locale: &str) -> Locale { let parts: Vec<&str> = locale.split('-').collect(); @@ -276,73 +204,22 @@ fn normalize_locale(locale: &str) -> Locale { .map(|s| s.to_lowercase()) .unwrap_or_else(|| "en".to_string()); - // A 4-letter part is a script subtag (e.g. "Hant", "Hans", "Cyrl"). - // A 2-letter or 3-digit part is a region subtag (e.g. "US", "CN"). - let mut explicit_script: Option = None; - let mut region: Option = None; + let mut region = None; for part in parts.iter().skip(1) { if part.len() == 4 && part.chars().all(|c| c.is_ascii_alphabetic()) { - explicit_script = Some(part[..1].to_uppercase() + &part[1..].to_lowercase()); - } else { - region = Some(part.to_uppercase()); + // Script subtag (e.g. Hans/Hant) — ignored; Wayfern fingerprint uses language+region only. + continue; } + region = Some(part.to_uppercase()); } - let script = if explicit_script.is_some() { - explicit_script - } else { - match language.as_str() { - "zh" => { - if region.as_deref() == Some("TW") || region.as_deref() == Some("HK") { - Some("Hant".to_string()) - } else { - Some("Hans".to_string()) - } - } - "sr" => Some("Cyrl".to_string()), - _ => None, - } - }; - - Locale { - language, - region, - script, - } + Locale { language, region } } -/// Get the path to the GeoIP MMDB file. -fn get_mmdb_path() -> Result { - let base_dirs = BaseDirs::new().ok_or(GeolocationError::DatabaseNotFound)?; - - #[cfg(target_os = "windows")] - let cache_dir = base_dirs - .data_local_dir() - .join("camoufox") - .join("camoufox") - .join("Cache"); - - #[cfg(target_os = "macos")] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - #[cfg(target_os = "linux")] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] - let cache_dir = base_dirs.cache_dir().join("camoufox"); - - Ok(cache_dir.join("GeoLite2-City.mmdb")) -} - -/// Check if the GeoIP database is available. -pub fn is_geoip_available() -> bool { - GeoIPDownloader::is_geoip_database_available() -} - -/// Get geolocation information for an IP address. pub fn get_geolocation(ip: &str) -> Result { - let mmdb_path = get_mmdb_path()?; + let mmdb_path = + GeoIPDownloader::get_mmdb_file_path().map_err(|_| GeolocationError::DatabaseNotFound)?; if !mmdb_path.exists() { return Err(GeolocationError::DatabaseNotFound); @@ -362,7 +239,6 @@ pub fn get_geolocation(ip: &str) -> Result { .map_err(|e| GeolocationError::LocationNotFound(e.to_string()))? .ok_or_else(|| GeolocationError::LocationNotFound(ip.to_string()))?; - // Extract location data let location = &city.location; let longitude = location @@ -376,14 +252,12 @@ pub fn get_geolocation(ip: &str) -> Result { .ok_or_else(|| GeolocationError::LocationNotFound("No timezone".to_string()))? .to_string(); - // Get country code let country = &city.country; let iso_code = country .iso_code .ok_or_else(|| GeolocationError::LocationNotFound("No country code".to_string()))? .to_uppercase(); - // Get locale from territory data let selector = LocaleSelector::new()?; let locale = selector.from_region(&iso_code)?; @@ -392,7 +266,6 @@ pub fn get_geolocation(ip: &str) -> Result { longitude, latitude, timezone, - accuracy: location.accuracy_radius.map(|r| r as f64), }) } @@ -410,7 +283,6 @@ mod tests { fn test_locale_from_region() { let selector = LocaleSelector::new().unwrap(); - // Test common regions let us_locale = selector.from_region("US"); assert!(us_locale.is_ok()); let us = us_locale.unwrap(); @@ -427,14 +299,12 @@ mod tests { let locale = Locale { language: "en".to_string(), region: Some("US".to_string()), - script: None, }; assert_eq!(locale.as_string(), "en-US"); let locale_no_region = Locale { language: "en".to_string(), region: None, - script: None, }; assert_eq!(locale_no_region.as_string(), "en"); } @@ -444,25 +314,13 @@ mod tests { let locale = normalize_locale("en-US"); assert_eq!(locale.language, "en"); assert_eq!(locale.region, Some("US".to_string())); - assert!(locale.script.is_none()); let zh_tw = normalize_locale("zh-TW"); assert_eq!(zh_tw.language, "zh"); assert_eq!(zh_tw.region, Some("TW".to_string())); - assert_eq!(zh_tw.script, Some("Hant".to_string())); - let zh_cn = normalize_locale("zh-CN"); - assert_eq!(zh_cn.script, Some("Hans".to_string())); - - // 3-part locale: language-script-region let zh_hant_us = normalize_locale("zh-Hant-US"); assert_eq!(zh_hant_us.language, "zh"); assert_eq!(zh_hant_us.region, Some("US".to_string())); - assert_eq!(zh_hant_us.script, Some("Hant".to_string())); - - let zh_hans_us = normalize_locale("zh-Hans-US"); - assert_eq!(zh_hans_us.language, "zh"); - assert_eq!(zh_hans_us.region, Some("US".to_string())); - assert_eq!(zh_hans_us.script, Some("Hans".to_string())); } } diff --git a/src-tauri/src/ip_utils.rs b/src-tauri/src/ip_utils.rs index 3e35c44..0689f09 100644 --- a/src-tauri/src/ip_utils.rs +++ b/src-tauri/src/ip_utils.rs @@ -10,9 +10,6 @@ use std::str::FromStr; pub enum IpError { #[error("Network error: {0}")] Network(String), - - #[error("Invalid IP address: {0}")] - InvalidIP(String), } /// Validate an IP address (IPv4 or IPv6). @@ -20,24 +17,6 @@ pub fn validate_ip(ip: &str) -> bool { IpAddr::from_str(ip).is_ok() } -/// Check if an IP is IPv4. -pub fn is_ipv4(ip: &str) -> bool { - if let Ok(addr) = IpAddr::from_str(ip) { - addr.is_ipv4() - } else { - false - } -} - -/// Check if an IP is IPv6. -pub fn is_ipv6(ip: &str) -> bool { - if let Ok(addr) = IpAddr::from_str(ip) { - addr.is_ipv6() - } else { - false - } -} - /// Fetch public IP address, optionally through a proxy. pub async fn fetch_public_ip(proxy: Option<&str>) -> Result { let urls = [ @@ -114,18 +93,4 @@ mod tests { assert!(!validate_ip("invalid")); assert!(!validate_ip("256.256.256.256")); } - - #[test] - fn test_is_ipv4() { - assert!(is_ipv4("8.8.8.8")); - assert!(!is_ipv4("2001:4860:4860::8888")); - assert!(!is_ipv4("invalid")); - } - - #[test] - fn test_is_ipv6() { - assert!(is_ipv6("2001:4860:4860::8888")); - assert!(!is_ipv6("8.8.8.8")); - assert!(!is_ipv6("invalid")); - } } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index b81fbba..8f36f0c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -22,8 +22,6 @@ mod auto_updater; mod browser; mod browser_runner; mod browser_version_manager; -pub mod camoufox; -mod camoufox_manager; mod default_browser; pub mod dns_blocklist; mod downloaded_browsers_registry; @@ -32,6 +30,7 @@ mod ephemeral_dirs; mod extension_manager; mod extraction; mod geoip_downloader; +mod geolocation; mod group_manager; mod human_typing; mod ip_utils; @@ -69,10 +68,9 @@ use browser_runner::{ use profile::manager::{ check_browser_status, clone_profile, create_browser_profile_new, delete_profile, - list_browser_profiles, rename_profile, update_camoufox_config, update_profile_dns_blocklist, - update_profile_launch_hook, update_profile_note, update_profile_proxy, - update_profile_proxy_bypass_rules, update_profile_tags, update_profile_vpn, - update_profile_window_color, update_wayfern_config, + list_browser_profiles, rename_profile, update_profile_dns_blocklist, update_profile_launch_hook, + update_profile_note, update_profile_proxy, update_profile_proxy_bypass_rules, + update_profile_tags, update_profile_vpn, update_profile_window_color, update_wayfern_config, }; use profile::password::{ @@ -1188,7 +1186,6 @@ async fn generate_sample_fingerprint( launch_hook: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: None, wayfern_config: None, group_id: None, tags: Vec::new(), @@ -1209,15 +1206,7 @@ async fn generate_sample_fingerprint( updated_at: None, }; - if browser == "camoufox" { - let config: crate::camoufox_manager::CamoufoxConfig = - serde_json::from_str(&config_json).map_err(|e| format!("Failed to parse config: {e}"))?; - let manager = crate::camoufox_manager::CamoufoxManager::instance(); - manager - .generate_fingerprint_config(&app_handle, &temp_profile, &config) - .await - .map_err(|e| format!("Failed to generate fingerprint: {e}")) - } else if browser == "wayfern" { + if browser == "wayfern" { let config: crate::wayfern_manager::WayfernConfig = serde_json::from_str(&config_json).map_err(|e| format!("Failed to parse config: {e}"))?; let manager = crate::wayfern_manager::WayfernManager::instance(); @@ -1849,26 +1838,6 @@ pub fn run() { } }); - // Start Camoufox cleanup task - let _app_handle_cleanup = app.handle().clone(); - tauri::async_runtime::spawn(async move { - let camoufox_manager = crate::camoufox_manager::CamoufoxManager::instance(); - let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(60)); - - loop { - interval.tick().await; - - match camoufox_manager.cleanup_dead_instances().await { - Ok(_) => { - // Cleanup completed silently - } - Err(e) => { - log::error!("Error during Camoufox cleanup: {e}"); - } - } - } - }); - // Check and download GeoIP database at startup if needed let app_handle_geoip = app.handle().clone(); tauri::async_runtime::spawn(async move { @@ -1879,7 +1848,7 @@ pub fn run() { match geoip_downloader.check_missing_geoip_database() { Ok(true) => { log::info!( - "GeoIP database is missing for Camoufox profiles, downloading at startup..." + "GeoIP database is missing for Wayfern profiles, downloading at startup..." ); let geoip_downloader = GeoIPDownloader::instance(); if let Err(e) = geoip_downloader @@ -1892,7 +1861,7 @@ pub fn run() { } } Ok(false) => { - // No Camoufox profiles or GeoIP database already available + // No Wayfern profiles or GeoIP database already available } Err(e) => { log::error!("Failed to check GeoIP database status at startup: {e}"); @@ -2301,7 +2270,6 @@ pub fn run() { import_proxies_json, parse_txt_proxies, import_proxies_from_parsed, - update_camoufox_config, update_wayfern_config, generate_sample_fingerprint, get_profile_groups, diff --git a/src-tauri/src/mcp_server.rs b/src-tauri/src/mcp_server.rs index e3c1958..4ac16e6 100644 --- a/src-tauri/src/mcp_server.rs +++ b/src-tauri/src/mcp_server.rs @@ -507,7 +507,7 @@ impl McpServer { vec![ McpTool { name: "list_profiles".to_string(), - description: "List all Wayfern and Camoufox browser profiles".to_string(), + description: "List all Wayfern browser profiles".to_string(), input_schema: serde_json::json!({ "type": "object", "properties": {}, @@ -614,7 +614,7 @@ impl McpServer { }, "browser": { "type": "string", - "enum": ["wayfern", "camoufox"], + "enum": ["wayfern"], "description": "Browser engine to use" }, "proxy_id": { @@ -1049,7 +1049,7 @@ impl McpServer { // Fingerprint management tools McpTool { name: "get_profile_fingerprint".to_string(), - description: "Get the fingerprint configuration for a Wayfern or Camoufox profile" + description: "Get the fingerprint configuration for a Wayfern profile" .to_string(), input_schema: serde_json::json!({ "type": "object", @@ -1065,7 +1065,7 @@ impl McpServer { McpTool { name: "update_profile_fingerprint".to_string(), description: - "Update the fingerprint configuration for a Wayfern or Camoufox profile. Requires an active Pro subscription." + "Update the fingerprint configuration for a Wayfern profile. Requires an active Pro subscription." .to_string(), input_schema: serde_json::json!({ "type": "object", @@ -1208,7 +1208,7 @@ impl McpServer { // Cookie management tools McpTool { name: "import_profile_cookies".to_string(), - description: "Import cookies into a Wayfern or Camoufox profile from a JSON array (Puppeteer / EditThisCookie format) or a Netscape cookies.txt. Format is auto-detected. The browser must not be running.".to_string(), + description: "Import cookies into a Wayfern profile from a JSON array (Puppeteer / EditThisCookie format) or a Netscape cookies.txt. Format is auto-detected. The browser must not be running.".to_string(), input_schema: serde_json::json!({ "type": "object", "properties": { @@ -1902,11 +1902,9 @@ impl McpServer { message: format!("Failed to list profiles: {e}"), })?; - // Filter to only Wayfern and Camoufox profiles - let filtered: Vec<&BrowserProfile> = profiles - .iter() - .filter(|p| p.browser == "wayfern" || p.browser == "camoufox") - .collect(); + // Filter to only Wayfern profiles + let filtered: Vec<&BrowserProfile> = + profiles.iter().filter(|p| p.browser == "wayfern").collect(); Ok(serde_json::json!({ "content": [{ @@ -1943,11 +1941,11 @@ impl McpServer { message: format!("Profile not found: {profile_id}"), })?; - // Check if it's a Wayfern or Camoufox profile - if profile.browser != "wayfern" && profile.browser != "camoufox" { + // Check if it's a Wayfern profile + if profile.browser != "wayfern" { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }); } @@ -2000,11 +1998,11 @@ impl McpServer { message: format!("Profile not found: {profile_id}"), })?; - // Check if it's a Wayfern or Camoufox profile - if profile.browser != "wayfern" && profile.browser != "camoufox" { + // Check if it's a Wayfern profile + if profile.browser != "wayfern" { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }); } @@ -2082,11 +2080,11 @@ impl McpServer { message: format!("Profile not found: {profile_id}"), })?; - // Check if it's a Wayfern or Camoufox profile - if profile.browser != "wayfern" && profile.browser != "camoufox" { + // Check if it's a Wayfern profile + if profile.browser != "wayfern" { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }); } @@ -2173,9 +2171,9 @@ impl McpServer { lines.push(format!("{profile_id}: not found")); continue; }; - if profile.browser != "wayfern" && profile.browser != "camoufox" { + if profile.browser != "wayfern" { lines.push(format!( - "{profile_id}: unsupported browser (MCP supports Wayfern/Camoufox)" + "{profile_id}: unsupported browser (MCP supports Wayfern)" )); continue; } @@ -2298,10 +2296,10 @@ impl McpServer { message: "Missing browser".to_string(), })?; - if browser != "wayfern" && browser != "camoufox" { + if browser != "wayfern" { return Err(McpError { code: -32602, - message: "browser must be 'wayfern' or 'camoufox'".to_string(), + message: "browser must be 'wayfern'".to_string(), }); } @@ -2350,7 +2348,6 @@ impl McpServer { proxy_id, None, None, - None, group_id, false, None, @@ -2594,11 +2591,11 @@ impl McpServer { message: format!("Profile not found: {profile_id}"), })?; - // Check if it's a Wayfern or Camoufox profile - if profile.browser != "wayfern" && profile.browser != "camoufox" { + // Check if it's a Wayfern profile + if profile.browser != "wayfern" { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }); } @@ -3507,23 +3504,6 @@ impl McpServer { })?; let fingerprint_info = match profile.browser.as_str() { - "camoufox" => { - let config = profile - .camoufox_config - .as_ref() - .cloned() - .unwrap_or_default(); - serde_json::json!({ - "browser": "camoufox", - "fingerprint": config.fingerprint, - "os": config.os, - "randomize_fingerprint_on_launch": config.randomize_fingerprint_on_launch, - "screen_max_width": config.screen_max_width, - "screen_max_height": config.screen_max_height, - "screen_min_width": config.screen_min_width, - "screen_min_height": config.screen_min_height, - }) - } "wayfern" => { let config = profile.wayfern_config.as_ref().cloned().unwrap_or_default(); serde_json::json!({ @@ -3540,7 +3520,7 @@ impl McpServer { _ => { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }) } }; @@ -3612,29 +3592,6 @@ impl McpServer { })?; match profile.browser.as_str() { - "camoufox" => { - let mut config = profile - .camoufox_config - .as_ref() - .cloned() - .unwrap_or_default(); - if let Some(fp) = fingerprint { - config.fingerprint = Some(fp.to_string()); - } - if let Some(os_val) = os { - config.os = Some(os_val.to_string()); - } - if let Some(r) = randomize { - config.randomize_fingerprint_on_launch = Some(r); - } - ProfileManager::instance() - .update_camoufox_config(app_handle.clone(), profile_id, config) - .await - .map_err(|e| McpError { - code: -32000, - message: format!("Failed to update camoufox config: {e}"), - })?; - } "wayfern" => { let mut config = profile.wayfern_config.as_ref().cloned().unwrap_or_default(); if let Some(fp) = fingerprint { @@ -3657,7 +3614,7 @@ impl McpServer { _ => { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }) } } @@ -4007,10 +3964,6 @@ impl McpServer { crate::wayfern_manager::WayfernManager::instance() .get_cdp_port(&profile_path_str) .await - } else if profile.browser == "camoufox" { - crate::camoufox_manager::CamoufoxManager::instance() - .get_cdp_port(&profile_path_str) - .await } else { None }; @@ -4409,10 +4362,10 @@ impl McpServer { message: format!("Profile not found: {profile_id}"), })?; - if profile.browser != "wayfern" && profile.browser != "camoufox" { + if profile.browser != "wayfern" { return Err(McpError { code: -32000, - message: "MCP only supports Wayfern and Camoufox profiles".to_string(), + message: "MCP only supports Wayfern profiles".to_string(), }); } diff --git a/src-tauri/src/platform_browser.rs b/src-tauri/src/platform_browser.rs index 14849b5..d20dbfa 100644 --- a/src-tauri/src/platform_browser.rs +++ b/src-tauri/src/platform_browser.rs @@ -15,7 +15,7 @@ use std::process::Command; fn cmd_matches_profile_path(cmd: &[std::ffi::OsString], profile_path: &str) -> bool { let args: Vec<&str> = cmd.iter().filter_map(|a| a.to_str()).collect(); for (i, arg) in args.iter().enumerate() { - // Exact argument equality (Firefox/Camoufox: `-profile `; some launchers + // Exact argument equality (Firefox: `-profile `; some launchers // pass the path as its own arg). if *arg == profile_path { return true; diff --git a/src-tauri/src/profile/manager.rs b/src-tauri/src/profile/manager.rs index 1b8c1c6..1570f60 100644 --- a/src-tauri/src/profile/manager.rs +++ b/src-tauri/src/profile/manager.rs @@ -1,6 +1,4 @@ -use crate::api_client::is_browser_version_nightly; -use crate::browser::{create_browser, BrowserType, ProxySettings}; -use crate::camoufox_manager::CamoufoxConfig; +use crate::browser::{create_browser, BrowserType}; use crate::cloud_auth::CLOUD_AUTH; use crate::downloaded_browsers_registry::DownloadedBrowsersRegistry; use crate::events; @@ -27,14 +25,12 @@ fn atomic_write(path: &Path, data: &[u8]) -> std::io::Result<()> { } pub struct ProfileManager { - camoufox_manager: &'static crate::camoufox_manager::CamoufoxManager, wayfern_manager: &'static crate::wayfern_manager::WayfernManager, } impl ProfileManager { fn new() -> Self { Self { - camoufox_manager: crate::camoufox_manager::CamoufoxManager::instance(), wayfern_manager: crate::wayfern_manager::WayfernManager::instance(), } } @@ -80,7 +76,6 @@ impl ProfileManager { release_type: &str, proxy_id: Option, vpn_id: Option, - camoufox_config: Option, wayfern_config: Option, group_id: Option, ephemeral: bool, @@ -103,6 +98,14 @@ impl ProfileManager { log::info!("Attempting to create profile: {name}"); + if browser == "camoufox" { + return Err( + serde_json::json!({ "code": "CAMOUFOX_REMOVED" }) + .to_string() + .into(), + ); + } + // Check if a profile with this name already exists (case insensitive) let existing_profiles = self.list_profiles()?; if existing_profiles @@ -125,113 +128,6 @@ impl ProfileManager { create_dir_all(&profile_data_dir)?; } - // For Camoufox profiles, generate fingerprint during creation - let final_camoufox_config = if browser == "camoufox" { - let mut config = camoufox_config.unwrap_or_else(|| { - log::info!("Creating default Camoufox config for profile: {name}"); - crate::camoufox_manager::CamoufoxConfig::default() - }); - - // Pass upstream proxy information to config for fingerprint generation - if let Some(proxy_id_ref) = &proxy_id { - if let Some(proxy_settings) = PROXY_MANAGER.get_proxy_settings_by_id(proxy_id_ref) { - // For fingerprint generation, pass upstream proxy directly with credentials if present - let proxy_url = if let (Some(username), Some(password)) = - (&proxy_settings.username, &proxy_settings.password) - { - format!( - "{}://{}:{}@{}:{}", - proxy_settings.proxy_type.to_lowercase(), - username, - password, - proxy_settings.host, - proxy_settings.port - ) - } else { - format!( - "{}://{}:{}", - proxy_settings.proxy_type.to_lowercase(), - proxy_settings.host, - proxy_settings.port - ) - }; - config.proxy = Some(proxy_url); - log::info!( - "Using upstream proxy for Camoufox fingerprint generation: {}://{}:{}", - proxy_settings.proxy_type.to_lowercase(), - proxy_settings.host, - proxy_settings.port - ); - } - } - - // Generate fingerprint if not already provided - if config.fingerprint.is_none() { - log::info!("Generating fingerprint for Camoufox profile: {name}"); - - // Use the camoufox launcher to generate the config - - // Create a temporary profile for fingerprint generation - let temp_profile = BrowserProfile { - id: uuid::Uuid::new_v4(), - name: name.to_string(), - browser: browser.to_string(), - version: version.to_string(), - proxy_id: proxy_id.clone(), - vpn_id: None, - launch_hook: launch_hook.clone(), - process_id: None, - last_launch: None, - release_type: release_type.to_string(), - camoufox_config: None, - wayfern_config: None, - group_id: group_id.clone(), - tags: Vec::new(), - note: None, - window_color: None, - sync_mode: SyncMode::Disabled, - encryption_salt: None, - last_sync: None, - host_os: None, - ephemeral: false, - extension_group_id: None, - proxy_bypass_rules: Vec::new(), - created_by_id: None, - created_by_email: None, - dns_blocklist: None, - password_protected: false, - created_at: None, - updated_at: None, - }; - - match self - .camoufox_manager - .generate_fingerprint_config(app_handle, &temp_profile, &config) - .await - { - Ok(generated_fingerprint) => { - config.fingerprint = Some(generated_fingerprint); - log::info!("Successfully generated fingerprint for profile: {name}"); - } - Err(e) => { - return Err( - format!("Failed to generate fingerprint for Camoufox profile '{name}': {e}").into(), - ); - } - } - } else { - log::info!("Using provided fingerprint for Camoufox profile: {name}"); - } - - // Clear the proxy from config after fingerprint generation - // Browser launch should always use local proxy, never direct to upstream - config.proxy = None; - - Some(config) - } else { - camoufox_config.clone() - }; - // For Wayfern profiles, generate fingerprint during creation let final_wayfern_config = if browser == "wayfern" { let mut config = wayfern_config.unwrap_or_else(|| { @@ -288,7 +184,6 @@ impl ProfileManager { process_id: None, last_launch: None, release_type: release_type.to_string(), - camoufox_config: None, wayfern_config: None, group_id: group_id.clone(), tags: Vec::new(), @@ -360,7 +255,6 @@ impl ProfileManager { process_id: None, last_launch: None, release_type: release_type.to_string(), - camoufox_config: final_camoufox_config, wayfern_config: final_wayfern_config, group_id: group_id.clone(), tags: Vec::new(), @@ -398,31 +292,6 @@ impl ProfileManager { log::info!("Profile '{name}' created successfully with ID: {profile_id}"); - // `apply_proxy_settings_to_profile` writes a Firefox-style user.js - // with the upstream proxy host. That is wrong for both supported - // browser types: - // - Camoufox: camoufox_manager rewrites user.js at every launch with - // the local donut-proxy host; writing the upstream here leaves a - // stale, wrong proxy in user.js until the next launch. - // - Wayfern: Chromium gets its proxy via `--proxy-pac-url=` at launch - // (see wayfern_manager.rs) and never reads user.js. - // So we only call it for any unrecognized browser type that might be - // a true Firefox-family target (none currently). Ephemeral profiles - // skip regardless because their data dir is created at launch time. - if !ephemeral && !matches!(browser, "camoufox" | "wayfern") { - if let Some(proxy_id_ref) = &proxy_id { - if let Some(proxy_settings) = PROXY_MANAGER.get_proxy_settings_by_id(proxy_id_ref) { - self.apply_proxy_settings_to_profile(&profile_data_dir, &proxy_settings, None)?; - } else { - // Proxy ID provided but not found, disable proxy - self.disable_proxy_settings_in_profile(&profile_data_dir)?; - } - } else { - // Create user.js with common Firefox preferences but no proxy - self.disable_proxy_settings_in_profile(&profile_data_dir)?; - } - } - // Emit profile creation event if let Err(e) = events::emit_empty("profiles-changed") { log::warn!("Warning: Failed to emit profiles-changed event: {e}"); @@ -698,12 +567,7 @@ impl ProfileManager { // Update version profile.version = version.to_string(); - // Update the release_type based on the version and browser - profile.release_type = if is_browser_version_nightly(&profile.browser, version, None) { - "nightly".to_string() - } else { - "stable".to_string() - }; + profile.release_type = "stable".to_string(); // Save the updated profile self.save_profile(&profile)?; @@ -1096,7 +960,6 @@ impl ProfileManager { process_id: None, last_launch: None, release_type: source.release_type, - camoufox_config: source.camoufox_config, wayfern_config: source.wayfern_config, group_id: source.group_id, tags: source.tags, @@ -1146,68 +1009,6 @@ impl ProfileManager { Ok(new_profile) } - pub async fn update_camoufox_config( - &self, - app_handle: tauri::AppHandle, - profile_id: &str, - config: CamoufoxConfig, - ) -> Result<(), Box> { - // Find the profile by ID - let profile_uuid = uuid::Uuid::parse_str(profile_id).map_err( - |_| -> Box { - format!("Invalid profile ID: {profile_id}").into() - }, - )?; - let profiles = - self - .list_profiles() - .map_err(|e| -> Box { - format!("Failed to list profiles: {e}").into() - })?; - let mut profile = profiles - .into_iter() - .find(|p| p.id == profile_uuid) - .ok_or_else(|| -> Box { - format!("Profile with ID '{profile_id}' not found").into() - })?; - - // Check if the browser is currently running using the comprehensive status check - let is_running = self - .check_browser_status(app_handle.clone(), &profile) - .await?; - - if is_running { - return Err( - "Cannot update Camoufox configuration while browser is running. Please stop the browser first.".into(), - ); - } - - // Update the Camoufox configuration - profile.camoufox_config = Some(config); - - // Save the updated profile - self - .save_profile(&profile) - .map_err(|e| -> Box { - format!("Failed to save profile: {e}").into() - })?; - - crate::sync::queue_profile_sync_if_eligible(&profile); - - log::info!( - "Camoufox configuration updated for profile '{}' (ID: {}).", - profile.name, - profile_id - ); - - // Emit profile config update event - if let Err(e) = events::emit_empty("profiles-changed") { - log::warn!("Warning: Failed to emit profiles-changed event: {e}"); - } - - Ok(()) - } - pub async fn update_wayfern_config( &self, app_handle: tauri::AppHandle, @@ -1323,44 +1124,6 @@ impl ProfileManager { } } - // Update on-disk browser profile config immediately. - // Both supported browser types ignore this write (Camoufox rewrites - // user.js at launch with the local donut-proxy host, Wayfern takes its - // proxy via `--proxy-pac-url=` and never reads user.js), and for - // Camoufox specifically writing the upstream host here would leave a - // stale, wrong proxy in user.js until the next launch. - if !matches!(profile.browser.as_str(), "camoufox" | "wayfern") { - if let Some(proxy_id_ref) = &proxy_id { - if let Some(proxy_settings) = PROXY_MANAGER.get_proxy_settings_by_id(proxy_id_ref) { - let profiles_dir = self.get_profiles_dir(); - let profile_path = profiles_dir.join(profile.id.to_string()).join("profile"); - self - .apply_proxy_settings_to_profile(&profile_path, &proxy_settings, None) - .map_err(|e| -> Box { - format!("Failed to apply proxy settings: {e}").into() - })?; - } else { - // Proxy ID provided but proxy not found, disable proxy - let profiles_dir = self.get_profiles_dir(); - let profile_path = profiles_dir.join(profile.id.to_string()).join("profile"); - self - .disable_proxy_settings_in_profile(&profile_path) - .map_err(|e| -> Box { - format!("Failed to disable proxy settings: {e}").into() - })?; - } - } else { - // No proxy ID provided, disable proxy - let profiles_dir = self.get_profiles_dir(); - let profile_path = profiles_dir.join(profile.id.to_string()).join("profile"); - self - .disable_proxy_settings_in_profile(&profile_path) - .map_err(|e| -> Box { - format!("Failed to disable proxy settings: {e}").into() - })?; - } - } - // Emit profile update event so frontend UIs can refresh immediately (e.g. proxy manager) if let Err(e) = events::emit("profile-updated", &profile) { log::warn!("Warning: Failed to emit profile update event: {e}"); @@ -1481,17 +1244,12 @@ impl ProfileManager { app_handle: tauri::AppHandle, profile: &BrowserProfile, ) -> Result> { - // Handle Camoufox profiles using CamoufoxManager-based status checking - if profile.browser == "camoufox" { - return self.check_camoufox_status(&app_handle, profile).await; - } - // Handle Wayfern profiles using WayfernManager-based status checking if profile.browser == "wayfern" { return self.check_wayfern_status(&app_handle, profile).await; } - // For non-camoufox browsers, use the existing PID-based logic + // For non-wayfern browsers, use the existing PID-based logic let inner_profile = profile.clone(); let system = System::new_with_specifics( RefreshKind::nothing().with_processes(ProcessRefreshKind::everything()), @@ -1510,18 +1268,8 @@ impl ProfileManager { let profile_path_match = cmd.iter().any(|s| { let arg = s.to_str().unwrap_or(""); // For Firefox-based browsers, check for exact profile path match - if profile.browser == "camoufox" { - arg == profile_data_path_str - || arg == format!("-profile={profile_data_path_str}") - || (arg == "-profile" - && cmd - .iter() - .any(|s2| s2.to_str().unwrap_or("") == profile_data_path_str)) - } else { - // For Chromium-based browsers (Wayfern), check for user-data-dir - arg.contains(&format!("--user-data-dir={profile_data_path_str}")) - || arg == profile_data_path_str - } + arg.contains(&format!("--user-data-dir={profile_data_path_str}")) + || arg == profile_data_path_str }); if profile_path_match { @@ -1539,7 +1287,6 @@ impl ProfileManager { // Check if this is the right browser executable first let exe_name = process.name().to_string_lossy().to_lowercase(); let is_correct_browser = match profile.browser.as_str() { - "camoufox" => exe_name.contains("camoufox") || exe_name.contains("firefox"), "wayfern" => { exe_name.contains("wayfern") || exe_name.contains("chromium") @@ -1559,18 +1306,8 @@ impl ProfileManager { let profile_path_match = cmd.iter().any(|s| { let arg = s.to_str().unwrap_or(""); // For Firefox-based browsers, check for exact profile path match - if profile.browser == "camoufox" { - arg == profile_data_path_str - || arg == format!("-profile={profile_data_path_str}") - || (arg == "-profile" - && cmd - .iter() - .any(|s2| s2.to_str().unwrap_or("") == profile_data_path_str)) - } else { - // For Chromium-based browsers (Wayfern), check for user-data-dir - arg.contains(&format!("--user-data-dir={profile_data_path_str}")) - || arg == profile_data_path_str - } + arg.contains(&format!("--user-data-dir={profile_data_path_str}")) + || arg == profile_data_path_str }); if profile_path_match { @@ -1644,146 +1381,6 @@ impl ProfileManager { Ok(is_running) } - // Check Camoufox status using CamoufoxManager - async fn check_camoufox_status( - &self, - app_handle: &tauri::AppHandle, - profile: &BrowserProfile, - ) -> Result> { - let launcher = self.camoufox_manager; - let profiles_dir = self.get_profiles_dir(); - let profile_data_path = - crate::ephemeral_dirs::get_effective_profile_path(profile, &profiles_dir); - let profile_path_str = profile_data_path.to_string_lossy(); - - // Check if there's a running Camoufox instance for this profile - match launcher.find_camoufox_by_profile(&profile_path_str).await { - Ok(Some(camoufox_process)) => { - // Found a running instance, update profile with process info if changed - let profiles_dir = self.get_profiles_dir(); - let profile_uuid_dir = profiles_dir.join(profile.id.to_string()); - let metadata_file = profile_uuid_dir.join("metadata.json"); - let metadata_exists = metadata_file.exists(); - - if metadata_exists { - // Load latest to avoid overwriting other fields - let mut latest: BrowserProfile = match std::fs::read_to_string(&metadata_file) - .ok() - .and_then(|s| serde_json::from_str(&s).ok()) - { - Some(p) => p, - None => profile.clone(), - }; - - if latest.process_id != camoufox_process.processId { - let old_pid = latest.process_id; - latest.process_id = camoufox_process.processId; - if let Err(e) = self.save_profile(&latest) { - log::warn!("Warning: Failed to update Camoufox profile with process info: {e}"); - } - if let (Some(prev), Some(new)) = (old_pid, camoufox_process.processId) { - let _ = crate::proxy_manager::PROXY_MANAGER.update_proxy_pid(prev, new); - } - - // Emit profile update event to frontend - if let Err(e) = events::emit("profile-updated", &latest) { - log::warn!("Warning: Failed to emit profile update event: {e}"); - } - - log::info!( - "Camoufox process has started for profile '{}' with PID: {:?}", - profile.name, - camoufox_process.processId - ); - } - } - Ok(true) - } - Ok(None) => { - // No running instance found, clear process ID if set and stop proxy - if profile.ephemeral { - crate::ephemeral_dirs::remove_ephemeral_dir(&profile.id.to_string()); - } - - let profiles_dir = self.get_profiles_dir(); - let profile_uuid_dir = profiles_dir.join(profile.id.to_string()); - let metadata_file = profile_uuid_dir.join("metadata.json"); - let metadata_exists = metadata_file.exists(); - - if metadata_exists { - let mut latest: BrowserProfile = match std::fs::read_to_string(&metadata_file) - .ok() - .and_then(|s| serde_json::from_str(&s).ok()) - { - Some(p) => p, - None => profile.clone(), - }; - - if latest.process_id.is_some() { - latest.process_id = None; - if let Err(e) = self.save_profile(&latest) { - log::warn!("Warning: Failed to clear Camoufox profile process info: {e}"); - } - - if let Some(updated) = crate::auto_updater::AutoUpdater::instance() - .update_profile_to_latest_installed(app_handle, &latest) - { - latest = updated; - } - - if let Err(e) = events::emit("profile-updated", &latest) { - log::warn!("Warning: Failed to emit profile update event: {e}"); - } - } - } - Ok(false) - } - Err(e) => { - // Error checking status, assume not running and clear process ID - log::warn!("Warning: Failed to check Camoufox status: {e}"); - if profile.ephemeral { - crate::ephemeral_dirs::remove_ephemeral_dir(&profile.id.to_string()); - } - - let profiles_dir = self.get_profiles_dir(); - let profile_uuid_dir = profiles_dir.join(profile.id.to_string()); - let metadata_file = profile_uuid_dir.join("metadata.json"); - let metadata_exists = metadata_file.exists(); - - if metadata_exists { - let mut latest: BrowserProfile = match std::fs::read_to_string(&metadata_file) - .ok() - .and_then(|s| serde_json::from_str(&s).ok()) - { - Some(p) => p, - None => profile.clone(), - }; - - if latest.process_id.is_some() { - latest.process_id = None; - if let Err(e2) = self.save_profile(&latest) { - log::warn!( - "Warning: Failed to clear Camoufox profile process info after error: {e2}" - ); - } - - if let Some(updated) = crate::auto_updater::AutoUpdater::instance() - .update_profile_to_latest_installed(app_handle, &latest) - { - latest = updated; - } - - // Emit profile update event to frontend - if let Err(e3) = events::emit("profile-updated", &latest) { - log::warn!("Warning: Failed to emit profile update event: {e3}"); - } - } - } - Ok(false) - } - } - } - // Check Wayfern status using WayfernManager async fn check_wayfern_status( &self, @@ -1880,212 +1477,6 @@ impl ProfileManager { } } } - - fn get_common_firefox_preferences(&self) -> Vec { - vec![ - // Disable default browser check - "user_pref(\"browser.shell.checkDefaultBrowser\", false);".to_string(), - "user_pref(\"browser.shell.skipDefaultBrowserCheckOnFirstRun\", true);".to_string(), - "user_pref(\"browser.preferences.moreFromMozilla\", false);".to_string(), - "user_pref(\"services.sync.prefs.sync.browser.startup.upgradeDialog.enabled\", false);" - .to_string(), - // Disable welcome / first-run screens - "user_pref(\"browser.aboutwelcome.enabled\", false);".to_string(), - "user_pref(\"browser.startup.homepage_override.mstone\", \"ignore\");".to_string(), - "user_pref(\"startup.homepage_welcome_url\", \"\");".to_string(), - "user_pref(\"startup.homepage_welcome_url.additional\", \"\");".to_string(), - "user_pref(\"startup.homepage_override_url\", \"\");".to_string(), - // Keep extension updates enabled and allow sideloaded extensions. - // - autoDisableScopes=0: profile-installed extensions are enabled by default. - // - startupScanScopes=1: rescan SCOPE_PROFILE on each launch so freshly - // dropped .xpi files in /extensions/ get registered. - // - signatures.required=false: accept unsigned/dev .xpi files. Camoufox - // is built without MOZ_REQUIRE_SIGNING so this is honored. - "user_pref(\"extensions.update.enabled\", true);".to_string(), - "user_pref(\"extensions.update.autoUpdateDefault\", true);".to_string(), - "user_pref(\"extensions.autoDisableScopes\", 0);".to_string(), - "user_pref(\"extensions.startupScanScopes\", 1);".to_string(), - "user_pref(\"xpinstall.signatures.required\", false);".to_string(), - // Completely disable browser update checking - "user_pref(\"app.update.enabled\", false);".to_string(), - "user_pref(\"app.update.auto\", false);".to_string(), - "user_pref(\"app.update.mode\", 0);".to_string(), - "user_pref(\"app.update.service.enabled\", false);".to_string(), - "user_pref(\"app.update.staging.enabled\", false);".to_string(), - "user_pref(\"app.update.silent\", true);".to_string(), - "user_pref(\"app.update.disabledForTesting\", true);".to_string(), - // Prevent update URL access entirely - "user_pref(\"app.update.url\", \"\");".to_string(), - "user_pref(\"app.update.url.manual\", \"\");".to_string(), - "user_pref(\"app.update.url.details\", \"\");".to_string(), - // Disable update timing/scheduling - "user_pref(\"app.update.timerFirstInterval\", 999999999);".to_string(), - "user_pref(\"app.update.interval\", 999999999);".to_string(), - "user_pref(\"app.update.background.interval\", 999999999);".to_string(), - "user_pref(\"app.update.idletime\", 999999999);".to_string(), - "user_pref(\"app.update.promptWaitTime\", 999999999);".to_string(), - // Disable update attempts - "user_pref(\"app.update.download.maxAttempts\", 0);".to_string(), - "user_pref(\"app.update.elevate.maxAttempts\", 0);".to_string(), - "user_pref(\"app.update.checkInstallTime\", false);".to_string(), - // Suppress update UI/prompts/notifications - "user_pref(\"app.update.doorhanger\", false);".to_string(), - "user_pref(\"app.update.badge\", false);".to_string(), - "user_pref(\"app.update.notifyDuringDownload\", false);".to_string(), - "user_pref(\"app.update.background.scheduling.enabled\", false);".to_string(), - "user_pref(\"app.update.background.enabled\", false);".to_string(), - // Disable BITS (Windows Background Intelligent Transfer Service) updates - "user_pref(\"app.update.BITS.enabled\", false);".to_string(), - // Disable language pack updates - "user_pref(\"app.update.langpack.enabled\", false);".to_string(), - // Suppress upgrade dialogs on startup - "user_pref(\"browser.startup.upgradeDialog.enabled\", false);".to_string(), - // Disable update ping telemetry - "user_pref(\"toolkit.telemetry.updatePing.enabled\", false);".to_string(), - // Zen browser specific - disable welcome screen and updates - "user_pref(\"zen.welcome-screen.seen\", true);".to_string(), - "user_pref(\"zen.updates.enabled\", false);".to_string(), - "user_pref(\"zen.updates.check-for-updates\", false);".to_string(), - // Additional first-run suppressions - "user_pref(\"app.normandy.first_run\", false);".to_string(), - "user_pref(\"trailhead.firstrun.didSeeAboutWelcome\", true);".to_string(), - "user_pref(\"datareporting.policy.dataSubmissionPolicyBypassNotification\", true);" - .to_string(), - "user_pref(\"toolkit.telemetry.reportingpolicy.firstRun\", false);".to_string(), - // Disable quit confirmation dialogs - "user_pref(\"browser.warnOnQuit\", false);".to_string(), - "user_pref(\"browser.showQuitWarning\", false);".to_string(), - "user_pref(\"browser.tabs.warnOnClose\", false);".to_string(), - "user_pref(\"browser.tabs.warnOnCloseOtherTabs\", false);".to_string(), - "user_pref(\"browser.sessionstore.warnOnQuit\", false);".to_string(), - ] - } - - pub fn apply_proxy_settings_to_profile( - &self, - profile_data_path: &Path, - proxy: &ProxySettings, - internal_proxy: Option<&ProxySettings>, - ) -> Result<(), Box> { - let user_js_path = profile_data_path.join("user.js"); - let prefs_js_path = profile_data_path.join("prefs.js"); - - // Remove prefs.js if it exists to ensure Firefox reads user.js instead - // Firefox may cache proxy settings in prefs.js, so we need to clear it - if prefs_js_path.exists() { - log::info!("Removing prefs.js to ensure Firefox reads updated user.js settings"); - let _ = fs::remove_file(&prefs_js_path); - } - - let mut preferences = Vec::new(); - - // Add common Firefox preferences (like disabling default browser check) - preferences.extend(self.get_common_firefox_preferences()); - - // Determine which proxy settings to use - let effective_proxy = internal_proxy.unwrap_or(proxy); - let proxy_host = &effective_proxy.host; - let proxy_port = effective_proxy.port; - - // Check if this is a SOCKS proxy (only possible when using upstream directly) - let is_socks = - internal_proxy.is_none() && (proxy.proxy_type == "socks4" || proxy.proxy_type == "socks5"); - - log::info!( - "Applying manual proxy settings to Firefox profile: {}:{} (is_internal: {}, is_socks: {})", - proxy_host, - proxy_port, - internal_proxy.is_some(), - is_socks - ); - - // Use MANUAL proxy configuration (type 1) instead of PAC file (type 2) - // PAC files with file:// URLs are blocked by privacy-focused browsers like Zen - // Manual proxy configuration works reliably across all Firefox variants - preferences.push("user_pref(\"network.proxy.type\", 1);".to_string()); - - if is_socks { - // SOCKS proxy configuration - preferences.extend([ - format!("user_pref(\"network.proxy.socks\", \"{}\");", proxy_host), - format!("user_pref(\"network.proxy.socks_port\", {});", proxy_port), - format!( - "user_pref(\"network.proxy.socks_version\", {});", - if proxy.proxy_type == "socks5" { 5 } else { 4 } - ), - "user_pref(\"network.proxy.http\", \"\");".to_string(), - "user_pref(\"network.proxy.http_port\", 0);".to_string(), - "user_pref(\"network.proxy.ssl\", \"\");".to_string(), - "user_pref(\"network.proxy.ssl_port\", 0);".to_string(), - ]); - } else { - // HTTP/HTTPS proxy configuration (including our internal local proxy) - preferences.extend([ - format!("user_pref(\"network.proxy.http\", \"{}\");", proxy_host), - format!("user_pref(\"network.proxy.http_port\", {});", proxy_port), - format!("user_pref(\"network.proxy.ssl\", \"{}\");", proxy_host), - format!("user_pref(\"network.proxy.ssl_port\", {});", proxy_port), - format!("user_pref(\"network.proxy.ftp\", \"{}\");", proxy_host), - format!("user_pref(\"network.proxy.ftp_port\", {});", proxy_port), - "user_pref(\"network.proxy.socks\", \"\");".to_string(), - "user_pref(\"network.proxy.socks_port\", 0);".to_string(), - ]); - } - - // Common proxy settings - keep it simple like proxy-chain expected - preferences.extend([ - "user_pref(\"network.proxy.no_proxies_on\", \"\");".to_string(), - "user_pref(\"network.proxy.autoconfig_url\", \"\");".to_string(), - // Disable QUIC/HTTP3 - it bypasses HTTP proxy - "user_pref(\"network.http.http3.enable\", false);".to_string(), - "user_pref(\"network.http.http3.enabled\", false);".to_string(), - ]); - - // Write settings to user.js file - let user_js_content = preferences.join("\n"); - fs::write(user_js_path, &user_js_content)?; - log::info!( - "Updated user.js with manual proxy settings: {}:{}", - proxy_host, - proxy_port - ); - - Ok(()) - } - - pub fn disable_proxy_settings_in_profile( - &self, - profile_data_path: &Path, - ) -> Result<(), Box> { - let user_js_path = profile_data_path.join("user.js"); - let mut preferences = Vec::new(); - - // Get the UUID directory (parent of profile data directory) - let uuid_dir = profile_data_path - .parent() - .ok_or("Invalid profile path - cannot find UUID directory")?; - - // Add common Firefox preferences (like disabling default browser check) - preferences.extend(self.get_common_firefox_preferences()); - - preferences.push("user_pref(\"network.proxy.type\", 0);".to_string()); - preferences.push("user_pref(\"network.proxy.failover_direct\", true);".to_string()); - - // Create a direct proxy PAC file in UUID directory - let pac_content = "function FindProxyForURL(url, host) { return 'DIRECT'; }"; - let pac_path = uuid_dir.join("proxy.pac"); - fs::write(&pac_path, pac_content)?; - let pac_url = - url::Url::from_file_path(&pac_path).map_err(|_| "Failed to convert PAC path to file URL")?; - preferences.push(format!( - "user_pref(\"network.proxy.autoconfig_url\", \"{}\");", - pac_url.as_str() - )); - - fs::write(user_js_path, preferences.join("\n"))?; - - Ok(()) - } } #[cfg(test)] @@ -2127,25 +1518,6 @@ mod tests { ); } - #[test] - fn test_get_common_firefox_preferences() { - let (manager, _temp_dir) = create_test_profile_manager(); - - let prefs = manager.get_common_firefox_preferences(); - assert!(!prefs.is_empty(), "Should return non-empty preferences"); - - // Check for some expected preferences - let prefs_string = prefs.join("\n"); - assert!( - prefs_string.contains("browser.shell.checkDefaultBrowser"), - "Should contain default browser check preference" - ); - assert!( - prefs_string.contains("app.update.enabled"), - "Should contain update preference" - ); - } - #[test] fn test_get_binaries_dir() { let (manager, _temp_dir) = create_test_profile_manager(); @@ -2163,109 +1535,6 @@ mod tests { ); } - #[test] - fn test_disable_proxy_settings_in_profile() { - let (manager, temp_dir) = create_test_profile_manager(); - - // Create a test profile directory - let profile_dir = temp_dir.path().join("test_profile"); - fs::create_dir_all(&profile_dir).expect("Should create profile directory"); - - let result = manager.disable_proxy_settings_in_profile(&profile_dir); - assert!(result.is_ok(), "Should successfully disable proxy settings"); - - // Check that user.js was created - let user_js_path = profile_dir.join("user.js"); - assert!(user_js_path.exists(), "user.js should be created"); - - let content = fs::read_to_string(&user_js_path).expect("Should read user.js"); - assert!( - content.contains("network.proxy.type"), - "Should contain proxy type setting" - ); - assert!( - content.contains("0"), - "Should set proxy type to 0 (no proxy)" - ); - } - - #[test] - fn test_apply_proxy_settings_to_profile() { - let (manager, temp_dir) = create_test_profile_manager(); - - // Create a test profile directory structure - let uuid_dir = temp_dir.path().join("test_uuid"); - let profile_dir = uuid_dir.join("profile"); - fs::create_dir_all(&profile_dir).expect("Should create profile directory"); - - let proxy_settings = ProxySettings { - proxy_type: "http".to_string(), - host: "proxy.example.com".to_string(), - port: 8080, - username: Some("user".to_string()), - password: Some("pass".to_string()), - }; - - let result = manager.apply_proxy_settings_to_profile(&profile_dir, &proxy_settings, None); - assert!(result.is_ok(), "Should successfully apply proxy settings"); - - // Check that user.js was created - let user_js_path = profile_dir.join("user.js"); - assert!(user_js_path.exists(), "user.js should be created"); - - let content = fs::read_to_string(&user_js_path).expect("Should read user.js"); - - // Check for manual proxy configuration (type 1) instead of PAC (type 2) - // Manual proxy is used because PAC file:// URLs are blocked by privacy browsers like Zen - assert!( - content.contains("network.proxy.type\", 1"), - "Should set proxy type to 1 (manual)" - ); - assert!( - content.contains("network.proxy.http\", \"proxy.example.com\""), - "Should set HTTP proxy host" - ); - assert!( - content.contains("network.proxy.http_port\", 8080"), - "Should set HTTP proxy port" - ); - assert!( - content.contains("network.proxy.ssl\", \"proxy.example.com\""), - "Should set SSL proxy host" - ); - assert!( - content.contains("network.proxy.ssl_port\", 8080"), - "Should set SSL proxy port" - ); - } - - #[test] - fn test_pac_url_encodes_spaces_in_path() { - let (manager, temp_dir) = create_test_profile_manager(); - - let uuid_dir = temp_dir.path().join("path with spaces"); - let profile_dir = uuid_dir.join("profile"); - fs::create_dir_all(&profile_dir).expect("Should create profile directory"); - - let result = manager.disable_proxy_settings_in_profile(&profile_dir); - assert!(result.is_ok(), "Should handle paths with spaces"); - - let user_js = fs::read_to_string(profile_dir.join("user.js")).unwrap(); - let pac_line = user_js - .lines() - .find(|l| l.contains("autoconfig_url")) - .expect("Should have autoconfig_url preference"); - - assert!( - !pac_line.contains("path with spaces"), - "PAC URL should not contain raw spaces: {pac_line}" - ); - assert!( - pac_line.contains("path%20with%20spaces"), - "PAC URL should percent-encode spaces: {pac_line}" - ); - } - #[test] fn test_normalize_launch_hook_accepts_http_and_https() { let http = @@ -2339,7 +1608,6 @@ pub async fn create_browser_profile_with_group( release_type: String, proxy_id: Option, vpn_id: Option, - camoufox_config: Option, wayfern_config: Option, group_id: Option, ephemeral: bool, @@ -2356,7 +1624,6 @@ pub async fn create_browser_profile_with_group( &release_type, proxy_id, vpn_id, - camoufox_config, wayfern_config, group_id, ephemeral, @@ -2527,17 +1794,13 @@ pub async fn create_browser_profile_new( release_type: String, proxy_id: Option, vpn_id: Option, - camoufox_config: Option, wayfern_config: Option, group_id: Option, ephemeral: Option, dns_blocklist: Option, launch_hook: Option, ) -> Result { - let fingerprint_os = camoufox_config - .as_ref() - .and_then(|c| c.os.as_deref()) - .or_else(|| wayfern_config.as_ref().and_then(|c| c.os.as_deref())); + let fingerprint_os = wayfern_config.as_ref().and_then(|c| c.os.as_deref()); if !crate::cloud_auth::CLOUD_AUTH .is_fingerprint_os_allowed(fingerprint_os) @@ -2560,7 +1823,6 @@ pub async fn create_browser_profile_new( release_type, proxy_id, vpn_id, - camoufox_config, wayfern_config, group_id, ephemeral.unwrap_or(false), @@ -2570,34 +1832,6 @@ pub async fn create_browser_profile_new( .await } -#[tauri::command] -pub async fn update_camoufox_config( - app_handle: tauri::AppHandle, - profile_id: String, - config: CamoufoxConfig, -) -> Result<(), String> { - if config.fingerprint.is_some() - && !crate::cloud_auth::CLOUD_AUTH - .can_use_cross_os_fingerprints() - .await - { - return Err(serde_json::json!({ "code": "FINGERPRINT_REQUIRES_PRO" }).to_string()); - } - - if !crate::cloud_auth::CLOUD_AUTH - .is_fingerprint_os_allowed(config.os.as_deref()) - .await - { - return Err("Fingerprint OS spoofing requires an active Pro subscription".to_string()); - } - - let profile_manager = ProfileManager::instance(); - profile_manager - .update_camoufox_config(app_handle, &profile_id, config) - .await - .map_err(|e| format!("Failed to update Camoufox config: {e}")) -} - #[tauri::command] pub async fn update_wayfern_config( app_handle: tauri::AppHandle, diff --git a/src-tauri/src/profile/types.rs b/src-tauri/src/profile/types.rs index 81867dc..cdf278e 100644 --- a/src-tauri/src/profile/types.rs +++ b/src-tauri/src/profile/types.rs @@ -1,4 +1,3 @@ -use crate::camoufox_manager::CamoufoxConfig; use crate::wayfern_manager::WayfernConfig; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; @@ -38,9 +37,7 @@ pub struct BrowserProfile { #[serde(default)] pub last_launch: Option, #[serde(default = "default_release_type")] - pub release_type: String, // "stable" or "nightly" - #[serde(default)] - pub camoufox_config: Option, // Camoufox configuration + pub release_type: String, #[serde(default)] pub wayfern_config: Option, // Wayfern configuration #[serde(default)] @@ -115,7 +112,6 @@ impl BrowserProfile { self .host_os .as_deref() - .or_else(|| self.camoufox_config.as_ref().and_then(|c| c.os.as_deref())) .or_else(|| self.wayfern_config.as_ref().and_then(|c| c.os.as_deref())) } diff --git a/src-tauri/src/profile_importer.rs b/src-tauri/src/profile_importer.rs index 08123f1..e68795c 100644 --- a/src-tauri/src/profile_importer.rs +++ b/src-tauri/src/profile_importer.rs @@ -4,7 +4,6 @@ use std::collections::HashSet; use std::fs::{self, create_dir_all}; use std::path::Path; -use crate::camoufox_manager::CamoufoxConfig; use crate::downloaded_browsers_registry::DownloadedBrowsersRegistry; use crate::profile::types::{get_host_os, BrowserProfile, SyncMode}; use crate::profile::ProfileManager; @@ -21,11 +20,9 @@ pub struct DetectedProfile { } fn map_browser_type(browser: &str) -> &str { - // Firefox-based sources map to the now-deprecated Camoufox. They are no longer - // detected for import; the mapping is kept only so the import command can - // recognize and REJECT them. Everything else maps to Wayfern. + // Legacy Firefox-family sources map to Wayfern at import time. match browser { - "firefox" | "firefox-developer" | "zen" | "camoufox" => "camoufox", + "firefox" | "firefox-developer" | "zen" | "camoufox" => "wayfern", _ => "wayfern", } } @@ -218,7 +215,7 @@ impl ProfileImporter { "chromium" => "Chrome/Chromium", "brave" => "Brave", "zen" => "Zen Browser", - "camoufox" => "Camoufox", + "wayfern" => "Wayfern", _ => "Unknown Browser", } @@ -232,7 +229,6 @@ impl ProfileImporter { browser_type: &str, new_profile_name: &str, proxy_id: Option, - _camoufox_config: Option, wayfern_config: Option, ) -> Result<(), Box> { let source_path = Path::new(source_path); @@ -268,10 +264,6 @@ impl ProfileImporter { let version = self.get_default_version_for_browser(mapped)?; - // Camoufox import is removed; only Wayfern profiles are imported now, so the - // imported profile never carries a Camoufox config. - let final_camoufox_config: Option = None; - let final_wayfern_config = if mapped == "wayfern" { let mut config = wayfern_config.unwrap_or_default(); @@ -312,7 +304,6 @@ impl ProfileImporter { process_id: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: None, wayfern_config: None, group_id: None, tags: Vec::new(), @@ -367,7 +358,6 @@ impl ProfileImporter { process_id: None, last_launch: None, release_type: "stable".to_string(), - camoufox_config: final_camoufox_config, wayfern_config: final_wayfern_config, group_id: None, tags: Vec::new(), @@ -465,19 +455,9 @@ pub async fn import_browser_profile( browser_type: String, new_profile_name: String, proxy_id: Option, - camoufox_config: Option, wayfern_config: Option, ) -> Result<(), String> { - // Camoufox is deprecated — Firefox-based profiles (which map to Camoufox) can - // no longer be imported. Reject them before doing any work. - if map_browser_type(&browser_type) == "camoufox" { - return Err(serde_json::json!({ "code": "CAMOUFOX_IMPORT_DEPRECATED" }).to_string()); - } - - let fingerprint_os = camoufox_config - .as_ref() - .and_then(|c| c.os.as_deref()) - .or_else(|| wayfern_config.as_ref().and_then(|c| c.os.as_deref())); + let fingerprint_os = wayfern_config.as_ref().and_then(|c| c.os.as_deref()); if !crate::cloud_auth::CLOUD_AUTH .is_fingerprint_os_allowed(fingerprint_os) @@ -494,7 +474,6 @@ pub async fn import_browser_profile( &browser_type, &new_profile_name, proxy_id, - camoufox_config, wayfern_config, ) .await @@ -546,12 +525,12 @@ mod tests { #[test] fn test_map_browser_type() { - assert_eq!(map_browser_type("firefox"), "camoufox"); - assert_eq!(map_browser_type("firefox-developer"), "camoufox"); - assert_eq!(map_browser_type("zen"), "camoufox"); + assert_eq!(map_browser_type("firefox"), "wayfern"); + assert_eq!(map_browser_type("firefox-developer"), "wayfern"); + assert_eq!(map_browser_type("zen"), "wayfern"); assert_eq!(map_browser_type("chromium"), "wayfern"); assert_eq!(map_browser_type("brave"), "wayfern"); - assert_eq!(map_browser_type("camoufox"), "camoufox"); + assert_eq!(map_browser_type("camoufox"), "wayfern"); assert_eq!(map_browser_type("wayfern"), "wayfern"); assert_eq!(map_browser_type("something_else"), "wayfern"); } diff --git a/src-tauri/src/proxy_manager.rs b/src-tauri/src/proxy_manager.rs index 9e4c4ec..73953fb 100644 --- a/src-tauri/src/proxy_manager.rs +++ b/src-tauri/src/proxy_manager.rs @@ -1487,9 +1487,8 @@ impl ProxyManager { profile_id: Option<&str>, bypass_rules: Vec, blocklist_file: Option, - // Protocol the local worker serves the browser: "http" (Camoufox) or - // "socks5" (Wayfern). Reflected in the returned ProxySettings.proxy_type - // so the caller formats the right local proxy URL scheme. + // Protocol the local worker serves the browser: "socks5" (Wayfern). Reflected in + // the returned ProxySettings.proxy_type so the caller formats the right local proxy URL scheme. local_protocol: &str, ) -> Result { if let Some(name) = profile_id { diff --git a/src-tauri/src/proxy_storage.rs b/src-tauri/src/proxy_storage.rs index aa39844..4198ea1 100644 --- a/src-tauri/src/proxy_storage.rs +++ b/src-tauri/src/proxy_storage.rs @@ -16,8 +16,7 @@ pub struct ProxyConfig { pub bypass_rules: Vec, #[serde(default)] pub blocklist_file: Option, - /// Protocol the local worker serves to the browser: "http" (default, used - /// by Camoufox/Firefox) or "socks5" (used by Wayfern/Chromium so QUIC and + /// Protocol the local worker serves to the browser: "socks5" (Wayfern/Chromium so QUIC and /// WebRTC UDP can be proxied without leaking the real IP). Independent of /// `upstream_url`, which is the real upstream proxy/VPN this worker dials. #[serde(default)] diff --git a/src-tauri/src/sync/engine.rs b/src-tauri/src/sync/engine.rs index e3aa3b7..92e91bf 100644 --- a/src-tauri/src/sync/engine.rs +++ b/src-tauri/src/sync/engine.rs @@ -73,7 +73,7 @@ const CRITICAL_FILE_PATTERNS: &[&str] = &[ "Secure Preferences", "Web Data", "Extension Cookies", - // Firefox/Camoufox equivalents + // Chromium profile equivalents "cookies.sqlite", "key4.db", "logins.json", diff --git a/src-tauri/src/synchronizer.rs b/src-tauri/src/synchronizer.rs index d89de58..cca309d 100644 --- a/src-tauri/src/synchronizer.rs +++ b/src-tauri/src/synchronizer.rs @@ -111,10 +111,7 @@ impl SynchronizerManager { .clone(); if leader.browser != "wayfern" { - return Err( - "Synchronizer only supports Wayfern profiles. Camoufox profiles cannot be used." - .to_string(), - ); + return Err("Synchronizer only supports Wayfern profiles.".to_string()); } // Check leader is not already running diff --git a/src-tauri/src/camoufox/data/territoryInfo.xml b/src-tauri/src/territory_info.xml similarity index 100% rename from src-tauri/src/camoufox/data/territoryInfo.xml rename to src-tauri/src/territory_info.xml diff --git a/src-tauri/src/version_updater.rs b/src-tauri/src/version_updater.rs index 61ae265..8945102 100644 --- a/src-tauri/src/version_updater.rs +++ b/src-tauri/src/version_updater.rs @@ -254,9 +254,9 @@ impl VersionUpdater { ) -> Result, Box> { let supported_browsers = self.browser_version_manager.get_supported_browsers(); - // Only fetch versions for active browsers (wayfern, camoufox) plus any + // Only fetch versions for active browsers (wayfern) plus any // deprecated browsers that still have existing profiles - let active_browsers = ["wayfern", "camoufox"]; + let active_browsers = ["wayfern"]; let browsers_with_profiles: std::collections::HashSet = crate::profile::ProfileManager::instance() .list_profiles() diff --git a/src-tauri/src/wayfern_manager.rs b/src-tauri/src/wayfern_manager.rs index 487cc00..bf85374 100644 --- a/src-tauri/src/wayfern_manager.rs +++ b/src-tauri/src/wayfern_manager.rs @@ -154,7 +154,7 @@ impl WayfernManager { /// /// Keys are the camelCase fields Wayfern uses in its fingerprint /// (`windowOuterWidth`, `screenAvailWidth`, …) — NOT the dotted - /// Camoufox-style keys. Preference order, matching how the fingerprint + /// Preference order, matching how the fingerprint /// describes the window: /// 1. `windowOuterWidth` / `windowOuterHeight` — the real window size. /// 2. `screenAvailWidth` / `screenAvailHeight` — usable screen area. @@ -325,7 +325,7 @@ impl WayfernManager { .await .map_err(|e| format!("Failed to fetch public IP: {e}"))?, }; - crate::camoufox::geolocation::get_geolocation(&ip) + crate::geolocation::get_geolocation(&ip) .map_err(|e| format!("Failed to get geolocation for IP {ip}: {e}")) } .await; diff --git a/src-tauri/tests/sync_e2e.rs b/src-tauri/tests/sync_e2e.rs index 4e1578c..5f2e023 100644 --- a/src-tauri/tests/sync_e2e.rs +++ b/src-tauri/tests/sync_e2e.rs @@ -246,7 +246,7 @@ fn create_test_profile_bundle_with_bypass_rules(temp_dir: &Path, bypass_rules: & let metadata = json!({ "id": "test-bypass-profile-id", "name": "Bypass Rules Profile", - "browser": "camoufox", + "browser": "wayfern", "version": "120.0.0", "release_type": "stable", "sync_enabled": true, @@ -802,7 +802,7 @@ async fn test_profile_bypass_rules_sync() { let metadata = extract_bundle(&downloaded, &extract_dir); assert_eq!(metadata["name"], "Bypass Rules Profile"); - assert_eq!(metadata["browser"], "camoufox"); + assert_eq!(metadata["browser"], "wayfern"); let synced_rules = metadata["proxy_bypass_rules"] .as_array() diff --git a/src/app/page.tsx b/src/app/page.tsx index 0d16515..74ebf58 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,8 +7,6 @@ import { useOnborda } from "onborda"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { AccountPage } from "@/components/account-page"; -import { CamoufoxConfigDialog } from "@/components/camoufox-config-dialog"; -import { CamoufoxDeprecationDialog } from "@/components/camoufox-deprecation-dialog"; import { CloneProfileDialog } from "@/components/clone-profile-dialog"; import { CloseConfirmDialog } from "@/components/close-confirm-dialog"; import { CommandPalette } from "@/components/command-palette"; @@ -43,6 +41,7 @@ import { SyncAllDialog } from "@/components/sync-all-dialog"; import { SyncConfigDialog } from "@/components/sync-config-dialog"; import { SyncFollowerDialog } from "@/components/sync-follower-dialog"; import { ThankYouDialog } from "@/components/thank-you-dialog"; +import { WayfernConfigDialog } from "@/components/wayfern-config-dialog"; import { WayfernTermsDialog } from "@/components/wayfern-terms-dialog"; import { WelcomeDialog } from "@/components/welcome-dialog"; import { WindowResizeWarningDialog } from "@/components/window-resize-warning-dialog"; @@ -78,14 +77,9 @@ import { showSyncProgressToast, showToast, } from "@/lib/toast-utils"; -import type { - BrowserProfile, - CamoufoxConfig, - SyncSettings, - WayfernConfig, -} from "@/types"; +import type { BrowserProfile, SyncSettings, WayfernConfig } from "@/types"; -type BrowserTypeString = "camoufox" | "wayfern"; +type BrowserTypeString = "wayfern"; interface PendingUrl { id: string; @@ -268,8 +262,7 @@ export default function Home() { const [importProfileDialogOpen, setImportProfileDialogOpen] = useState(false); const [proxyManagementDialogOpen, setProxyManagementDialogOpen] = useState(false); - const [camoufoxConfigDialogOpen, setCamoufoxConfigDialogOpen] = - useState(false); + const [wayfernConfigDialogOpen, setWayfernConfigDialogOpen] = useState(false); const [groupManagementDialogOpen, setGroupManagementDialogOpen] = useState(false); const [extensionManagementDialogOpen, setExtensionManagementDialogOpen] = @@ -306,7 +299,7 @@ export default function Home() { const [selectedProfiles, setSelectedProfiles] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const [pendingUrls, setPendingUrls] = useState([]); - const [currentProfileForCamoufoxConfig, setCurrentProfileForCamoufoxConfig] = + const [currentProfileForWayfernConfig, setCurrentProfileForWayfernConfig] = useState(null); const [cloneProfile, setCloneProfile] = useState(null); const [passwordDialogProfile, setPasswordDialogProfile] = @@ -315,8 +308,6 @@ export default function Home() { useState("set"); const pendingLaunchAfterUnlockRef = useRef(null); const [windowResizeWarningOpen, setWindowResizeWarningOpen] = useState(false); - const [windowResizeWarningBrowserType, setWindowResizeWarningBrowserType] = - useState(undefined); const windowResizeWarningResolver = useRef< ((proceed: boolean) => void) | null >(null); @@ -534,7 +525,7 @@ export default function Home() { console.log("Found missing binaries:", missingBinaries); } if (missingGeoIP) { - console.log("Found missing GeoIP database for Camoufox"); + console.log("Found missing GeoIP database"); } // Group missing binaries by browser type to avoid concurrent downloads @@ -556,9 +547,9 @@ export default function Home() { if (missingGeoIP) { if (missingList) { - missingList += ", GeoIP database for Camoufox"; + missingList += ", GeoIP database"; } else { - missingList = "GeoIP database for Camoufox"; + missingList = "GeoIP database"; } } @@ -776,33 +767,11 @@ export default function Home() { } }, [handleUrlOpen, t]); - const handleConfigureCamoufox = useCallback((profile: BrowserProfile) => { - setCurrentProfileForCamoufoxConfig(profile); - setCamoufoxConfigDialogOpen(true); + const handleConfigureWayfern = useCallback((profile: BrowserProfile) => { + setCurrentProfileForWayfernConfig(profile); + setWayfernConfigDialogOpen(true); }, []); - const handleSaveCamoufoxConfig = useCallback( - async (profile: BrowserProfile, config: CamoufoxConfig) => { - try { - await invoke("update_camoufox_config", { - profileId: profile.id, - config, - }); - // No need to manually reload - useProfileEvents will handle the update - setCamoufoxConfigDialogOpen(false); - } catch (err: unknown) { - console.error("Failed to update camoufox config:", err); - showErrorToast( - t("errors.updateCamoufoxConfigFailed", { - error: JSON.stringify(err), - }), - ); - throw err; - } - }, - [t], - ); - const handleSaveWayfernConfig = useCallback( async (profile: BrowserProfile, config: WayfernConfig) => { try { @@ -811,7 +780,7 @@ export default function Home() { config, }); // No need to manually reload - useProfileEvents will handle the update - setCamoufoxConfigDialogOpen(false); + setWayfernConfigDialogOpen(false); } catch (err: unknown) { console.error("Failed to update wayfern config:", err); showErrorToast( @@ -831,7 +800,6 @@ export default function Home() { releaseType: string; proxyId?: string; vpnId?: string; - camoufoxConfig?: CamoufoxConfig; wayfernConfig?: WayfernConfig; groupId?: string; extensionGroupId?: string; @@ -850,7 +818,6 @@ export default function Home() { releaseType: profileData.releaseType, proxyId: profileData.proxyId, vpnId: profileData.vpnId, - camoufoxConfig: profileData.camoufoxConfig, wayfernConfig: profileData.wayfernConfig, groupId: profileData.groupId ?? @@ -926,7 +893,7 @@ export default function Home() { } // Show one-time warning about window resizing for fingerprinted browsers - if (profile.browser === "camoufox" || profile.browser === "wayfern") { + if (profile.browser === "wayfern") { try { const dismissed = await invoke( "get_window_resize_warning_dismissed", @@ -934,7 +901,6 @@ export default function Home() { if (!dismissed) { const proceed = await new Promise((resolve) => { windowResizeWarningResolver.current = resolve; - setWindowResizeWarningBrowserType(profile.browser); setWindowResizeWarningOpen(true); }); if (!proceed) { @@ -1138,9 +1104,7 @@ export default function Home() { const handleBulkCopyCookies = useCallback(() => { if (selectedProfiles.length === 0) return; const eligibleProfiles = profiles.filter( - (p) => - selectedProfiles.includes(p.id) && - (p.browser === "wayfern" || p.browser === "camoufox"), + (p) => selectedProfiles.includes(p.id) && p.browser === "wayfern", ); if (eligibleProfiles.length === 0) { showErrorToast(t("errors.cookieCopyUnsupportedBrowser")); @@ -1400,7 +1364,7 @@ export default function Home() { void checkMissingBinaries(); } - // Proactively download Wayfern and Camoufox if not already available + // Proactively download Wayfern if not already available if (!profilesLoading) { void invoke("ensure_active_browsers_downloaded").catch((err: unknown) => { console.error("Failed to auto-download browsers:", err); @@ -1523,40 +1487,6 @@ export default function Home() { }; }, [t]); - // Show warning for non-wayfern/camoufox profiles (support ending March 15, 2026) - useEffect(() => { - if (profiles.length === 0) return; - - const unsupportedProfiles = profiles.filter( - (p) => p.browser !== "wayfern" && p.browser !== "camoufox", - ); - - if (unsupportedProfiles.length > 0) { - const unsupportedNames = unsupportedProfiles - .map((p) => p.name) - .join(", "); - - showToast({ - id: "browser-support-ending-warning", - type: "error", - title: t("browserSupport.endingSoonTitle"), - description: t("browserSupport.endingSoonDescription", { - profiles: unsupportedNames, - }), - duration: 15000, - action: { - label: t("common.buttons.learnMore"), - onClick: () => { - const event = new CustomEvent("url-open-request", { - detail: "https://github.com/zhom/donutbrowser/discussions", - }); - window.dispatchEvent(event); - }, - }, - }); - } - }, [profiles, t]); - // Re-check Wayfern terms when a browser download completes useEffect(() => { let unlisten: (() => void) | null = null; @@ -1639,7 +1569,6 @@ export default function Home() { return (