From e5f148e534bac220be02316d432cd064b75eb379 Mon Sep 17 00:00:00 2001 From: CRT Date: Tue, 13 Oct 2026 07:25:01 +0800 Subject: [PATCH] Onboarding live apps without owner questions for what the stores and the code prove: storebound onboard imports the live products and subscriptions with USD / base prices (catalog diff clean), contact values, the App Review contact and demo account (credentials.json, masked), sign-in for review from Apple's review detail and auth code, and the account deletion page from the app's site; App Store keywords count characters (live fields up to 265 bytes accepted); validate accepts the 6.5-inch iPhone set and Play's default-language graphics fallback; Play Reporting API off gives the project's enable link and apps list falls back to local apps; accounts default ; store-only apps (apps add --store --app-id) shown read-only in the desktop (pitfalls 43-52) --- CHANGELOG.md | 34 ++ apps/desktop/src-tauri/src/commands.rs | 30 +- apps/desktop/src-tauri/src/registry.rs | 83 ++++- apps/desktop/src-tauri/tests/machine.rs | 34 ++ apps/desktop/src-tauri/tests/state.rs | 17 +- apps/desktop/src/i18n/en.ts | 2 +- .../state/d1-missing-folders.host.json | 1 + .../tests/fixtures/state/d3-full.host.json | 14 + .../tests/fixtures/state/empty.host.json | 1 + .../fixtures/state/shared-profiles.host.json | 33 ++ cli/accounts.ts | 25 +- cli/api/wrapped.gen.ts | 16 +- cli/apps.ts | 81 ++++- cli/aso.ts | 4 +- cli/catalog.ts | 28 +- cli/commands.ts | 3 +- cli/data/flags.json | 48 ++- cli/lib/aso-audit.ts | 6 +- cli/lib/aso-intel.ts | 14 +- cli/lib/aso.ts | 11 +- cli/lib/catalog.ts | 6 + cli/lib/copy.ts | 1 - cli/lib/credentials.ts | 32 +- cli/lib/embedded.ts | 6 +- cli/lib/fastlane.ts | 6 +- cli/lib/health.ts | 8 +- cli/lib/listing-translate.ts | 20 +- cli/lib/onboard.ts | 304 ++++++++++++++++++ cli/lib/project-signals.ts | 11 +- cli/lib/registry.ts | 75 ++++- cli/lib/scan/config-edit.ts | 8 +- cli/lib/store-apps.ts | 34 +- cli/lib/validate-rules.ts | 33 +- cli/mcp-tools.ts | 5 +- cli/onboard.ts | 187 +++++++++++ docs/api-coverage.md | 16 +- docs/commands.md | 3 +- docs/getting-started.md | 20 ++ docs/pitfalls.md | 12 +- skills/appstore-first-release/SKILL.md | 2 +- skills/aso-basics/SKILL.md | 2 +- skills/listing-localization/SKILL.md | 2 +- skills/release-management/SKILL.md | 4 + skills/store-pitfalls/SKILL.md | 74 ++++- templates/appstore.md | 2 +- templates/profiles/app/appstore.md | 2 +- .../profiles/subscription-app/appstore.md | 2 +- tests/aso-plus.test.ts | 15 +- tests/listing-translate.test.ts | 22 +- tests/machine.test.ts | 39 ++- tests/onboard.test.ts | 272 ++++++++++++++++ tests/pure.test.ts | 5 +- tests/store-real-shapes.test.ts | 25 +- tests/wave1.test.ts | 49 ++- tools/desktop-boot-check.ts | 17 +- 55 files changed, 1648 insertions(+), 158 deletions(-) create mode 100644 cli/lib/onboard.ts create mode 100644 cli/onboard.ts create mode 100644 tests/onboard.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f157978..306c7c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,40 @@ machine in `~/.storebound`, shared by the CLI and the app. `storebound://open` link, so a folder added in the terminal is selected without a question. - **Desktop:** a folder whose `package.json` pins another storebound version shows "This project uses storebound X, the app runs Y". `storebound-desktop --version`. `ws desktop import / export` carry the accounts' profile names. + +Onboarding apps that are already live, without owner questions for what the stores and the code prove (lessons +43-52, from setting storebound up on 6 live apps): + +- **`storebound onboard [--write]`** (MCP `onboard`, dry run by default). Read-only on both stores, never changes a + store price. Imports the live one-time products and subscriptions of both stores into `products` / `subscriptions`: + ids, type, listings per language, usd = the US price (else Play's own USD price for new regions), Apple's price + schedule base territory as an override when it is not the USA, an item on one store only kept with `platforms`; + `catalog diff` comes out clean. An item with no USD price anywhere is named with its base price, not left out + silently. Fills app.contactEmail / website / supportUrl / privacyPolicyUrl / marketingUrl from Play's app details and + App Store Connect where the config holds a template value (real values that differ are reported and kept); the App + Review contact goes into `.storebound/credentials.json` `reviewContact` (masked in output, the phone never printed). + Sign-in for review is decided from Apple's review detail (`demoAccountRequired`; a demo account set there is imported + into `reviewDemoAccount`, never printed) and the code's auth signals, never a default yes. With accounts and no + `accounts.deletionUrl` it looks for the deletion page on the app's own site (/delete-account, /account/delete, + /delete, /account-deletion, links in the privacy policy that mention deletion); not found stays a finding. Then the + owner questions that are left, in one batch. +- **App Store keywords count characters, not bytes.** Live READY_FOR_SALE fields hold Thai 95 characters / 265 + bytes, Turkish 100 / 105, Polish 99 / 105: `check`, `check --aso`, `listing check`, `listing translate` and + `aso suggest` count characters again (lesson 4 was wrong; lesson 43). +- **`validate`:** a live app with only the 6.5" iPhone set (APP_IPHONE_65) passes, App Store Connect accepts it for + the 6.9" requirement; a 6.9" set is a recommendation (also the two 13" iPad types). Play: a non-default language + without its own icon / feature graphic uses the default language's (a note), only the default language's missing + graphics block. +- **Play Reporting API off:** the finding names the Cloud project and the exact link to enable + `playdeveloperreporting.googleapis.com` for it (`apps check`, `apps list`, `health`, `validate`); `apps list` no + longer fails but lists the Play apps of this machine's app folders and store-only entries. +- **`storebound accounts default `** (`--clear`): the machine's default credential profile, a pointer file in + the credentials folder, shown in `accounts list`. Order: env > the profile a project names > the project's own keys + > this default > the only profile (or the one named `default`). +- **Store-only apps:** `storebound apps add --store apple|play --app-id --account ` adds an app that is + live but has no project on this machine to `~/.storebound/projects.json` (`storeApps`); `apps folders` shows it as + "no local project", `apps remove apple:` takes it out. The desktop shows it read-only ("Store only": status, + reviews, analytics) under the account with that profile, and keeps the entries when it writes the folder list. - `ws` children get the app's own account choice when the workspace names no account (before: no profile at all). Fixes from a real first release of a second game (Capacitor 8 monorepo, lessons 35 to 37): diff --git a/apps/desktop/src-tauri/src/commands.rs b/apps/desktop/src-tauri/src/commands.rs index 5224cd9..5310907 100644 --- a/apps/desktop/src-tauri/src/commands.rs +++ b/apps/desktop/src-tauri/src/commands.rs @@ -1091,9 +1091,21 @@ pub async fn store_apps_refresh(window: WebviewWindow, app: AppHandle, state: St let value = r.call_job("apps.list", json!({ "credentials": creds, "args": { "icons": icons } }), job.as_deref()).await?; let at = store::now_iso(); state.cache.put(&format!("acct:{id}"), "apps.list", &json!({}), &value, &at).map_err(Fail::host)?; + let st = saved(&state)?; + let value = match st.accounts.iter().find(|a| a.id == id) { + Some(a) => store_only_into(&st.accounts, a, Some(value.clone()), ®istry::read_store_apps(&state.registry), &at).unwrap_or(value), + None => value, + }; Ok(Entry { value, at }) } +/// One account's app list with the machine's store-only apps of its credential profile added (registry.rs). +fn store_only_into(all: &[Account], a: &Account, list: Option, apps: &[registry::StoreOnly], at: &str) -> Option { + let store = match a.kind { AccountKind::Apple => "apple", AccountKind::Play => "play" }; + let only = all.iter().filter(|x| x.kind == a.kind).count() == 1; + registry::with_store_only(list, store, a.profile.as_deref(), only, apps, at) +} + #[derive(Serialize)] pub struct AccountApps { account: String, @@ -1104,11 +1116,19 @@ pub struct AccountApps { #[tauri::command] pub fn store_apps_cached(window: WebviewWindow, state: State<'_, AppState>) -> Res> { guard(&window)?; - let ids: Vec = saved(&state)?.accounts.iter().map(|a| a.id.clone()).collect(); - ids.into_iter() - .map(|account| { - let entry = state.cache.get(&format!("acct:{account}"), "apps.list", &json!({})).map_err(Fail::host)?; - Ok(AccountApps { account, entry }) + let accounts = saved(&state)?.accounts.clone(); + let store_only = registry::read_store_apps(&state.registry); + accounts + .iter() + .map(|a| { + let entry = state.cache.get(&format!("acct:{}", a.id), "apps.list", &json!({})).map_err(Fail::host)?; + // apps live on a store with no project on this machine (`storebound apps add --store … --app-id …`) + let at = entry.as_ref().map(|e| e.at.clone()).unwrap_or_else(store::now_iso); + let entry = match store_only_into(&accounts, a, entry.as_ref().map(|e| e.value.clone()), &store_only, &at) { + Some(value) => Some(Entry { value, at }), + None => entry, + }; + Ok(AccountApps { account: a.id.clone(), entry }) }) .collect() } diff --git a/apps/desktop/src-tauri/src/registry.rs b/apps/desktop/src-tauri/src/registry.rs index 86529fd..2ae732b 100644 --- a/apps/desktop/src-tauri/src/registry.rs +++ b/apps/desktop/src-tauri/src/registry.rs @@ -4,7 +4,11 @@ //! in state.json under the same id. `sync` runs at start, when the list is shown and before a deep link is handled; //! adding, removing and locating a folder in the app write the registry too. The first start with a registry missing //! writes the app's own list into it. -//! { "version": 1, "projects": [{ "id": "<16 hex>", "path": "/abs/folder", "name": "Star Dash", "added": "" }] } +//! { "version": 1, "projects": [{ "id": "<16 hex>", "path": "/abs/folder", "name": "Star Dash", "added": "" }], +//! "storeApps": [{ "id": "<16 hex>", "store": "apple", "appId": "6400000000", "account": "", "name": "…" }] } +//! `storeApps` (written by `storebound apps add --store … --app-id …`) are apps live on a store with no project on this +//! machine: they join the app list of the account with that credential profile (`store_apps_cached`), so the +//! portfolio shows them read-only ("store only"). Writing the folder list keeps them. use std::fs; use std::path::{Path, PathBuf}; @@ -69,12 +73,87 @@ pub fn write(file: &Path, entries: &[Entry]) -> Result<(), String> { if let Some(d) = file.parent() { fs::create_dir_all(d).map_err(|e| e.to_string())?; } - let text = serde_json::to_string_pretty(&serde_json::json!({ "version": 1, "projects": entries })).map_err(|e| e.to_string())? + "\n"; + // the store-only entries the CLI wrote stay as they are + let keep = fs::read_to_string(file).ok().and_then(|t| serde_json::from_str::(&t).ok()).and_then(|v| v.get("storeApps").cloned()).filter(|s| s.as_array().is_some_and(|a| !a.is_empty())); + let mut doc = serde_json::json!({ "version": 1, "projects": entries }); + if let Some(s) = keep { + doc["storeApps"] = s; + } + let text = serde_json::to_string_pretty(&doc).map_err(|e| e.to_string())? + "\n"; let tmp = file.with_extension(format!("tmp-{}", std::process::id())); fs::write(&tmp, text).map_err(|e| e.to_string())?; fs::rename(&tmp, file).map_err(|e| e.to_string()) } +/// An app that is live on a store with no project on this machine (cli/lib/registry.ts StoreOnlyApp). +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct StoreOnly { + pub id: String, + /// "apple" | "play" + pub store: String, + /// Apple: the numeric app id; Play: the package name. + pub app_id: String, + /// The credential profile that reads it; None = the account of that store when there is only one. + pub account: Option, + pub name: String, + pub bundle_id: Option, +} + +/// The store-only entries of the file's text (pure): malformed ones are dropped. +pub fn parse_store_apps(text: &str) -> Vec { + let Ok(v) = serde_json::from_str::(text) else { return vec![] }; + let mut out: Vec = vec![]; + for x in v.get("storeApps").and_then(Value::as_array).into_iter().flatten() { + let s = |k: &str| x.get(k).and_then(Value::as_str).map(str::trim).filter(|s| !s.is_empty()).map(str::to_string); + let (Some(store), Some(app_id)) = (s("store"), s("appId")) else { continue }; + let ok = match store.as_str() { + "apple" => app_id.len() >= 6 && app_id.len() <= 12 && app_id.chars().all(|c| c.is_ascii_digit()), + "play" => app_id.contains('.') && app_id.chars().all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '_'), + _ => false, + }; + if !ok || out.iter().any(|o| o.store == store && o.app_id == app_id) { + continue; + } + let id: String = Sha256::digest(format!("store:{store}:{app_id}").as_bytes()).iter().take(8).map(|b| format!("{b:02x}")).collect(); + let bundle_id = s("bundleId").or_else(|| (store == "play").then(|| app_id.clone())); + out.push(StoreOnly { id, name: s("name").unwrap_or_else(|| app_id.clone()), account: s("account"), bundle_id, store, app_id }); + } + out +} + +pub fn read_store_apps(file: &Path) -> Vec { + fs::read_to_string(file).map(|t| parse_store_apps(&t)).unwrap_or_default() +} + +/// One account's app list (`apps.list` JSON, or None when never read) with the store-only entries of its profile +/// added (pure). `store` is "apple" | "play"; `only` = this is the only account of that store (entries that name no +/// profile go to it). The entries already in the list (same id) are left as the store reported them. +pub fn with_store_only(list: Option, store: &str, profile: Option<&str>, only: bool, apps: &[StoreOnly], at: &str) -> Option { + let mine: Vec<&StoreOnly> = apps.iter().filter(|a| a.store == store && (a.account.as_deref().is_some_and(|p| Some(p) == profile) || (a.account.is_none() && only))).collect(); + if mine.is_empty() { + return list; + } + let ios = store == "apple"; + let mut v = list.unwrap_or_else(|| serde_json::json!({ "store": if ios { "ios" } else { "android" }, "apps": [], "warnings": [], "at": at })); + if !v.get("apps").is_some_and(Value::is_array) { + v["apps"] = serde_json::json!([]); + } + let have: Vec = v["apps"].as_array().map(|a| a.iter().filter_map(|x| x.get("id").and_then(Value::as_str).map(str::to_string)).collect()).unwrap_or_default(); + for a in mine { + if have.contains(&a.app_id) { + continue; + } + let app = serde_json::json!({ + "store": if ios { "ios" } else { "android" }, "id": a.app_id, "bundleId": a.bundle_id.clone().unwrap_or_default(), "name": a.name, + "platforms": [if ios { "IOS" } else { "ANDROID" }], "sku": null, "primaryLocale": null, "latest": null, "icon": null, "registered": true, + }); + if let Some(list) = v["apps"].as_array_mut() { + list.push(app); + } + } + Some(v) +} + fn entry_of(p: &Project) -> Entry { Entry { id: p.id.clone(), path: p.path.clone(), name: p.name.clone(), added: p.added.clone() } } diff --git a/apps/desktop/src-tauri/tests/machine.rs b/apps/desktop/src-tauri/tests/machine.rs index d1ff82f..78d76ad 100644 --- a/apps/desktop/src-tauri/tests/machine.rs +++ b/apps/desktop/src-tauri/tests/machine.rs @@ -160,6 +160,40 @@ fn the_folder_list_is_the_machines() { assert_eq!(registry::parse(r#"{"projects":[{"path":"rel"},{"path":"/a","id":"XYZ"},{"path":"/a"}]}"#).iter().map(|e| e.id.clone()).collect::>(), vec![registry::folder_id("/a")]); } +#[test] +fn store_only_apps_join_their_profiles_account_and_survive_folder_writes() { + let dir = tempfile::tempdir().unwrap(); + let file = dir.path().join("projects.json"); + // as `storebound apps add --store apple --app-id 6400000999 --account teamA` and a Play one without a profile wrote it + std::fs::write(&file, r#"{"version":1,"projects":[],"storeApps":[ + {"id":"x","store":"apple","appId":"6400000999","account":"teamA","name":"Example Aquarium","bundleId":"com.example.aquarium","added":"t"}, + {"store":"play","appId":"com.example.legacy","name":"Legacy"}, + {"store":"apple","appId":"not-a-number"}]}"#).unwrap(); + let apps = registry::read_store_apps(&file); + assert_eq!(apps.iter().map(|a| a.app_id.as_str()).collect::>(), vec!["6400000999", "com.example.legacy"]); + assert_eq!(apps[1].bundle_id.as_deref(), Some("com.example.legacy")); + // the app writes its folder list: the store-only entries stay + let mut st = State { projects: vec![project("aaaaaaaaaaaaaaaa", "/w/Star Dash", None)], ..State::default() }; + registry::publish(&st, &file, &[]).unwrap(); + assert_eq!(registry::read_store_apps(&file).len(), 2); + assert!(registry::sync(&mut st, &file).is_ok()); + assert_eq!(registry::read_store_apps(&file).len(), 2); + // an account of profile teamA that never listed its apps: the entry shows as its app, read-only, no folder + let v = registry::with_store_only(None, "apple", Some("teamA"), false, &apps, "t").unwrap(); + assert_eq!(v["store"], "ios"); + assert_eq!(v["apps"][0]["id"], "6400000999"); + assert_eq!(v["apps"][0]["bundleId"], "com.example.aquarium"); + assert_eq!(v["apps"][0]["registered"], true); + // an account of another profile gets nothing; the list the store returned is kept, the entry not doubled + assert_eq!(registry::with_store_only(None, "apple", Some("teamB"), false, &apps, "t"), None); + let listed = serde_json::json!({ "store": "ios", "apps": [{ "id": "6400000999", "name": "From the store" }], "warnings": [], "at": "t" }); + assert_eq!(registry::with_store_only(Some(listed.clone()), "apple", Some("teamA"), false, &apps, "t"), Some(listed)); + // no profile named: the only Play account takes it + let p = registry::with_store_only(None, "play", Some("any"), true, &apps, "t").unwrap(); + assert_eq!(p["apps"][0]["name"], "Legacy"); + assert_eq!(registry::with_store_only(None, "play", Some("any"), false, &apps, "t"), None); +} + #[test] fn a_folder_that_pins_another_storebound_says_so() { let dir = tempfile::tempdir().unwrap(); diff --git a/apps/desktop/src-tauri/tests/state.rs b/apps/desktop/src-tauri/tests/state.rs index 543f80e..ea56f38 100644 --- a/apps/desktop/src-tauri/tests/state.rs +++ b/apps/desktop/src-tauri/tests/state.rs @@ -208,7 +208,9 @@ fn log_entries_are_one_block_and_rotate() { /// next to it as `.host.json`, after the start-up sync with the machine's shared stores: D1 keeps its accounts in a /// keychain that has no entries (the keys were never added: the accounts stay without a profile), D3's keychain has /// them (they move into credential profiles), and shared-profiles is the 0.8 format whose apple account comes from a -/// profile the CLI wrote, with a folder that pins storebound 0.6.0. tools/desktop-boot-check.ts boots the built window on exactly these answers. +/// profile the CLI wrote, with a folder that pins storebound 0.6.0 and a store-only app of that profile (`storebound +/// apps add --store apple --app-id … --account default`: store_apps_cached lists it under the apple account). +/// tools/desktop-boot-check.ts boots the built window on exactly these answers. /// After a change to the state format: STOREBOUND_UPDATE_FIXTURES=1 cargo test --test state #[test] fn host_answers_for_the_fixtures_are_current() { @@ -240,9 +242,22 @@ fn host_answers_for_the_fixtures_are_current() { let pin = project_view(&p).storebound_pin.expect("0.6.0 is not this app"); projects[0]["storeboundPin"] = json!(pin); } + // store_apps_cached before any store read: only the machine's store-only entries (registry.rs) + let store_only = if name == "shared-profiles" { + registry::parse_store_apps(r#"{"storeApps":[{"store":"apple","appId":"6400000999","account":"default","name":"Example Aquarium","bundleId":"com.example.aquarium"}]}"#) + } else { + vec![] + }; + let cached: Vec = st.accounts.iter().map(|a| { + let store = match a.kind { AccountKind::Apple => "apple", AccountKind::Play => "play" }; + let only = st.accounts.iter().filter(|x| x.kind == a.kind).count() == 1; + let entry = registry::with_store_only(None, store, a.profile.as_deref(), only, &store_only, "2026-10-13T00:00:00Z").map(|value| json!({ "value": value, "at": "2026-10-13T00:00:00Z" })); + json!({ "account": a.id, "entry": entry }) + }).collect(); let host = json!({ "projects_list": projects, "accounts_list": st.accounts, + "store_apps_cached": cached, "workspace_get": { "studios": st.studios, "overrides": st.overrides, "settings": st.settings }, }); let want = format!("{}\n", serde_json::to_string_pretty(&host).unwrap()); diff --git a/apps/desktop/src/i18n/en.ts b/apps/desktop/src/i18n/en.ts index b15afce..5dd63ef 100644 --- a/apps/desktop/src/i18n/en.ts +++ b/apps/desktop/src/i18n/en.ts @@ -582,7 +582,7 @@ export const en = { 'action.importApps': 'Import apps', 'action.importAppsHint': 'Read-only: every app each store account can see, from App Store Connect and Google Play', 'apps.storeOnly': 'Store only', - 'apps.storeOnlyHint': 'On a store account, no app folder yet: store data only (read-only)', + 'apps.storeOnlyHint': 'On a store account, no local project (no app folder on this machine): store data only (read-only)', 'common.save': 'Save', 'studio.studio': 'Studio', 'studio.none': 'No studio', diff --git a/apps/desktop/tests/fixtures/state/d1-missing-folders.host.json b/apps/desktop/tests/fixtures/state/d1-missing-folders.host.json index 3e1a7f4..798b8e9 100644 --- a/apps/desktop/tests/fixtures/state/d1-missing-folders.host.json +++ b/apps/desktop/tests/fixtures/state/d1-missing-folders.host.json @@ -18,6 +18,7 @@ "playAccount": null } ], + "store_apps_cached": [], "workspace_get": { "overrides": { "appStudio": [], diff --git a/apps/desktop/tests/fixtures/state/d3-full.host.json b/apps/desktop/tests/fixtures/state/d3-full.host.json index 0d70077..65fe250 100644 --- a/apps/desktop/tests/fixtures/state/d3-full.host.json +++ b/apps/desktop/tests/fixtures/state/d3-full.host.json @@ -43,6 +43,20 @@ "playAccount": "0123456789abcdef" } ], + "store_apps_cached": [ + { + "account": "0123456789abcdef", + "entry": null + }, + { + "account": "fedcba9876543210", + "entry": null + }, + { + "account": "00112233445566ff", + "entry": null + } + ], "workspace_get": { "overrides": { "appStudio": [ diff --git a/apps/desktop/tests/fixtures/state/empty.host.json b/apps/desktop/tests/fixtures/state/empty.host.json index f142fc5..f1c3a55 100644 --- a/apps/desktop/tests/fixtures/state/empty.host.json +++ b/apps/desktop/tests/fixtures/state/empty.host.json @@ -1,6 +1,7 @@ { "accounts_list": [], "projects_list": [], + "store_apps_cached": [], "workspace_get": { "overrides": { "appStudio": [], diff --git a/apps/desktop/tests/fixtures/state/shared-profiles.host.json b/apps/desktop/tests/fixtures/state/shared-profiles.host.json index fedb091..23b62fe 100644 --- a/apps/desktop/tests/fixtures/state/shared-profiles.host.json +++ b/apps/desktop/tests/fixtures/state/shared-profiles.host.json @@ -28,6 +28,39 @@ "storeboundPin": "0.6.0" } ], + "store_apps_cached": [ + { + "account": "82a8c2561d950999", + "entry": null + }, + { + "account": "8e4050ce9325b4da", + "entry": { + "at": "2026-10-13T00:00:00Z", + "value": { + "apps": [ + { + "bundleId": "com.example.aquarium", + "icon": null, + "id": "6400000999", + "latest": null, + "name": "Example Aquarium", + "platforms": [ + "IOS" + ], + "primaryLocale": null, + "registered": true, + "sku": null, + "store": "ios" + } + ], + "at": "2026-10-13T00:00:00Z", + "store": "ios", + "warnings": [] + } + } + } + ], "workspace_get": { "overrides": { "appStudio": [], diff --git a/cli/accounts.ts b/cli/accounts.ts index 4d44ea9..a0fa02c 100644 --- a/cli/accounts.ts +++ b/cli/accounts.ts @@ -10,10 +10,14 @@ // contact and demo account stay in the project // storebound accounts use [--dir ] this project uses that profile ("account" in its // .storebound/credentials.json) +// storebound accounts default | --clear the machine's default profile (a pointer file in the +// credentials folder). Order: env > a profile the project +// names > the project's own keys > this default > the only +// profile (or the one named "default") import { resolve } from 'node:path'; import type { Args } from './lib/args'; import { applyImport, describeProfiles, planImport } from './lib/accounts'; -import { activeProfile, profileDir } from './lib/credentials'; +import { activeProfile, defaultPointer, defaultProfile, profileDir, setDefaultPointer } from './lib/credentials'; import { confirm, type Ctx } from './lib/ctx'; import { textTable } from './lib/table'; @@ -26,14 +30,17 @@ export async function run(args: Args): Promise { const rows = describeProfiles(); let active = null; try { active = activeProfile(dir); } catch { /* unreadable project file */ } - if (args.has('json')) { console.log(JSON.stringify({ folder: tilde(profileDir()), profiles: rows, thisFolder: active }, null, 2)); return; } + const def = defaultProfile(); + const pointer = defaultPointer(); + if (args.has('json')) { console.log(JSON.stringify({ folder: tilde(profileDir()), profiles: rows.map(r => ({ ...r, default: r.profile === def })), default: def, defaultFrom: def ? (def === pointer ? 'pointer' : rows.length === 1 ? 'only' : 'named-default') : null, thisFolder: active }, null, 2)); return; } if (!rows.length) { console.log(`no store accounts on this machine yet (${tilde(profileDir())}).\n From a project that has its keys in .storebound/credentials.json: storebound accounts import\n Or add them in the desktop app (Accounts).`); return; } - console.log(textTable(['profile', 'App Store Connect', 'Google Play', 'vendor no.'], rows.map(r => [r.profile, r.error ? `unreadable: ${r.error}` : r.apple ? 'key' : '-', r.play ? r.playAccount ?? 'service account' : '-', r.vendor ? 'yes' : '-']))); + console.log(textTable(['profile', 'App Store Connect', 'Google Play', 'vendor no.', 'default'], rows.map(r => [r.profile, r.error ? `unreadable: ${r.error}` : r.apple ? 'key' : '-', r.play ? r.playAccount ?? 'service account' : '-', r.vendor ? 'yes' : '-', r.profile === def ? (def === pointer ? 'yes (accounts default)' : 'yes') : '']))); + if (pointer && pointer !== def) console.log(`note: the default pointer names "${pointer}", which is not a profile here (storebound accounts default )`); console.log(`\n${tilde(profileDir())}: shared by the CLI and the desktop app`); - console.log(active ? `this folder uses "${active.name}" (${{ env: '--account / STOREBOUND_PROFILE', config: 'account in the config', project: '"account" in .storebound/credentials.json', default: 'the default profile' }[active.from]})` : 'this folder uses no profile (several profiles and none named "default": storebound accounts use )'); + console.log(active ? `this folder uses "${active.name}" (${{ env: '--account / STOREBOUND_PROFILE', config: 'account in the config', project: '"account" in .storebound/credentials.json', default: 'the default profile' }[active.from]})` : 'this folder uses no profile (several profiles and no default: storebound accounts default , or accounts use in the project)'); return; } if (sub === 'import') { @@ -61,5 +68,13 @@ export async function run(args: Args): Promise { console.log(`${tilde(f)}: "account": "${name}"`); return; } - throw new Error('usage: storebound accounts [list | import [--dir ] [--name ] [--dry] [--yes] | use ]'); + if (sub === 'default') { + if (args.has('clear')) { setDefaultPointer(null); console.log('default profile pointer removed (default: the only profile, or the one named "default")'); return; } + const name = args._[1]; + if (!name) { const d = defaultProfile(); console.log(d ? `default profile: ${d}${d === defaultPointer() ? ' (accounts default)' : ''}` : 'no default profile (storebound accounts default )'); return; } + const f = setDefaultPointer(name); + console.log(`${tilde(f)}: default profile "${name}" (used by every folder that names no profile and has no keys of its own)`); + return; + } + throw new Error('usage: storebound accounts [list | import [--dir ] [--name ] [--dry] [--yes] | use | default | default --clear]'); } diff --git a/cli/api/wrapped.gen.ts b/cli/api/wrapped.gen.ts index 27d20b3..2f2131f 100644 --- a/cli/api/wrapped.gen.ts +++ b/cli/api/wrapped.gen.ts @@ -29,7 +29,7 @@ export const WRAPPED: { apple: Record; play: Record; play: Record; play: Record; play: Record; play: Record] | apps remove add / remove a folder in that list (the folder itself stays) +// storebound apps add --store apple|play --app-id [--account ] [--name ] [--bundle-id ] +// a store app with no project on this machine: the +// desktop shows it read-only ("no local project"); +// apps remove apple: | takes it out import type { Args } from './lib/args'; import { ascKey, playServiceAccount } from './lib/credentials'; import type { AccountCheck, AppsListResult } from './lib/desktop-protocol'; import { PLAY_SCOPE, REPORTING_SCOPE, tokenSource } from './lib/google-auth'; import { errorBody } from './lib/http'; import { log, printJson, warn } from './lib/log'; -import { appleCheck, type Bytes, dataUrl, type Get, listAppleApps, listPlayApps, MAX_ICON_BYTES, playCheck } from './lib/store-apps'; +import { appleCheck, type Bytes, dataUrl, type Get, isServiceDisabled, listAppleApps, listPlayApps, localPlayApps, MAX_ICON_BYTES, playCheck } from './lib/store-apps'; import { textTable } from './lib/table'; import { ascClient } from './apple/asc'; import { REPORTING_API } from './play/google'; import * as rt from './lib/rt'; -import { existsSync } from 'node:fs'; +import { existsSync, readFileSync } from 'node:fs'; import { join, resolve } from 'node:path'; import { CONFIG_NAMES } from './lib/config'; -import { addFolder, readRegistry, registryFile, removeFolder } from './lib/registry'; +import { addFolder, addStoreApp, readRegistry, registryFile, removeFolder, removeStoreApp } from './lib/registry'; type Store = 'apple' | 'play'; @@ -99,8 +103,42 @@ export async function listApps(store: Store, root: string, icons: boolean): Prom return { store: 'ios', ...r, at }; } const sa = playServiceAccount(root); - const r = await listPlayApps(googleGet(tokenSource(sa, REPORTING_SCOPE), REPORTING_API), icons ? { icon: playIcon(root) } : {}); - return { store: 'android', ...r, at }; + try { + const r = await listPlayApps(googleGet(tokenSource(sa, REPORTING_SCOPE), REPORTING_API), icons ? { icon: playIcon(root) } : {}); + return { store: 'android', ...r, at }; + } catch (e) { + // the Reporting API is off in the service account's Cloud project: a clear finding with the exact link, and the + // Play apps this machine knows (app folders' configs, store-only entries) instead of failing the whole list + if (!isServiceDisabled(e)) throw e; + const c = playCheck(sa.client_email, { error: e }); + const known = knownPlayPackages(root); + return { store: 'android', apps: localPlayApps(known), at, + warnings: [`${c.message} Fix: ${c.fix}`, known.length ? `listed ${known.length} Play app(s) from this machine's app folders and store-only entries instead (not read from Google Play)` : 'no Play app folders on this machine to list instead (storebound apps add)'] }; + } +} + +/** Play package names this machine knows without the Reporting API: the config of `root`, every app folder of + * ~/.storebound/projects.json (read as text, never run) and the store-only Play entries. */ +export function knownPlayPackages(root: string): { packageName: string; name: string; source: string }[] { + const out: { packageName: string; name: string; source: string }[] = []; + const reg = readRegistry(); + const fromFolder = (dir: string, name: string) => { + for (const n of CONFIG_NAMES) { + const f = join(dir, n); + if (!existsSync(f)) continue; + try { + const text = readFileSync(f, 'utf8'); + const pkg = /\bpackageName\s*["']?\s*:\s*["']([A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+)["']/.exec(text)?.[1]; + const appName = /\bapp\s*["']?\s*:\s*\{[^}]*?\bname\s*["']?\s*:\s*["']([^"'\n]+)["']/.exec(text)?.[1]; + if (pkg && !out.some(o => o.packageName === pkg)) out.push({ packageName: pkg, name: appName ?? name, source: dir }); + } catch { /* unreadable: skipped */ } + return; + } + }; + fromFolder(root, ''); + for (const p of reg.projects) fromFolder(p.path, p.name); + for (const a of reg.storeApps ?? []) if (a.store === 'play' && !out.some(o => o.packageName === a.appId)) out.push({ packageName: a.appId, name: a.name, source: 'store-only entry' }); + return out; } export async function checkAccount(store: Store, root: string): Promise { @@ -123,16 +161,43 @@ export async function checkAccount(store: Store, root: string): Promise (process.env.HOME && p.startsWith(process.env.HOME) ? '~' + p.slice(process.env.HOME.length) : p); /** apps folders / add / remove: the machine's app folder list (cli/lib/registry.ts). */ -function folders(sub: string, args: Args): void { +async function folders(sub: string, args: Args): Promise { if (sub === 'folders') { const r = readRegistry(); - if (args.has('json')) { printJson({ file: registryFile(), projects: r.projects.map(p => ({ ...p, missing: !existsSync(p.path) })) }); return; } + if (args.has('json')) { printJson({ file: registryFile(), projects: r.projects.map(p => ({ ...p, missing: !existsSync(p.path) })), storeApps: r.storeApps ?? [] }); return; } + if (r.storeApps?.length) { + console.log(textTable(['store app', 'store', 'app id', 'profile', ''], r.storeApps.map(a => [a.name, a.store, a.appId, a.account ?? '(default)', 'no local project']))); + console.log(''); + } if (!r.projects.length) { console.log(`no app folders yet (${tilde(registryFile())}): storebound apps add, in an app folder (or storebound desktop there)`); return; } console.log(textTable(['app', 'folder', ''], r.projects.map(p => [p.name, tilde(p.path), existsSync(p.path) ? '' : 'folder not found']))); console.log(` ${tilde(registryFile())}: the same list as the desktop app's App folders`); return; } + const store = args.get('store'); + if (sub === 'add' && store !== undefined) { + if (store !== 'apple' && store !== 'play') throw new Error('--store: apple or play'); + const appId = args.get('app-id'); + if (!appId) throw new Error('storebound apps add --store apple|play --app-id [--account ] [--name ]'); + let name = args.get('name'), bundleId = args.get('bundle-id') ?? null; + // Apple: the name and bundle id from App Store Connect when the profile's key can read them (read-only; offline is fine) + if (store === 'apple' && (!name || !bundleId) && /^\d{6,12}$/.test(appId)) { + try { + const a = (await (await appleGet(process.cwd()))(`/v1/apps/${appId}?fields[apps]=name,bundleId`)).data; + name ||= a?.attributes?.name; bundleId ||= a?.attributes?.bundleId ?? null; + } catch { /* no key or no access: the entry keeps what was given */ } + } + const r = addStoreApp({ store, appId, account: args.get('account') ?? (process.env.STOREBOUND_PROFILE || null), name, bundleId }); + log('apps', r.added ? `added ${store} app ${r.app.appId} (${r.app.name}) with no local project${r.app.account ? `, profile ${r.app.account}` : ''}: the desktop shows it read-only (status, reviews, analytics)` + : r.changed ? `updated ${store} app ${r.app.appId}` : `${store} app ${r.app.appId} is already in the list`); + return; + } + if (sub === 'remove' && args._[1] && (/^(apple|play):/.test(args._[1]) || (readRegistry().storeApps ?? []).some(a => a.id === args._[1]))) { + const removed = removeStoreApp(args._[1]); + log('apps', removed ? `removed ${removed.store} app ${removed.appId} from the list` : `${args._[1]} is not in the list`); + return; + } const dir = resolve(args._[1] ?? '.'); if (sub === 'add') { if (!CONFIG_NAMES.some(n => existsSync(join(dir, n)))) throw new Error(`${dir}: no storebound config here (storebound init starts one)`); @@ -181,6 +246,6 @@ export async function run(args: Args): Promise { if (out.some(c => c.status !== 'ok')) process.exitCode = 1; return; } - console.error('usage: storebound apps list [--store apple|play] [--icons] [--json] | apps check [--store apple|play] [--json] | apps folders [--json] | apps add [] | apps remove '); + console.error('usage: storebound apps list [--store apple|play] [--icons] [--json] | apps check [--store apple|play] [--json] | apps folders [--json] | apps add [] | apps add --store apple|play --app-id [--account ] | apps remove | apps remove apple:'); process.exit(2); } diff --git a/cli/aso.ts b/cli/aso.ts index 163432c..bba84cf 100644 --- a/cli/aso.ts +++ b/cli/aso.ts @@ -220,8 +220,8 @@ async function suggest(ctx: Ctx): Promise { const skipped = r.candidates.filter(c => c.status !== 'candidate' && c.kind === 'word').slice(0, 12); if (skipped.length) log(TAG, `left out: ${skipped.map(c => `${c.term} (${c.why})`).join(', ')}`); const p = r.proposal; - if (p.after === p.before) { log(TAG, `${r.locale}: keyword field unchanged (${p.bytes}/100 bytes)`); continue; } - console.log(`--- ${r.locale} keywords (store/appstore.md)\n- ${p.before || '(empty)'}\n+ ${p.after}\n ${p.bytes}/100 bytes · kept ${p.kept.length} · added ${p.added.join(', ') || 'none'}${p.dropped.length ? ` · dropped ${p.dropped.map(d => `${d.term} (${d.why})`).join(', ')}` : ''}`); + if (p.after === p.before) { log(TAG, `${r.locale}: keyword field unchanged (${p.chars}/100 characters)`); continue; } + console.log(`--- ${r.locale} keywords (store/appstore.md)\n- ${p.before || '(empty)'}\n+ ${p.after}\n ${p.chars}/100 characters · kept ${p.kept.length} · added ${p.added.join(', ') || 'none'}${p.dropped.length ? ` · dropped ${p.dropped.map(d => `${d.term} (${d.why})`).join(', ')}` : ''}`); } log(TAG, 'relevance: in your own text (+1) and in competitors\' names (+1); "in names": top apps that already have the word in their name; popularity only from Apple Ads, never estimated'); } diff --git a/cli/catalog.ts b/cli/catalog.ts index aa2357d..a887e8b 100644 --- a/cli/catalog.ts +++ b/cli/catalog.ts @@ -17,7 +17,7 @@ import { ascClient, type J } from './apple/asc'; import { type CatalogRow, catalogDiff, fromApplePeriod, fromAppleType, regionOf, type StoreItem, wantedCatalog } from './lib/catalog'; import type { Ctx } from './lib/ctx'; import { done, log, printJson } from './lib/log'; -import { fromMoney } from './lib/money'; +import { fromMoney, type Money } from './lib/money'; import { listOneTimeProducts } from './play/products'; import { playClient } from './play/client'; import { appleSubPrices, basePlanId } from './lib/subscriptions'; @@ -25,7 +25,7 @@ import { textTable } from './lib/table'; const TAG = 'catalog'; -async function appleItems(ctx: Ctx): Promise { +export async function appleItems(ctx: Ctx): Promise { const { config, root } = ctx.loaded; const c = await ascClient(root, config.apple!.bundleId, config.apple?.appId); const appId = await c.app(); @@ -37,11 +37,15 @@ async function appleItems(ctx: Ctx): Promise { const hasSchedule = !!(await c.maybe(`/v2/inAppPurchases/${p.id}/iapPriceSchedule`))?.data; const today = new Date().toISOString().slice(0, 10); // today's price per territory: entries that started (or have no start), the latest start wins; manual over automatic - const rows = hasSchedule ? (await appleCurrent(c, p.id, p.attributes.productId, true)).rows.filter(r => (r.startDate ?? '') <= today) - .sort((x, y) => (x.kind === 'auto' ? 0 : 1) - (y.kind === 'auto' ? 0 : 1) || (x.startDate ?? '').localeCompare(y.startDate ?? '')) : []; + const cur = hasSchedule ? await appleCurrent(c, p.id, p.attributes.productId, true) : null; + const rows = (cur?.rows ?? []).filter(r => (r.startDate ?? '') <= today) + .sort((x, y) => (x.kind === 'auto' ? 0 : 1) - (y.kind === 'auto' ? 0 : 1) || (x.startDate ?? '').localeCompare(y.startDate ?? '')); const byRegion = new Map(rows.map(r => [r.region, r] as const)); + // the price schedule's base territory (alpha-3) and its price today + const base = cur?.base ? byRegion.get(regionOf(cur.base)) : undefined; out.push({ id: p.attributes.productId, kind: fromAppleType(p.attributes.inAppPurchaseType), state: p.attributes.state, locales, - prices: [...byRegion.values()].map(r => ({ region: r.region, currency: r.currency, price: r.price })) }); + prices: [...byRegion.values()].map(r => ({ region: r.region, currency: r.currency, price: r.price })), + ...(base ? { base: { region: base.region, currency: base.currency, price: base.price } } : {}) }); } for (const g of await c.all(`/v1/apps/${appId}/subscriptionGroups?limit=200`)) { for (const s of await c.all(`/v1/subscriptionGroups/${g.id}/subscriptions?limit=200`)) { @@ -52,14 +56,14 @@ async function appleItems(ctx: Ctx): Promise { const promos = (await c.all(`/v1/subscriptions/${s.id}/promotionalOffers?limit=200`)).map((o: J) => o.attributes.offerCode as string); const codes = (await c.all(`/v1/subscriptions/${s.id}/offerCodes?limit=200`)).map((o: J) => `code:${o.attributes.name}`); out.push({ id: s.attributes.productId, kind: 'subscription', state: s.attributes.state, period: fromApplePeriod(s.attributes.subscriptionPeriod), - level: s.attributes.groupLevel, locales, prices: prices.map(p => ({ region: regionOf(p.territory), currency: p.currency ?? '', price: p.price })), + level: s.attributes.groupLevel, group: g.attributes.referenceName, locales, prices: prices.map(p => ({ region: regionOf(p.territory), currency: p.currency ?? '', price: p.price })), offers: [...intro, ...promos, ...codes] }); } } return out; } -async function playItems(ctx: Ctx): Promise { +export async function playItems(ctx: Ctx): Promise { const { config, root } = ctx.loaded; const play = await playClient(root, config.play!.packageName); const out: StoreItem[] = []; @@ -69,7 +73,8 @@ async function playItems(ctx: Ctx): Promise { if (!p) continue; const opt = p.purchaseOptions?.find(o => o.purchaseOptionId === 'buy') ?? p.purchaseOptions?.[0]; out.push({ id: productId, kind: 'one_time', state: opt?.state, locales: ((p.listings as { languageCode: string }[] | undefined) ?? []).map(l => l.languageCode), - prices: (opt?.regionalPricingAndAvailabilityConfigs ?? []).filter(r => r.price && r.availability !== 'NO_LONGER_AVAILABLE').map(r => ({ region: r.regionCode, currency: r.price!.currencyCode, price: fromMoney(r.price!) })) }); + prices: (opt?.regionalPricingAndAvailabilityConfigs ?? []).filter(r => r.price && r.availability !== 'NO_LONGER_AVAILABLE').map(r => ({ region: r.regionCode, currency: r.price!.currencyCode, price: fromMoney(r.price!) })), + ...((opt?.newRegionsConfig as { usdPrice?: Money } | undefined)?.usdPrice ? { usd: fromMoney((opt!.newRegionsConfig as { usdPrice: Money }).usdPrice) } : {}) }); } let page = ''; do { @@ -83,14 +88,15 @@ async function playItems(ctx: Ctx): Promise { const offers = bp ? ((await play.call<{ subscriptionOffers?: { offerId: string }[] }>('GET', `${play.API}/subscriptions/${encodeURIComponent(s.productId)}/basePlans/${bp.basePlanId}/offers`)).subscriptionOffers ?? []).map(o => o.offerId) : []; out.push({ id: s.productId, kind: 'subscription', state: bp?.state, period: bp?.autoRenewingBasePlanType?.billingPeriodDuration ?? bp?.prepaidBasePlanType?.billingPeriodDuration, locales: (s.listings ?? []).map((l: J) => l.languageCode), - prices: (bp?.regionalConfigs ?? []).filter((x: J) => x.price).map((x: J) => ({ region: x.regionCode, currency: x.price.currencyCode, price: fromMoney(x.price) })), offers }); + prices: (bp?.regionalConfigs ?? []).filter((x: J) => x.price).map((x: J) => ({ region: x.regionCode, currency: x.price.currencyCode, price: fromMoney(x.price) })), offers, + ...(bp?.otherRegionsConfig?.usdPrice ? { usd: fromMoney(bp.otherRegionsConfig.usdPrice) } : {}) }); } page = r.nextPageToken ?? ''; } while (page); return out; } -async function appleTexts(ctx: Ctx): Promise { +export async function appleTexts(ctx: Ctx): Promise { const { config, root } = ctx.loaded; const c = await ascClient(root, config.apple!.bundleId, config.apple?.appId); const appId = await c.app(); @@ -106,7 +112,7 @@ async function appleTexts(ctx: Ctx): Promise { return out; } -async function playTexts(ctx: Ctx): Promise { +export async function playTexts(ctx: Ctx): Promise { const { config, root } = ctx.loaded; const play = await playClient(root, config.play!.packageName); const out: RemoteCatalog = {}; diff --git a/cli/commands.ts b/cli/commands.ts index cfcb165..c9fc2c3 100644 --- a/cli/commands.ts +++ b/cli/commands.ts @@ -14,7 +14,7 @@ export const PLAIN: Record Promise, string]> = { 'serve': [() => import('./serve'), '--stdio: JSON-RPC session for the storebound desktop app (dry runs; writes need a host confirm token)'], 'apps': [() => import('./apps'), 'list (every app the store keys can see: App Store Connect team, Play developer accounts; --icons) | check (key works / permission missing / revoked, with the fix); --store apple|play, --json; read-only | folders | add [] | remove : the app folders of this machine, the same list as the desktop app'], 'desktop': [() => import('./desktop'), 'open the storebound desktop app on this folder; not installed or another version: download it for this system (size, SHA-256, signature checked), install it for this user (asks once; --yes) and open it; --download only saves the installer, --dry / --json change nothing'], - 'accounts': [() => import('./accounts'), 'the store accounts of this machine (credential profiles in ~/.storebound/credentials, shared with the desktop app): list | import (a project\'s store keys -> a profile; --dry first) | use '], + 'accounts': [() => import('./accounts'), 'the store accounts of this machine (credential profiles in ~/.storebound/credentials, shared with the desktop app): list | import (a project\'s store keys -> a profile; --dry first) | use | default (the machine default; --clear)'], 'doctor': [() => import('./doctor'), 'local tools for screenshots, previews, icons and captures (ffmpeg, Chrome, playwright, Xcode, adb, git) and how to install what is missing; --json'], 'scan': [() => import('./scan'), 'offline, read-only rejection-risk scan of the project itself (stack, SDKs, Info.plist, manifest, listings) with guideline, evidence file:line, fix and skill, plus the Data safety / App Privacy / ATT / privacy manifest proposal; --write puts the detected answers into the config; --json; exit 1 on blockers'], 'api': [() => import('./api'), 'every App Store Connect / Google Play API operation: list | coverage | apple|play [--param k=v] [--body f.json] [--all-pages] (GET runs; writes dry unless --yes in a terminal; owner-only ones need the id typed)'], @@ -30,6 +30,7 @@ export const COMMANDS: Record Promise, string]> = { 'validate': [() => import('./validate'), 'read-only store readiness report with ordered blockers (--apple / --play), plus local renders checks (--no-local skips); exit 1 on blockers'], 'analytics': [() => import('./analytics'), 'setup (App Store report request) | snapshot (impressions, page views, installs, conversion -> .storebound/analytics) | compare (vs listing changes in git)'], 'health': [() => import('./health'), 'crash / ANR vitals (Play) and diagnostics (App Store), read-only; --weekly writes a markdown report; exit 1 over a threshold'], + 'onboard': [() => import('./onboard'), 'an app that is already live: the live products + subscriptions with their USD / base prices, contact e-mail, website, privacy and support URLs, the App Review contact and demo account, sign-in for review and the account deletion page, from the stores, the code and the app\'s site -> config and .storebound/credentials.json (--write; read-only on the stores, never changes store prices); then the owner questions nothing proves'], 'catalog': [() => import('./catalog'), 'diff: cross-store parity of products + subscriptions (missing / extra / mismatched, prices per region, offers); read-only, exit 1 on mismatches | pull [--write]: store texts of IAPs + subscriptions as a config proposal'], 'reports': [() => import('./reports'), 'apple-sales | apple-finance --month | play-earnings --month | play-sales --month: download to .storebound/reports/, summary table + CSV; read-only'], 'triage': [() => import('./triage'), 'TestFlight crash / screenshot feedback and Play error reports grouped by signature, device, OS version, build; read-only, --json'], diff --git a/cli/data/flags.json b/cli/data/flags.json index da86aaa..be65e8e 100644 --- a/cli/data/flags.json +++ b/cli/data/flags.json @@ -12,6 +12,7 @@ ], "commands": { "accounts": [ + "clear", "dir", "name" ], @@ -261,7 +262,10 @@ "with-automatic" ], "apps": [ + "app-id", + "bundle-id", "icons", + "name", "store" ], "aso": [ @@ -436,6 +440,36 @@ "translate" ], "mcp": [], + "onboard": [ + "all", + "allow-price-changes", + "base", + "capacitor", + "ceiling", + "cordova", + "cordova-android", + "cordova-ios", + "csv", + "expo", + "file", + "floor", + "flutter", + "godot", + "no-catalog", + "no-subscriptions", + "no-web", + "offline", + "out", + "react-native", + "reconvert", + "source", + "store", + "threshold", + "unity", + "update-bigmac", + "with-automatic", + "write" + ], "originality": [ "against", "threshold" @@ -755,6 +789,7 @@ "alpha", "apk", "app", + "app-id", "apple", "apply", "apps", @@ -767,6 +802,7 @@ "body", "build", "build-number", + "bundle-id", "by", "campaign", "cancel-submission", @@ -775,6 +811,7 @@ "ceiling", "channel", "chrome-profile", + "clear", "codes", "command", "comments", @@ -850,6 +887,7 @@ "name", "new-version", "no-captions", + "no-catalog", "no-declarations", "no-folder", "no-health", @@ -866,6 +904,7 @@ "no-validate", "no-variants", "no-wait", + "no-web", "off", "offline", "older-than", @@ -960,7 +999,8 @@ "accounts": [ "storebound accounts [list] [--json] every profile: Apple key, Play account (masked), which", "storebound accounts import [--dir ] [--name ] [--dry] [--yes]", - "storebound accounts use [--dir ] this project uses that profile (\"account\" in its" + "storebound accounts use [--dir ] this project uses that profile (\"account\" in its", + "storebound accounts default | --clear the machine's default profile (a pointer file in the" ], "ads": [ "storebound ads scan --ios ios/App [--plist path/to/Info.plist] [--dry] [--json]" @@ -1101,7 +1141,8 @@ "storebound apps list [--store apple|play] [--icons] [--json] every app the key can see (App Store Connect team /", "storebound apps check [--store apple|play] [--json] auth OK / permission missing / key revoked, with the fix", "storebound apps folders [--json] the app folders of this machine (~/.storebound/projects.json,", - "storebound apps add [] | apps remove add / remove a folder in that list (the folder itself stays)" + "storebound apps add [] | apps remove add / remove a folder in that list (the folder itself stays)", + "storebound apps add --store apple|play --app-id [--account ] [--name ] [--bundle-id ]" ], "aso": [ "storebound aso rank [--storefronts us,de=de-DE] [--keywords \"a,b\"] [--only-keywords] [--competitors 3] [--limit 200]", @@ -1173,6 +1214,9 @@ "storebound listing check [--json] limits, keyword rules, untranslated and draft sections; exit 1 on a problem", "storebound listing reviewed --lang de-DE[,ja] | --all [--dry] a human read the draft: remove its marker" ], + "onboard": [ + "storebound onboard [--store apple|play] [--write] [--dry] [--json] [--no-web] [--no-catalog]" + ], "originality": [ "storebound originality [--against [,]] [--threshold 0.7] [--json]" ], diff --git a/cli/lib/aso-audit.ts b/cli/lib/aso-audit.ts index d6cce82..c64a6dc 100644 --- a/cli/lib/aso-audit.ts +++ b/cli/lib/aso-audit.ts @@ -169,10 +169,10 @@ export function nextActions(a: AsoAudit, i: AuditInput): Action[] { const err = f.find(x => x.level === 'error'); if (err) out.push({ what: `fix ${err.where}: ${err.msg}`, why: 'App Store Connect refuses the keyword field as it is', command: 'storebound check --aso' }); if (a.drafts.length) out.push({ what: `review the draft keywords of ${a.drafts.join(', ')} in store/appstore.md and delete the draft line`, why: 'they were proposed by aso suggest, not reviewed yet' }); - const room = f.find(x => /bytes used; fill/.test(x.msg)); - if (room) out.push({ what: `fill the keyword field of ${room.where.replace('apple ', '')} (${room.msg.replace(/^keywords: /, '')})`, why: 'unused bytes are unused search reach', command: `storebound aso suggest --locale ${room.where.replace('apple ', '')}` }); + const room = f.find(x => /characters used; fill/.test(x.msg)); + if (room) out.push({ what: `fill the keyword field of ${room.where.replace('apple ', '')} (${room.msg.replace(/^keywords: /, '')})`, why: 'unused characters are unused search reach', command: `storebound aso suggest --locale ${room.where.replace('apple ', '')}` }); const rep = f.find(x => /repeat words from the name/.test(x.msg)); - if (rep) out.push({ what: `${rep.where}: replace the words the name / subtitle already index (${rep.msg.split(': ').at(-1)})`, why: 'they take bytes without adding reach', command: `storebound aso suggest --locale ${rep.where.replace('apple ', '')}` }); + if (rep) out.push({ what: `${rep.where}: replace the words the name / subtitle already index (${rep.msg.split(': ').at(-1)})`, why: 'they take characters without adding reach', command: `storebound aso suggest --locale ${rep.where.replace('apple ', '')}` }); const gap = a.competitors.gaps.find(g => g.gaps.length); if (gap) out.push({ what: `consider "${gap.gaps.slice(0, 3).map(g => g.word).join('", "')}" for ${gap.locale} (in the names of ${gap.gaps[0]!.developers} developers' top apps, not in your name / subtitle / keywords)`, why: 'words the top apps lead with; only if they describe your app', command: `storebound aso suggest --locale ${gap.locale}` }); const lost = a.ranks.rows.filter(r => r.arrow === '↓' || r.arrow === 'lost'); diff --git a/cli/lib/aso-intel.ts b/cli/lib/aso-intel.ts index 6e7ae2e..186792d 100644 --- a/cli/lib/aso-intel.ts +++ b/cli/lib/aso-intel.ts @@ -276,12 +276,12 @@ export function candidates(i: CandidateInput): Candidate[] { // --------------------------------------------------------------------------------------------------------------- // The 100-byte keyword field -export interface FieldProposal { locale: string; before: string; after: string; bytes: number; kept: string[]; added: string[]; dropped: { term: string; why: string }[] } +export interface FieldProposal { locale: string; before: string; after: string; chars: number; kept: string[]; added: string[]; dropped: { term: string; why: string }[] } -const bytes = (s: string) => Buffer.byteLength(s, 'utf8'); +const chars = (s: string) => [...s].length; /** - * A keyword field for one locale that fits 100 bytes (UTF-8) with the existing rules: commas without spaces, no + * A keyword field for one locale that fits 100 characters (App Store Connect counts characters, not bytes) with the existing rules: commas without spaces, no * duplicates (plural-insensitive), no words of the name / subtitle, no filler or category words, single words. Current * terms that are still valid are kept first (change a few terms per release, not all), unless `fresh`; then the best * candidates fill the room. Pure. @@ -292,7 +292,7 @@ export function fitKeywordField(o: { locale: string; current: string; name: stri const blocked = new Map(o.ranked.filter(c => c.status !== 'candidate' && c.kind === 'word').map(c => [stem(c.term, L), c.why ?? c.status] as const)); const out: string[] = [], kept: string[] = [], added: string[] = [], dropped: { term: string; why: string }[] = []; const seen: string[] = []; - const fits = (t: string) => bytes([...out, t].join(',')) <= limit; + const fits = (t: string) => chars([...out, t].join(',')) <= limit; const tryAdd = (t: string, into: string[]): string | null => { const ws = words(t, L); if (!ws.length) return 'empty'; @@ -301,12 +301,12 @@ export function fitKeywordField(o: { locale: string; current: string; name: stri if (ws.length === 1 ? coveredBy(ws[0]!, seen, L) : seen.includes(ws.join(' '))) return 'duplicate'; const b = ws.length === 1 ? blocked.get(stem(ws[0]!, L)) : undefined; if (b) return b; - if (!fits(t)) return 'no room in 100 bytes'; + if (!fits(t)) return 'no room in 100 characters'; seen.push(ws.length === 1 ? ws[0]! : ws.join(' ')); out.push(t); into.push(t); return null; }; if (!o.fresh) for (const t of o.current.split(',').map(s => s.trim().toLocaleLowerCase(L)).filter(Boolean)) { - // keep a current phrase as the words it is made of: single words combine on their own and save bytes + // keep a current phrase as the words it is made of: single words combine on their own and save characters const parts = /\s/.test(t) ? tokens(t, L) : [t]; for (const p of parts) { const why = tryAdd(p, kept); if (why && why !== 'duplicate') dropped.push({ term: p, why }); } } @@ -315,7 +315,7 @@ export function fitKeywordField(o: { locale: string; current: string; name: stri tryAdd(c.term, added); } const after = out.join(','); - return { locale: L, before: o.current, after, bytes: bytes(after), kept, added, dropped }; + return { locale: L, before: o.current, after, chars: chars(after), kept, added, dropped }; } // --------------------------------------------------------------------------------------------------------------- diff --git a/cli/lib/aso.ts b/cli/lib/aso.ts index dbc754e..7da98f6 100644 --- a/cli/lib/aso.ts +++ b/cli/lib/aso.ts @@ -27,12 +27,13 @@ export function auditAppleKeywords(locale: string, c: AppleCopy, appName: string const at = `apple ${locale}`; const kw = c.keywords ?? ''; if (!kw) return [{ level: 'error', where: at, msg: 'keywords: empty' }]; - // App Store Connect limits the keyword field to 100 bytes (UTF-8), not characters: Cyrillic, Arabic, Hindi, Thai, - // Japanese, Korean and Chinese words take 2-3 bytes per character, so both the limit and the fill hint count bytes. - const bytes = Buffer.byteLength(kw, 'utf8'); - if (bytes > 100) out.push({ level: 'error', where: at, msg: `keywords: ${bytes} bytes > 100` }); + // App Store Connect limits the keyword field to 100 characters, not UTF-8 bytes: live versions (READY_FOR_SALE, + // read 2026-10-13) hold Thai 95 characters / 265 bytes, Russian 91 / 169, Turkish 100 / 105, Polish 99 / 105 + // (store-pitfalls 43). Both the limit and the fill hint count characters. + const chars = len(kw); + if (chars > 100) out.push({ level: 'error', where: at, msg: `keywords: ${chars} characters > 100` }); if (/,\s|\s,/.test(kw)) out.push({ level: 'error', where: at, msg: 'keywords: spaces around commas waste characters' }); - if (bytes < 90) out.push({ level: 'warn', where: at, msg: `keywords: ${bytes}/100 bytes used; fill at least 90 (${100 - bytes} bytes free)` }); + if (chars < 90) out.push({ level: 'warn', where: at, msg: `keywords: ${chars}/100 characters used; fill at least 90 (${100 - chars} characters free)` }); const terms = kw.split(',').map(t => t.trim().toLocaleLowerCase(locale)).filter(Boolean); const seen = new Set(); for (const t of terms) { diff --git a/cli/lib/catalog.ts b/cli/lib/catalog.ts index 333b82c..9350c80 100644 --- a/cli/lib/catalog.ts +++ b/cli/lib/catalog.ts @@ -23,6 +23,12 @@ export interface StoreItem { /** Offer ids (Play offer ids; Apple: "intro" when there is an introductory offer, promotional offer codes, * "code:" for offer code campaigns). */ offers?: string[]; + /** Apple in-app purchases: the price schedule's base territory (region, currency) and its price today. */ + base?: { region: string; currency: string; price: number }; + /** The store's own USD price for regions without one of their own (Play newRegionsConfig / otherRegionsConfig). */ + usd?: number; + /** Apple subscriptions: the group's reference name. */ + group?: string; } export interface WantItem { diff --git a/cli/lib/copy.ts b/cli/lib/copy.ts index 5408fb3..031cbd8 100644 --- a/cli/lib/copy.ts +++ b/cli/lib/copy.ts @@ -76,7 +76,6 @@ export function parseAppStoreListing(md: string): Record { for (const k of APPLE_REQUIRED) if (!f[k]) errors.push(`${locale}: missing ${k}`); for (const [k, v] of Object.entries(f) as [AppleField, string][]) if (len(v) > APPLE_LIMITS[k]) errors.push(`${locale}: ${k} is ${len(v)} > ${APPLE_LIMITS[k]}`); - if (f.keywords && Buffer.byteLength(f.keywords) > 100) errors.push(`${locale}: keywords are ${Buffer.byteLength(f.keywords)} bytes > 100`); if (f.keywords && /,\s/.test(f.keywords)) errors.push(`${locale}: keywords: no spaces after commas (they count)`); out[locale] = f; } diff --git a/cli/lib/credentials.ts b/cli/lib/credentials.ts index 10d46c8..5b6d33a 100644 --- a/cli/lib/credentials.ts +++ b/cli/lib/credentials.ts @@ -6,7 +6,8 @@ // // Which profile a project uses (first hit): --account / env STOREBOUND_PROFILE (set but empty = none), the // config's `account`, "account" in /.storebound/credentials.json (written by `storebound accounts import`), -// else the default: the only profile on this machine, or the one named "default". +// else the default: the one `storebound accounts default ` set (the pointer file /default-profile), +// else the only profile on this machine, else the one named "default". // // One value, first hit wins: // 1. environment: PLAY_SERVICE_ACCOUNT (path to the JSON key, or the JSON itself), ASC_KEY_ID, ASC_ISSUER_ID, @@ -22,7 +23,7 @@ // A profile file: { "ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_P8", "PLAY_SERVICE_ACCOUNT", "ASC_VENDOR_NUMBER", "label"? }; // key paths relative to the credentials folder (`accounts import` puts the key files in /, mode 0600), or env // STOREBOUND_PROFILE__ (NAME upper case, other characters as _). storebound.workspace.json names profiles too. -import { chmodSync, existsSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; +import { chmodSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'; import { homedir, tmpdir } from 'node:os'; import { isAbsolute, join, resolve } from 'node:path'; @@ -78,8 +79,31 @@ export function profileNames(): string[] { return names.filter(n => PROFILE_RE.test(n)).sort(); } -/** The default profile: the only one on this machine, else the one named "default"; null when that is not clear. */ -export function defaultProfile(names = profileNames()): string | null { +/** The pointer file `storebound accounts default ` writes: one profile name, nothing else (never a key). */ +export const defaultPointerFile = (): string => join(profileDir(), 'default-profile'); + +/** The profile the pointer file names, when it is a valid name; null without one. Not checked against the folder. */ +export function defaultPointer(): string | null { + try { + const n = readFileSync(defaultPointerFile(), 'utf8').trim(); + return PROFILE_RE.test(n) ? n : null; + } catch { return null; } +} + +/** Sets (or with null clears) the default profile pointer. Throws on a name that is not a profile on this machine. */ +export function setDefaultPointer(name: string | null): string { + const f = defaultPointerFile(); + if (name === null) { rmSync(f, { force: true }); return f; } + if (!profileNames().includes(name)) throw new Error(`no profile "${name}" on this machine (${profileNames().join(', ') || 'none yet'}; storebound accounts lists them)`); + mkdirSync(profileDir(), { recursive: true, mode: 0o700 }); + writeFileSync(f, name + '\n', { mode: 0o600 }); + return f; +} + +/** The default profile: the one the pointer names (when it exists), else the only one on this machine, else the one + * named "default"; null when that is not clear. */ +export function defaultProfile(names = profileNames(), pointer = defaultPointer()): string | null { + if (pointer && names.includes(pointer)) return pointer; return names.length === 1 ? names[0]! : names.includes('default') ? 'default' : null; } diff --git a/cli/lib/embedded.ts b/cli/lib/embedded.ts index 13ecd9e..7d05fdf 100644 --- a/cli/lib/embedded.ts +++ b/cli/lib/embedded.ts @@ -5,14 +5,14 @@ /** Every file under templates/, by its path there (forward slashes). */ export const TEMPLATE_TEXT: Record = { "app-privacy.md": "# Example Game · App Store \"App Privacy\" answers\n\nApp Store Connect > your app > App Privacy. **Web UI only, there is no API.** Fill it from this table, then press\n**Publish** at the top of the App Privacy page (saving alone does not publish it, and review checks the published one).\nKeep it consistent with the privacy policy and the Play Data safety answers (`dataSafety` in `storebound.config.ts`).\n\nTypical free-to-play game: analytics SDK + ad mediation (with ATT) + optional server backup, no accounts.\n\n**Do you or your third-party partners collect data from this app?** Yes\n\n**Tracking**: Yes, if any ad network uses the IDFA after the App Tracking Transparency prompt (third-party advertising).\nThen `NSUserTrackingUsageDescription` must be in Info.plist and the prompt must come before the ad SDK starts.\n\n| data type | collected | used to track | linked to the user | purposes |\n|---|---|---|---|---|\n| Identifiers > Device ID (IDFA, analytics random id) | yes | yes (IDFA, with ATT consent) | no | Third-Party Advertising, Analytics, App Functionality |\n| Location > Coarse Location (country from IP) | yes | yes | no | Third-Party Advertising, Analytics |\n| Usage Data > Advertising Data (ads shown, ad taps) | yes | yes | no | Third-Party Advertising, Analytics |\n| Usage Data > Product Interaction (sessions, level events) | yes | no | no | Analytics |\n| User Content > Gameplay Content (save backup, scores) | only with a server backup | no | no | App Functionality |\n| Diagnostics > Other Diagnostic Data (device model, OS version) | yes | no | no | Analytics, Third-Party Advertising |\n| Purchases > Purchase History | only if your server stores receipts | no | yes if tied to an account | App Functionality |\n\n\"Linked to you\" is **No** when there are no accounts and nothing is tied to a name, email or phone number.\nNot collected (typical): Contact Info, Health and Fitness, Financial Info, Precise Location, Sensitive Info, Contacts,\nEmails or Text Messages, Photos or Videos, Audio, Browsing History, Search History, Crash Data (unless you ship a crash\nreporter).\n\nPurposes follow Apple's definitions (https://developer.apple.com/app-store/app-privacy-details/): ads shown by an ad\nSDK are **Third-Party Advertising** only. **Developer's Advertising or Marketing** is your own ads or marketing to your\nusers; tick it only when that is true.\n\nPut the answers into `storebound.config.ts` so `storebound console fill apple-app-privacy` fills them and\n`storebound check` compares them with Info.plist and PrivacyInfo.xcprivacy (all type ids: storebound's\ncli/lib/app-privacy.ts):\n\n```ts\nappPrivacy: { tracking: true, types: {\n DEVICE_ID: { collected: true, linked: false, tracking: true, purposes: ['THIRD_PARTY_ADVERTISING', 'ANALYTICS', 'APP_FUNCTIONALITY'] },\n COARSE_LOCATION: { collected: true, linked: false, tracking: true, purposes: ['THIRD_PARTY_ADVERTISING', 'ANALYTICS'] },\n ADVERTISING_DATA: { collected: true, linked: false, tracking: true, purposes: ['THIRD_PARTY_ADVERTISING', 'ANALYTICS'] },\n PRODUCT_INTERACTION: { collected: true, linked: false, tracking: false, purposes: ['ANALYTICS'] },\n GAMEPLAY_CONTENT: { collected: false },\n} },\n```\n\nPer data type the UI asks, in order: purposes (checkboxes) > \"Is this data linked to the user's identity?\" >\n\"Do you or your third-party partners use this data for tracking purposes?\".\n\nPrivacy policy URL: App Information > Privacy Policy URL (set by `storebound apple listing`). Privacy choices URL:\noptional, leave empty unless you have a page for it.\n", - "appstore.md": "# Example Game · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 bytes, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nShort hook under the name\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\npuzzle,casual,relaxing,offline,brain,match,levels\n```\n\n### description\n```\nFirst paragraph: what the player does and why it feels good.\n\nFEATURES\n• One-thumb controls\n• 100+ levels\n• Play offline, no account needed\n\nFree to play. Contains ads and offers optional in-app purchases.\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nİsmin altındaki kısa kanca\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nbulmaca,rahatlatıcı,internetsiz,zeka,eşleştirme,bölüm\n```\n\n### description\n```\nİlk paragraf: oyuncu ne yapıyor ve neden keyifli.\n\nÖZELLİKLER\n• Tek parmakla kontrol\n• 100+ bölüm\n• İnternetsiz oyna, hesap gerekmez\n\nÜcretsiz oyun. Reklam içerir ve isteğe bağlı uygulama içi satın alımlar sunar.\n```\n", + "appstore.md": "# Example Game · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 characters, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nShort hook under the name\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\npuzzle,casual,relaxing,offline,brain,match,levels\n```\n\n### description\n```\nFirst paragraph: what the player does and why it feels good.\n\nFEATURES\n• One-thumb controls\n• 100+ levels\n• Play offline, no account needed\n\nFree to play. Contains ads and offers optional in-app purchases.\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nİsmin altındaki kısa kanca\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nbulmaca,rahatlatıcı,internetsiz,zeka,eşleştirme,bölüm\n```\n\n### description\n```\nİlk paragraf: oyuncu ne yapıyor ve neden keyifli.\n\nÖZELLİKLER\n• Tek parmakla kontrol\n• 100+ bölüm\n• İnternetsiz oyna, hesap gerekmez\n\nÜcretsiz oyun. Reklam içerir ve isteğe bağlı uygulama içi satın alımlar sunar.\n```\n", "credentials.example.json": "{\n \"PLAY_SERVICE_ACCOUNT\": \"\",\n \"ASC_KEY_ID\": \"\",\n \"ASC_ISSUER_ID\": \"\",\n \"ASC_P8\": \"\",\n \"APPLE_ADS_CLIENT_ID\": \"\",\n \"APPLE_ADS_TEAM_ID\": \"\",\n \"APPLE_ADS_KEY_ID\": \"\",\n \"APPLE_ADS_PRIVATE_KEY\": \"\",\n \"APPLE_ADS_ACCOUNT_ID\": \"\",\n \"REVENUECAT_SECRET_KEY\": \"\",\n \"ANDROID_KEYSTORE\": \"\",\n \"ANDROID_KEYSTORE_PASSWORD\": \"\",\n \"ANDROID_KEY_ALIAS\": \"\",\n \"ANDROID_KEY_PASSWORD\": \"\",\n \"ASC_VENDOR_NUMBER\": \"\",\n \"reviewContact\": { \"firstName\": \"\", \"lastName\": \"\", \"phone\": \"\", \"email\": \"\" },\n \"reviewDemoAccount\": { \"username\": \"\", \"password\": \"\" }\n}\n", "data-safety.csv": "Question ID (machine readable),Response ID (machine readable),Response value,Answer requirement,Human-friendly question label\nPSL_DATA_COLLECTION_COLLECTS_PERSONAL_DATA,,TRUE,REQUIRED,Does your app collect or share any of the required user data types?\nPSL_DATA_COLLECTION_ENCRYPTED_IN_TRANSIT,,TRUE,MAYBE_REQUIRED,Is all of the user data collected by your app encrypted in transit?\nPSL_SUPPORTED_ACCOUNT_CREATION_METHODS,PSL_ACM_NONE,TRUE,MULTIPLE_CHOICE,Which of the following methods of account creation does your app support? Select all that apply / My app does not allow users to create an account\nPSL_DATA_TYPES_PERSONAL,PSL_NAME,,MULTIPLE_CHOICE,Personal info / Name\nPSL_DATA_TYPES_PERSONAL,PSL_EMAIL,,MULTIPLE_CHOICE,Personal info / Email address\nPSL_DATA_TYPES_PERSONAL,PSL_USER_ACCOUNT,,MULTIPLE_CHOICE,Personal info / User IDs\nPSL_DATA_TYPES_PERSONAL,PSL_ADDRESS,,MULTIPLE_CHOICE,Personal info / Address\nPSL_DATA_TYPES_PERSONAL,PSL_PHONE,,MULTIPLE_CHOICE,Personal info / Phone number\nPSL_DATA_TYPES_PERSONAL,PSL_RACE_ETHNICITY,,MULTIPLE_CHOICE,Personal info / Race and ethnicity\nPSL_DATA_TYPES_PERSONAL,PSL_POLITICAL_RELIGIOUS,,MULTIPLE_CHOICE,Personal info / Political or religious beliefs\nPSL_DATA_TYPES_PERSONAL,PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY,,MULTIPLE_CHOICE,Personal info / Sexual orientation\nPSL_DATA_TYPES_PERSONAL,PSL_OTHER_PERSONAL,,MULTIPLE_CHOICE,Personal info / Other info\nPSL_DATA_TYPES_FINANCIAL,PSL_PURCHASE_HISTORY,TRUE,MULTIPLE_CHOICE,Financial info / Purchase history\nPSL_DATA_TYPES_FINANCIAL,PSL_CREDIT_SCORE,,MULTIPLE_CHOICE,Financial info / Credit score\nPSL_DATA_TYPES_FINANCIAL,PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER,,MULTIPLE_CHOICE,Financial info / User payment info\nPSL_DATA_TYPES_FINANCIAL,PSL_OTHER,,MULTIPLE_CHOICE,Financial info / Other financial info\nPSL_DATA_TYPES_LOCATION,PSL_APPROX_LOCATION,TRUE,MULTIPLE_CHOICE,Location / Approximate location\nPSL_DATA_TYPES_LOCATION,PSL_PRECISE_LOCATION,,MULTIPLE_CHOICE,Location / Precise location\nPSL_DATA_TYPES_SEARCH_AND_BROWSING,PSL_WEB_BROWSING_HISTORY,,MULTIPLE_CHOICE,Web browsing / Web browsing history\nPSL_DATA_TYPES_EMAIL_AND_TEXT,PSL_EMAILS,,MULTIPLE_CHOICE,Messages / Emails\nPSL_DATA_TYPES_EMAIL_AND_TEXT,PSL_SMS_CALL_LOG,,MULTIPLE_CHOICE,Messages / SMS or MMS\nPSL_DATA_TYPES_EMAIL_AND_TEXT,PSL_OTHER_MESSAGES,,MULTIPLE_CHOICE,Messages / Other in-app messages\nPSL_DATA_TYPES_PHOTOS_AND_VIDEOS,PSL_PHOTOS,,MULTIPLE_CHOICE,Photos and videos / Photos\nPSL_DATA_TYPES_PHOTOS_AND_VIDEOS,PSL_VIDEOS,,MULTIPLE_CHOICE,Photos and videos / Videos\nPSL_DATA_TYPES_AUDIO,PSL_AUDIO,,MULTIPLE_CHOICE,Audio files / Voice or sound recordings\nPSL_DATA_TYPES_AUDIO,PSL_MUSIC,,MULTIPLE_CHOICE,Audio files / Music files\nPSL_DATA_TYPES_AUDIO,PSL_OTHER_AUDIO,,MULTIPLE_CHOICE,Audio files / Other audio files\nPSL_DATA_TYPES_HEALTH_AND_FITNESS,PSL_HEALTH,,MULTIPLE_CHOICE,Health and fitness / Health info\nPSL_DATA_TYPES_HEALTH_AND_FITNESS,PSL_FITNESS,,MULTIPLE_CHOICE,Health and fitness / Fitness info\nPSL_DATA_TYPES_CONTACTS,PSL_CONTACTS,,MULTIPLE_CHOICE,Contacts / Contacts\nPSL_DATA_TYPES_CALENDAR,PSL_CALENDAR,,MULTIPLE_CHOICE,Calendar / Calendar events\nPSL_DATA_TYPES_APP_PERFORMANCE,PSL_CRASH_LOGS,,MULTIPLE_CHOICE,App info and performance / Crash logs\nPSL_DATA_TYPES_APP_PERFORMANCE,PSL_PERFORMANCE_DIAGNOSTICS,TRUE,MULTIPLE_CHOICE,App info and performance / Diagnostics\nPSL_DATA_TYPES_APP_PERFORMANCE,PSL_OTHER_PERFORMANCE,,MULTIPLE_CHOICE,App info and performance / Other app performance data\nPSL_DATA_TYPES_FILES_AND_DOCS,PSL_FILES_AND_DOCS,,MULTIPLE_CHOICE,Files and docs / Files and docs\nPSL_DATA_TYPES_APP_ACTIVITY,PSL_USER_INTERACTION,TRUE,MULTIPLE_CHOICE,App activity / App interactions\nPSL_DATA_TYPES_APP_ACTIVITY,PSL_IN_APP_SEARCH_HISTORY,,MULTIPLE_CHOICE,App activity / In-app search history\nPSL_DATA_TYPES_APP_ACTIVITY,PSL_APPS_ON_DEVICE,,MULTIPLE_CHOICE,App activity / Installed apps\nPSL_DATA_TYPES_APP_ACTIVITY,PSL_USER_GENERATED_CONTENT,,MULTIPLE_CHOICE,App activity / Other user-generated content\nPSL_DATA_TYPES_APP_ACTIVITY,PSL_OTHER_APP_ACTIVITY,TRUE,MULTIPLE_CHOICE,App activity / Other actions\nPSL_DATA_TYPES_IDENTIFIERS,PSL_DEVICE_ID,TRUE,MULTIPLE_CHOICE,Device or other IDs / Device or other IDs\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Name) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Name) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Name) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Name) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Name) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_NAME:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Name) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Email address) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Email address) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Email address) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Email address) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Email address) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_EMAIL:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Email address) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (User IDs) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (User IDs) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (User IDs) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (User IDs) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (User IDs) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_ACCOUNT:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (User IDs) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Address) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Address) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Address) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Address) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Address) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_ADDRESS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Address) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Phone number) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Phone number) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Phone number) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Phone number) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Phone number) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PHONE:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Phone number) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Race and ethnicity) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_RACE_ETHNICITY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Race and ethnicity) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Political or religious beliefs) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_POLITICAL_RELIGIOUS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Political or religious beliefs) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Sexual orientation) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Sexual orientation) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Sexual orientation) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Sexual orientation) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Sexual orientation) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_SEXUAL_ORIENTATION_GENDER_IDENTITY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Sexual orientation) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other info) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other info) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other info) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other info) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other info) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERSONAL:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other info) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Purchase history) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Purchase history) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (Purchase history) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Purchase history) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (Purchase history) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,TRUE,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PURCHASE_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Purchase history) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Credit score) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Credit score) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Credit score) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Credit score) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Credit score) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_SCORE:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Credit score) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (User payment info) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (User payment info) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (User payment info) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (User payment info) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (User payment info) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CREDIT_DEBIT_BANK_ACCOUNT_NUMBER:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (User payment info) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other financial info) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other financial info) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other financial info) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other financial info) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other financial info) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other financial info) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Approximate location) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Approximate location) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (Approximate location) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Approximate location) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (Approximate location) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_APPROX_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Approximate location) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Precise location) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Precise location) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Precise location) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Precise location) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Precise location) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PRECISE_LOCATION:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Precise location) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Web browsing history) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Web browsing history) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Web browsing history) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Web browsing history) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Web browsing history) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_WEB_BROWSING_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Web browsing history) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Emails) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Emails) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Emails) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Emails) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Emails) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_EMAILS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Emails) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (SMS or MMS) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (SMS or MMS) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (SMS or MMS) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (SMS or MMS) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (SMS or MMS) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_SMS_CALL_LOG:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (SMS or MMS) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other in-app messages) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other in-app messages) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other in-app messages) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other in-app messages) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other in-app messages) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_MESSAGES:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other in-app messages) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Photos) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Photos) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Photos) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Photos) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Photos) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PHOTOS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Photos) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Videos) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Videos) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Videos) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Videos) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Videos) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_VIDEOS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Videos) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Voice or sound recordings) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Voice or sound recordings) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Music files) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Music files) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Music files) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Music files) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Music files) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_MUSIC:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Music files) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other audio files) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other audio files) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other audio files) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other audio files) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other audio files) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_AUDIO:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other audio files) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Health info) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Health info) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Health info) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Health info) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Health info) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_HEALTH:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Health info) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Fitness info) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Fitness info) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Fitness info) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Fitness info) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Fitness info) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_FITNESS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Fitness info) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Contacts) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Contacts) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Contacts) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Contacts) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Contacts) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CONTACTS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Contacts) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Calendar events) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Calendar events) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Calendar events) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Calendar events) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Calendar events) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CALENDAR:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Calendar events) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Crash logs) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Crash logs) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Crash logs) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Crash logs) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Crash logs) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_CRASH_LOGS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Crash logs) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Diagnostics) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Diagnostics) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (Diagnostics) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Diagnostics) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (Diagnostics) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_PERFORMANCE_DIAGNOSTICS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Diagnostics) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other app performance data) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other app performance data) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other app performance data) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other app performance data) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other app performance data) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_PERFORMANCE:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other app performance data) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Files and docs) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Files and docs) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Files and docs) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Files and docs) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Files and docs) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_FILES_AND_DOCS:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Files and docs) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (App interactions) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (App interactions) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (App interactions) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (App interactions) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (App interactions) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_INTERACTION:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (App interactions) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (In-app search history) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (In-app search history) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (In-app search history) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (In-app search history) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (In-app search history) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_IN_APP_SEARCH_HISTORY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (In-app search history) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Installed apps) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Installed apps) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Installed apps) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Installed apps) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Installed apps) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_APPS_ON_DEVICE:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Installed apps) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,,MULTIPLE_CHOICE,\"Data usage and handling (Other user-generated content) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other user-generated content) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:PSL_DATA_USAGE_EPHEMERAL,,,MAYBE_REQUIRED,Data usage and handling (Other user-generated content) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other user-generated content) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,,SINGLE_CHOICE,\"Data usage and handling (Other user-generated content) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_USER_GENERATED_CONTENT:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other user-generated content) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Other actions) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,,MULTIPLE_CHOICE,\"Data usage and handling (Other actions) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (Other actions) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Other actions) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (Other actions) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,TRUE,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,,MULTIPLE_CHOICE,\"Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_OTHER_APP_ACTIVITY:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Other actions) / Why is this user data shared? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_COLLECTED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Device or other IDs) / Is this data collected, shared, or both? / Collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:PSL_DATA_USAGE_COLLECTION_AND_SHARING,PSL_DATA_USAGE_ONLY_SHARED,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Device or other IDs) / Is this data collected, shared, or both? / Shared\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:PSL_DATA_USAGE_EPHEMERAL,,FALSE,MAYBE_REQUIRED,Data usage and handling (Device or other IDs) / Is this data processed ephemerally?\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_OPTIONAL,,SINGLE_CHOICE,\"Data usage and handling (Device or other IDs) / Is this data required for your app, or can users choose whether it's collected? / Users can choose whether this data is collected\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_USER_CONTROL,PSL_DATA_USAGE_USER_CONTROL_REQUIRED,TRUE,SINGLE_CHOICE,\"Data usage and handling (Device or other IDs) / Is this data required for your app, or can users choose whether it's collected? / Data collection is required (users can't turn off this data collection)\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_APP_FUNCTIONALITY,TRUE,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_COLLECTION_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data collected? Select all that apply. / Account management\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_APP_FUNCTIONALITY,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / App functionality\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_ANALYTICS,TRUE,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Analytics\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_DEVELOPER_COMMUNICATIONS,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Developer communications\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_FRAUD_PREVENTION_SECURITY,TRUE,MULTIPLE_CHOICE,\"Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Fraud prevention, security, and compliance\"\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_ADVERTISING,TRUE,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Advertising or marketing\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_PERSONALIZATION,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Personalization\nPSL_DATA_USAGE_RESPONSES:PSL_DEVICE_ID:DATA_USAGE_SHARING_PURPOSE,PSL_ACCOUNT_MANAGEMENT,,MULTIPLE_CHOICE,Data usage and handling (Device or other IDs) / Why is this user data shared? Select all that apply. / Account management\n", "declarations.md": "# Example Game · store declarations (answers to copy into the consoles)\n\nAnswers for a typical single-player free-to-play game with ads (mediation) and in-app purchases, no accounts, no chat,\nno user-generated content, general audience 13+. Change what does not match your game. Everything marked **UI** has no\nAPI: Play Console > your app > Policy and programs > **App content** (or Dashboard > \"Set up your app\"), and App Store\nConnect for Apple. Data safety (Play) has an API: `storebound play data-safety`.\n\n## Google Play · App content (UI)\n\n| declaration | answer |\n|---|---|\n| Privacy policy | your policy URL (same one in the listing and inside the app) |\n| App access | All functionality is available without special access (no login) |\n| Ads | Yes, my app contains ads |\n| Content rating | IARC questionnaire, below |\n| Target audience and content | 13-15, 16-17, 18 and over; \"Could your app unintentionally appeal to children?\" No (only if true) |\n| News app | No |\n| COVID-19 contact tracing / status | No |\n| Data safety | `storebound play data-safety` (then check the summary in the Console) |\n| Government apps | No |\n| Financial features | My app doesn't provide any financial features |\n| Health apps | No health features |\n| Advertising ID | Yes, uses it; purposes: Advertising or marketing, Analytics, Fraud prevention / security / compliance |\n| Sign-in details (App access) | No sign-in needed |\n| Store settings | App category Game > (Casual, Puzzle, Arcade ...); tags; contact email + website (website serves app-ads.txt) |\n\nFamilies / Designed for Families: only if you really target children; it changes the ad SDK setup (certified networks,\nno ad id). If you leave children out, the policy and the ad mediation must say \"not directed at children\" too.\n\n## IARC content rating (Play UI; Apple has its own form, `storebound apple appinfo`)\n\nCategory: Game. Typical answers for a non-violent casual game:\n\n| topic | answer |\n|---|---|\n| Violence (realistic / cartoon / fantasy) | No |\n| Blood / gore | No |\n| Fear / horror | No |\n| Sexuality / nudity | No |\n| Language (profanity, crude humour) | No |\n| Controlled substances | No |\n| Gambling: simulated / real money | No / No |\n| Random paid items (loot boxes) | No (fixed contents only; answer Yes if a paid item has random contents) |\n| Users interact or exchange content | No (no chat; OS share sheet does not count) |\n| Shares location with other users | No |\n| Digital purchases | Yes (in-app purchases) |\n| Unrestricted internet / browser | No |\n\nExpected: PEGI 3, ESRB Everyone, USK 0, IARC 3+. Apple age rating 4+ (all content questions None; ads are declared as\n\"advertising: true\", which does not change 4+).\n\n## App Store (UI-only parts)\n\n- App record: App Store Connect > Apps > + > New App (platform, name, primary language, bundle id, SKU). No API.\n- App Privacy: `app-privacy.md`, then **Publish**.\n- Export compliance (export-compliance skill): `ITSAppUsesNonExemptEncryption = NO` in Info.plist only if true (HTTPS / OS encryption only) so\n every build skips the question.\n- First in-app purchases: from the IAP page \"Add for Review\" into the draft submission with the version (see the\n store-iap-setup skill).\n- Guideline 5.1.1: the privacy policy link must also be reachable **inside the app** (Settings > Privacy).\n\n## Ads\n\n- app-ads.txt at the root of the developer website named in both listings (`https://example.com/app-ads.txt`),\n with the mediation's DIRECT line plus each network's lines.\n- iOS: SKAdNetwork ids of every network in Info.plist, ATT prompt before the ad SDK starts.\n- EU / EEA / UK / CH: consent (CMP) or non-personalized ads.\n", "listing.md": "# Example Game · Google Play listing copy\n\nSource for `storebound play listing` (title, short + full description) and `storebound play release` (release notes).\nRules the parser follows:\n- every `## ...` section with a `` line is a listing; one section can serve several Play codes\n (``)\n- under it, `### ...` headings that contain **title** (optional, defaults to `app.name`), **short**, **full** and\n **what's new**, each followed by one fenced block\n- limits (checked before anything is sent): title 30, short 80, full 4000, what's new 500 characters\nOnly claim what is really in the game. No prices, no \"best / #1\", no other games' names.\n\n---\n\n## English (en-US)\n\n\n### Play short description (max 80)\n```\nShort, punchy promise of the core loop in one line\n```\n\n### Play full description (max 4000)\n```\nFirst paragraph: what the player does and why it feels good, in two or three sentences.\n\nFEATURES\n• One-thumb controls\n• 100+ levels and new ones every update\n• Play offline, no account needed\n\nFree to play. Contains ads and offers optional in-app purchases.\n```\n\n### What's new (max 500)\n```\nFirst release. Have fun!\n```\n\n## Türkçe (tr-TR)\n\n\n### Play kısa açıklama · short (max 80)\n```\nOyunun özünü anlatan kısa ve vurucu bir cümle\n```\n\n### Play tam açıklama · full (max 4000)\n```\nİlk paragraf: oyuncu ne yapıyor ve neden keyifli, iki üç cümlede.\n\nÖZELLİKLER\n• Tek parmakla kontrol\n• 100+ bölüm, her güncellemede yenileri\n• İnternetsiz oyna, hesap gerekmez\n\nÜcretsiz oyun. Reklam içerir ve isteğe bağlı uygulama içi satın alımlar sunar.\n```\n\n### Yenilikler · what's new (max 500)\n```\nİlk sürüm. İyi eğlenceler!\n```\n", "privacy-policy.html": "\n\n\n\n\nPrivacy Policy · Example Studio\n\n\n\n\n
\n \n\n
\n

Privacy Policy

\n

Example Studio · applies to all our games · last updated 2026-01-01

\n\n

We make small games. We collect as little as we can, never sell personal data, and none of our games needs an\n account. This page explains what each game collects, why, and what you can do about it.

\n\n

What our games use

\n
\n \n \n \n \n
GameServiceWhat and whyYour choice
Example GameAnalytics (e.g. GameAnalytics)Random player id, sessions, level events, device model, OS version, country derived from IP: to improve the game.Settings > Analytics off
Example GameAds (e.g. a mediation SDK and its networks)Advertising id (if you allow it), IP, device info, ad interactions: to show and measure ads.iOS: tracking prompt; Android: OS ad settings; buy \"Remove Ads\"
Example GameApp storesPurchases are handled by Google Play / the App Store; we never see payment details.-
\n\n

Children

\n

Our games are for a general audience and are not directed at children under 13. We do not knowingly collect\n personal data from children. If you believe a child sent us data, contact us and we will delete it.

\n\n

Retention and your rights

\n

Analytics data is kept for up to 24 months. You can ask us for a copy of your data or to delete it by writing\n to privacy@example.com; we answer within 30 days. Include the game name and,\n if you can, the player id shown in Settings.

\n\n

Security

\n

All network traffic of our games uses HTTPS.

\n\n

Changes

\n

When a game starts collecting something new we update this page and its date first.

\n\n

Contact

\n

Example Studio · privacy@example.com

\n
\n\n
\n

Gizlilik Politikası

\n

Example Studio · tüm oyunlarımız için geçerlidir · son güncelleme 2026-01-01

\n

Küçük oyunlar yapıyoruz. Olabildiğince az veri topluyoruz, kişisel verileri asla satmıyoruz ve hiçbir oyunumuz\n hesap istemiyor. Yukarıdaki tablo her oyunun neyi neden topladığını gösterir.

\n

Haklarınız

\n

Verilerinizin bir kopyasını veya silinmesini privacy@example.com adresine\n yazarak isteyebilirsiniz; 30 gün içinde yanıtlıyoruz.

\n
\n
\n\n\n", "profiles/app/app-privacy.md": "# Example App · App Store \"App Privacy\" answers\n\nApp Store Connect > your app > App Privacy. **Web UI only, there is no API.** Fill it from this table, then press\n**Publish** (saving alone does not publish it). Keep it consistent with the privacy policy and the Play Data safety\nanswers (`dataSafety` in `storebound.config.ts`). **Edit to match your app.**\n\nTypical utility / productivity app: optional account (email), content synced to your backend, an analytics SDK\nacting as your processor, no ads, no tracking.\n\n**Do you or your third-party partners collect data from this app?** Yes\n\n**Tracking**: No (no ad SDK, no data broker, nothing combined with other companies' data for advertising). If that\nchanges, add the App Tracking Transparency prompt first.\n\n| data type | collected | used to track | linked to the user | purposes |\n|---|---|---|---|---|\n| Contact Info > Email Address | yes (account) | no | yes | App Functionality |\n| Identifiers > User ID | yes (account id) | no | yes | App Functionality, Analytics |\n| User Content > Other User Content (lists, notes) | yes (synced) | no | yes | App Functionality |\n| Usage Data > Product Interaction | yes (analytics) | no | yes if tied to the account, else no | Analytics |\n| Diagnostics > Crash Data | yes | no | no | App Functionality, Analytics |\n| Diagnostics > Performance Data | yes | no | no | Analytics |\n\n\"Linked to you\" is **Yes** for what you store under the account. Not collected (typical): Location, Health and\nFitness, Financial Info, Contacts, Photos or Videos (unless people attach them), Browsing and Search History,\nPurchases (until you sell something), Sensitive Info.\n\nPer data type the UI asks, in order: purposes > \"Is this data linked to the user's identity?\" > \"Do you or your\nthird-party partners use this data for tracking purposes?\".\n", - "profiles/app/appstore.md": "# Example App · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 bytes, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nLists and notes, in sync\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\ntodo,checklist,groceries,planner,notes,shared,family,organizer,tasks,sync\n```\n\n### description\n```\nFirst paragraph: the job the app does and why it is easier with it.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use. An account is optional and only needed for sync and sharing.\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nListeler ve notlar, eşitli\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nyapılacaklar,kontrol,market,planlayıcı,not,paylaşım,aile,düzen,görev\n```\n\n### description\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\nÜcretsiz. Hesap isteğe bağlıdır; yalnızca eşitleme ve paylaşım için gerekir.\n```\n", + "profiles/app/appstore.md": "# Example App · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 characters, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nLists and notes, in sync\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\ntodo,checklist,groceries,planner,notes,shared,family,organizer,tasks,sync\n```\n\n### description\n```\nFirst paragraph: the job the app does and why it is easier with it.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use. An account is optional and only needed for sync and sharing.\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nListeler ve notlar, eşitli\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nyapılacaklar,kontrol,market,planlayıcı,not,paylaşım,aile,düzen,görev\n```\n\n### description\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\nÜcretsiz. Hesap isteğe bağlıdır; yalnızca eşitleme ve paylaşım için gerekir.\n```\n", "profiles/app/declarations.md": "# Example App · store declarations (answers to copy into the consoles)\n\nStarting answers for a typical **utility / productivity app**: an optional account (email + password, or sign in\nwith a provider), an analytics SDK acting as your processor, data synced to your own backend, no ads, no chat with\nstrangers, general audience. **Edit every line to match your app**: these are your statements to the stores. Everything\nmarked **UI** has no API: Play Console > your app > Policy and programs > **App content**, and App Store Connect for\nApple. Data safety (Play) has an API: `storebound play data-safety`.\n\n## Google Play · App content (UI)\n\n| declaration | answer |\n|---|---|\n| Privacy policy | your policy URL (same one in the listing and inside the app) |\n| App access | \"All or some functionality is restricted\": add the demo account (username, password) and the steps from `reviewAccess.instructions`; credentials must work at all times, no 2FA / OTP (review-access skill) |\n| Ads | No, my app does not contain ads |\n| Content rating | IARC questionnaire, below |\n| Target audience and content | 18 and over (or 13+ if teens use it); \"Could your app unintentionally appeal to children?\" No (only if true) |\n| News app | No |\n| Data safety | `storebound play data-safety`, then check the summary; with accounts: the delete-account URL (`accounts.deletionUrl`) |\n| Government apps | No |\n| Financial features | My app doesn't provide any financial features |\n| Health apps | No health features |\n| Advertising ID | No (unless an SDK in your app reads it: check the SDK docs and your merged manifest) |\n| Store settings | App, category (Productivity, Tools, ...); contact email + website |\n\n## Account deletion (account-deletion skill)\n\n- In the app: Settings > Account > Delete account deletes the account and its data (not only \"deactivate\").\n- On the web: `accounts.deletionUrl` lets people request deletion without the app; Play asks for it in Data safety.\n- With subscriptions: say that deleting the account does not cancel the store subscription, and how to cancel.\n\n## IARC content rating (Play UI; Apple has its own form, `storebound apple appinfo`)\n\nCategory: not a game (e.g. Utility, Productivity, Communication, or Social Networking if people share content with\nothers). Typical answers for a lists / notes app:\n\n| topic | answer |\n|---|---|\n| Violence, sexuality, language, controlled substances | No |\n| Gambling (simulated / real money) | No |\n| Users interact or exchange content | Yes only if people can share with others outside their own invitations; then also moderation and reporting |\n| Shares location with other users | No |\n| Digital purchases | No (Yes once you sell IAPs or subscriptions) |\n| Unrestricted internet / browser | No |\n\nExpected: PEGI 3, ESRB Everyone, IARC 3+. Apple age rating 4+ (all content questions None) unless users share\ncontent publicly.\n\n## App Store (UI-only parts)\n\n- App record: App Store Connect > Apps > + > New App. No API.\n- App Privacy: `app-privacy.md`, then **Publish**.\n- App Review information: `storebound apple review-details` sends the contact, the demo account (from\n `.storebound/credentials.json`, masked in the log) and the notes.\n- Export compliance (export-compliance skill): `ITSAppUsesNonExemptEncryption = NO` only if true.\n- Guideline 5.1.1: the privacy policy link must also be reachable **inside the app**; 5.1.1(v): account deletion\n inside the app.\n", "profiles/app/listing.md": "# Example App · Google Play listing copy\n\nSource for `storebound play listing` (title, short + full description) and `storebound play release` (release notes).\nRules the parser follows:\n- every `## ...` section with a `` line is a listing; one section can serve several Play codes\n- under it, `### ...` headings that contain **title** (optional, defaults to `app.name`), **short**, **full** and\n **what's new**, each followed by one fenced block\n- limits (checked before anything is sent): title 30, short 80, full 4000, what's new 500 characters\nOnly claim what the app really does. No prices, no \"best / #1\", no other apps' names.\n\n---\n\n## English (en-US)\n\n\n### Play short description (max 80)\n```\nWhat the app does for people, in one plain line\n```\n\n### Play full description (max 4000)\n```\nFirst paragraph: the job the app does and why it is easier with it, in two or three sentences.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use. An account is optional and only needed for sync and sharing.\n```\n\n### What's new (max 500)\n```\nFirst release. Thanks for trying it!\n```\n\n## Türkçe (tr-TR)\n\n\n### Play kısa açıklama · short (max 80)\n```\nUygulamanın insanlar için ne yaptığını anlatan sade bir cümle\n```\n\n### Play tam açıklama · full (max 4000)\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu, iki üç cümlede.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\nÜcretsiz. Hesap isteğe bağlıdır; yalnızca eşitleme ve paylaşım için gerekir.\n```\n\n### Yenilikler · what's new (max 500)\n```\nİlk sürüm. Denediğin için teşekkürler!\n```\n", "profiles/app/privacy-policy.html": "\n\n\n\n\nPrivacy Policy · Example Studio\n\n\n\n\n
\n \n\n
\n

Privacy Policy

\n

Example Studio · applies to all our apps · last updated 2026-01-01

\n\n

We collect what an app needs to work for you, never sell personal data and show no ads. This page explains what\n each app collects, why, and what you can do about it.

\n\n

What our apps use

\n
\n \n \n \n \n \n
AppServiceWhat and whyYour choice
Example AppAccount (our servers)Email address, account id and the lists and notes you create: to sign you in and sync your content between your devices.The account is optional; export or delete it in Settings > Account
Example AppAnalytics (e.g. a privacy-friendly analytics SDK)Random install id, screens used, device model, OS version: to improve the app.Settings > Analytics off
Example AppCrash reportingCrash logs and device model: to fix crashes.-
Example AppApp storesPurchases and subscriptions are handled by Google Play / the App Store; we never see payment details.-
\n\n

Deleting your account

\n

In the app: Settings > Account > Delete account. Without the app: example.com/delete-account.\n We delete your account and its content within 30 days; backups roll over within 90 days. A store subscription is\n not cancelled by deleting the account: cancel it in your Google Play or App Store subscriptions.

\n\n

Children

\n

Our apps are not directed at children under 13. We do not knowingly collect personal data from children. If you\n believe a child sent us data, contact us and we will delete it.

\n\n

Retention and your rights

\n

We keep account data while the account exists and analytics data for up to 24 months. You can ask for a copy or\n the deletion of your data by writing to privacy@example.com; we answer\n within 30 days.

\n\n

Security

\n

All network traffic of our apps uses HTTPS; passwords are stored only as salted hashes.

\n\n

Changes

\n

When an app starts collecting something new we update this page and its date first.

\n\n

Contact

\n

Example Studio · privacy@example.com

\n
\n\n
\n

Gizlilik Politikası

\n

Example Studio · tüm uygulamalarımız için geçerlidir · son güncelleme 2026-01-01

\n

Yalnızca uygulamanın sizin için çalışması gereken verileri topluyoruz, kişisel verileri asla satmıyoruz ve reklam\n göstermiyoruz. Yukarıdaki tablo her uygulamanın neyi neden topladığını gösterir.

\n

Hesabınızı silmek

\n

Uygulamada: Ayarlar > Hesap > Hesabı sil. Uygulama olmadan: example.com/delete-account.\n Mağaza aboneliği hesap silinince iptal olmaz; Google Play veya App Store aboneliklerinizden iptal edin.

\n

Haklarınız

\n

Verilerinizin bir kopyasını veya silinmesini privacy@example.com adresine\n yazarak isteyebilirsiniz; 30 gün içinde yanıtlıyoruz.

\n
\n
\n\n\n", @@ -21,7 +21,7 @@ export const TEMPLATE_TEXT: Record = { "profiles/app/workflows/beta.yml": "# storebound flow \"beta\": a TestFlight / internal testing build for your testers.\n# storebound flow run beta VERSION=1.2.0 [--apply]\ndescription: Next build to TestFlight and Play internal testing\nparams:\n VERSION: \"1.0.0\"\n GROUP: \"Internal\"\nsteps:\n - id: check\n run: check\n - id: next-build\n if: apple\n run: apple next-build\n capture: BUILD\n - id: build\n if: apple\n run: apple build --version ${VERSION} --build-number ${BUILD}\n - id: upload\n if: apple\n run: apple upload --no-wait\n - id: wait\n if: apple\n run: apple testflight wait --build ${BUILD} --version ${VERSION}\n - id: what-to-test\n if: apple\n run: apple testflight what-to-test --build ${BUILD}\n - id: distribute\n if: apple\n run: apple testflight distribute --build ${BUILD} --group ${GROUP}\n - id: play-build\n if: play\n run: play build --version-name ${VERSION}\n - id: play-upload\n if: play\n run: play upload --track internal\n - id: external\n owner: \"External testers: storebound apple testflight distribute --build ${BUILD} --group --submit-review (Beta App Review is your call)\"\n", "profiles/app/workflows/release.yml": "# storebound flow \"release\": one version of the app on both stores, up to your Submit click.\n# storebound flow run release VERSION=1.2.0 reads run, writes run as dry runs (nothing changes)\n# storebound flow run release VERSION=1.2.0 --apply writes run for real; each command still asks you first\n# storebound flow run release --resume --apply continue after fixing a failed step\n# Steps are storebound commands (no \"storebound\" prefix). `if: apple` / `if: play` skip a store the config does not\n# have; `owner:` steps are never run, they list what you click. Edit freely: this file is yours.\ndescription: Build, upload and check one version on both stores, then your Submit click\nparams:\n VERSION: \"1.0.0\"\nsteps:\n - id: next-build\n if: apple\n run: apple next-build\n capture: BUILD\n - id: build\n if: apple\n run: apple build --version ${VERSION} --build-number ${BUILD}\n - id: upload\n if: apple\n run: apple upload --no-wait\n - id: wait\n if: apple\n run: apple testflight wait --build ${BUILD} --version ${VERSION}\n - id: play-build\n if: play\n run: play build --version-name ${VERSION}\n - id: play-upload\n if: play\n run: play upload --track internal\n - id: whats-new\n if: exists store/whats-new\n run: whats-new apply\n - id: listing\n if: apple\n run: apple listing --version ${VERSION} --build ${BUILD}\n - id: validate\n run: validate\n - id: scan\n run: scan\n - id: plan\n run: release plan ${VERSION}\n - id: submit\n owner: \"App Store Connect: Submit for Review (version ${VERSION}, build ${BUILD}). Play Console: promote the internal release and Send changes for review\"\n", "profiles/subscription-app/app-privacy.md": "# Example App · App Store \"App Privacy\" answers\n\nApp Store Connect > your app > App Privacy. **Web UI only, there is no API.** Fill it from this table, then press\n**Publish** (saving alone does not publish it). Keep it consistent with the privacy policy and the Play Data safety\nanswers (`dataSafety` in `storebound.config.ts`). **Edit to match your app.**\n\nTypical subscription app: account (email), content synced to your backend, auto-renewable subscriptions checked by\nyour server, an analytics SDK acting as your processor, no ads, no tracking.\n\n**Do you or your third-party partners collect data from this app?** Yes\n\n**Tracking**: No (no ad SDK, no data broker, nothing combined with other companies' data for advertising). If that\nchanges, add the App Tracking Transparency prompt first.\n\n| data type | collected | used to track | linked to the user | purposes |\n|---|---|---|---|---|\n| Contact Info > Email Address | yes (account) | no | yes | App Functionality |\n| Identifiers > User ID | yes (account id) | no | yes | App Functionality, Analytics |\n| User Content > Other User Content (lists, notes) | yes (synced) | no | yes | App Functionality |\n| Usage Data > Product Interaction | yes (analytics) | no | yes if tied to the account, else no | Analytics |\n| Purchases > Purchase History (subscription status) | yes | no | yes | App Functionality |\n| Diagnostics > Crash Data | yes | no | no | App Functionality, Analytics |\n| Diagnostics > Performance Data | yes | no | no | Analytics |\n\n\"Linked to you\" is **Yes** for what you store under the account. Not collected (typical): Location, Health and\nFitness, Financial Info, Contacts, Photos or Videos (unless people attach them), Browsing and Search History,\nSensitive Info.\n\nPer data type the UI asks, in order: purposes > \"Is this data linked to the user's identity?\" > \"Do you or your\nthird-party partners use this data for tracking purposes?\".\n", - "profiles/subscription-app/appstore.md": "# Example App · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 bytes, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nLists and notes, in sync\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\ntodo,checklist,groceries,planner,notes,shared,family,organizer,tasks,sync\n```\n\n### description\n```\nFirst paragraph: the job the app does and why it is easier with it.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use with up to 3 lists. Example Pro unlocks unlimited lists, sharing and themes: yearly with a 1-week free trial, or monthly. Payment is charged to your store account; the subscription renews automatically unless cancelled at least 24 hours before the end of the period, and you can manage or cancel it in your account settings.\n\nTerms of Use: https://example.com/terms\nPrivacy Policy: https://example.com/privacy\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nListeler ve notlar, eşitli\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nyapılacaklar,kontrol,market,planlayıcı,not,paylaşım,aile,düzen,görev\n```\n\n### description\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\n3 listeye kadar ücretsiz. Example Pro sınırsız liste, paylaşım ve tema açar: 1 hafta ücretsiz denemeli yıllık ya da aylık. Ödeme mağaza hesabınızdan alınır; abonelik, dönem bitmeden en az 24 saat önce iptal edilmezse otomatik yenilenir; hesap ayarlarınızdan yönetebilir ya da iptal edebilirsiniz.\n\nKullanım Koşulları: https://example.com/terms\nGizlilik Politikası: https://example.com/privacy\n```\n", + "profiles/subscription-app/appstore.md": "# Example App · App Store listing copy\n\nSource for `storebound apple listing`. One `## ` section per locale (the first word is the locale code:\n`en-US`, `tr`, `de-DE`, `ja`, `zh-Hans`, `ar-SA`, ...), one fenced block per `### `, field names exactly:\n`name` (optional, defaults to `apple.name`, else `app.name`), `subtitle` (30), `promotionalText` (170), `keywords` (100 characters, comma\nseparated, no spaces after commas, do not repeat the app name), `description` (4000), `whatsNew` (optional; not allowed\non the first version). Shared values (privacy policy, support and marketing URL) come from `storebound.config.ts`.\n\n---\n\n## en-US · English (U.S.)\n\n### subtitle\n```\nLists and notes, in sync\n```\n\n### promotionalText\n```\nOne or two sentences you can change any time without a new version.\n```\n\n### keywords\n```\ntodo,checklist,groceries,planner,notes,shared,family,organizer,tasks,sync\n```\n\n### description\n```\nFirst paragraph: the job the app does and why it is easier with it.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use with up to 3 lists. Example Pro unlocks unlimited lists, sharing and themes: yearly with a 1-week free trial, or monthly. Payment is charged to your store account; the subscription renews automatically unless cancelled at least 24 hours before the end of the period, and you can manage or cancel it in your account settings.\n\nTerms of Use: https://example.com/terms\nPrivacy Policy: https://example.com/privacy\n```\n\n## tr · Türkçe\n\n### subtitle\n```\nListeler ve notlar, eşitli\n```\n\n### promotionalText\n```\nYeni sürüm göndermeden istediğin zaman değiştirebileceğin bir iki cümle.\n```\n\n### keywords\n```\nyapılacaklar,kontrol,market,planlayıcı,not,paylaşım,aile,düzen,görev\n```\n\n### description\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\n3 listeye kadar ücretsiz. Example Pro sınırsız liste, paylaşım ve tema açar: 1 hafta ücretsiz denemeli yıllık ya da aylık. Ödeme mağaza hesabınızdan alınır; abonelik, dönem bitmeden en az 24 saat önce iptal edilmezse otomatik yenilenir; hesap ayarlarınızdan yönetebilir ya da iptal edebilirsiniz.\n\nKullanım Koşulları: https://example.com/terms\nGizlilik Politikası: https://example.com/privacy\n```\n", "profiles/subscription-app/declarations.md": "# Example App · store declarations (answers to copy into the consoles)\n\nStarting answers for a typical **subscription app**: auto-renewable subscriptions (free trial on the yearly plan), an account (email + password, or sign in\nwith a provider), an analytics SDK acting as your processor, data synced to your own backend, no ads, no chat with\nstrangers, general audience. **Edit every line to match your app**: these are your statements to the stores. Everything\nmarked **UI** has no API: Play Console > your app > Policy and programs > **App content**, and App Store Connect for\nApple. Data safety (Play) has an API: `storebound play data-safety`.\n\n## Google Play · App content (UI)\n\n| declaration | answer |\n|---|---|\n| Privacy policy | your policy URL (same one in the listing and inside the app) |\n| App access | \"All or some functionality is restricted\": add the demo account (username, password) and the steps from `reviewAccess.instructions`; credentials must work at all times, no 2FA / OTP (review-access skill) |\n| Ads | No, my app does not contain ads |\n| Content rating | IARC questionnaire, below |\n| Target audience and content | 18 and over (or 13+ if teens use it); \"Could your app unintentionally appeal to children?\" No (only if true) |\n| News app | No |\n| Data safety | `storebound play data-safety`, then check the summary; with accounts: the delete-account URL (`accounts.deletionUrl`) |\n| Government apps | No |\n| Financial features | My app doesn't provide any financial features |\n| Health apps | No health features |\n| Advertising ID | No (unless an SDK in your app reads it: check the SDK docs and your merged manifest) |\n| Store settings | App, category (Productivity, Tools, ...); contact email + website |\n\n## Account deletion (account-deletion skill)\n\n- In the app: Settings > Account > Delete account deletes the account and its data (not only \"deactivate\").\n- On the web: `accounts.deletionUrl` lets people request deletion without the app; Play asks for it in Data safety.\n- With subscriptions: say that deleting the account does not cancel the store subscription, and how to cancel.\n\n## IARC content rating (Play UI; Apple has its own form, `storebound apple appinfo`)\n\nCategory: not a game (e.g. Utility, Productivity, Communication, or Social Networking if people share content with\nothers). Typical answers for a lists / notes app:\n\n| topic | answer |\n|---|---|\n| Violence, sexuality, language, controlled substances | No |\n| Gambling (simulated / real money) | No |\n| Users interact or exchange content | Yes only if people can share with others outside their own invitations; then also moderation and reporting |\n| Shares location with other users | No |\n| Digital purchases | Yes (subscriptions) |\n| Unrestricted internet / browser | No |\n\nExpected: PEGI 3, ESRB Everyone, IARC 3+. Apple age rating 4+ (all content questions None) unless users share\ncontent publicly.\n\n## App Store (UI-only parts)\n\n- App record: App Store Connect > Apps > + > New App. No API.\n- App Privacy: `app-privacy.md`, then **Publish**.\n- App Review information: `storebound apple review-details` sends the contact, the demo account (from\n `.storebound/credentials.json`, masked in the log) and the notes.\n- Export compliance (export-compliance skill): `ITSAppUsesNonExemptEncryption = NO` only if true.\n- Guideline 5.1.1: the privacy policy link must also be reachable **inside the app**; 5.1.1(v): account deletion\n inside the app.\n\n## Subscriptions (store-subscriptions skill)\n\n- Purchase screen (both stores): plan name, length, the full renewal price per period (most prominent), what is\n included, free trial length and what is charged after it, how to cancel, Restore Purchases, links to the Terms of Use\n and the Privacy Policy. Apple 3.1.2; Google Play subscriptions policy.\n- Metadata: the App Store description (or a custom EULA in App Information > License Agreement) links the Terms of\n Use; the Privacy Policy URL field is set by `storebound apple listing`.\n- First subscriptions are submitted together with an app version (App Store Connect: add them to the version on its\n page before Submit for Review), like first in-app purchases.\n- App Review notes say where the paywall is and that sandbox purchases work with the demo account.\n- Play: base plans and offers must be active before people can buy; new subscribers see the converted regional prices.\n", "profiles/subscription-app/listing.md": "# Example App · Google Play listing copy\n\nSource for `storebound play listing` (title, short + full description) and `storebound play release` (release notes).\nRules the parser follows:\n- every `## ...` section with a `` line is a listing; one section can serve several Play codes\n- under it, `### ...` headings that contain **title** (optional, defaults to `app.name`), **short**, **full** and\n **what's new**, each followed by one fenced block\n- limits (checked before anything is sent): title 30, short 80, full 4000, what's new 500 characters\nOnly claim what the app really does. No prices, no \"best / #1\", no other apps' names.\n\n---\n\n## English (en-US)\n\n\n### Play short description (max 80)\n```\nWhat the app does for people, in one plain line\n```\n\n### Play full description (max 4000)\n```\nFirst paragraph: the job the app does and why it is easier with it, in two or three sentences.\n\nFEATURES\n• Lists and notes that sync across your devices\n• Share a list with family or friends\n• Export your data or delete your account in Settings, any time\n\nFree to use with up to 3 lists. Example Pro unlocks unlimited lists, sharing and themes: yearly with a 1-week free trial, or monthly. Payment is charged to your store account; the subscription renews automatically unless cancelled at least 24 hours before the end of the period, and you can manage or cancel it in your account settings.\n\nTerms of Use: https://example.com/terms\nPrivacy Policy: https://example.com/privacy\n```\n\n### What's new (max 500)\n```\nFirst release. Thanks for trying it!\n```\n\n## Türkçe (tr-TR)\n\n\n### Play kısa açıklama · short (max 80)\n```\nUygulamanın insanlar için ne yaptığını anlatan sade bir cümle\n```\n\n### Play tam açıklama · full (max 4000)\n```\nİlk paragraf: uygulamanın gördüğü iş ve onunla neden daha kolay olduğu, iki üç cümlede.\n\nÖZELLİKLER\n• Tüm cihazlarında eşitlenen listeler ve notlar\n• Bir listeyi ailen ya da arkadaşlarınla paylaş\n• Verilerini dışa aktar ya da hesabını Ayarlar'dan istediğin an sil\n\n3 listeye kadar ücretsiz. Example Pro sınırsız liste, paylaşım ve tema açar: 1 hafta ücretsiz denemeli yıllık ya da aylık. Ödeme mağaza hesabınızdan alınır; abonelik, dönem bitmeden en az 24 saat önce iptal edilmezse otomatik yenilenir; hesap ayarlarınızdan yönetebilir ya da iptal edebilirsiniz.\n\nKullanım Koşulları: https://example.com/terms\nGizlilik Politikası: https://example.com/privacy\n```\n\n### Yenilikler · what's new (max 500)\n```\nİlk sürüm. Denediğin için teşekkürler!\n```\n", "profiles/subscription-app/storebound.config.ts": "// storebound config for one app (profile \"subscription-app\": accounts plus auto-renewable subscriptions, an\n// analytics SDK, no ads). Every answer below is a starting point: edit it to match your app. Credentials NEVER go\n// here (env vars or .storebound/credentials.json, gitignored). Paths are relative to this file.\n// The type import is optional: it only works when storebound is installed in the project (bun add -d storebound).\nimport type { ShipConfig } from 'storebound';\n\nconst config: ShipConfig = {\n app: {\n name: 'Example App',\n profile: 'subscription-app',\n copyright: '2026 Example Studio',\n privacyPolicyUrl: 'https://example.com/privacy',\n termsUrl: 'https://example.com/terms', // Terms of Use (EULA): in the app and the metadata (Apple 3.1.2)\n supportUrl: 'https://example.com/support',\n marketingUrl: 'https://example.com',\n website: 'https://example.com',\n contactEmail: 'support@example.com',\n },\n\n // Accounts (account-deletion skill). Remove this block if the app has no sign-up / sign-in at all.\n // Apple 5.1.1(v): deletion must start inside the app. Google Play: in the app AND on a public web page.\n accounts: {\n enabled: true,\n deletionUrl: 'https://example.com/delete-account', // public page, no login needed to request deletion\n inApp: 'Settings > Account > Delete account', // goes into the App Review notes\n // How people sign up: 'username' (a name picked in the app, no password, no email), 'username-password',\n // 'email-password', 'email-link', 'phone', 'oauth', 'other'. `storebound scan` proposes the account data and\n // dataSafety.accountCreation from it; only the 'email-*' methods mean an email address.\n signUp: ['email-password'],\n },\n\n // Sign-in for store reviewers (review-access skill). The demo account itself lives ONLY in\n // .storebound/credentials.json (\"reviewDemoAccount\") or REVIEW_DEMO_USER / REVIEW_DEMO_PASSWORD.\n reviewAccess: {\n signInRequired: true, // false if every feature works without signing in\n instructions: 'Sign in with the demo account. Sample data is already there; nothing needs a second device.',\n },\n\n // id = your folder / copy key; play = Play language code(s); apple = App Store Connect locale\n languages: [\n { id: 'en', play: 'en-US', apple: 'en-US' },\n { id: 'tr', play: 'tr-TR', apple: 'tr' },\n ],\n\n play: {\n packageName: 'com.example.app',\n defaultLanguage: 'en-US',\n listing: 'store/listing.md',\n icon: 'store/icons/play-512.png',\n },\n\n apple: {\n bundleId: 'com.example.app',\n // name: 'Example: Short Tagline', // App Store name (max 30) when app.name is taken there (\"already being used\"); default app.name\n listing: 'store/appstore.md',\n // Export compliance (export-compliance skill): decide it, then uncomment. false ONLY if the app uses no encryption\n // beyond the OS (HTTPS through the system, standard sign-in).\n // usesNonExemptEncryption: false,\n // ipad: true,\n info: {\n categories: { primary: 'PRODUCTIVITY', secondary: 'UTILITIES' },\n ageRating: {}, // every content question NONE / false; change what applies (user-generated content, web access ...)\n contentRights: 'DOES_NOT_USE_THIRD_PARTY_CONTENT',\n free: true,\n reviewNotes: [\n 'Example App keeps lists and notes in sync across devices. Pro (yearly with a 1-week free trial, or monthly) unlocks unlimited lists, sharing and themes.',\n 'Subscriptions: Settings > Pro (or the paywall after the third list). Restore Purchases is on the paywall and in Settings > Pro.',\n 'Privacy policy and Terms of Use: on the paywall and in Settings > About.',\n ].join('\\n\\n'),\n },\n },\n\n // Auto-renewable subscriptions (store-subscriptions skill): `storebound apple subscriptions`, `storebound play\n // subscriptions`. Apple: one group, levels rank the plans (1 = highest). Play: one subscription per entry with one\n // auto-renewing base plan. Prices: USD base, Apple equalizes from the USA, Play converts per region; overrides set a\n // region by hand. The disclosure (price per period, renewal, how to cancel, Terms + Privacy links) belongs on the\n // purchase screen and in the descriptions.\n subscriptions: [\n {\n name: 'Example Pro',\n listings: { en: { name: 'Example Pro' }, tr: { name: 'Example Pro' } },\n subscriptions: [\n {\n id: 'com.example.app.pro_yearly', period: 'P1Y', level: 1, usd: 29.99,\n listings: {\n en: { title: 'Pro yearly', description: 'Unlimited lists, sharing and themes.', benefits: ['Unlimited lists', 'Shared lists', 'All themes'] },\n tr: { title: 'Pro yıllık', description: 'Sınırsız liste, paylaşım ve tema.', benefits: ['Sınırsız liste', 'Paylaşılan listeler', 'Tüm temalar'] },\n },\n intro: { type: 'free', duration: 'P1W' }, // 1 week free trial for new subscribers\n reviewScreenshot: 'store/iap-review/paywall.png',\n },\n {\n id: 'com.example.app.pro_monthly', period: 'P1M', level: 2, usd: 3.99,\n overrides: [{ region: 'TR', currency: 'TRY', price: 99.99 }],\n listings: {\n en: { title: 'Pro monthly', description: 'Unlimited lists, sharing and themes.', benefits: ['Unlimited lists', 'Shared lists', 'All themes'] },\n tr: { title: 'Pro aylık', description: 'Sınırsız liste, paylaşım ve tema.', benefits: ['Sınırsız liste', 'Paylaşılan listeler', 'Tüm temalar'] },\n },\n reviewScreenshot: 'store/iap-review/paywall.png',\n },\n ],\n },\n ],\n\n // Google Play Data safety. Types not listed = not collected. Typical app with accounts + an analytics SDK acting as\n // your processor (collected, not shared). Edit to match what your app and its SDKs really do.\n dataSafety: {\n collectsData: true,\n encryptedInTransit: true,\n // Sign-up methods. Google does not publish these ids: compare with Play Console > App content > Data safety >\n // Export to CSV before the first import. The delete-account URL (PSL_ACCOUNT_DELETION_URL) comes from\n // accounts.deletionUrl; `storebound check` names any other row Play requires.\n accountCreation: ['PSL_ACM_USER_ID_PASSWORD'],\n // Can people delete their data without deleting the account (a data-only page)? true needs partialDeletionUrl.\n // Play's \"can users request deletion?\" is answered yes by accounts.deletionUrl. Ask the owner.\n partialDeletion: false,\n data: {\n PSL_EMAIL: { shared: false, collect: ['functionality', 'account'] },\n PSL_USER_ACCOUNT: { shared: false, collect: ['functionality', 'account'] },\n PSL_USER_GENERATED_CONTENT: { shared: false, collect: ['functionality'] },\n PSL_USER_INTERACTION: { shared: false, collect: ['analytics'] },\n PSL_CRASH_LOGS: { shared: false, collect: ['analytics'] },\n PSL_PERFORMANCE_DIAGNOSTICS: { shared: false, collect: ['analytics'] },\n PSL_DEVICE_ID: { shared: false, collect: ['analytics'] },\n PSL_PURCHASE_HISTORY: { shared: false, collect: ['functionality'] }, // subscription status tied to the account\n },\n },\n\n renders: 'store/renders',\n\n shots: {\n style: 'app', // calm gradient, device frame, headline + subline (game: sparkles and badges)\n copy: 'store/shots/copy.json',\n frames: 'store/shots/frames', // /phone/.png, /tablet/.png\n out: 'store/renders',\n // fonts: { title: 'Inter', body: 'Inter' }, // the app style default\n scenes: [\n { id: 'home', palette: 'mist', frames: [{ src: 'home.png' }] },\n { id: 'detail', palette: 'mint', frames: [{ src: 'detail.png' }] },\n { id: 'share', palette: 'sky', frames: [{ src: 'share.png' }] },\n { id: 'privacy', palette: 'slate', frames: [{ src: 'settings.png' }] },\n ],\n feature: { frame: 'home.png', palette: 'mist' },\n // Raw frames from a web build, the iOS Simulator (ios-sim) or an Android emulator (android-emu): sign in to a demo\n // account with realistic sample data, never real user data (store-screenshots skill).\n capture: {\n baseUrl: 'http://127.0.0.1:5173',\n query: 'lang={lang}&demo=1',\n shots: {\n 'home': { path: '/', delayMs: 1000, device: 'both' },\n 'detail': { path: '/lists/1', delayMs: 1000, device: 'both' },\n 'share': { path: '/lists/1/share', delayMs: 1000, device: 'both' },\n 'settings': { path: '/settings', delayMs: 1000, device: 'both' },\n },\n },\n },\n\n icons: {\n composite: 'store/icon/icon.png',\n foreground: 'store/icon/foreground.png',\n background: 'store/icon/background.png',\n out: 'store/icons',\n },\n};\n\nexport default config;\n", diff --git a/cli/lib/fastlane.ts b/cli/lib/fastlane.ts index 0726b6a..292c9d4 100644 --- a/cli/lib/fastlane.ts +++ b/cli/lib/fastlane.ts @@ -307,7 +307,7 @@ const fence = (t: string) => '```\n' + t + '\n```'; const https = (u: string | undefined): string | undefined => (u && /^https:\/\/\S+$/.test(u.trim()) ? u.trim() : undefined); const YOUTUBE = /^https:\/\/(www\.youtube\.com\/watch\?v=[\w-]{6,}|youtu\.be\/[\w-]{6,})$/; -/** Keywords "a, b ,c" -> "a,b,c" (spaces after commas count against the 100 bytes on the App Store). */ +/** Keywords "a, b ,c" -> "a,b,c" (spaces after commas count against the 100 characters on the App Store). */ export const normalizeKeywords = (k: string): string => k.split(/[,\n]/).map(x => x.trim()).filter(Boolean).join(','); /** Image size, null when the header is not PNG / JPEG. */ @@ -453,7 +453,7 @@ export function planImport(scan: FastlaneScan, o: PlanOptions): ImportPlan { add('promotionalText', f.promotionalText); if (f.keywords) { const k = normalizeKeywords(f.keywords); - if (k !== f.keywords) warnings.push(`${l.locale}: keywords normalized (spaces after commas removed; they count against 100 bytes)`); + if (k !== f.keywords) warnings.push(`${l.locale}: keywords normalized (spaces after commas removed; they count against 100 characters)`); add('keywords', k); } add('description', f.description); @@ -472,7 +472,7 @@ export function planImport(scan: FastlaneScan, o: PlanOptions): ImportPlan { Imported from fastlane deliver (\`storebound import fastlane\`). Source for \`storebound apple listing\`. One \`## \` section per locale, one fenced block per \`### \`: \`name\` (optional, defaults to \`apple.name\`, else \`app.name\`), -\`subtitle\` (30), \`promotionalText\` (170), \`keywords\` (100 bytes, comma separated, no spaces after commas), +\`subtitle\` (30), \`promotionalText\` (170), \`keywords\` (100 characters, comma separated, no spaces after commas), \`description\` (4000), \`whatsNew\` (optional). Privacy policy, support and marketing URL come from \`storebound.config.ts\`. diff --git a/cli/lib/health.ts b/cli/lib/health.ts index 7658bcf..6b563ff 100644 --- a/cli/lib/health.ts +++ b/cli/lib/health.ts @@ -18,6 +18,7 @@ // (HANGS, DISK_WRITES, LAUNCHES), GET /v1/apps/{id}/betaFeedbackCrashSubmissions (TestFlight crash reports, API 4.0+). import type { Finding, Level } from './validate-rules'; import { mdTable, pct, textTable } from './table'; +import { reportingEnableUrl } from './store-apps'; export const PLAY_THRESHOLDS = { crash: 0.0109, anr: 0.0047, perDevice: 0.08 } as const; /** Warn when a rate reaches this share of its threshold. */ @@ -181,13 +182,14 @@ const levelFor = (v: number | null, limit: number): Level => (v === null ? 'ok' /** A Google 403 for an API that is not enabled in the caller's Cloud project. */ export const REPORTING_OFF = /SERVICE_DISABLED|has not been used in project|accessNotConfigured/; -export function healthFindings(h: HealthSnapshot, o: { unreadable?: Level } = {}): Finding[] { +export function healthFindings(h: HealthSnapshot, o: { unreadable?: Level; principal?: string | null } = {}): Finding[] { const f: Finding[] = []; const play = h.play; if (play && 'error' in play) { + const on = reportingEnableUrl(play.error, o.principal ?? null); f.push(REPORTING_OFF.test(play.error) - ? { store: 'play', level: o.unreadable ?? 'warn', code: 'vitals', msg: 'vitals not readable: the Google Play Developer Reporting API is off in the service account\'s Google Cloud project', - fix: 'Google Cloud console > APIs & Services > Library: enable "Google Play Developer Reporting API" in that project, wait a few minutes (store-health skill)' } + ? { store: 'play', level: o.unreadable ?? 'warn', code: 'vitals', msg: `vitals not readable: the Google Play Developer Reporting API is off in the service account's Google Cloud project${on.project ? ` ${on.project}` : ''}`, + fix: `enable "Google Play Developer Reporting API" for that project: ${on.url} (Enable), wait a few minutes (store-health skill)` } : { store: 'play', level: o.unreadable ?? 'warn', code: 'vitals', msg: `vitals not readable: ${play.error.slice(0, 200)}`, fix: 'store-health skill (Reporting API access)' }); } else if (play) { diff --git a/cli/lib/listing-translate.ts b/cli/lib/listing-translate.ts index b6dc55c..7bd5b3c 100644 --- a/cli/lib/listing-translate.ts +++ b/cli/lib/listing-translate.ts @@ -4,7 +4,7 @@ // yours once per field. Every generated section carries a marker line until a human reviewed it: // source text copied in, still to translate // machine-translated: review, then `listing reviewed` -// Limits per store field (characters; App Store keywords also 100 bytes, as the existing listing check counts them): +// Limits per store field, in characters (App Store keywords too: live fields of 265 UTF-8 bytes are accepted): // App Store (appStoreVersionLocalizations / appInfoLocalizations): name 30, subtitle 30, promotionalText 170, // keywords 100, description 4000. https://developer.apple.com/help/app-store-connect/reference/app-information // Google Play (edits.listings): title 30, shortDescription 80, fullDescription 4000. @@ -108,7 +108,7 @@ export const unmark = (sec: string): string => sec.replace(/^