From 207114c295a1ee253e982aecd9f9023115d1056d Mon Sep 17 00:00:00 2001 From: deymosh Date: Wed, 30 Sep 2026 23:07:29 +0200 Subject: [PATCH 1/7] feat(client-core): the phone's configuration as a backup payload A bridge knows a phone by its identity pubkey and a phone mints fresh session keys on its own, so a new phone with the same identity needs only what the phone alone knows to carry on: each paired machine's relays, label, direct endpoints and new-session defaults, the settings and the quick prompts. `ConfigBackup` holds exactly that; everything a heartbeat re-sends, session keys and grants are left out. The backup is a NIP-78 kind 30078 event whose `d` tag is a sha256 of the identity and a context only this app uses, so it names no app on the relay and no other app's data can share it. Decoding is total and drops relays the phone may not dial; importing adds the machines the phone lacks, leaves the ones it has as they are, and takes the backup's settings and quick prompts. The backup relay is kept under its own key, apart from the settings the backup carries. Co-Authored-By: Claude Code --- crates/client-core/src/stores/backup.rs | 321 ++++++++++++++++++++++++ crates/client-core/src/stores/mod.rs | 1 + 2 files changed, 322 insertions(+) create mode 100644 crates/client-core/src/stores/backup.rs diff --git a/crates/client-core/src/stores/backup.rs b/crates/client-core/src/stores/backup.rs new file mode 100644 index 00000000..41d83eef --- /dev/null +++ b/crates/client-core/src/stores/backup.rs @@ -0,0 +1,321 @@ +//! `backup` — the phone's configuration as one encrypted Nostr event on a +//! relay the user picks, so a new phone (or a reinstalled one) with the same +//! identity picks up where the old one left off. +//! +//! A bridge knows a phone by its identity pubkey and a phone mints fresh +//! session keys on its own, so what a restored phone needs is only what the +//! phone alone knows: each paired machine's relays, label, direct endpoints +//! and new-session defaults, the settings and the quick prompts. Everything a +//! bridge re-sends in its heartbeat (sessions, agents, credentials, models, +//! folders) is left out, as are session keys, grants and anything about one +//! device. +//! +//! The event is NIP-78 application data: kind [`BACKUP_KIND`], addressable, +//! so a relay keeps only the latest one per `d` tag. The `d` tag +//! ([`backup_d_tag`]) is a hash of the identity and a context only this app +//! uses: it names no app to someone browsing the relay, and no other app's +//! data can share it. The content is the [`ConfigBackup`] JSON, NIP-44 +//! encrypted to the identity itself. What stays public is what any event +//! shows: the pubkey, the kind and when it was saved. +//! +//! Pure: building, decoding and merging a backup. Encrypting, signing and +//! the relay are the runtime's. + +use nostr::hashes::{sha256, Hash}; +use serde::{Deserialize, Serialize}; + +use super::machines::{AgentDefaults, MachinesState}; +use super::pairing::is_relay_url; +use super::quick_prompts::{QuickPrompt, QuickPromptsState}; +use super::settings::{clamp_ui_scale, SettingsData, SettingsState}; + +use std::collections::BTreeMap; + +/// NIP-78 application-specific data (addressable). +pub const BACKUP_KIND: u16 = 30078; +/// NIP-09 deletion. +pub const DELETION_KIND: u16 = 5; +/// The payload version this build writes and reads. +pub const BACKUP_VERSION: u32 = 1; +/// Hashed with the identity into the `d` tag; changing it moves every +/// backup to a new address. +const D_TAG_CONTEXT: &str = "codedeck-plus/config-backup/v1"; +/// Where the backup relay is kept on the phone (never in the backup). +pub const BACKUP_STORAGE_KEY: &str = "backup"; + +/// The backup's `d` tag for identity `pubkey_hex`: hex sha256 of the +/// context, a colon and the pubkey (lowercase). Deterministic, so a new phone +/// finds it with the identity alone. +pub fn backup_d_tag(pubkey_hex: &str) -> String { + let input = format!("{D_TAG_CONTEXT}:{}", pubkey_hex.to_ascii_lowercase()); + sha256::Hash::hash(input.as_bytes()).to_string() +} + +/// The `a` address a NIP-09 deletion of the backup names. +pub fn backup_address(pubkey_hex: &str) -> String { + format!("{BACKUP_KIND}:{}:{}", pubkey_hex.to_ascii_lowercase(), backup_d_tag(pubkey_hex)) +} + +/// One paired machine, as only the phone knows it. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BackupMachine { + pub pubkey_hex: String, + /// What the bridge last called itself: shown until its next heartbeat. + pub name: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub label: Option, + pub relays: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub direct_endpoints: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub default_agent: Option, + #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] + pub agent_defaults: BTreeMap, +} + +/// The backup's plaintext. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ConfigBackup { + pub v: u32, + /// When it was made, in ms since the epoch. + pub saved_at: u64, + pub machines: Vec, + pub settings: SettingsData, + pub quick_prompts: Vec, +} + +/// The backup of the current state. +pub fn build_backup(machines: &MachinesState, settings: &SettingsData, prompts: &[QuickPrompt], saved_at: u64) -> ConfigBackup { + ConfigBackup { + v: BACKUP_VERSION, + saved_at, + machines: machines + .machines + .values() + .map(|m| BackupMachine { + pubkey_hex: m.pubkey_hex.clone(), + name: m.name.clone(), + label: m.label.clone(), + relays: m.relays.clone(), + direct_endpoints: m.direct_endpoints.clone(), + default_agent: m.default_agent.clone(), + agent_defaults: m.agent_defaults.clone(), + }) + .collect(), + settings: settings.clone(), + quick_prompts: prompts.to_vec(), + } +} + +pub fn encode_backup(backup: &ConfigBackup) -> String { + serde_json::to_string(backup).expect("ConfigBackup serializes") +} + +/// What the backup holds, whenever it was made: two backups with the same +/// fingerprint need not both be saved. +pub fn backup_fingerprint(backup: &ConfigBackup) -> String { + let content = ConfigBackup { saved_at: 0, ..backup.clone() }; + sha256::Hash::hash(encode_backup(&content).as_bytes()).to_string() +} + +/// Decode a backup's plaintext. Total: bad JSON, another version, or a +/// machine with no relay the phone may dial is an error to show, never a +/// panic. A machine's relays the phone may not dial are dropped. +pub fn decode_backup(json: &str) -> Result { + let raw: serde_json::Value = serde_json::from_str(json).map_err(|_| "The backup could not be read.".to_string())?; + match raw.get("v").and_then(serde_json::Value::as_u64) { + Some(v) if v == u64::from(BACKUP_VERSION) => {} + Some(v) if v > u64::from(BACKUP_VERSION) => { + return Err("The backup was made by a newer version of the app. Update it and try again.".into()) + } + _ => return Err("The backup could not be read.".into()), + } + let mut backup: ConfigBackup = + serde_json::from_value(raw).map_err(|_| "The backup could not be read.".to_string())?; + backup.settings.ui_scale = clamp_ui_scale(backup.settings.ui_scale); + for m in &mut backup.machines { + m.relays.retain(|r| is_relay_url(r)); + } + backup.machines.retain(|m| !m.pubkey_hex.is_empty() && !m.relays.is_empty()); + Ok(backup) +} + +/// What an import did. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct ImportSummary { + /// Machines the phone did not have. + pub added: usize, + /// Machines it had, left as they were. + pub kept: usize, +} + +/// Merge `backup` into the phone: the machines it does not have are added +/// (as they were, offline until each bridge is heard from), the ones it has +/// keep their own configuration, and the settings and quick prompts become +/// the backup's. +pub fn merge_backup( + backup: &ConfigBackup, + machines: &mut MachinesState, + settings: &mut SettingsState, + prompts: &mut QuickPromptsState, +) -> ImportSummary { + let mut summary = ImportSummary::default(); + for m in &backup.machines { + if machines.machine(&m.pubkey_hex).is_some() { + summary.kept += 1; + continue; + } + machines.register_machine(&m.pubkey_hex, &m.name, m.label.clone(), None, &m.relays); + machines.set_direct_endpoints(&m.pubkey_hex, m.direct_endpoints.clone()); + machines.set_default_agent(&m.pubkey_hex, m.default_agent.clone()); + for (agent, defaults) in &m.agent_defaults { + machines.set_agent_defaults(&m.pubkey_hex, agent, defaults.clone()); + } + summary.added += 1; + } + settings.data = backup.settings.clone(); + prompts.prompts = backup.quick_prompts.clone(); + summary +} + +/// The backup relay, kept on the phone apart from the backup. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BackupConfig { + /// `None`: backup is off. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub relay: Option, + /// When a backup last reached the relay, in ms since the epoch. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub saved_at: Option, + /// The fingerprint of what was last saved. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub fingerprint: Option, +} + +/// Tolerant hydrate: anything unreadable is backup off. +pub fn hydrate_backup_config(raw: Option<&str>) -> BackupConfig { + let config: BackupConfig = raw.and_then(|r| serde_json::from_str(r).ok()).unwrap_or_default(); + match &config.relay { + Some(relay) if !is_relay_url(relay) => BackupConfig::default(), + _ => config, + } +} + +pub fn serialize_backup_config(config: &BackupConfig) -> String { + serde_json::to_string(config).expect("BackupConfig serializes") +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::stores::machines::MergeOptions; + use crate::stores::settings::default_settings; + + const ID: &str = "AB12cd"; + + fn phone() -> (MachinesState, SettingsState, QuickPromptsState) { + let mut machines = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + machines.register_machine("m1", "laptop", Some("Work".into()), None, &["wss://relay.one".to_string()]); + machines.set_direct_endpoints("m1", vec!["wss://laptop.tailnet:7447".into()]); + machines.set_default_agent("m1", Some("opencode".into())); + machines.set_agent_defaults("m1", "claude", AgentDefaults { mode: "plan".into(), effort: String::new(), model: String::new() }); + let mut settings = SettingsState::default(); + settings.set_tor_proxy_enabled(true); + let prompts = QuickPromptsState::from_hydrated(vec![QuickPrompt { id: "q".into(), label: "Go".into(), text: "Continue".into() }]); + (machines, settings, prompts) + } + + #[test] + fn the_d_tag_is_a_hash_of_the_identity_and_names_no_app() { + let tag = backup_d_tag(ID); + assert_eq!(tag.len(), 64); + assert!(tag.chars().all(|c| c.is_ascii_hexdigit())); + assert!(!tag.contains("codedeck")); + // The same for the same identity, whatever its case; another for another. + assert_eq!(tag, backup_d_tag(&ID.to_ascii_lowercase())); + assert_ne!(tag, backup_d_tag("ab12ce")); + assert_eq!(backup_address(ID), format!("30078:ab12cd:{tag}")); + } + + #[test] + fn a_backup_holds_only_what_the_phone_alone_knows_and_round_trips() { + let (mut machines, settings, prompts) = phone(); + // A heartbeat's worth of data the bridge would send again. + machines.machines.get_mut("m1").unwrap().folders = vec!["repo".into()]; + let backup = build_backup(&machines, &settings.data, &prompts.prompts, 7); + let json = encode_backup(&backup); + assert!(!json.contains("repo") && !json.contains("sessionGrant") && !json.contains("sessions")); + assert_eq!(decode_backup(&json).unwrap(), backup); + } + + #[test] + fn the_fingerprint_ignores_when_it_was_made() { + let (machines, settings, prompts) = phone(); + let a = build_backup(&machines, &settings.data, &prompts.prompts, 1); + let b = build_backup(&machines, &settings.data, &prompts.prompts, 2); + assert_eq!(backup_fingerprint(&a), backup_fingerprint(&b)); + let mut c = b.clone(); + c.quick_prompts.clear(); + assert_ne!(backup_fingerprint(&a), backup_fingerprint(&c)); + } + + #[test] + fn importing_adds_the_missing_machines_and_keeps_the_ones_the_phone_has() { + let (machines, settings, prompts) = phone(); + let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, 1); + backup.machines.push(BackupMachine { + pubkey_hex: "m2".into(), + name: "vps".into(), + label: None, + relays: vec!["wss://relay.two".into()], + direct_endpoints: vec![], + default_agent: None, + agent_defaults: BTreeMap::new(), + }); + + // A phone that already has m1, labelled its own way. + let mut here = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + here.register_machine("m1", "laptop", Some("Mine".into()), None, &["wss://relay.local".to_string()]); + let mut here_settings = SettingsState::new(default_settings()); + let mut here_prompts = QuickPromptsState::default(); + + let summary = merge_backup(&backup, &mut here, &mut here_settings, &mut here_prompts); + assert_eq!(summary, ImportSummary { added: 1, kept: 1 }); + assert_eq!(here.machine("m1").unwrap().label.as_deref(), Some("Mine")); + assert_eq!(here.machine("m2").unwrap().relays, ["wss://relay.two"]); + assert!(here_settings.data.tor_proxy_enabled); + assert_eq!(here_prompts.prompts.len(), 1); + + // Everything a fresh phone gets back. + let mut fresh = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + merge_backup(&backup, &mut fresh, &mut SettingsState::default(), &mut QuickPromptsState::default()); + let m1 = fresh.machine("m1").unwrap(); + assert_eq!((m1.label.as_deref(), m1.default_agent.as_deref()), (Some("Work"), Some("opencode"))); + assert_eq!(m1.direct_endpoints, ["wss://laptop.tailnet:7447"]); + assert_eq!(m1.agent_defaults["claude"].mode, "plan"); + } + + #[test] + fn a_bad_or_newer_backup_is_an_error_not_a_panic() { + assert!(decode_backup("not json").is_err()); + assert!(decode_backup(r#"{"v":1}"#).is_err()); + assert!(decode_backup(r#"{"v":99}"#).unwrap_err().contains("newer version")); + // A machine with no relay the phone may dial is dropped. + let (machines, settings, prompts) = phone(); + let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, 1); + backup.machines[0].relays = vec!["http://plain.example".into()]; + assert!(decode_backup(&encode_backup(&backup)).unwrap().machines.is_empty()); + } + + #[test] + fn the_backup_relay_hydrates_tolerantly() { + assert_eq!(hydrate_backup_config(None), BackupConfig::default()); + assert_eq!(hydrate_backup_config(Some("garbage")), BackupConfig::default()); + assert_eq!(hydrate_backup_config(Some(r#"{"relay":"http://x"}"#)), BackupConfig::default()); + let config = BackupConfig { relay: Some("wss://r".into()), saved_at: Some(5), fingerprint: None }; + assert_eq!(hydrate_backup_config(Some(&serialize_backup_config(&config))), config); + } +} diff --git a/crates/client-core/src/stores/mod.rs b/crates/client-core/src/stores/mod.rs index dbce42ae..3be49514 100644 --- a/crates/client-core/src/stores/mod.rs +++ b/crates/client-core/src/stores/mod.rs @@ -1,6 +1,7 @@ //! stores — domain state as pure state machines. No zustand, no //! I/O; the runtime owns wiring + persistence. +pub mod backup; pub mod session_key; pub mod fetches; pub mod machines; From b06ab5a91909894fce161a33803ed2995061dd41 Mon Sep 17 00:00:00 2001 From: deymosh Date: Wed, 30 Sep 2026 23:09:57 +0200 Subject: [PATCH 2/7] feat(nostr-transport): filter subscriptions by d tag A subscription can now ask for addressable events by their `d` tag (`#d`), so a client fetching one of its own (say, a backup stored as application data) asks the relay for just that one instead of every event of the kind. Co-Authored-By: Claude Code --- crates/bridge-runtime/src/relay.rs | 2 ++ crates/client-runtime/src/nostr_client.rs | 1 + crates/nostr-transport/src/frames.rs | 9 +++++++-- crates/nostr-transport/src/port.rs | 2 ++ crates/nostr-transport/src/ws.rs | 1 + 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/bridge-runtime/src/relay.rs b/crates/bridge-runtime/src/relay.rs index 53275942..38f86663 100644 --- a/crates/bridge-runtime/src/relay.rs +++ b/crates/bridge-runtime/src/relay.rs @@ -485,6 +485,7 @@ impl Relays { kinds: vec![COMMAND_KIND], authors, p_tags: vec![self.bridge_pubkey.clone()], + d_tags: vec![], since: Some(since as i64), }; self.commands = Some(self.subscribe(filter, Via::Commands)); @@ -497,6 +498,7 @@ impl Relays { kinds: vec![COMMAND_KIND], authors: vec![], p_tags: vec![self.bridge_pubkey.clone()], + d_tags: vec![], since: Some(since as i64), }; self.pairing = Some(self.subscribe(filter, Via::Pairing)); diff --git a/crates/client-runtime/src/nostr_client.rs b/crates/client-runtime/src/nostr_client.rs index ddfe4eaa..ec04e730 100644 --- a/crates/client-runtime/src/nostr_client.rs +++ b/crates/client-runtime/src/nostr_client.rs @@ -54,6 +54,7 @@ pub fn build_phone_filters(phone_pubkey: &str, authors: &[String], last_stored_s kinds, authors: authors.to_vec(), p_tags: vec![phone_pubkey.to_string()], + d_tags: vec![], since, }; vec![ diff --git a/crates/nostr-transport/src/frames.rs b/crates/nostr-transport/src/frames.rs index 2d9e539a..068efd00 100644 --- a/crates/nostr-transport/src/frames.rs +++ b/crates/nostr-transport/src/frames.rs @@ -106,6 +106,9 @@ pub fn filter_to_json(filter: &Filter) -> Value { if !filter.p_tags.is_empty() { map.insert("#p".to_string(), json!(filter.p_tags)); } + if !filter.d_tags.is_empty() { + map.insert("#d".to_string(), json!(filter.d_tags)); + } if let Some(since) = filter.since { map.insert("since".to_string(), json!(since)); } @@ -213,24 +216,26 @@ mod tests { kinds: vec![4516], authors: vec!["a1".into()], p_tags: vec!["p1".into()], + d_tags: vec!["d1".into()], since: Some(1000), }; assert_eq!( filter_to_json(&full), - json!({ "kinds": [4516], "authors": ["a1"], "#p": ["p1"], "since": 1000 }) + json!({ "kinds": [4516], "authors": ["a1"], "#p": ["p1"], "#d": ["d1"], "since": 1000 }) ); let no_since = Filter { kinds: vec![30515], authors: vec!["a1".into()], p_tags: vec!["p1".into()], + d_tags: vec![], since: None, }; let v = filter_to_json(&no_since); assert!(v.get("since").is_none()); assert_eq!(v["kinds"], json!([30515])); - let empty = Filter { kinds: vec![], authors: vec![], p_tags: vec![], since: None }; + let empty = Filter { kinds: vec![], authors: vec![], p_tags: vec![], d_tags: vec![], since: None }; assert_eq!(filter_to_json(&empty), json!({})); } diff --git a/crates/nostr-transport/src/port.rs b/crates/nostr-transport/src/port.rs index 02198d5d..9803caad 100644 --- a/crates/nostr-transport/src/port.rs +++ b/crates/nostr-transport/src/port.rs @@ -43,6 +43,8 @@ pub struct Filter { pub authors: Vec, /// the `#p` tag filter. pub p_tags: Vec, + /// the `#d` tag filter (an addressable event's identifier). + pub d_tags: Vec, pub since: Option, } diff --git a/crates/nostr-transport/src/ws.rs b/crates/nostr-transport/src/ws.rs index b6a70d16..0fc7fb38 100644 --- a/crates/nostr-transport/src/ws.rs +++ b/crates/nostr-transport/src/ws.rs @@ -1529,6 +1529,7 @@ mod tests { kinds: vec![24515], authors: vec!["a".repeat(64)], p_tags: vec![phone.pubkey_hex.clone()], + d_tags: vec![], since: None, } } From b3225d32b832ae583e9ca247c6bfc1ffe0757a72 Mon Sep 17 00:00:00 2001 From: deymosh Date: Wed, 30 Sep 2026 23:16:57 +0200 Subject: [PATCH 3/7] feat(client-runtime): save, find and restore the config backup The phone can keep its configuration on a relay the user picks. The backup relay joins the set the transport dials, so it goes through Tor when that is on and answers the relay's AUTH with the identity, like every other relay. Its content is NIP-44 encrypted from the identity to the identity through the identity's signer (an on-device key or a NIP-55 signer app alike), so only that identity can read it; the relay sees the pubkey, the kind, when it was saved and an opaque d tag. Setting the relay looks there first. A backup found waits for the user to import it (merged into the phone) or keep this phone's, and nothing is saved meanwhile, so a new phone never overwrites the backup it is about to restore; with none there, this phone's is saved at once. After that a backup is saved half a minute after the last change to the machines, settings or quick prompts, only when what it holds changed, each one dated past the last. Turning it off can also send a NIP-09 deletion. The settings view carries where the backup stands. Co-Authored-By: Claude Code --- crates/client-ffi/src/views.rs | 2 +- crates/client-runtime/src/backup.rs | 165 +++++++++++ crates/client-runtime/src/intent.rs | 20 ++ crates/client-runtime/src/lib.rs | 3 +- crates/client-runtime/src/runtime.rs | 58 ++++ crates/client-runtime/src/runtime/backup.rs | 302 ++++++++++++++++++++ crates/client-runtime/src/runtime/tests.rs | 98 +++++++ crates/client-runtime/src/stores.rs | 32 ++- crates/client-runtime/src/view.rs | 36 ++- 9 files changed, 706 insertions(+), 10 deletions(-) create mode 100644 crates/client-runtime/src/backup.rs create mode 100644 crates/client-runtime/src/runtime/backup.rs diff --git a/crates/client-ffi/src/views.rs b/crates/client-ffi/src/views.rs index 3d830ad0..9ee904d5 100644 --- a/crates/client-ffi/src/views.rs +++ b/crates/client-ffi/src/views.rs @@ -952,7 +952,7 @@ pub struct UniffiSettingsView { } pub fn build_uniffi_settings_view(v: &SettingsView) -> UniffiSettingsView { - let d = &v.0; + let d = &v.data; UniffiSettingsView { ui_scale: d.ui_scale, stay_connected: d.stay_connected, diff --git a/crates/client-runtime/src/backup.rs b/crates/client-runtime/src/backup.rs new file mode 100644 index 00000000..dcdac243 --- /dev/null +++ b/crates/client-runtime/src/backup.rs @@ -0,0 +1,165 @@ +//! The config backup's events: sealing the phone's configuration into one +//! (NIP-44 encrypted to the identity itself, then signed), opening one, and +//! the deletion that withdraws it. What goes in the backup, and merging it +//! back, is `client_core::stores::backup`; when to save and fetch is the +//! runtime loop's. +//! +//! Only the identity can read a backup: its content is NIP-44 encrypted from +//! the identity to the identity, through the identity's signer (so a key held +//! by a NIP-55 signer app works the same way). The relay sees the pubkey, +//! the kind, when it was saved and an opaque `d` tag — nothing of what is in +//! it. + +use client_core::stores::backup::{ + backup_address, backup_d_tag, decode_backup, encode_backup, ConfigBackup, BACKUP_KIND, DELETION_KIND, +}; +use nostr::{EventBuilder, Kind, PublicKey, Tag, TagKind, Timestamp, UnsignedEvent}; +use nostr_transport::NostrEvent; +use protocol::nostr_event::SignedEvent; + +use crate::signer::{sign, IdentitySigner}; + +/// Where a backup operation stands, as the settings page shows it. +#[derive(Debug, Clone, PartialEq, Eq, Default, serde::Serialize, specta::Type)] +#[serde(rename_all = "camelCase", tag = "state")] +pub enum BackupStatus { + /// Nothing going on (backup off, or on and up to date). + #[default] + Idle, + /// Looking on the relay for a backup. + Checking, + /// A backup is on the relay: import it, or keep this phone's. + Found { + #[specta(type = specta_typescript::Number)] + saved_at: u64, + machines: u32, + }, + Saving, + Importing, + /// The last operation failed; `reason` says why, for the user. + Failed { reason: String }, +} + +fn unsigned(signer: &dyn IdentitySigner, kind: u16, content: String, tags: Vec, created_at: u64) -> Result { + let author = PublicKey::from_hex(&signer.pubkey_hex()).map_err(|e| e.to_string())?; + let mut event = EventBuilder::new(Kind::Custom(kind), content) + .tags(tags) + .custom_created_at(Timestamp::from(created_at)) + .build(author); + event.ensure_id(); + Ok(event) +} + +/// `backup` as a signed event, dated `created_at` (seconds): its content +/// encrypted to the identity itself. +pub async fn seal_backup(signer: &dyn IdentitySigner, backup: &ConfigBackup, created_at: u64) -> Result { + let me = signer.pubkey_hex(); + let content = signer + .nip44_encrypt(&me, &encode_backup(backup)) + .await + .map_err(|e| format!("The backup could not be encrypted: {e}"))?; + let tags = vec![Tag::identifier(backup_d_tag(&me))]; + let event = unsigned(signer, BACKUP_KIND, content, tags, created_at)?; + let signed = sign(signer, event).await.map_err(|e| format!("The backup could not be signed: {e}"))?; + Ok(SignedEvent::from_nostr(&signed)) +} + +/// The backup `event` holds. Only one the identity wrote to itself opens. +pub async fn open_backup(signer: &dyn IdentitySigner, event: &NostrEvent) -> Result { + let me = signer.pubkey_hex(); + if event.kind != BACKUP_KIND || !event.pubkey.eq_ignore_ascii_case(&me) { + return Err("The backup could not be read.".into()); + } + let plaintext = signer + .nip44_decrypt(&me, &event.content) + .await + .map_err(|_| "The backup could not be decrypted with this key.".to_string())?; + decode_backup(&plaintext) +} + +/// The newest of `events` that could be the identity's backup. +pub fn newest_backup<'a>(events: &'a [NostrEvent], me: &str) -> Option<&'a NostrEvent> { + events + .iter() + .filter(|e| e.kind == BACKUP_KIND && e.pubkey.eq_ignore_ascii_case(me)) + .max_by_key(|e| e.created_at) +} + +/// A NIP-09 deletion of the identity's backup, dated `created_at`. +pub async fn seal_deletion(signer: &dyn IdentitySigner, created_at: u64) -> Result { + let me = signer.pubkey_hex(); + let tags = vec![ + Tag::custom(TagKind::a(), [backup_address(&me)]), + Tag::custom(TagKind::k(), [BACKUP_KIND.to_string()]), + ]; + let event = unsigned(signer, DELETION_KIND, String::new(), tags, created_at)?; + let signed = sign(signer, event).await.map_err(|e| e.to_string())?; + Ok(SignedEvent::from_nostr(&signed)) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::signer::LocalSigner; + use client_core::stores::machines::{MachinesState, MergeOptions}; + use client_core::stores::quick_prompts::QuickPrompt; + use client_core::stores::settings::default_settings; + use protocol::crypto::generate_keypair; + use std::collections::BTreeMap; + + const MACHINE: &str = "4f3c2b1a09f8e7d6c5b4a3928170615f4e3d2c1b0a9f8e7d6c5b4a3928170615"; + + fn backup() -> ConfigBackup { + let mut machines = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + machines.register_machine(MACHINE, "my laptop", Some("Secret lab".into()), None, &["wss://private.relay".to_string()]); + let prompts = [QuickPrompt { id: "q".into(), label: "Deploy".into(), text: "ship it".into() }]; + client_core::stores::backup::build_backup(&machines, &default_settings(), &prompts, 42) + } + + fn as_received(e: &SignedEvent) -> NostrEvent { + NostrEvent { id: e.id.clone(), kind: e.kind, created_at: e.created_at as i64, pubkey: e.pubkey.clone(), content: e.content.clone() } + } + + #[tokio::test] + async fn a_sealed_backup_shows_nothing_of_what_is_in_it_and_only_its_identity_opens_it() { + let me = LocalSigner(generate_keypair()); + let event = seal_backup(&me, &backup(), 1_000).await.unwrap(); + assert_eq!(event.kind, BACKUP_KIND); + assert_eq!(event.created_at, 1_000); + // The only tag is the opaque d tag. + assert_eq!(event.tags, vec![vec!["d".to_string(), backup_d_tag(&me.pubkey_hex())]]); + let wire = serde_json::to_string(&event).unwrap(); + // Each has a space or a dot, or is long: none can turn up by chance in + // base64 ciphertext or a hex id. + for secret in ["Secret lab", "private.relay", "my laptop", "ship it", MACHINE] { + assert!(!wire.contains(secret), "{secret} is readable in {wire}"); + } + assert_eq!(open_backup(&me, &as_received(&event)).await.unwrap(), backup()); + + // Another identity cannot read it, even handed the event as its own. + let other = LocalSigner(generate_keypair()); + let mut stolen = as_received(&event); + assert!(open_backup(&other, &stolen).await.is_err()); + stolen.pubkey = other.pubkey_hex(); + assert!(open_backup(&other, &stolen).await.is_err()); + } + + #[tokio::test] + async fn the_newest_backup_is_the_one_taken() { + let me = LocalSigner(generate_keypair()); + let old = as_received(&seal_backup(&me, &backup(), 1).await.unwrap()); + let new = as_received(&seal_backup(&me, &backup(), 2).await.unwrap()); + let events = [old, new.clone()]; + assert_eq!(newest_backup(&events, &me.pubkey_hex()), Some(&new)); + assert_eq!(newest_backup(&events, "someone-else"), None); + } + + #[tokio::test] + async fn a_deletion_names_the_backup_by_its_address() { + let me = LocalSigner(generate_keypair()); + let event = seal_deletion(&me, 5).await.unwrap(); + assert_eq!(event.kind, DELETION_KIND); + assert!(event.tags.contains(&vec!["a".to_string(), backup_address(&me.pubkey_hex())])); + assert!(event.tags.contains(&vec!["k".to_string(), "30078".to_string()])); + } +} diff --git a/crates/client-runtime/src/intent.rs b/crates/client-runtime/src/intent.rs index 8d6b0918..73755a4e 100644 --- a/crates/client-runtime/src/intent.rs +++ b/crates/client-runtime/src/intent.rs @@ -383,6 +383,20 @@ pub enum Intent { SetUiScale(f64), SetShowUsageBadge(bool), SetShowCommitBadge(bool), + + // --- config backup (the loop's, see `runtime::backup`) --- + /// Turn the backup on with this relay (or move it there), then look for + /// a backup already on it. + SetBackupRelay(String), + /// Merge the backup found on the relay into this phone. + ImportBackup, + /// Leave the backup found on the relay and save this phone's over it. + KeepLocalConfig, + /// Save the backup now. + BackupNow, + /// Turn the backup off; `delete` also asks the relay to delete it. + DisableBackup { delete: bool }, + AddQuickPrompt { id: String, label: String, @@ -864,6 +878,12 @@ pub fn apply( stores.settings.set_show_commit_badge(on); r.persist(StoreId::Settings); } + // Taken by the loop before the stores see an intent. + Intent::SetBackupRelay(_) + | Intent::ImportBackup + | Intent::KeepLocalConfig + | Intent::BackupNow + | Intent::DisableBackup { .. } => {} Intent::AddQuickPrompt { id, label, text } => { if stores.quick_prompts.add_prompt(&id, &label, &text) { r.persist(StoreId::QuickPrompts); diff --git a/crates/client-runtime/src/lib.rs b/crates/client-runtime/src/lib.rs index af6e2158..13b0b4ed 100644 --- a/crates/client-runtime/src/lib.rs +++ b/crates/client-runtime/src/lib.rs @@ -20,6 +20,7 @@ uniffi::setup_scaffolding!(); pub mod attachments; +pub mod backup; pub mod deadline; pub mod dispatch; pub mod intent; @@ -44,7 +45,7 @@ pub use intent::{Intent, IntentCtx, SessionFileSend}; pub use ports::{Kv, MemoryKv, MemoryTranscriptStore, Notifier, NullNotifier, SessionKeyStore, TranscriptStore}; pub use stores::{CoreStores, HydratedCore}; pub use view::{ - ConnectionView, MachinesView, OutboxView, PairingView, + BackupView, ConnectionView, MachinesView, OutboxView, PairingView, PendingSessionsView, QuickPromptsView, SettingsView, TranscriptRowsView, TranscriptRowView, TranscriptSyncView, UiView, }; diff --git a/crates/client-runtime/src/runtime.rs b/crates/client-runtime/src/runtime.rs index 4a63082a..62d0fec6 100644 --- a/crates/client-runtime/src/runtime.rs +++ b/crates/client-runtime/src/runtime.rs @@ -47,6 +47,7 @@ use crate::ports::{ }; use crate::signer::{Cipher, IdentityAuth, IdentitySigner, PhoneKeys, SignerError}; use crate::stores::{hydrate, CoreStores, Persister, StoresConfig}; +use client_core::stores::backup::ConfigBackup; use crate::transport::ws::{WsConfig, WsTransport, PING_EVERY, PUBLISH_CONFIRM_ATTEMPTS, PUBLISH_CONFIRM_BUDGET}; use crate::view::{ ConnectionView, MachinesView, OutboxView, PairingView, @@ -424,6 +425,9 @@ impl Core { last_connected_relays: Vec::new(), pair_timer: None, undo_timer: None, + backup_timer: None, + backup_busy: false, + backup_created_at: 0, machines_dirty: false, stored_seen_dirty: None, flush_timer: None, @@ -699,6 +703,15 @@ enum Msg { }, /// A bridge's direct link delivered an event. DirectEvent(NostrEvent), + /// Time to save the config backup. + BackupDue, + /// A look on the backup relay finished. + BackupFetched(backup::Fetched), + /// A backup save finished: when it was made and what it held, or why + /// it failed. + BackupSaved(Result<(u64, String), String>), + /// The backup's deletion was sent (or given up on). + BackupDeleted, /// A machine's direct link came up on an endpoint, or went down. DirectState { machine: String, @@ -721,6 +734,22 @@ enum SignerJob { }, /// Decrypt a message the session key could not. Decrypt(NostrEvent), + /// Open the identity's config backup. + OpenBackup { + event: NostrEvent, + reply: oneshot::Sender>, + }, + /// Seal the config backup into a signed event. + SealBackup { + backup: Box, + created_at: u64, + reply: oneshot::Sender>, + }, + /// Sign the deletion of the config backup. + SealDeletion { + created_at: u64, + reply: oneshot::Sender>, + }, } async fn run_signer( @@ -740,6 +769,19 @@ async fn run_signer( plaintext: signer.nip44_decrypt(&event.pubkey, &event.content).await, event, }, + // The backup's own task waits for these. + SignerJob::OpenBackup { event, reply } => { + let _ = reply.send(crate::backup::open_backup(signer.as_ref(), &event).await); + continue; + } + SignerJob::SealBackup { backup, created_at, reply } => { + let _ = reply.send(crate::backup::seal_backup(signer.as_ref(), &backup, created_at).await); + continue; + } + SignerJob::SealDeletion { created_at, reply } => { + let _ = reply.send(crate::backup::seal_deletion(signer.as_ref(), created_at).await); + continue; + } }; if tx.send(msg).is_err() { return; @@ -849,6 +891,12 @@ struct Loop { pair_timer: Option, /// The delete-controller's 4 s undo window. undo_timer: Option, + /// The pending config backup save (see `runtime::backup`). + backup_timer: Option, + /// A backup look, save or deletion is under way. + backup_busy: bool, + /// The `created_at` (s) of the last backup event made. + backup_created_at: u64, /// The machines store changed since it was last written. machines_dirty: bool, /// A stored-event cursor not written yet. @@ -1009,6 +1057,10 @@ impl Loop { } Msg::CommandSigned { machine, event, reply, outbox_id } => self.publish_built(&machine, event, reply, outbox_id), Msg::DirectEvent(event) => self.nostr.deliver(&event), + Msg::BackupDue => self.on_backup_due(), + Msg::BackupFetched(found) => self.on_backup_fetched(found), + Msg::BackupSaved(saved) => self.on_backup_saved(saved).await, + Msg::BackupDeleted => self.forget_backup_relay().await, Msg::DirectState { machine, endpoint } => { let changed = match endpoint { Some(endpoint) => self.links_up.insert(machine, endpoint.clone()) != Some(endpoint), @@ -1412,6 +1464,10 @@ impl Loop { } async fn persist_store(&mut self, id: StoreId) { + // What these hold goes in the config backup. + if id != StoreId::Outbox { + self.backup_changed(); + } let p = Persister::new(self.kv.as_ref()); match id { StoreId::Machines => { @@ -1483,6 +1539,7 @@ impl Loop { reply: oneshot::Sender<()>, ) -> Option> { let mut reply = Some(reply); + let Some(intent) = self.on_backup_intent(intent).await else { return reply }; // A pairing grants the current key: never one about to be replaced. self.rotate_session_key_if_due().await; let ctx = IntentCtx { @@ -2113,5 +2170,6 @@ fn egress_detail(err: &EgressError) -> String { } } +mod backup; #[cfg(test)] mod tests; diff --git a/crates/client-runtime/src/runtime/backup.rs b/crates/client-runtime/src/runtime/backup.rs new file mode 100644 index 00000000..af048f04 --- /dev/null +++ b/crates/client-runtime/src/runtime/backup.rs @@ -0,0 +1,302 @@ +//! The loop's side of the config backup: when to look for one, when to save +//! one, importing and turning it off. The events themselves are +//! `crate::backup`'s; the payload is `client_core::stores::backup`'s. +//! +//! A backup is saved a while after the last change worth backing up (a +//! paired machine, the settings, the quick prompts), and only when what it +//! holds changed. Nothing is saved while a backup found on the relay waits +//! for the user to import it or keep this phone's, so a new phone never +//! overwrites the backup it is about to restore. + +use std::cell::RefCell; +use std::rc::Rc; +use std::time::Duration; + +use client_core::stores::backup::{backup_d_tag, backup_fingerprint, build_backup, merge_backup, ConfigBackup, BACKUP_KIND}; +use client_core::stores::pairing::is_relay_url; +use nostr_transport::{Filter, SubCallbacks, Transport}; +use tokio::sync::oneshot; + +use super::{abort, Loop, Msg, SignerJob}; +use crate::backup::{newest_backup, BackupStatus}; +use crate::dispatch::StoreId; +use crate::intent::Intent; +use crate::nostr_client::NostrEvent; +use crate::stores::Persister; +use crate::transport::ws::{WsTransport, PUBLISH_CONFIRM_ATTEMPTS, PUBLISH_CONFIRM_BUDGET}; +use super::SliceId; + +/// How long after the last change a backup is saved: a burst of edits (or +/// the heartbeats a pairing brings) costs one event. +const SAVE_AFTER: Duration = Duration::from_secs(30); +/// How long to wait for the backup relay to come up before looking on it. +const RELAY_WAIT: Duration = Duration::from_secs(20); +/// How long a look on the relay may take once it is up. +const FETCH_BUDGET: Duration = Duration::from_secs(15); + +/// What a look on the relay found. +pub(super) type Fetched = Result, String>; + +impl Loop { + /// Take a backup intent; any other comes back for the stores. + pub(super) async fn on_backup_intent(&mut self, intent: Intent) -> Option { + match intent { + Intent::SetBackupRelay(url) => self.set_backup_relay(url.trim()).await, + Intent::ImportBackup => self.import_backup().await, + Intent::KeepLocalConfig => { + if self.stores.backup.found.take().is_some() { + self.save_backup(true); + } + } + Intent::BackupNow => self.save_backup(true), + Intent::DisableBackup { delete } => self.disable_backup(delete).await, + other => return Some(other), + } + self.state_changed(SliceId::Settings); + None + } + + async fn set_backup_relay(&mut self, relay: &str) { + if !is_relay_url(relay) { + self.stores.backup.status = + BackupStatus::Failed { reason: "Enter a relay address that starts with wss://.".into() }; + return; + } + abort(&mut self.backup_timer); + let backup = &mut self.stores.backup; + backup.config.relay = Some(relay.to_string()); + backup.config.saved_at = None; + backup.config.fingerprint = None; + backup.found = None; + Persister::new(self.kv.as_ref()).save_backup(&self.stores.backup).await; + self.sync_relays(); + self.fetch_backup(); + } + + /// Look on the backup relay for this identity's backup. + fn fetch_backup(&mut self) { + let Some(relay) = self.stores.backup.config.relay.clone() else { return }; + self.backup_busy = true; + self.stores.backup.status = BackupStatus::Checking; + let ws = self.ws.clone(); + let me = self.signer.pubkey_hex(); + let jobs = self.signer_jobs.clone(); + let tx = self.self_tx.clone(); + tokio::task::spawn_local(async move { + let found = match fetch_event(&ws, &relay, &me).await { + Ok(None) => Ok(None), + Ok(Some(event)) => { + let (reply, answer) = oneshot::channel(); + let _ = jobs.send(SignerJob::OpenBackup { event, reply }); + answer.await.unwrap_or_else(|_| Err("The backup could not be read.".into())).map(Some) + } + Err(reason) => Err(reason), + }; + let _ = tx.send(Msg::BackupFetched(found)); + }); + } + + pub(super) fn on_backup_fetched(&mut self, found: Fetched) { + self.backup_busy = false; + match found { + Ok(Some(backup)) => { + self.stores.backup.status = BackupStatus::Found { + saved_at: backup.saved_at, + machines: backup.machines.len() as u32, + }; + self.stores.backup.found = Some(backup); + } + // Nothing there yet: this phone's is the first. + Ok(None) => { + self.stores.backup.status = BackupStatus::Idle; + self.save_backup(true); + } + Err(reason) => self.stores.backup.status = BackupStatus::Failed { reason }, + } + self.state_changed(SliceId::Settings); + } + + async fn import_backup(&mut self) { + let Some(backup) = self.stores.backup.found.take() else { return }; + self.stores.backup.status = BackupStatus::Importing; + let tor_before = self.stores.settings.data.tor_proxy_enabled; + let stores = &mut self.stores; + let summary = merge_backup(&backup, &mut stores.machines, &mut stores.settings, &mut stores.quick_prompts); + log::info!("backup: imported ({} machines added, {} kept)", summary.added, summary.kept); + for id in [StoreId::Machines, StoreId::Settings, StoreId::QuickPrompts] { + self.persist_store(id).await; + self.state_changed(super::slice_of(id)); + } + self.flush_writes().await; + let tor = self.stores.settings.data.tor_proxy_enabled; + if tor != tor_before { + let proxy = if tor { self.tor_proxy_address.clone() } else { None }; + self.nostr.set_proxy(proxy.clone()); + self.http.set_proxy(proxy.as_deref()); + } + self.sync_relays(); + self.refresh_authors(); + self.sync_direct_links(); + self.stores.backup.status = BackupStatus::Idle; + // What the phone has now: the backup, plus anything it kept. + self.save_backup(false); + } + + async fn disable_backup(&mut self, delete: bool) { + abort(&mut self.backup_timer); + self.stores.backup.found = None; + match self.stores.backup.config.relay.clone() { + Some(relay) if delete => { + self.backup_busy = true; + self.stores.backup.status = BackupStatus::Saving; + let ws = self.ws.clone(); + let jobs = self.signer_jobs.clone(); + let tx = self.self_tx.clone(); + let created_at = self.next_backup_created_at(); + tokio::task::spawn_local(async move { + let (reply, answer) = oneshot::channel(); + let _ = jobs.send(SignerJob::SealDeletion { created_at, reply }); + if let Ok(Ok(event)) = answer.await { + let result = ws.publish_confirmed_to(&event, &[relay], PUBLISH_CONFIRM_BUDGET, PUBLISH_CONFIRM_ATTEMPTS).await; + if !result.verdict.is_delivered() { + log::warn!("backup: deletion not delivered: {:?} {:?}", result.verdict, result.detail); + } + } + let _ = tx.send(Msg::BackupDeleted); + }); + } + _ => self.forget_backup_relay().await, + } + } + + pub(super) async fn forget_backup_relay(&mut self) { + self.backup_busy = false; + let backup = &mut self.stores.backup; + backup.config = Default::default(); + backup.status = BackupStatus::Idle; + Persister::new(self.kv.as_ref()).save_backup(&self.stores.backup).await; + self.sync_relays(); + self.state_changed(SliceId::Settings); + } + + /// Something worth backing up changed: save in a while. + pub(super) fn backup_changed(&mut self) { + if self.stores.backup.config.relay.is_some() && self.backup_timer.is_none() { + self.backup_timer = Some(self.arm(SAVE_AFTER.as_millis() as u64, Msg::BackupDue)); + } + } + + pub(super) fn on_backup_due(&mut self) { + self.backup_timer = None; + self.save_backup(false); + self.state_changed(SliceId::Settings); + } + + /// Save the backup now, unless `force` is off and it holds what was last + /// saved. Never while a found backup waits on the user, or another + /// operation runs (a change meanwhile arms the next save). + fn save_backup(&mut self, force: bool) { + let Some(relay) = self.stores.backup.config.relay.clone() else { return }; + if self.backup_busy || self.stores.backup.found.is_some() { + return; + } + let now = self.clock.now_ms(); + let backup = build_backup(&self.stores.machines, &self.stores.settings.data, &self.stores.quick_prompts.prompts, now); + let fingerprint = backup_fingerprint(&backup); + if !force && self.stores.backup.config.fingerprint.as_deref() == Some(fingerprint.as_str()) { + return; + } + self.backup_busy = true; + self.stores.backup.status = BackupStatus::Saving; + let created_at = self.next_backup_created_at(); + let ws = self.ws.clone(); + let jobs = self.signer_jobs.clone(); + let tx = self.self_tx.clone(); + tokio::task::spawn_local(async move { + let (reply, answer) = oneshot::channel(); + let _ = jobs.send(SignerJob::SealBackup { backup: Box::new(backup), created_at, reply }); + let saved = match answer.await.unwrap_or_else(|_| Err("The backup could not be sealed.".into())) { + Ok(event) => { + let result = ws.publish_confirmed_to(&event, &[relay], PUBLISH_CONFIRM_BUDGET, PUBLISH_CONFIRM_ATTEMPTS).await; + if result.verdict.is_delivered() { + Ok((now, fingerprint)) + } else { + Err(match result.detail { + Some(detail) => format!("The relay did not take the backup: {detail}"), + None => "The backup relay could not be reached.".into(), + }) + } + } + Err(reason) => Err(reason), + }; + let _ = tx.send(Msg::BackupSaved(saved)); + }); + } + + pub(super) async fn on_backup_saved(&mut self, saved: Result<(u64, String), String>) { + self.backup_busy = false; + match saved { + Ok((at, fingerprint)) => { + self.stores.backup.config.saved_at = Some(at); + self.stores.backup.config.fingerprint = Some(fingerprint); + self.stores.backup.status = BackupStatus::Idle; + Persister::new(self.kv.as_ref()).save_backup(&self.stores.backup).await; + } + Err(reason) => { + log::warn!("backup: {reason}"); + self.stores.backup.status = BackupStatus::Failed { reason }; + } + } + self.state_changed(SliceId::Settings); + } + + /// A relay keeps the newest backup and, between two of the same second, + /// the one with the lower id: each one is dated past the last. + fn next_backup_created_at(&mut self) -> u64 { + let at = (self.clock.now_ms() / 1000).max(self.backup_created_at + 1); + self.backup_created_at = at; + at + } +} + +/// The identity's newest backup on `relay`, once the relay is up. +async fn fetch_event(ws: &WsTransport, relay: &str, me: &str) -> Result, String> { + let deadline = tokio::time::Instant::now() + RELAY_WAIT; + while !ws.connected_relays().contains(relay) { + if tokio::time::Instant::now() >= deadline { + return Err("The backup relay could not be reached.".into()); + } + tokio::time::sleep(Duration::from_millis(200)).await; + } + let events: Rc>> = Rc::default(); + let (done, ended) = oneshot::channel::<()>(); + let done = Rc::new(RefCell::new(Some(done))); + let collected = Rc::clone(&events); + let (eose, closed) = (Rc::clone(&done), Rc::clone(&done)); + let sub = ws.subscribe( + Filter { + kinds: vec![BACKUP_KIND], + authors: vec![me.to_string()], + p_tags: vec![], + d_tags: vec![backup_d_tag(me)], + since: None, + }, + SubCallbacks { + on_event: Rc::new(move |e: &NostrEvent| collected.borrow_mut().push(e.clone())), + on_eose: Rc::new(move || { + if let Some(done) = eose.borrow_mut().take() { + let _ = done.send(()); + } + }), + on_close: Rc::new(move |_| { + closed.borrow_mut().take(); + }), + }, + ); + let answered = tokio::time::timeout(FETCH_BUDGET, ended).await; + sub.close(); + match answered { + Ok(Ok(())) => Ok(newest_backup(&events.borrow(), me).cloned()), + _ => Err("The backup relay did not answer.".into()), + } +} diff --git a/crates/client-runtime/src/runtime/tests.rs b/crates/client-runtime/src/runtime/tests.rs index 6ec6b880..32aa2642 100644 --- a/crates/client-runtime/src/runtime/tests.rs +++ b/crates/client-runtime/src/runtime/tests.rs @@ -2236,3 +2236,101 @@ fn core_event_json_shape_is_externally_tagged_camel_case() { serde_json::json!({ "actionFailed": { "kind": "publishRejected" } }), ); } + +/// The next frame of `kind` (`REQ`, `EVENT`, …), skipping the others. +async fn next_frame_of(mock: &mut MockRelay, kind: &str) -> Vec { + for _ in 0..20 { + let frame = mock.next_frame().await; + let v: Vec = serde_json::from_str(&frame).unwrap(); + if v[0] == kind { + return v; + } + } + panic!("no {kind} frame"); +} + +/// The backup look's REQ: answered with `events` then EOSE. +async fn answer_backup_req(mock: &mut MockRelay, me: &str, events: &[serde_json::Value]) { + loop { + let req = next_frame_of(mock, "REQ").await; + let sub = req[1].as_str().unwrap().to_string(); + if req[2]["#d"].is_array() { + assert_eq!(req[2]["kinds"], serde_json::json!([30078])); + assert_eq!(req[2]["authors"], serde_json::json!([me])); + for e in events { + mock.push(serde_json::json!(["EVENT", sub, e]).to_string()); + } + mock.push(format!(r#"["EOSE","{sub}"]"#)); + return; + } + mock.push(format!(r#"["EOSE","{sub}"]"#)); + } +} + +async fn settings_backup(core: &Core) -> crate::view::BackupView { + core.settings_view().await.unwrap().backup +} + +#[tokio::test] +async fn a_backup_saved_by_one_phone_restores_the_machines_on_another() { + LocalSet::new() + .run_until(async { + let phone = keypair_from_secret_hex(SEC_PHONE).unwrap(); + let machine = generate_keypair(); + + // The old phone, paired with a machine, turns the backup on. + let mut first = mock_relay().await; + let mut state = client_core::stores::machines::MachinesState::default(); + // Names with spaces: base64 ciphertext can never contain them by chance. + state.register_machine(&machine.pubkey_hex, "my laptop", Some("Work lab".into()), None, &[first.url.clone()]); + let kv = MemoryKv::seeded([( + crate::stores::MACHINES_KEY, + client_core::stores::machines::serialize_machines(&state.machines), + )]); + let old = core_for_ports(&first, &phone, Rc::new(Spy::default()), CorePorts { kv: Rc::new(kv), ..CorePorts::default() }).await; + old.start(); + old.dispatch(Intent::SetBackupRelay(first.url.clone())).await; + // Nothing on the relay yet: this phone's is saved. + answer_backup_req(&mut first, &phone.pubkey_hex, &[]).await; + let event = next_frame_of(&mut first, "EVENT").await[1].clone(); + assert_eq!(event["kind"], 30078); + let wire = event.to_string(); + assert!(!wire.contains("my laptop") && !wire.contains("Work lab") && !wire.contains(&machine.pubkey_hex)); + first.push(serde_json::json!(["OK", event["id"], true, ""]).to_string()); + settle().await; + let saved = settings_backup(&old).await; + assert_eq!(saved.relay.as_deref(), Some(first.url.as_str())); + assert!(saved.saved_at.is_some()); + + // A fresh phone with the same identity finds it and imports it. + let mut second = mock_relay().await; + let new = core_for(&second, &phone, Rc::new(Spy::default())).await; + new.start(); + new.dispatch(Intent::SetBackupRelay(second.url.clone())).await; + answer_backup_req(&mut second, &phone.pubkey_hex, &[event]).await; + settle().await; + assert!(matches!(settings_backup(&new).await.status, crate::backup::BackupStatus::Found { machines: 1, .. })); + assert!(new.machines_view().await.machines.is_empty(), "nothing is imported before the user says so"); + + new.dispatch(Intent::ImportBackup).await; + let machines = new.machines_view().await.machines; + let restored = &machines[&machine.pubkey_hex]; + assert_eq!((restored.label.as_deref(), restored.relays.clone()), (Some("Work lab"), vec![first.url.clone()])); + }) + .await; +} + +#[tokio::test] +async fn a_relay_address_the_phone_may_not_dial_is_refused() { + LocalSet::new() + .run_until(async { + let mock = mock_relay().await; + let phone = keypair_from_secret_hex(SEC_PHONE).unwrap(); + let core = core_for(&mock, &phone, Rc::new(Spy::default())).await; + core.dispatch(Intent::SetBackupRelay("ws://plain.example".into())).await; + let backup = settings_backup(&core).await; + assert_eq!(backup.relay, None); + assert!(matches!(backup.status, crate::backup::BackupStatus::Failed { .. })); + }) + .await; +} diff --git a/crates/client-runtime/src/stores.rs b/crates/client-runtime/src/stores.rs index 18a8b87c..55fd6874 100644 --- a/crates/client-runtime/src/stores.rs +++ b/crates/client-runtime/src/stores.rs @@ -18,7 +18,10 @@ use client_core::stores::pending_sessions::PendingSessionsState; use client_core::stores::quick_prompts::{ hydrate_quick_prompts, serialize_quick_prompts, QuickPromptsState, QUICK_PROMPTS_STORAGE_KEY, }; +use client_core::stores::backup::{hydrate_backup_config, serialize_backup_config, BackupConfig, ConfigBackup, BACKUP_STORAGE_KEY}; use client_core::stores::settings::{hydrate_settings, serialize_settings, SettingsState}; + +use crate::backup::BackupStatus; use client_core::stores::transcript::TranscriptState; use client_core::stores::ui::UiState; @@ -31,6 +34,8 @@ pub const DISMISSED_SESSIONS_KEY: &str = "machines.dismissed"; pub const OUTBOX_KEY: &str = "outbox"; pub const SETTINGS_KEY: &str = "settings"; pub const QUICK_PROMPTS_KEY: &str = QUICK_PROMPTS_STORAGE_KEY; +/// The config backup's relay and what was last saved there. +pub const BACKUP_KEY: &str = BACKUP_STORAGE_KEY; /// The session keys, when the host keeps them in the KV (see /// [`crate::ports::KvSessionKeyStore`]). pub const SESSION_KEYS_KEY: &str = "session.keys"; @@ -41,6 +46,16 @@ pub const OLD_SESSION_KEY_KEY: &str = "session.secretKey"; /// resumes its since-window. pub const LAST_STORED_SEEN_KEY: &str = "client.lastStoredSeen"; +/// The config backup: its relay (persisted), where the current operation +/// stands, and a backup found on the relay the user has not decided on yet +/// (in memory only, never written down). +#[derive(Debug, Clone, Default, PartialEq)] +pub struct BackupState { + pub config: BackupConfig, + pub status: BackupStatus, + pub found: Option, +} + /// Boot options for the store bundle. #[derive(Debug, Clone, Default)] pub struct StoresConfig { @@ -58,6 +73,7 @@ pub struct CoreStores { pub pairing: PairingState, pub settings: SettingsState, pub quick_prompts: QuickPromptsState, + pub backup: BackupState, pub ui: UiState, pub notifications: NotificationCoordinator, pub delete_controller: DeleteController, @@ -65,10 +81,13 @@ pub struct CoreStores { impl CoreStores { /// The relays the transport dials: every paired machine's, plus a pairing - /// candidate's, which its pair-request and pair-ack travel over. + /// candidate's, which its pair-request and pair-ack travel over, plus the + /// config backup's. Dialled like the others, so through Tor when it is + /// on, and answering the relay's AUTH with the identity. pub fn relay_set(&self) -> Vec { let mut relays = self.machines.relay_set(); - for relay in self.pairing.candidate.iter().flat_map(|c| &c.relays) { + let candidate = self.pairing.candidate.iter().flat_map(|c| &c.relays); + for relay in candidate.chain(self.backup.config.relay.as_ref()) { if !relays.contains(relay) { relays.push(relay.clone()); } @@ -157,6 +176,10 @@ pub async fn hydrate( config: &StoresConfig, ) -> HydratedCore { let settings = SettingsState::new(hydrate_settings(kv.get(SETTINGS_KEY).await.as_deref())); + let backup = BackupState { + config: hydrate_backup_config(kv.get(BACKUP_KEY).await.as_deref()), + ..BackupState::default() + }; let quick_prompts = QuickPromptsState::from_hydrated(hydrate_quick_prompts(kv.get(QUICK_PROMPTS_KEY).await.as_deref())); let mut machines = MachinesState::new( @@ -192,6 +215,7 @@ pub async fn hydrate( pairing: PairingState::default(), settings, quick_prompts, + backup, ui: UiState::default(), notifications: NotificationCoordinator::default(), delete_controller: DeleteController::default(), @@ -233,6 +257,10 @@ impl<'a> Persister<'a> { .await; } + pub async fn save_backup(&self, s: &BackupState) { + self.kv.set(BACKUP_KEY, &serialize_backup_config(&s.config)).await; + } + pub async fn save_last_stored_seen(&self, ts: i64) { self.kv.set(LAST_STORED_SEEN_KEY, &ts.to_string()).await; } diff --git a/crates/client-runtime/src/view.rs b/crates/client-runtime/src/view.rs index fc97883d..f60b2487 100644 --- a/crates/client-runtime/src/view.rs +++ b/crates/client-runtime/src/view.rs @@ -110,12 +110,35 @@ impl OutboxView { // --- settings ------------------------------------------------------------ #[derive(Debug, Clone, PartialEq, Serialize, specta::Type)] -#[serde(transparent)] -pub struct SettingsView(pub SettingsData); +#[serde(rename_all = "camelCase")] +pub struct SettingsView { + #[serde(flatten)] + pub data: SettingsData, + pub backup: BackupView, +} + +/// The config backup as the settings page shows it. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, specta::Type)] +#[serde(rename_all = "camelCase")] +pub struct BackupView { + /// `None`: backup is off. + pub relay: Option, + /// When a backup last reached the relay (ms). + #[specta(type = Option)] + pub saved_at: Option, + pub status: crate::backup::BackupStatus, +} impl SettingsView { pub fn from_stores(s: &CoreStores) -> Self { - Self(s.settings.data.clone()) + Self { + data: s.settings.data.clone(), + backup: BackupView { + relay: s.backup.config.relay.clone(), + saved_at: s.backup.config.saved_at, + status: s.backup.status.clone(), + }, + } } } @@ -405,9 +428,10 @@ mod tests { let mv = MachinesView::from_stores(&s); assert_eq!(mv.machines["m"].relays, vec!["wss://extra.example"]); let sv = SettingsView::from_stores(&s); - assert_eq!(sv.0.ui_scale, 1.2); - // transparent — serializes as the bare SettingsData - assert!(serde_json::to_string(&sv).unwrap().starts_with('{')); + assert_eq!(sv.data.ui_scale, 1.2); + assert_eq!(sv.backup.relay, None); + // The settings' own fields stay at the top level. + assert!(serde_json::to_string(&sv).unwrap().contains("\"uiScale\":1.2")); } #[tokio::test] From 05b043222ff4dbfccdf023988c53ef9378066168 Mon Sep 17 00:00:00 2001 From: deymosh Date: Thu, 1 Oct 2026 02:37:23 +0200 Subject: [PATCH 4/7] feat(client-core): carry the session keys in the config backup The backup now holds the phone's session-key ring (secrets and expiries) and each machine's confirmed grant. A restored phone takes them while it has granted none of its own keys, so it reads what its bridges encrypt to those keys right away instead of asking the identity's signer to grant every bridge again. A phone that already granted its own keys keeps them, and a backed-up grant is restored only if it names a live key of the ring the phone ends up with. A session key never signs, so reading it cannot command a bridge, and the backup is NIP-44 encrypted to the identity, which reads every payload anyway. The ring's Debug output shows no secret. A rotation or prune of the ring now also schedules a backup. Co-Authored-By: Claude Code --- crates/client-core/src/stores/backup.rs | 158 ++++++++++++++++--- crates/client-core/src/stores/session_key.rs | 37 ++++- crates/client-runtime/src/backup.rs | 7 +- crates/client-runtime/src/runtime.rs | 18 ++- crates/client-runtime/src/runtime/backup.rs | 17 +- crates/client-runtime/src/runtime/tests.rs | 13 +- 6 files changed, 208 insertions(+), 42 deletions(-) diff --git a/crates/client-core/src/stores/backup.rs b/crates/client-core/src/stores/backup.rs index 41d83eef..2dd94780 100644 --- a/crates/client-core/src/stores/backup.rs +++ b/crates/client-core/src/stores/backup.rs @@ -2,13 +2,20 @@ //! relay the user picks, so a new phone (or a reinstalled one) with the same //! identity picks up where the old one left off. //! -//! A bridge knows a phone by its identity pubkey and a phone mints fresh -//! session keys on its own, so what a restored phone needs is only what the -//! phone alone knows: each paired machine's relays, label, direct endpoints -//! and new-session defaults, the settings and the quick prompts. Everything a -//! bridge re-sends in its heartbeat (sessions, agents, credentials, models, -//! folders) is left out, as are session keys, grants and anything about one -//! device. +//! A bridge knows a phone by its identity pubkey, so what a restored phone +//! needs is only what the phone alone knows: each paired machine's relays, +//! label, direct endpoints and new-session defaults, the settings and the +//! quick prompts. Everything a bridge re-sends in its heartbeat (sessions, +//! agents, credentials, models, folders) is left out, as is anything about +//! one device. +//! +//! The session keys go in too, with each machine's confirmed grant: a +//! restored phone then reads what its bridges encrypt to those keys at once, +//! instead of asking the identity's signer to grant every bridge again. A +//! session key never signs, so whoever reads it can read payloads but never +//! command a bridge; and the backup is readable only with the identity, +//! which reads every payload anyway. The phone adopts the backup's keys only +//! while it has granted none of its own ([`merge_backup`]). //! //! The event is NIP-78 application data: kind [`BACKUP_KIND`], addressable, //! so a relay keeps only the latest one per `d` tag. The `d` tag @@ -27,6 +34,7 @@ use serde::{Deserialize, Serialize}; use super::machines::{AgentDefaults, MachinesState}; use super::pairing::is_relay_url; use super::quick_prompts::{QuickPrompt, QuickPromptsState}; +use super::session_key::{SessionGrant, SessionKeyRing, StoredRing}; use super::settings::{clamp_ui_scale, SettingsData, SettingsState}; use std::collections::BTreeMap; @@ -72,6 +80,9 @@ pub struct BackupMachine { pub default_agent: Option, #[serde(default, skip_serializing_if = "BTreeMap::is_empty")] pub agent_defaults: BTreeMap, + /// The session-key grant this bridge confirmed, if any. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub session_grant: Option, } /// The backup's plaintext. @@ -84,13 +95,23 @@ pub struct ConfigBackup { pub machines: Vec, pub settings: SettingsData, pub quick_prompts: Vec, + /// The phone's session keys, with their secrets and expiries. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub session_keys: Option, } /// The backup of the current state. -pub fn build_backup(machines: &MachinesState, settings: &SettingsData, prompts: &[QuickPrompt], saved_at: u64) -> ConfigBackup { +pub fn build_backup( + machines: &MachinesState, + settings: &SettingsData, + prompts: &[QuickPrompt], + ring: &SessionKeyRing, + saved_at: u64, +) -> ConfigBackup { ConfigBackup { v: BACKUP_VERSION, saved_at, + session_keys: Some(ring.stored()), machines: machines .machines .values() @@ -102,6 +123,7 @@ pub fn build_backup(machines: &MachinesState, settings: &SettingsData, prompts: direct_endpoints: m.direct_endpoints.clone(), default_agent: m.default_agent.clone(), agent_defaults: m.agent_defaults.clone(), + session_grant: m.session_grant.clone(), }) .collect(), settings: settings.clone(), @@ -149,31 +171,56 @@ pub struct ImportSummary { pub added: usize, /// Machines it had, left as they were. pub kept: usize, + /// Whether the phone took the backup's session keys (the host must + /// store the ring again and encrypt under it). + pub adopted_keys: bool, } /// Merge `backup` into the phone: the machines it does not have are added /// (as they were, offline until each bridge is heard from), the ones it has /// keep their own configuration, and the settings and quick prompts become /// the backup's. +/// +/// The backup's session keys replace `ring` only while no bridge holds or +/// awaits a grant of the phone's own (a phone that has granted its keys +/// would otherwise strand those bridges on a key it no longer has), and +/// only if they are still live. A machine then gets back the grant it had +/// confirmed, if it names a live key of the ring the phone ends up with; +/// any other is granted afresh when next heard from. pub fn merge_backup( backup: &ConfigBackup, machines: &mut MachinesState, settings: &mut SettingsState, prompts: &mut QuickPromptsState, + ring: &mut SessionKeyRing, + now_ms: u64, ) -> ImportSummary { let mut summary = ImportSummary::default(); + let granted = machines.machines.values().any(|m| m.session_grant.is_some() || m.session_grant_sent.is_some()); + if !granted { + if let Some(theirs) = backup.session_keys.as_ref().and_then(|s| SessionKeyRing::from_stored(s, now_ms)) { + *ring = theirs; + summary.adopted_keys = true; + } + } for m in &backup.machines { if machines.machine(&m.pubkey_hex).is_some() { summary.kept += 1; - continue; + } else { + machines.register_machine(&m.pubkey_hex, &m.name, m.label.clone(), None, &m.relays); + machines.set_direct_endpoints(&m.pubkey_hex, m.direct_endpoints.clone()); + machines.set_default_agent(&m.pubkey_hex, m.default_agent.clone()); + for (agent, defaults) in &m.agent_defaults { + machines.set_agent_defaults(&m.pubkey_hex, agent, defaults.clone()); + } + summary.added += 1; } - machines.register_machine(&m.pubkey_hex, &m.name, m.label.clone(), None, &m.relays); - machines.set_direct_endpoints(&m.pubkey_hex, m.direct_endpoints.clone()); - machines.set_default_agent(&m.pubkey_hex, m.default_agent.clone()); - for (agent, defaults) in &m.agent_defaults { - machines.set_agent_defaults(&m.pubkey_hex, agent, defaults.clone()); + let grant = m.session_grant.as_ref().filter(|g| g.expires_at > now_ms / 1000 && ring.key(&g.pubkey_hex, now_ms).is_some()); + if let (Some(grant), Some(here)) = (grant, machines.machines.get_mut(&m.pubkey_hex)) { + if here.session_grant.is_none() && here.session_grant_sent.is_none() { + here.session_grant = Some(grant.clone()); + } } - summary.added += 1; } settings.data = backup.settings.clone(); prompts.prompts = backup.quick_prompts.clone(); @@ -215,6 +262,11 @@ mod tests { use crate::stores::settings::default_settings; const ID: &str = "AB12cd"; + const NOW: u64 = 1_700_000_000_000; + + fn ring() -> SessionKeyRing { + SessionKeyRing::load(None, NOW).0 + } fn phone() -> (MachinesState, SettingsState, QuickPromptsState) { let mut machines = MachinesState::new(BTreeMap::new(), MergeOptions::default()); @@ -245,17 +297,18 @@ mod tests { let (mut machines, settings, prompts) = phone(); // A heartbeat's worth of data the bridge would send again. machines.machines.get_mut("m1").unwrap().folders = vec!["repo".into()]; - let backup = build_backup(&machines, &settings.data, &prompts.prompts, 7); + let backup = build_backup(&machines, &settings.data, &prompts.prompts, &ring(), 7); let json = encode_backup(&backup); - assert!(!json.contains("repo") && !json.contains("sessionGrant") && !json.contains("sessions")); + assert!(!json.contains("repo") && !json.contains("sessions")); assert_eq!(decode_backup(&json).unwrap(), backup); } #[test] fn the_fingerprint_ignores_when_it_was_made() { let (machines, settings, prompts) = phone(); - let a = build_backup(&machines, &settings.data, &prompts.prompts, 1); - let b = build_backup(&machines, &settings.data, &prompts.prompts, 2); + let keys = ring(); + let a = build_backup(&machines, &settings.data, &prompts.prompts, &keys, 1); + let b = build_backup(&machines, &settings.data, &prompts.prompts, &keys, 2); assert_eq!(backup_fingerprint(&a), backup_fingerprint(&b)); let mut c = b.clone(); c.quick_prompts.clear(); @@ -265,7 +318,7 @@ mod tests { #[test] fn importing_adds_the_missing_machines_and_keeps_the_ones_the_phone_has() { let (machines, settings, prompts) = phone(); - let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, 1); + let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, &ring(), 1); backup.machines.push(BackupMachine { pubkey_hex: "m2".into(), name: "vps".into(), @@ -274,6 +327,7 @@ mod tests { direct_endpoints: vec![], default_agent: None, agent_defaults: BTreeMap::new(), + session_grant: None, }); // A phone that already has m1, labelled its own way. @@ -282,8 +336,8 @@ mod tests { let mut here_settings = SettingsState::new(default_settings()); let mut here_prompts = QuickPromptsState::default(); - let summary = merge_backup(&backup, &mut here, &mut here_settings, &mut here_prompts); - assert_eq!(summary, ImportSummary { added: 1, kept: 1 }); + let summary = merge_backup(&backup, &mut here, &mut here_settings, &mut here_prompts, &mut ring(), NOW); + assert_eq!(summary, ImportSummary { added: 1, kept: 1, adopted_keys: true }); assert_eq!(here.machine("m1").unwrap().label.as_deref(), Some("Mine")); assert_eq!(here.machine("m2").unwrap().relays, ["wss://relay.two"]); assert!(here_settings.data.tor_proxy_enabled); @@ -291,7 +345,7 @@ mod tests { // Everything a fresh phone gets back. let mut fresh = MachinesState::new(BTreeMap::new(), MergeOptions::default()); - merge_backup(&backup, &mut fresh, &mut SettingsState::default(), &mut QuickPromptsState::default()); + merge_backup(&backup, &mut fresh, &mut SettingsState::default(), &mut QuickPromptsState::default(), &mut ring(), NOW); let m1 = fresh.machine("m1").unwrap(); assert_eq!((m1.label.as_deref(), m1.default_agent.as_deref()), (Some("Work"), Some("opencode"))); assert_eq!(m1.direct_endpoints, ["wss://laptop.tailnet:7447"]); @@ -305,11 +359,67 @@ mod tests { assert!(decode_backup(r#"{"v":99}"#).unwrap_err().contains("newer version")); // A machine with no relay the phone may dial is dropped. let (machines, settings, prompts) = phone(); - let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, 1); + let mut backup = build_backup(&machines, &settings.data, &prompts.prompts, &ring(), 1); backup.machines[0].relays = vec!["http://plain.example".into()]; assert!(decode_backup(&encode_backup(&backup)).unwrap().machines.is_empty()); } + fn grant(key: &SessionKeyRing) -> SessionGrant { + SessionGrant { pubkey_hex: key.current.pubkey_hex().to_string(), expires_at: key.current.expires_at, sent_at: NOW / 1000 } + } + + #[test] + fn a_fresh_phone_takes_the_session_keys_and_the_confirmed_grants() { + let (mut machines, settings, prompts) = phone(); + let theirs = ring(); + machines.machines.get_mut("m1").unwrap().session_grant = Some(grant(&theirs)); + let backup = build_backup(&machines, &settings.data, &prompts.prompts, &theirs, 1); + // The secrets travel only inside the encrypted content, and no Debug shows them. + let secret = theirs.current.keypair.secret_hex(); + assert!(encode_backup(&backup).contains(&secret)); + assert!(!format!("{backup:?}").contains(&secret)); + let backup = decode_backup(&encode_backup(&backup)).unwrap(); + + let mut fresh = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + let mut mine = ring(); + let summary = merge_backup(&backup, &mut fresh, &mut SettingsState::default(), &mut QuickPromptsState::default(), &mut mine, NOW); + assert!(summary.adopted_keys); + assert_eq!(mine.current.keypair.secret_hex(), secret); + assert_eq!(fresh.session_key_of("m1", NOW), Some(theirs.current.pubkey_hex())); + } + + #[test] + fn a_phone_that_granted_its_own_keys_keeps_them() { + let (mut machines, settings, prompts) = phone(); + let theirs = ring(); + machines.machines.get_mut("m1").unwrap().session_grant = Some(grant(&theirs)); + let backup = build_backup(&machines, &settings.data, &prompts.prompts, &theirs, 1); + + let mut here = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + here.register_machine("m0", "desk", None, None, &["wss://relay.local".to_string()]); + let mut mine = ring(); + here.machines.get_mut("m0").unwrap().session_grant_sent = Some(grant(&mine)); + let own = mine.current.pubkey_hex().to_string(); + let summary = merge_backup(&backup, &mut here, &mut SettingsState::default(), &mut QuickPromptsState::default(), &mut mine, NOW); + assert!(!summary.adopted_keys); + assert_eq!(mine.current.pubkey_hex(), own); + // m1's grant names a key this phone does not hold: it is granted afresh. + assert!(here.machine("m1").unwrap().session_grant.is_none()); + } + + #[test] + fn lapsed_session_keys_are_not_taken() { + let (machines, settings, prompts) = phone(); + let theirs = ring(); + let backup = build_backup(&machines, &settings.data, &prompts.prompts, &theirs, 1); + let later = (theirs.current.expires_at + 1) * 1000; + let mut fresh = MachinesState::new(BTreeMap::new(), MergeOptions::default()); + let mut mine = SessionKeyRing::load(None, later).0; + let summary = merge_backup(&backup, &mut fresh, &mut SettingsState::default(), &mut QuickPromptsState::default(), &mut mine, later); + assert!(!summary.adopted_keys); + assert_ne!(mine.current.pubkey_hex(), theirs.current.pubkey_hex()); + } + #[test] fn the_backup_relay_hydrates_tolerantly() { assert_eq!(hydrate_backup_config(None), BackupConfig::default()); diff --git a/crates/client-core/src/stores/session_key.rs b/crates/client-core/src/stores/session_key.rs index 368a013b..ad2b584a 100644 --- a/crates/client-core/src/stores/session_key.rs +++ b/crates/client-core/src/stores/session_key.rs @@ -84,22 +84,32 @@ pub struct SessionKeyRing { pub previous: Option, } -/// The ring as the host stores it. Holds secrets. -#[derive(Serialize, Deserialize)] +/// The ring as the host stores it, and as the config backup carries it. +/// Holds secrets; its `Debug` shows none. +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -struct StoredRing { +pub struct StoredRing { current: StoredKey, - #[serde(default)] + #[serde(default, skip_serializing_if = "Option::is_none")] previous: Option, } -#[derive(Serialize, Deserialize)] +#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct StoredKey { secret_hex: String, expires_at: u64, } +impl std::fmt::Debug for StoredRing { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("StoredRing") + .field("expires_at", &self.current.expires_at) + .field("previous", &self.previous.is_some()) + .finish_non_exhaustive() + } +} + impl StoredKey { fn of(key: &SessionKey) -> Self { Self { secret_hex: key.keypair.secret_hex(), expires_at: key.expires_at } @@ -133,8 +143,21 @@ impl SessionKeyRing { /// The ring as the host stores it. Holds the secrets: keep it wherever /// the host keeps secrets, never in a log. pub fn encode(&self) -> String { - let ring = StoredRing { current: StoredKey::of(&self.current), previous: self.previous.as_ref().map(StoredKey::of) }; - serde_json::to_string(&ring).expect("ring serializes") + serde_json::to_string(&self.stored()).expect("ring serializes") + } + + /// The ring with its secrets, as the config backup carries it. + pub fn stored(&self) -> StoredRing { + StoredRing { current: StoredKey::of(&self.current), previous: self.previous.as_ref().map(StoredKey::of) } + } + + /// The ring a backup carried, if its current key is readable and still + /// live at `now_ms`; a previous key already lapsed is left behind. + pub fn from_stored(stored: &StoredRing, now_ms: u64) -> Option { + let now = now_ms / 1000; + let current = stored.current.key().filter(|k| k.live(now))?; + let previous = stored.previous.as_ref().and_then(StoredKey::key).filter(|k| k.live(now)); + Some(Self { current, previous }) } /// Replace the current key with a fresh one once less than diff --git a/crates/client-runtime/src/backup.rs b/crates/client-runtime/src/backup.rs index dcdac243..2a754ed3 100644 --- a/crates/client-runtime/src/backup.rs +++ b/crates/client-runtime/src/backup.rs @@ -108,12 +108,15 @@ mod tests { use std::collections::BTreeMap; const MACHINE: &str = "4f3c2b1a09f8e7d6c5b4a3928170615f4e3d2c1b0a9f8e7d6c5b4a3928170615"; + const SESSION_SECRET: &str = "7e57000000000000000000000000000000000000000000000000000000000001"; fn backup() -> ConfigBackup { let mut machines = MachinesState::new(BTreeMap::new(), MergeOptions::default()); machines.register_machine(MACHINE, "my laptop", Some("Secret lab".into()), None, &["wss://private.relay".to_string()]); let prompts = [QuickPrompt { id: "q".into(), label: "Deploy".into(), text: "ship it".into() }]; - client_core::stores::backup::build_backup(&machines, &default_settings(), &prompts, 42) + let stored = format!(r#"{{"current":{{"secretHex":"{SESSION_SECRET}","expiresAt":99999999999}}}}"#); + let ring = client_core::stores::session_key::SessionKeyRing::load(Some(&stored), 1_000).0; + client_core::stores::backup::build_backup(&machines, &default_settings(), &prompts, &ring, 42) } fn as_received(e: &SignedEvent) -> NostrEvent { @@ -131,7 +134,7 @@ mod tests { let wire = serde_json::to_string(&event).unwrap(); // Each has a space or a dot, or is long: none can turn up by chance in // base64 ciphertext or a hex id. - for secret in ["Secret lab", "private.relay", "my laptop", "ship it", MACHINE] { + for secret in ["Secret lab", "private.relay", "my laptop", "ship it", MACHINE, SESSION_SECRET] { assert!(!wire.contains(secret), "{secret} is readable in {wire}"); } assert_eq!(open_backup(&me, &as_received(&event)).await.unwrap(), backup()); diff --git a/crates/client-runtime/src/runtime.rs b/crates/client-runtime/src/runtime.rs index 62d0fec6..52da0e75 100644 --- a/crates/client-runtime/src/runtime.rs +++ b/crates/client-runtime/src/runtime.rs @@ -1248,7 +1248,7 @@ impl Loop { self.persist_store(StoreId::Machines).await; if self.session.drop_unused_previous(&self.stores.machines, now) { log::info!("session key: every bridge moved to the new key; the previous one is gone"); - self.key_store.save(&self.session.encode()).await; + self.session_ring_changed().await; } } self.interpret_route(result).await; @@ -1321,10 +1321,20 @@ impl Loop { } log::info!("session key: replaced by a fresh one"); self.session.drop_unused_previous(&self.stores.machines, now); + self.session_ring_changed().await; + } + + /// The session-key ring changed (rotated, pruned, or taken from a + /// backup): store it, grant and encrypt under its current key, and back + /// it up. + pub(super) async fn session_ring_changed(&mut self) { self.key_store.save(&self.session.encode()).await; - self.keys = PhoneKeys::new(&self.keys.identity_pubkey_hex, &self.session.current); - // The old key's grant attempts say nothing about the new one. - self.grant_attempts.clear(); + if self.keys.session_pubkey_hex != self.session.current.pubkey_hex() { + self.keys = PhoneKeys::new(&self.keys.identity_pubkey_hex, &self.session.current); + // The old key's grant attempts say nothing about the new one. + self.grant_attempts.clear(); + } + self.backup_changed(); } fn emit(&self, event: CoreEvent) { diff --git a/crates/client-runtime/src/runtime/backup.rs b/crates/client-runtime/src/runtime/backup.rs index af048f04..0d4672ee 100644 --- a/crates/client-runtime/src/runtime/backup.rs +++ b/crates/client-runtime/src/runtime/backup.rs @@ -120,9 +120,19 @@ impl Loop { let Some(backup) = self.stores.backup.found.take() else { return }; self.stores.backup.status = BackupStatus::Importing; let tor_before = self.stores.settings.data.tor_proxy_enabled; + let now = self.clock.now_ms(); let stores = &mut self.stores; - let summary = merge_backup(&backup, &mut stores.machines, &mut stores.settings, &mut stores.quick_prompts); - log::info!("backup: imported ({} machines added, {} kept)", summary.added, summary.kept); + let summary = + merge_backup(&backup, &mut stores.machines, &mut stores.settings, &mut stores.quick_prompts, &mut self.session, now); + log::info!( + "backup: imported ({} machines added, {} kept, session keys {})", + summary.added, + summary.kept, + if summary.adopted_keys { "taken" } else { "kept" } + ); + if summary.adopted_keys { + self.session_ring_changed().await; + } for id in [StoreId::Machines, StoreId::Settings, StoreId::QuickPrompts] { self.persist_store(id).await; self.state_changed(super::slice_of(id)); @@ -201,7 +211,8 @@ impl Loop { return; } let now = self.clock.now_ms(); - let backup = build_backup(&self.stores.machines, &self.stores.settings.data, &self.stores.quick_prompts.prompts, now); + let backup = + build_backup(&self.stores.machines, &self.stores.settings.data, &self.stores.quick_prompts.prompts, &self.session, now); let fingerprint = backup_fingerprint(&backup); if !force && self.stores.backup.config.fingerprint.as_deref() == Some(fingerprint.as_str()) { return; diff --git a/crates/client-runtime/src/runtime/tests.rs b/crates/client-runtime/src/runtime/tests.rs index 32aa2642..02368479 100644 --- a/crates/client-runtime/src/runtime/tests.rs +++ b/crates/client-runtime/src/runtime/tests.rs @@ -2287,7 +2287,9 @@ async fn a_backup_saved_by_one_phone_restores_the_machines_on_another() { crate::stores::MACHINES_KEY, client_core::stores::machines::serialize_machines(&state.machines), )]); - let old = core_for_ports(&first, &phone, Rc::new(Spy::default()), CorePorts { kv: Rc::new(kv), ..CorePorts::default() }).await; + let old_keys = MemoryKeyStore::default(); + let ports = CorePorts { kv: Rc::new(kv), session_keys: Some(Rc::new(old_keys.clone())), ..CorePorts::default() }; + let old = core_for_ports(&first, &phone, Rc::new(Spy::default()), ports).await; old.start(); old.dispatch(Intent::SetBackupRelay(first.url.clone())).await; // Nothing on the relay yet: this phone's is saved. @@ -2295,7 +2297,9 @@ async fn a_backup_saved_by_one_phone_restores_the_machines_on_another() { let event = next_frame_of(&mut first, "EVENT").await[1].clone(); assert_eq!(event["kind"], 30078); let wire = event.to_string(); + let old_secret = old_keys.ring().current.keypair.secret_hex(); assert!(!wire.contains("my laptop") && !wire.contains("Work lab") && !wire.contains(&machine.pubkey_hex)); + assert!(!wire.contains(&old_secret)); first.push(serde_json::json!(["OK", event["id"], true, ""]).to_string()); settle().await; let saved = settings_backup(&old).await; @@ -2304,8 +2308,11 @@ async fn a_backup_saved_by_one_phone_restores_the_machines_on_another() { // A fresh phone with the same identity finds it and imports it. let mut second = mock_relay().await; - let new = core_for(&second, &phone, Rc::new(Spy::default())).await; + let new_keys = MemoryKeyStore::default(); + let ports = CorePorts { session_keys: Some(Rc::new(new_keys.clone())), ..CorePorts::default() }; + let new = core_for_ports(&second, &phone, Rc::new(Spy::default()), ports).await; new.start(); + assert_ne!(new_keys.ring().current.keypair.secret_hex(), old_secret); new.dispatch(Intent::SetBackupRelay(second.url.clone())).await; answer_backup_req(&mut second, &phone.pubkey_hex, &[event]).await; settle().await; @@ -2316,6 +2323,8 @@ async fn a_backup_saved_by_one_phone_restores_the_machines_on_another() { let machines = new.machines_view().await.machines; let restored = &machines[&machine.pubkey_hex]; assert_eq!((restored.label.as_deref(), restored.relays.clone()), (Some("Work lab"), vec![first.url.clone()])); + // It granted nothing of its own yet, so it takes the old phone's session keys. + assert_eq!(new_keys.ring().current.keypair.secret_hex(), old_secret); }) .await; } From b1080284639da178d4dfad5c8a49be6dcc008444 Mon Sep 17 00:00:00 2001 From: deymosh Date: Thu, 1 Oct 2026 02:50:18 +0200 Subject: [PATCH 5/7] feat(client-ffi): expose the config backup to the host Five intents (set the backup relay, import the backup found on it, keep this phone's configuration instead, back up now, turn it off with an optional deletion), the backup's relay, last save and status in the settings view, and nsec_of for a "show my key" on an on-device login. The Kotlin bindings are regenerated. Co-Authored-By: Claude Code --- .../main/java/uniffi/client_ffi/client_ffi.kt | 344 +++++++++++++++++- .../com/codedeck/plus/ui/DesignFixtures.kt | 3 + crates/client-ffi/src/intent.rs | 21 ++ crates/client-ffi/src/lib.rs | 8 + crates/client-ffi/src/views.rs | 42 +++ crates/protocol/src/crypto.rs | 19 + 6 files changed, 436 insertions(+), 1 deletion(-) diff --git a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt index 2541187e..9e438cc3 100644 --- a/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt +++ b/apps/android/app/src/main/java/uniffi/client_ffi/client_ffi.kt @@ -855,6 +855,8 @@ internal object IntegrityCheckingUniffiLib { ): Int external fun uniffi_client_ffi_checksum_func_is_valid_provider_base_url( ): Int + external fun uniffi_client_ffi_checksum_func_nsec_of( + ): Int external fun uniffi_client_ffi_checksum_func_persisted_tor_proxy_enabled( ): Int external fun uniffi_client_ffi_checksum_func_provider_base_url_error( @@ -1065,6 +1067,8 @@ internal object UniffiLib { ): Byte external fun uniffi_client_ffi_fn_func_is_valid_provider_base_url(`raw`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, ): Byte + external fun uniffi_client_ffi_fn_func_nsec_of(`secretHex`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue external fun uniffi_client_ffi_fn_func_persisted_tor_proxy_enabled(`dbPath`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, ): Byte external fun uniffi_client_ffi_fn_func_provider_base_url_error(uniffi_out_err: UniffiRustCallStatus, @@ -1209,6 +1213,9 @@ private fun uniffiCheckApiChecksums(lib: IntegrityCheckingUniffiLib) { if ((lib.uniffi_client_ffi_checksum_func_is_valid_provider_base_url() and 0xFFFF) != 1205) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if ((lib.uniffi_client_ffi_checksum_func_nsec_of() and 0xFFFF) != 40173) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if ((lib.uniffi_client_ffi_checksum_func_persisted_tor_proxy_enabled() and 0xFFFF) != 37378) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } @@ -4871,6 +4878,58 @@ public object FfiConverterTypeUniffiAvailablePlugin: FfiConverterRustBuffer { + override fun read(buf: ByteBuffer): UniffiBackupView { + return UniffiBackupView( + FfiConverterOptionalString.read(buf), + FfiConverterOptionalULong.read(buf), + FfiConverterTypeUniffiBackupStatus.read(buf), + ) + } + + override fun allocationSize(value: UniffiBackupView) = ( + FfiConverterOptionalString.allocationSize(value.`relay`) + + FfiConverterOptionalULong.allocationSize(value.`savedAt`) + + FfiConverterTypeUniffiBackupStatus.allocationSize(value.`status`) + ) + + override fun write(value: UniffiBackupView, buf: ByteBuffer) { + FfiConverterOptionalString.write(value.`relay`, buf) + FfiConverterOptionalULong.write(value.`savedAt`, buf) + FfiConverterTypeUniffiBackupStatus.write(value.`status`, buf) + } +} + + + /** * A credential's status — the secret itself never crosses. */ @@ -7246,6 +7305,8 @@ data class UniffiSettingsView ( var `showUsageBadge`: kotlin.Boolean , var `showCommitBadge`: kotlin.Boolean + , + var `backup`: UniffiBackupView ){ @@ -7270,6 +7331,7 @@ public object FfiConverterTypeUniffiSettingsView: FfiConverterRustBuffer{ + override fun read(buf: ByteBuffer): UniffiBackupStatus { + return when(buf.getInt()) { + 1 -> UniffiBackupStatus.Idle + 2 -> UniffiBackupStatus.Checking + 3 -> UniffiBackupStatus.Found( + FfiConverterULong.read(buf), + FfiConverterUInt.read(buf), + ) + 4 -> UniffiBackupStatus.Saving + 5 -> UniffiBackupStatus.Importing + 6 -> UniffiBackupStatus.Failed( + FfiConverterString.read(buf), + ) + else -> throw RuntimeException("invalid enum value, something is very wrong!!") + } + } + + override fun allocationSize(value: UniffiBackupStatus): ULong = when(value) { + is UniffiBackupStatus.Idle -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiBackupStatus.Checking -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiBackupStatus.Found -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterULong.allocationSize(value.`savedAt`) + + FfiConverterUInt.allocationSize(value.`machines`) + ) + } + is UniffiBackupStatus.Saving -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiBackupStatus.Importing -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiBackupStatus.Failed -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`reason`) + ) + } + } + + override fun write(value: UniffiBackupStatus, buf: ByteBuffer) { + when(value) { + is UniffiBackupStatus.Idle -> { + buf.putInt(1) + Unit + } + is UniffiBackupStatus.Checking -> { + buf.putInt(2) + Unit + } + is UniffiBackupStatus.Found -> { + buf.putInt(3) + FfiConverterULong.write(value.`savedAt`, buf) + FfiConverterUInt.write(value.`machines`, buf) + Unit + } + is UniffiBackupStatus.Saving -> { + buf.putInt(4) + Unit + } + is UniffiBackupStatus.Importing -> { + buf.putInt(5) + Unit + } + is UniffiBackupStatus.Failed -> { + buf.putInt(6) + FfiConverterString.write(value.`reason`, buf) + Unit + } + }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } + } +} + + + + + /** @@ -8536,6 +8755,50 @@ sealed class UniffiIntent { object ResetPairing : UniffiIntent() + /** + * Turn the config backup on with this relay (`wss://`), and look on it + * for a backup this identity already saved. + */ + data class SetBackupRelay( + val `url`: kotlin.String) : UniffiIntent() + + { + + + companion object + } + + /** + * Merge the backup found on the relay into this phone. + */ + object ImportBackup : UniffiIntent() + + + /** + * Keep this phone's configuration over the backup found on the relay; + * it replaces that backup. + */ + object KeepLocalConfig : UniffiIntent() + + + /** + * Save the backup now, even if nothing changed. + */ + object BackupNow : UniffiIntent() + + + /** + * Turn the backup off; with `delete`, also ask the relay to delete it. + */ + data class DisableBackup( + val `delete`: kotlin.Boolean) : UniffiIntent() + + { + + + companion object + } + @@ -8774,6 +9037,15 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer UniffiIntent.DismissStagedPairing 51 -> UniffiIntent.ResetPairing + 52 -> UniffiIntent.SetBackupRelay( + FfiConverterString.read(buf), + ) + 53 -> UniffiIntent.ImportBackup + 54 -> UniffiIntent.KeepLocalConfig + 55 -> UniffiIntent.BackupNow + 56 -> UniffiIntent.DisableBackup( + FfiConverterBoolean.read(buf), + ) else -> throw RuntimeException("invalid enum value, something is very wrong!!") } } @@ -9208,6 +9480,38 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterString.allocationSize(value.`url`) + ) + } + is UniffiIntent.ImportBackup -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiIntent.KeepLocalConfig -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiIntent.BackupNow -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + ) + } + is UniffiIntent.DisableBackup -> { + // Add the size for the Int that specifies the variant plus the size needed for all fields + ( + 4UL + + FfiConverterBoolean.allocationSize(value.`delete`) + ) + } } override fun write(value: UniffiIntent, buf: ByteBuffer) { @@ -9539,6 +9843,28 @@ public object FfiConverterTypeUniffiIntent : FfiConverterRustBuffer { + buf.putInt(52) + FfiConverterString.write(value.`url`, buf) + Unit + } + is UniffiIntent.ImportBackup -> { + buf.putInt(53) + Unit + } + is UniffiIntent.KeepLocalConfig -> { + buf.putInt(54) + Unit + } + is UniffiIntent.BackupNow -> { + buf.putInt(55) + Unit + } + is UniffiIntent.DisableBackup -> { + buf.putInt(56) + FfiConverterBoolean.write(value.`delete`, buf) + Unit + } }.let { /* this makes the `when` an expression, which ensures it is exhaustive */ } } } @@ -11649,6 +11975,22 @@ public object FfiConverterMapStringSequenceString: FfiConverterRustBuffer + UniffiLib.uniffi_client_ffi_fn_func_nsec_of( + + + FfiConverterString.lower(`secretHex`),_status) +} + ) + } + + /** * Whether Orbot routing was on when settings were last saved, for * [`Core::new`]'s `tor` argument. Pure read, safe before any `Core` exists: diff --git a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignFixtures.kt b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignFixtures.kt index a196a84f..fc40afcd 100644 --- a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignFixtures.kt +++ b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignFixtures.kt @@ -19,6 +19,8 @@ import uniffi.client_ffi.UniffiAgentDefaults import uniffi.client_ffi.UniffiAgentModels import uniffi.client_ffi.UniffiAgentPlugins import uniffi.client_ffi.UniffiAvailablePlugin +import uniffi.client_ffi.UniffiBackupStatus +import uniffi.client_ffi.UniffiBackupView import uniffi.client_ffi.UniffiInstalledPlugin import uniffi.client_ffi.UniffiAgentMcp import uniffi.client_ffi.UniffiMcpImport @@ -188,6 +190,7 @@ internal object DesignFixtures { val settings = UniffiSettingsView( uiScale = 1.0, stayConnected = true, torProxyEnabled = false, blossomServer = "", maxUploadBytes = 5_250_000uL, notificationsEnabled = true, showUsageBadge = true, showCommitBadge = true, + backup = UniffiBackupView(relay = null, savedAt = null, status = UniffiBackupStatus.Idle), ) val quickPrompts = listOf( diff --git a/crates/client-ffi/src/intent.rs b/crates/client-ffi/src/intent.rs index 4d440d60..6ac21931 100644 --- a/crates/client-ffi/src/intent.rs +++ b/crates/client-ffi/src/intent.rs @@ -401,6 +401,22 @@ pub enum UniffiIntent { }, DismissStagedPairing, ResetPairing, + /// Turn the config backup on with this relay (`wss://`), and look on it + /// for a backup this identity already saved. + SetBackupRelay { + url: String, + }, + /// Merge the backup found on the relay into this phone. + ImportBackup, + /// Keep this phone's configuration over the backup found on the relay; + /// it replaces that backup. + KeepLocalConfig, + /// Save the backup now, even if nothing changed. + BackupNow, + /// Turn the backup off; with `delete`, also ask the relay to delete it. + DisableBackup { + delete: bool, + }, } #[derive(Debug, thiserror::Error, uniffi::Error)] @@ -573,6 +589,11 @@ impl TryFrom for Intent { UniffiIntent::ConfirmStagedPairing { label } => Intent::ConfirmStagedPairing { label }, UniffiIntent::DismissStagedPairing => Intent::DismissStagedPairing, UniffiIntent::ResetPairing => Intent::ResetPairing, + UniffiIntent::SetBackupRelay { url } => Intent::SetBackupRelay(url), + UniffiIntent::ImportBackup => Intent::ImportBackup, + UniffiIntent::KeepLocalConfig => Intent::KeepLocalConfig, + UniffiIntent::BackupNow => Intent::BackupNow, + UniffiIntent::DisableBackup { delete } => Intent::DisableBackup { delete }, }) } } diff --git a/crates/client-ffi/src/lib.rs b/crates/client-ffi/src/lib.rs index ad697713..e917a478 100644 --- a/crates/client-ffi/src/lib.rs +++ b/crates/client-ffi/src/lib.rs @@ -95,6 +95,14 @@ fn is_relay_url(url: String) -> bool { client_runtime::client_core::stores::pairing::is_relay_url(url.trim()) } +/// The `nsec…` of an on-device login's hex secret, for "Show my key"; `None` +/// for anything that is not a secret key. A secret: the host shows it only +/// on the user's request and never logs it. +#[uniffi::export] +fn nsec_of(secret_hex: String) -> Option { + protocol::crypto::nsec_from_secret_hex(secret_hex.trim()).ok() +} + /// Whether Orbot routing was on when settings were last saved, for /// [`Core::new`]'s `tor` argument. Pure read, safe before any `Core` exists: /// the proxy must be known before the first relay or Blossom connection, diff --git a/crates/client-ffi/src/views.rs b/crates/client-ffi/src/views.rs index 9ee904d5..b65a20ff 100644 --- a/crates/client-ffi/src/views.rs +++ b/crates/client-ffi/src/views.rs @@ -949,6 +949,43 @@ pub struct UniffiSettingsView { pub notifications_enabled: bool, pub show_usage_badge: bool, pub show_commit_badge: bool, + pub backup: UniffiBackupView, +} + +/// The config backup, as the settings page shows it. +#[derive(Debug, Clone, uniffi::Record)] +pub struct UniffiBackupView { + /// `None`: backup is off. + pub relay: Option, + /// When a backup last reached the relay (ms since the epoch). + pub saved_at: Option, + pub status: UniffiBackupStatus, +} + +#[derive(Debug, Clone, uniffi::Enum)] +pub enum UniffiBackupStatus { + /// Nothing going on (off, or on and up to date). + Idle, + /// Looking on the relay for a backup. + Checking, + /// A backup is on the relay: import it, or keep this phone's. + Found { saved_at: u64, machines: u32 }, + Saving, + Importing, + /// The last operation failed; `reason` is for the user. + Failed { reason: String }, +} + +fn build_uniffi_backup_status(s: &client_runtime::backup::BackupStatus) -> UniffiBackupStatus { + use client_runtime::backup::BackupStatus; + match s { + BackupStatus::Idle => UniffiBackupStatus::Idle, + BackupStatus::Checking => UniffiBackupStatus::Checking, + BackupStatus::Found { saved_at, machines } => UniffiBackupStatus::Found { saved_at: *saved_at, machines: *machines }, + BackupStatus::Saving => UniffiBackupStatus::Saving, + BackupStatus::Importing => UniffiBackupStatus::Importing, + BackupStatus::Failed { reason } => UniffiBackupStatus::Failed { reason: reason.clone() }, + } } pub fn build_uniffi_settings_view(v: &SettingsView) -> UniffiSettingsView { @@ -962,6 +999,11 @@ pub fn build_uniffi_settings_view(v: &SettingsView) -> UniffiSettingsView { notifications_enabled: d.notifications_enabled, show_usage_badge: d.show_usage_badge, show_commit_badge: d.show_commit_badge, + backup: UniffiBackupView { + relay: v.backup.relay.clone(), + saved_at: v.backup.saved_at, + status: build_uniffi_backup_status(&v.backup.status), + }, } } diff --git a/crates/protocol/src/crypto.rs b/crates/protocol/src/crypto.rs index f57ad2ae..9bc0f47c 100644 --- a/crates/protocol/src/crypto.rs +++ b/crates/protocol/src/crypto.rs @@ -72,6 +72,15 @@ pub fn npub_from_hex(pubkey_hex: &str) -> Result { .map_err(|_| CryptoError::InvalidKey) } +/// `nsec…` for a hex secret key, for the user to copy their own key out of +/// an on-device login. A secret: never log it. +pub fn nsec_from_secret_hex(secret_hex: &str) -> Result { + SecretKey::from_hex(secret_hex) + .map_err(|_| CryptoError::InvalidKey)? + .to_bech32() + .map_err(|_| CryptoError::InvalidKey) +} + /// hex pubkey for an `npub…` (pairing URL / manual-pair input). `Err` on a /// non-`npub` bech32 (e.g. an `nsec`) or garbage — never a panic. pub fn hex_from_npub(npub: &str) -> Result { @@ -155,6 +164,16 @@ mod tests { ); } + #[test] + fn nsec_encodes_a_secret_and_rejects_garbage() { + // NIP-19's own example. + assert_eq!( + nsec_from_secret_hex("67dea2ed018072d675f5415ecfaed7d2597555e202d85b3d65ea4e58d2d92ffa").unwrap(), + "nsec1vl029mgpspedva04g90vltkh6fvh240zqtv9k0t9af8935ke9laqsnlfe5" + ); + assert_eq!(nsec_from_secret_hex("nothex"), Err(CryptoError::InvalidKey)); + } + #[test] fn hex_helpers_match_ts_strictness() { assert_eq!(hex_to_bytes("deadbeef").unwrap(), vec![0xde, 0xad, 0xbe, 0xef]); From 823ba86739ce98922c3ec9913b9411ae46bd056a Mon Sep 17 00:00:00 2001 From: deymosh Date: Thu, 1 Oct 2026 02:56:25 +0200 Subject: [PATCH 6/7] feat(android): back up and restore the phone's setup Settings gets a Backup page: off, it takes a relay; on, it says when it last saved, offers a save now and turning it off (with or without asking the relay to delete the backup); a backup already on the relay waits for Restore or Keep this phone's, the latter confirmed since it replaces the backup. Right after logging in with an existing key, a restore step offers to look on a relay before the app opens; Skip turns backup off again. Account can show and copy the nsec of a key kept on the phone, read off the main thread and copied as sensitive so the clipboard preview hides it. Co-Authored-By: Claude Code --- .../java/com/codedeck/plus/MainActivity.kt | 23 +- .../codedeck/plus/ui/screens/BackupPage.kt | 360 ++++++++++++++++++ .../plus/ui/screens/SettingsScreen.kt | 99 ++++- .../codedeck/plus/ui/DesignSnapshotTest.kt | 43 +++ ...ui_DesignFullPageSnapshotTest_settings.png | Bin 33341 -> 34908 bytes ...eck.plus.ui_DesignSnapshotTest_restore.png | Bin 0 -> 46175 bytes ...us.ui_DesignSnapshotTest_restore_found.png | Bin 0 -> 48590 bytes ...esignSnapshotTest_settings_account_key.png | Bin 0 -> 49472 bytes ...ignSnapshotTest_settings_backup_failed.png | Bin 0 -> 50905 bytes ...signSnapshotTest_settings_backup_found.png | Bin 0 -> 43971 bytes ...DesignSnapshotTest_settings_backup_off.png | Bin 0 -> 49113 bytes ..._DesignSnapshotTest_settings_backup_on.png | Bin 0 -> 43572 bytes 12 files changed, 520 insertions(+), 5 deletions(-) create mode 100644 apps/android/app/src/main/java/com/codedeck/plus/ui/screens/BackupPage.kt create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_restore.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_restore_found.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_account_key.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_failed.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_found.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_off.png create mode 100644 apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_on.png diff --git a/apps/android/app/src/main/java/com/codedeck/plus/MainActivity.kt b/apps/android/app/src/main/java/com/codedeck/plus/MainActivity.kt index 41fe73a6..1c024aff 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/MainActivity.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/MainActivity.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity @@ -48,6 +49,7 @@ import com.codedeck.plus.platform.installedSignerApps import com.codedeck.plus.platform.signerAnswerOf import com.codedeck.plus.ui.OpenSessionRequest import com.codedeck.plus.ui.Shell +import com.codedeck.plus.ui.screens.RestoreContent import com.codedeck.plus.ui.screens.WelcomeBusy import com.codedeck.plus.ui.screens.WelcomeScreen import com.codedeck.plus.ui.theme.CodeDeckTheme @@ -87,6 +89,9 @@ class MainViewModel : ViewModel() { /** Whether a login exists; until one does, the welcome screen shows and * no core runs. */ val loggedIn = MutableStateFlow(null) + /** Whether to offer restoring a backup before the app proper: once, + * right after logging in with a key that may have one. */ + val offerRestore = MutableStateFlow(false) val welcomeBusy = MutableStateFlow(null) val welcomeError = MutableStateFlow(null) val signers = MutableStateFlow>(emptyList()) @@ -209,7 +214,8 @@ class MainActivity : ComponentActivity() { busy = busy, error = error, onUseSigner = ::useSigner, - onCreateKey = { logIn(Login.OnDevice) { vault -> vault.setIdentity(freshSecretHex()) } }, + // A key made just now has no backup to restore. + onCreateKey = { logIn(Login.OnDevice, offerRestore = false) { vault -> vault.setIdentity(freshSecretHex()) } }, onImportKey = ::importKey, ) } else if (current != null) { @@ -217,12 +223,22 @@ class MainActivity : ComponentActivity() { // and sp text scale as one, like the TSX multiplier. val settings by current.settings.collectAsState() val openRequest by viewModel.openRequest.collectAsState() + val offerRestore by viewModel.offerRestore.collectAsState() val scale = settings?.uiScale?.toFloat() ?: 1f val d = LocalDensity.current + val restoreFrom = settings CompositionLocalProvider( LocalDensity provides Density(d.density * scale, d.fontScale * scale), ) { - Shell( + if (offerRestore && restoreFrom != null) { + val scope = rememberCoroutineScope() + RestoreContent( + backup = restoreFrom.backup, + torOn = restoreFrom.torProxyEnabled, + dispatch = { intent -> scope.launch { current.dispatch(intent) } }, + onDone = { viewModel.offerRestore.value = false }, + ) + } else Shell( current, openRequest = openRequest, onOpenRequestHandled = viewModel::openRequestHandled, @@ -323,7 +339,7 @@ class MainActivity : ComponentActivity() { /** Store `login` (after `prepare` set up its keys, off the main thread), * give it a fresh session key, and start the core. */ - private fun logIn(login: Login, prepare: (KeyVault) -> Unit) { + private fun logIn(login: Login, offerRestore: Boolean = true, prepare: (KeyVault) -> Unit) { viewModel.welcomeError.value = null if (viewModel.welcomeBusy.value == null) viewModel.welcomeBusy.value = WelcomeBusy.Key lifecycleScope.launch { @@ -340,6 +356,7 @@ class MainActivity : ComponentActivity() { viewModel.welcomeError.value = "Could not store the key on this device." return@launch } + viewModel.offerRestore.value = offerRestore viewModel.loggedIn.value = true startCore() bind() diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/BackupPage.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/BackupPage.kt new file mode 100644 index 00000000..4b9c3785 --- /dev/null +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/BackupPage.kt @@ -0,0 +1,360 @@ +package com.codedeck.plus.ui.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.CloudSync +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.codedeck.plus.ui.components.ActionRow +import com.codedeck.plus.ui.components.Dot +import com.codedeck.plus.ui.components.ErrorNote +import com.codedeck.plus.ui.components.Field +import com.codedeck.plus.ui.components.Group +import com.codedeck.plus.ui.components.GroupBody +import com.codedeck.plus.ui.components.Page +import com.codedeck.plus.ui.components.PrimaryButton +import com.codedeck.plus.ui.components.QuietButton +import com.codedeck.plus.ui.components.SecondaryButton +import com.codedeck.plus.ui.components.ValueRow +import com.codedeck.plus.ui.theme.Tokens +import uniffi.client_ffi.UniffiBackupStatus +import uniffi.client_ffi.UniffiBackupView +import uniffi.client_ffi.UniffiIntent +import java.text.DateFormat +import java.util.Date + +/** What the backup holds, said once for the settings page and the restore step. */ +private const val BACKUP_HOLDS = + "Your paired machines, settings, quick prompts and this phone's session keys, encrypted to your key: only you can read it." + +/** A relay address the backup may use: `wss://` with a host, `ws://` only to an onion service. */ +internal fun isBackupRelay(url: String): Boolean { + val trimmed = url.trim() + if (trimmed.any { it.isWhitespace() }) return false + val host = trimmed.substringAfter("://").substringBefore('/').substringBefore(':').lowercase() + return when { + trimmed.startsWith("wss://") -> host.isNotEmpty() + trimmed.startsWith("ws://") -> host.endsWith(".onion") && host.length > ".onion".length + else -> false + } +} + +/** A relay's host, for saying where the backup is. */ +internal fun relayHost(url: String): String = url.trim().substringAfter("://").substringBefore('/') + +/** When something happened, as a person says it: "just now", "5 min ago", "3 h ago", or the date. */ +internal fun whenSaved(at: Long, now: Long): String { + val minutes = (now - at) / 60_000 + return when { + minutes < 1 -> "just now" + minutes < 60 -> "$minutes min ago" + minutes < 24 * 60 -> "${minutes / 60} h ago" + else -> "on " + DateFormat.getDateInstance(DateFormat.MEDIUM).format(Date(at)) + } +} + +private fun machinesText(n: UInt): String = when (n) { + 0u -> "no machines" + 1u -> "1 machine" + else -> "$n machines" +} + +/** + * The config backup: off, it asks for a relay; on, it says when it last + * saved and offers a save now and turning it off. A backup found on the + * relay waits for a choice before anything is saved over it. + */ +@Composable +internal fun BackupPage( + backup: UniffiBackupView, + torOn: Boolean, + now: Long, + dispatch: (UniffiIntent) -> Unit, + onBack: () -> Unit, +) { + Page(title = "Backup", onBack = onBack) { + val relay = backup.relay + if (relay == null) { + BackupOff(backup.status, torOn, dispatch) + } else { + BackupOn(relay, backup, now, dispatch) + } + } +} + +@Composable +private fun BackupOff(status: UniffiBackupStatus, torOn: Boolean, dispatch: (UniffiIntent) -> Unit) { + var draft by rememberSaveable { mutableStateOf("") } + val valid = isBackupRelay(draft) + Group( + title = "Back up to a relay", + footer = "$BACKUP_HOLDS A new phone logged in as you restores it from the same relay. The relay only sees that " + + "you saved something, and when." + if (torOn) " It goes through Orbot, like your other relays." else "", + ) { + GroupBody { + Field( + value = draft, + onValueChange = { draft = it }, + placeholder = "wss://relay.example.com", + mono = true, + isError = draft.isNotBlank() && !valid, + supporting = when { + draft.isNotBlank() && !valid -> "Use a wss:// address, or ws:// for a .onion." + status is UniffiBackupStatus.Failed -> status.reason + else -> null + }, + ) + SecondaryButton("Turn on backup", onClick = { dispatch(UniffiIntent.SetBackupRelay(draft.trim())) }, enabled = valid) + } + } +} + +@Composable +private fun BackupOn(relay: String, backup: UniffiBackupView, now: Long, dispatch: (UniffiIntent) -> Unit) { + val status = backup.status + if (status is UniffiBackupStatus.Found) { + FoundBackup(status, relay, now, dispatch) + return + } + var turningOff by remember { mutableStateOf(false) } + Group(footer = "$BACKUP_HOLDS It saves itself a little after each change.") { + GroupBody { BackupStatusLine(status, backup.savedAt?.toLong(), now) } + ValueRow("Relay", subtitle = relay, mono = true) {} + GroupBody { + SecondaryButton( + "Back up now", + onClick = { dispatch(UniffiIntent.BackupNow) }, + enabled = status !is UniffiBackupStatus.Saving && status !is UniffiBackupStatus.Checking, + ) + } + } + Group { + if (turningOff) { + GroupBody { + Text( + "Turn off backup? This phone stops saving to ${relayHost(relay)}. You can also ask the relay to delete " + + "what is there; relays usually do, but none has to.", + color = Tokens.Text, + fontSize = Tokens.TextSm, + ) + Column(verticalArrangement = Arrangement.spacedBy(Tokens.Space2)) { + SecondaryButton("Turn off and delete it", danger = true, onClick = { + turningOff = false + dispatch(UniffiIntent.DisableBackup(delete = true)) + }) + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2)) { + SecondaryButton("Turn off, keep it", onClick = { + turningOff = false + dispatch(UniffiIntent.DisableBackup(delete = false)) + }) + QuietButton("Cancel", onClick = { turningOff = false }) + } + } + } + } else { + ActionRow("Turn off backup", onClick = { turningOff = true }, danger = true) + } + } +} + +/** One line of what the backup is doing, with a dot or a spinner. */ +@Composable +private fun BackupStatusLine(status: UniffiBackupStatus, savedAt: Long?, now: Long) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Tokens.Space2)) { + val busy = status is UniffiBackupStatus.Checking || status is UniffiBackupStatus.Saving || status is UniffiBackupStatus.Importing + if (busy) { + CircularProgressIndicator(Modifier.size(12.dp), color = Tokens.TextMuted, strokeWidth = 1.5.dp) + } else { + Dot( + when { + status is UniffiBackupStatus.Failed -> Tokens.Danger + savedAt != null -> Tokens.Success + else -> Tokens.TextDim + }, + ) + } + Text( + when (status) { + UniffiBackupStatus.Checking -> "Looking for a backup…" + UniffiBackupStatus.Saving -> "Backing up…" + UniffiBackupStatus.Importing -> "Restoring…" + is UniffiBackupStatus.Failed -> "Not backed up" + else -> if (savedAt != null) "Backed up ${whenSaved(savedAt, now)}" else "Not backed up yet" + }, + color = Tokens.Text, + fontSize = Tokens.TextMd, + ) + } + if (status is UniffiBackupStatus.Failed) ErrorNote(status.reason) +} + +/** A backup is on the relay already: restore it, or let this phone's replace it. */ +@Composable +private fun FoundBackup(found: UniffiBackupStatus.Found, relay: String, now: Long, dispatch: (UniffiIntent) -> Unit) { + var replacing by remember { mutableStateOf(false) } + Group( + title = "A backup is already there", + footer = "Restoring adds the machines this phone does not have and takes the backup's settings and quick " + + "prompts. Nothing is saved to the relay until you choose.", + ) { + GroupBody { + FoundSummary(found, relay, now) + if (replacing) { + Text( + "Replace it with this phone's setup? What the backup holds and this phone lacks is lost.", + color = Tokens.Danger, + fontSize = Tokens.TextSm, + ) + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2)) { + SecondaryButton("Replace it", danger = true, onClick = { dispatch(UniffiIntent.KeepLocalConfig) }) + QuietButton("Cancel", onClick = { replacing = false }) + } + } else { + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2), verticalAlignment = Alignment.CenterVertically) { + PrimaryButton("Restore", onClick = { dispatch(UniffiIntent.ImportBackup) }) + QuietButton("Keep this phone's", onClick = { replacing = true }) + } + } + } + } +} + +/** The found backup's date and size, the thing the choice is about. */ +@Composable +private fun FoundSummary(found: UniffiBackupStatus.Found, relay: String, now: Long) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Tokens.Space3)) { + Icon(Icons.Outlined.CloudSync, contentDescription = null, tint = Tokens.Text, modifier = Modifier.size(28.dp)) + Column { + Text( + "Saved ${whenSaved(found.savedAt.toLong(), now)}", + color = Tokens.Text, + fontSize = Tokens.TextMd, + fontWeight = FontWeight.Medium, + ) + Text("${machinesText(found.machines)}, on ${relayHost(relay)}", color = Tokens.TextMuted, fontSize = Tokens.TextSm) + } + } +} + +/** + * Right after logging in: restore a backup made on another phone, or skip. + * Shown once, before the app proper; [onDone] leaves for the app. + */ +@Composable +internal fun RestoreContent( + backup: UniffiBackupView, + torOn: Boolean, + dispatch: (UniffiIntent) -> Unit, + onDone: () -> Unit, + now: Long = System.currentTimeMillis(), +) { + var draft by rememberSaveable { mutableStateOf("") } + // Set once Restore is tapped, so the idle state after it reads as done + // rather than as "nothing was there". + var restoring by rememberSaveable { mutableStateOf(false) } + val status = backup.status + val relay = backup.relay + val skip = { + if (relay != null) dispatch(UniffiIntent.DisableBackup(delete = false)) + onDone() + } + + BoxWithConstraints(Modifier.fillMaxSize().background(Tokens.Bg), contentAlignment = Alignment.TopCenter) { + val viewport = maxHeight + Column( + Modifier + .verticalScroll(rememberScrollState()) + .widthIn(max = 560.dp) + .fillMaxWidth() + .heightIn(min = viewport) + .padding(horizontal = Tokens.Space5, vertical = Tokens.Space6), + verticalArrangement = Arrangement.spacedBy(Tokens.Space5, Alignment.CenterVertically), + ) { + Column(verticalArrangement = Arrangement.spacedBy(Tokens.Space2)) { + Text("Restore your setup?", color = Tokens.Text, fontSize = 28.sp, fontWeight = FontWeight.SemiBold, letterSpacing = (-0.3).sp) + Text( + "If you backed up another phone, enter the relay it saved to: its machines, settings and quick " + + "prompts come back here. The backup is encrypted to your key, so only you can read it.", + color = Tokens.TextMuted, + fontSize = Tokens.TextMd, + lineHeight = 20.sp, + ) + } + when { + status is UniffiBackupStatus.Found && relay != null -> Column(verticalArrangement = Arrangement.spacedBy(Tokens.Space4)) { + FoundSummary(status, relay, now) + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2), verticalAlignment = Alignment.CenterVertically) { + PrimaryButton("Restore", onClick = { + restoring = true + dispatch(UniffiIntent.ImportBackup) + }) + QuietButton("Skip", onClick = skip) + } + } + status is UniffiBackupStatus.Checking || status is UniffiBackupStatus.Importing || status is UniffiBackupStatus.Saving -> + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(Tokens.Space3)) { + CircularProgressIndicator(Modifier.size(18.dp), color = Tokens.TextMuted, strokeWidth = 2.dp) + Text( + if (status is UniffiBackupStatus.Checking) "Looking on ${relayHost(relay.orEmpty())}…" else "Restoring…", + color = Tokens.Text, + fontSize = Tokens.TextMd, + ) + } + relay != null && status !is UniffiBackupStatus.Failed -> Column(verticalArrangement = Arrangement.spacedBy(Tokens.Space4)) { + Text( + if (restoring) { + "Restored. Your machines reconnect as each one is heard from. Backup stays on, so this phone saves its changes there too." + } else { + "No backup on ${relayHost(relay)} yet. Backup is on, so this phone saves its setup there from now on." + }, + color = Tokens.Text, + fontSize = Tokens.TextMd, + lineHeight = 20.sp, + ) + PrimaryButton("Continue", onClick = onDone) + } + else -> Column(verticalArrangement = Arrangement.spacedBy(Tokens.Space3)) { + val valid = isBackupRelay(draft) + Field( + value = draft, + onValueChange = { draft = it }, + placeholder = "wss://relay.example.com", + mono = true, + isError = draft.isNotBlank() && !valid, + supporting = if (draft.isNotBlank() && !valid) "Use a wss:// address, or ws:// for a .onion." else null, + ) + if (status is UniffiBackupStatus.Failed) ErrorNote(status.reason) + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2), verticalAlignment = Alignment.CenterVertically) { + PrimaryButton("Look for a backup", onClick = { dispatch(UniffiIntent.SetBackupRelay(draft.trim())) }, enabled = valid) + QuietButton("Skip", onClick = skip) + } + if (torOn) Text("Goes through Orbot.", color = Tokens.TextDim, fontSize = Tokens.TextXs) + } + } + } + } +} diff --git a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt index e0d75066..c77445f9 100644 --- a/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt +++ b/apps/android/app/src/main/java/com/codedeck/plus/ui/screens/SettingsScreen.kt @@ -1,7 +1,11 @@ package com.codedeck.plus.ui.screens +import android.content.ClipData +import android.content.ClipDescription +import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.os.PersistableBundle import android.provider.Settings import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Arrangement @@ -13,6 +17,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.Article import androidx.compose.material.icons.automirrored.outlined.Chat import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.CloudSync import androidx.compose.material.icons.outlined.CloudUpload import androidx.compose.material.icons.outlined.NotificationsNone import androidx.compose.material.icons.outlined.SettingsEthernet @@ -37,6 +42,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.codedeck.plus.BuildConfig import com.codedeck.plus.core.CoreHost +import com.codedeck.plus.platform.KeyVault import com.codedeck.plus.platform.Login import com.codedeck.plus.platform.StayConnectedService import com.codedeck.plus.ui.components.ActionRow @@ -55,8 +61,13 @@ import com.codedeck.plus.ui.components.SwitchRow import com.codedeck.plus.ui.components.ValueRow import com.codedeck.plus.ui.components.machineLabel import com.codedeck.plus.ui.theme.Tokens +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import uniffi.client_ffi.UniffiBackupStatus +import uniffi.client_ffi.UniffiBackupView import uniffi.client_ffi.UniffiIntent +import uniffi.client_ffi.nsecOf import uniffi.client_ffi.UniffiMachineSummary import uniffi.client_ffi.UniffiQuickPrompt import uniffi.client_ffi.UniffiSettingsView @@ -81,6 +92,7 @@ internal sealed interface SettingsPage { data object Connection : SettingsPage data object Messages : SettingsPage data object Uploads : SettingsPage + data object Backup : SettingsPage data object Account : SettingsPage fun save(): String = when (this) { @@ -93,6 +105,7 @@ internal sealed interface SettingsPage { Connection -> "connection" Messages -> "messages" Uploads -> "uploads" + Backup -> "backup" Account -> "account" } @@ -114,6 +127,7 @@ internal sealed interface SettingsPage { saved == "connection" -> Connection saved == "messages" -> Messages saved == "uploads" -> Uploads + saved == "backup" -> Backup saved == "account" -> Account else -> Hub } @@ -224,7 +238,20 @@ fun SettingsScreen( } SettingsPage.Messages -> MessagesPage(view, quickPrompts?.prompts.orEmpty(), ::dispatch, toHub) SettingsPage.Uploads -> UploadsPage(view, ::dispatch, toHub) - SettingsPage.Account -> AccountPage(npub, signerLabel, onLogOut, toHub) + SettingsPage.Backup -> BackupPage(view.backup, view.torProxyEnabled, System.currentTimeMillis(), ::dispatch, toHub) + SettingsPage.Account -> AccountPage( + npub, + signerLabel, + onLogOut, + toHub, + // Only a key kept on this phone can be shown; reading it + // touches the Keystore and a file, so not on the main thread. + revealKey = if (login is Login.OnDevice) { + { withContext(Dispatchers.IO) { KeyVault(context).identitySecretHex()?.let { nsecOf(it) } } } + } else { + null + }, + ) } } } @@ -296,6 +323,13 @@ internal fun SettingsHub( icon = { RowIcon(Icons.Outlined.CloudUpload) }, subtitle = if (view.blossomServer.isNotBlank()) "To ${blossomHost(view.blossomServer)}" else "Through the relays", ) + Divider(inset = 68.dp) + NavRow( + "Backup", + onClick = { onOpen(SettingsPage.Backup) }, + icon = { RowIcon(Icons.Outlined.CloudSync) }, + subtitle = backupSummary(view.backup, now), + ) } Group { NavRow("Logs", onClick = onOpenLogs, icon = { RowIcon(Icons.AutoMirrored.Outlined.Article) }) @@ -316,6 +350,16 @@ internal fun SettingsHub( } } +/** The hub's line for the backup: off, waiting on a choice, failing, or when it last saved. */ +private fun backupSummary(backup: UniffiBackupView, now: Long): String { + val relay = backup.relay ?: return "Off" + return when (val status = backup.status) { + is UniffiBackupStatus.Found -> "A backup on ${relayHost(relay)} waits for you" + is UniffiBackupStatus.Failed -> "Not backed up" + else -> backup.savedAt?.let { "Backed up ${whenSaved(it.toLong(), now)}" } ?: "On, to ${relayHost(relay)}" + } +} + private fun sessionCount(machine: UniffiMachineSummary): String = when (val n = machine.sessions.size) { 0 -> "" 1 -> ", 1 session" @@ -506,6 +550,50 @@ private fun NewQuickPrompt(dispatch: (UniffiIntent) -> Unit) { } } +/** + * The secret key of a login kept on this phone, hidden until asked for: + * it is the only way back into the identity on another phone or after + * logging out. Copied as sensitive, so the keyboard's clipboard preview + * does not show it. + */ +@Composable +private fun SecretKeyGroup(revealKey: suspend () -> String?) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + var nsec by remember { mutableStateOf(null) } + var copied by remember { mutableStateOf(false) } + Group(footer = "Anyone with your secret key is you. Keep a copy somewhere safe and never share it.") { + val shown = nsec + if (shown == null) { + ValueRow("Secret key", subtitle = "Hidden") { + QuietButton("Show", onClick = { scope.launch { nsec = revealKey() } }) + } + } else { + GroupBody { + Text(shown, color = Tokens.Text, fontSize = Tokens.TextSm, fontFamily = Tokens.FontMono) + Row(horizontalArrangement = Arrangement.spacedBy(Tokens.Space2), verticalAlignment = Alignment.CenterVertically) { + SecondaryButton(if (copied) "Copied" else "Copy", onClick = { + copySensitive(context, shown) + copied = true + }) + QuietButton("Hide", onClick = { + nsec = null + copied = false + }) + } + } + } + } +} + +/** Put a secret on the clipboard, flagged so Android does not preview it. */ +private fun copySensitive(context: Context, text: String) { + val clipboard = context.getSystemService(ClipboardManager::class.java) ?: return + val clip = ClipData.newPlainText("Secret key", text) + clip.description.extras = PersistableBundle().apply { putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true) } + clipboard.setPrimaryClip(clip) +} + /** * Who this phone is logged in as, and logging out. Logging out deletes * everything the phone keeps for the identity (paired machines, transcripts, @@ -513,7 +601,13 @@ private fun NewQuickPrompt(dispatch: (UniffiIntent) -> Unit) { * why the confirmation says so plainly. */ @Composable -internal fun AccountPage(npub: String, signerLabel: String?, onLogOut: () -> Unit, onBack: () -> Unit) { +internal fun AccountPage( + npub: String, + signerLabel: String?, + onLogOut: () -> Unit, + onBack: () -> Unit, + revealKey: (suspend () -> String?)? = null, +) { var confirming by remember { mutableStateOf(false) } Page(title = "Account", onBack = onBack) { Group(footer = "Machines and relays know this phone by this key.") { @@ -523,6 +617,7 @@ internal fun AccountPage(npub: String, signerLabel: String?, onLogOut: () -> Uni mono = true, ) {} } + if (revealKey != null) SecretKeyGroup(revealKey) Group { if (confirming) { GroupBody { diff --git a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt index e25753fb..a9737c8b 100644 --- a/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt +++ b/apps/android/app/src/test/java/com/codedeck/plus/ui/DesignSnapshotTest.kt @@ -29,6 +29,11 @@ import com.codedeck.plus.ui.screens.NotificationsPage import com.codedeck.plus.ui.screens.PairingBody import com.codedeck.plus.ui.screens.PluginsContent import com.codedeck.plus.ui.screens.UploadsPage +import com.codedeck.plus.ui.screens.AccountPage +import com.codedeck.plus.ui.screens.BackupPage +import com.codedeck.plus.ui.screens.RestoreContent +import uniffi.client_ffi.UniffiBackupStatus +import uniffi.client_ffi.UniffiBackupView import com.codedeck.plus.ui.screens.SettingsHub import com.codedeck.plus.ui.session.Composer import com.codedeck.plus.ui.session.QuickPromptStrip @@ -180,6 +185,34 @@ private val pages: Map Unit> = linkedMapOf( "settings_uploads_blossom" to { UploadsPage(settings.copy(blossomServer = "https://blossom.example.com", maxUploadBytes = 26_214_400uL), {}, {}) }, + "settings_backup_off" to { BackupPage(settings.backup, torOn = true, now = NOW, dispatch = {}, onBack = {}) }, + "settings_backup_on" to { + BackupPage( + UniffiBackupView(relay = "wss://relay.example.org", savedAt = (NOW - 3 * 60_000).toULong(), status = UniffiBackupStatus.Idle), + torOn = false, now = NOW, dispatch = {}, onBack = {}, + ) + }, + "settings_backup_found" to { + BackupPage( + UniffiBackupView(relay = "wss://relay.example.org", savedAt = null, status = FOUND), + torOn = false, now = NOW, dispatch = {}, onBack = {}, + ) + }, + "settings_backup_failed" to { + BackupPage( + UniffiBackupView( + relay = "wss://relay.example.org", + savedAt = (NOW - 26 * 3_600_000).toULong(), + status = UniffiBackupStatus.Failed("The relay did not take the backup: blocked: auth required"), + ), + torOn = false, now = NOW, dispatch = {}, onBack = {}, + ) + }, + "settings_account_key" to { AccountPage(workstation.npub, signerLabel = null, onLogOut = {}, onBack = {}, revealKey = { null }) }, + "restore" to { RestoreContent(settings.backup, torOn = false, dispatch = {}, onDone = {}, now = NOW) }, + "restore_found" to { + RestoreContent(UniffiBackupView(relay = "wss://relay.example.org", savedAt = null, status = FOUND), torOn = false, dispatch = {}, onDone = {}, now = NOW) + }, "logs" to { LogsContent( lines = listOf( @@ -196,6 +229,9 @@ private val pages: Map Unit> = linkedMapOf( }, ) +/** A backup another phone saved two hours before the fixtures' clock. */ +private val FOUND = UniffiBackupStatus.Found(savedAt = (NOW - 2 * 3_600_000).toULong(), machines = 2u) + private fun Paparazzi.page(name: String) = snapshot { CodeDeckTheme { pages.getValue(name)() } } /** The pages on a phone: what fits on one screen. */ @@ -230,6 +266,13 @@ class DesignSnapshotTest { @Test fun settings_connection() = paparazzi.page("settings_connection") @Test fun settings_uploads() = paparazzi.page("settings_uploads") @Test fun settings_uploads_blossom() = paparazzi.page("settings_uploads_blossom") + @Test fun settings_backup_off() = paparazzi.page("settings_backup_off") + @Test fun settings_backup_on() = paparazzi.page("settings_backup_on") + @Test fun settings_backup_found() = paparazzi.page("settings_backup_found") + @Test fun settings_backup_failed() = paparazzi.page("settings_backup_failed") + @Test fun settings_account_key() = paparazzi.page("settings_account_key") + @Test fun restore() = paparazzi.page("restore") + @Test fun restore_found() = paparazzi.page("restore_found") @Test fun logs() = paparazzi.page("logs") } diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignFullPageSnapshotTest_settings.png index 4a65ea0cca24e6716948d5c894d40c373e73f42b..36eb9b84680cd7ae078a939553bb23ecd8be02bd 100644 GIT binary patch delta 10837 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 delta 9258 zcmcJUcTiL9*7lPSFn|V5nx2C-2)L~D{!*WsZa)ZPCml03i%g4$iVX>y`rZxtFw_jd> zTS+0`s#q5#V+shagqV5e8O+>dNygnOjw#x!%51SRW0S+;P+7D01&3-iYsJg!cY^iq z`&0b8bhB8S5smJ>_-vFI%_e^0!^L4V4cLuoLdygJJ`I}#1&@Fw?O8ONki4 zX#*Z4ARP-+cp>gaSFSi~-v0bRwIl#_5ApG%$DWLn=y?5KpL3!P^?Yh{Ce3*sHYY?^ z?1Ryt&;IyP<}z7K9|I!O&-q6w9Y1)e?68N1Tz9E+E_Q3qy|}w-Jtf8bJ^NAOmF*Ey z;9{UGux-L0=aB&MExCRB$9Xjb?gHXt>slp{%R-lu8Er}F)*5A+1`9a-^*nPQI<#W@k`3WJC4Au7KYEyh&Fndlg#xw-#EgW}GmMCWnLuCLb`#&}vgw4TTvPkeM$U+N;V3{M zV}(XO<_e#U*p3~OUy{-aNLaKtN8qQqn=mCcHGME7R~+GuHa@jU+3!2^|)zYyL z)Qjergxa~@S?;>FIf9Q!cD3NoNj(^hW0eEBW`>n^t_ zi4W(dUnh?Ue-Z8;cV*H}xZlM3+I&vXMF+Y0q)lJSx@EeOKIxj$EEWW@JpM`0%IaG{ zx+c??y-uA7WYl+f3rTCWh#uG*6cwNygAgR%_JH{WS7rr&L%*UrfD8szS-l1g1 zhGwGphlWBTke4#ai)SNn{)GP4bB=M9M~zj$h;wby}Rf9s8$iz)h; zKc8uj_Pi?^T^QnrG0R9-D9E^mz{NX6&weeX+i^_`mB8%Dh6?U1a=?}~}5JT5^Y@M78p6-K9Bp}aT+^=!IW_GGb89vkHe4oC48tcGa za%45pq;-K{s$iZea~xl;WrS>fqh7;uI0au{I5$p&tS@R?~{IK*zFV%B#wc*C@)~m-?$SX2(5$a4iCt+WN@0<_+-XyR{+mqL*jbVNK03 znn|;UXWt<5U}xa#*XN=lZ@4l`nd-qy7LqTl`D2e9g-Zk^H($zdtEnq-bp7D{W}sgh z;azfK@2Jx~ZiZ+T?gJmRblmDHiZmb!1JkhbPNO$kc|Hy~eFiG(zt;SXE;pXUd)&9Z zU9q^zcWGRI2nE>Xnv$~HzgX43|7B?DD#I_XvX+(g^bGzAB7ac)N-aO0yhu5D68x36Zl4&T0*A)+G9GD_}tpZHWY^XMMrqgsB7gg4>=j!xH} zU#ZNMJ?(-QO~-vxJg-i+j%#N5z=ghX)v-khuna;YA=Ia-pMYpQ+n$AKeX zzT6#{L}W_(J*h%jtl-3o{|I7HN1qv(!9iu9I#tCD`eOkr8?|TR3^hz2yY{3GYULEFan<3usWEdp(5geY<7#`@GCj z_yLEmy?b!u!N>$b+c-%GcmYPLz2^2qOe>Y}TaQB#4|&(f~#fYmQ);X zEri8r$>Pi&zO8rz^LQ{%NVYOBRO+_{i*LFUqVjI<0EQlrl);}ge*pHKOvBT!uI1LD z_XBdi6LI2ph8V`xWiEHsy;ebmjs6laap$my8Qd?gKjxa9Iq;)UzklK!FI3)w=nV%8 zcnlIV_*u+gZosmw zSp6SbwuU@~)#arXTaP^v9x3vRmBNhv>qiekUdBXOJ1n%t-gykvL9!Y#bNaCeW}&?*faZgP5M$q1xJ*(QmK$VPD-ElCrCYg^w#L z`sr^^H1@rB{Zs-T`jrVuABP!Q@RTWQz}|<{Uql(KoG)t#@1+VwEd2#wXETDRx-6+6 zbKSMd`F^D@GLm{>Z?!{yy=!u1*0PyEQ)}y*OSADHdwX_P+=egOMgqpmOLjEtY?9bo zUj%Fn@o#S7*h?Q$90LQB=g0JWIg{edI(d`SVOMa=$J(K*uS7Q{TQ!F(SLdF4r-W}W zD|oLj)J7e1e8b*h0a+L#tuBFEQeba%HX~kA%=ixk&JA%jL+b-)(FZ6saOH773YWny z_z`b@Fy7sLXOdP6>PT~ITU+he?v6hoWuSd5e7RMYBOJWePZXA{`@t`&1&N z+G}J2kO8){?DGB0xbQ>qNN?|kk%sU*=1e-}f-*caWQNViPLR=1FdKDGkk5Pjwl-)i zyh~a?qDA`L{XRZt<)oj3D7(9H0exX%sG^I^qOmn< zK1V0{?v=VB{2k&ED7W-c#2ht-9V&l`>5%|5_Op49`zc&K?ms>KJbY_xgd4>Ltjs7Q z0{F#9v9V6pPMY^`m)V!ydZ~0$YG!9O@08=UYl)31)jXn#~ zG-_y&7*4}0*DLgQLeMcx@|d1Gb}wTzq-dlLgFTE$yeBg8<@qUgx)5~z;63h7f2)TaWq+NFSWmhvc<6JAv1pX+nmUP6ipLOahO zgkgaJR&Qe>D+IVY6yfzH2DeMJ@uty_xgZ^<;fhTCamOIt07}NNp7}CYhu%NL_Mb%c zEUB^-)_orXD8LQRWkNj)>W$`kp^*$wh=pOXpb~@XEC=dw?B6dCbl~mn$7=uj%R%g* zFl_b+JRq~FGlMkPABo|a^!*9XY36^Rv8@wBC4D04?<|`$3i2|&@9Sr(MD2V&no@o^ z$1OgxQ&6g)2-r7w=>*fWWdc>>TZU!S&QePw*3fCso}s48ys5Vq+dmfBP=ECFY}uR} zKOVd`k?t6=Gp<+V9tYL56Q813jOV3X-h@4LH>107lI z*!B!DF#DS0`&F>X^i)m)Uw>i$%$G0CCa=u1^i-E|b9? zfs+V6zWBO}vf(F}Y8(B~loHpQ#$S1%RggFPAep`>_|VWf2C6>w5a%Ozo&(g0V^#vIVeGpdXwlJu_;Onn7hA=)!W_XkFxnl zSB-B<_i0!JI#~^@7xqMNGSy~&LO~x0iQzt^tOT#DPM)bkkOGrV2onVcdoB+E8ZWX8(fiU90VGjpShN!1?O zVu~oFl8Cg>k;ciVIJTV~*TOnjTy87#G1Ws$$ynA< zyFCY3o!U&B+OVOfs7=O7*RG2xr@lUF!1~~sH=oz$o->>P&Tb8;$8|L|G7L)NP9F;X z@FAHR)Ufh|#0D5ZIfV({PwYgTEa}AywcocrNyuZ|!tpWqoj&r&ss33GGu=@z;)~)H zIaZgVw>3yhi94kH2V5(`>f`baDg*9U@q~AibZ=$%8Y$whP@ABm6-*I zdUygenZc7^kRtV2mLj1)K3hgL1PP5K@2pXF-O#=ubg(pTgV;LgsC2(0H(=r;*ORZS z)?G|FkKO{-hkU%2%;FmF4PC(|S5FtceDbU(K^Xby`Cp@-OtbX5k|eA>ZO6Q=<+@2h ziR`b=4ZN!v3M0E;Qwi^-112X!>qY<{eUGE8I_F)qi}&WQmtfx96aMyUg1Z?*P=L23 zOEY)2XG#)S zA)}~t=bk-JJ==zWnsN%6who&7NObh1&&}*U6k*v>qJ)tq@20M{x90-21=rn43@Wxd zS-5+BrIEA9tlsP(nVSM$N6jz&TpSY@5pkd5@styWc@#h`P+CJUr1F$aue609T5=2Y z4MgdC3^Hp(;~0LR86+g%$xAJdya$SFOY-wS*71Hw5Z?#$@C$fQ55vDX@+Y)=p<3{2 zrcQtON{6!-Ix_GHU{~Y&a52QzNv~B}H#CJ>nzKNk=K~+s$;W4WzL>lFUXa*ujb8 zr(}0svzHhoW-W*@hV~|Yl!<9J!nw9&W`~+iPYHCM2S}%d4*gmD<>YNHo*(_BCvkPp z6SoLuWy?1gskxiEj>Y|JE3xH|f~Ig3$Hl{?m+pDG5-0q9A(r>=;*L?gTxczYueWNi!@Dd;4H~D&Ft=9cd=jMQtE1-w5DWak0kbG26`855Ti=v)bZsvl4Mh_c794(K z6jNuf=68+-34+ph>zS{gKWF~7dvx-%ZLtS5rC?Ig*Y@^hBbSd4ETd*qhtc({0e5=1 zh7Zl|sMM-MxF)6}U<|B6L?&Tmo-%fer6B)~C--iw`IvoH>6m?2@6%VqB9-@x0N<4v z>76fj2i}8dZ5_9;pu_(wipxB!PFXX^f{g8+3pY-dT8tM^`eh3P*+5lO&*C|MF}p`6 zm6Rw{ko!p97=U`=_6*DGo=xK1s}ud@l;zME6X8sFQqNu;32n@ovAeEcQ}iV+Qf$>D z0eKwFYL~;uZ7fY-y#&qxJ4t{yWAs8*^)0Kz!wv=NB+5OfD$j5i(~6cBBYsNHJI$fR z5pPnjn1r$wYjnj0|L8hHQSnXIA5B#x5 zaMTOk^-_sa2TJA;2bI(LSAn!i+mM%NrXKcds*3>{XYK2RD0U(@19||Zgkz0T2lG+5 z8`glCC#;VONLJS!Qk@y(Oizo7#VXz~CFz|C-UxWuVN{h`x##EVT*V>~?ri!9)`Mjl z#PD%W3&@1mY6_Q&aE*n>YX|&%(BW*Fm3u<3Ay3!Ix$MN_13kUD9ekA@HpAgyZ7TES zyu~8Dr1eo6slMK2@LN{n$CJ%qCNr&qTi(PMOKlrC0qxTWH5ub`&ivNCX(m5P6~eZf_v^&MEuqVdoW3 zCpxyMb*kelcyvScHm|I9RJL}&Hbt>xq+{pR$KUV{PzONn1e?$ph%RdwyWaS^!2~4U zKx1oJ1jmN|XsKu(t4B?-rv5`Cnjfm%6`Gtok!l~f>E2>PIijvkZK#;Z;VCAE7$Rar z-hB7SxOKH-%YwauNkHO6-PUHiKvKF$3&-Lw5mA<KJqN9>Ta*wf z<}13;nL!*fEU6;qACfggctEY1Z2=*uX&#QOi#?Wk25vQo@(0NoDyQ(SlP(;DmFO5R zr-{8X4#D(M#Jd5-LY)o??e1Z6Wo7*paif)Xw!W_Jhc-mL+XsHoFs+7GIXruIjn2`v z?!y_AQz$LnK5ujDz0poZBr9FGm~!DE7%l9ivhvDonMeI?TD`o+ZZtp?AF%`odT=dF zU9Lf%6eUG!2=Y^G;IQ*qIs9Gg6`JIY9&{zXu*rxw>gYvA1-Em|U#Rqa_3S&jd={KA z!c$k*slr&~wQIOtr|j5B%CkW-JCeYwuHUy{4SDh6afLcg9ENIA7tEe1$8BTcA``ES z8MWqf)A*qnSF4RWz`3{Rhz)@1_)%FIQN6y_2I~_5G1`tIRZ{ec)Aia%`Aj_P^Or+E z1!Z(5gNT*!plM3$@Fyho*YyPTI3xzX-yUf39LCDw=fF-hf-OLv>kG0By4ssNLa$a!cn*;B|BGM=N|$&p$)#-Vv$`Q5 zeX?)9(nam|O3J`ro-(0a-iqga4x5{PYVWf4D|k}K=sPpY^Qq5jjpuP2^9TvxAo34h~< z>e`|KZy&kTmX>|%JI{}q3e@|&b{+&NHy4K>^;fg&+4k*Sb>}J`3R}^)Uf4p(WqpBr zorV)?W_%ImKc1o~TmV(aNGme;f#tKRjhP)%U~~RL>s7WM%}2{`@;0zwG?B}Evq@lC zK=MT~q4RB5>?^R82i-b0nufgvdSTNB7J#mKRyMS?)?a+jj`JPnoInJf)xG;NO*y=T zDCL1tqkWgE7W~H%fyPzmi1w_<&AqlJwBno{FRz%Gs)AAJ2dVAUsBU|ET|!g+`@)og zLC-trZcA4s+KnjKA3fS#l^TWSzi|xSk+dGsD>NIAI`dRV#MH~`32g&F=BowIRo&}6 zPnG4)8rY)EXjZ}cbjLNlrTX*eYMye3n^T*JuO^TpQ<&Nhgt_-dPgklU8%7 zpAoVz?5ID8*M^{bhf^BRlySXXh{Vz0zI%CQ6jbsQNlIPfzdbT8MLzr%qFPo{-%8(`Z>42%%(Vkol})w;E-DyDN`3abfO=Ptp`!r z`o>G!K$m7i5SC}`uf@B(6-5%g%e*(1EK9(z>K;a|q67wV*h2YhXGA$5btwUd4j}H@ zQPB+YyD**M^zv>6o4suS1vA zR<}>3IfdGdW77uXHlI!{qAKYPQwq z#o?+IBLE-HURTl9?s5$Heqm==OB?G#7&9vEt)z&-P;9hBeV4g;SMjglurTwqC*337 ztc9Tw)cKPR9_n(!;uKYjvjyr5CQX<2?%lf)FVR#KpW<+~(WBzeBybj`45bc8+@L-H zrKNnbLb?er%Dy>T60SQOS?dt|X3&C4}y5~6$uVUeYI>GspY99H((9Dk?dMXME zV=rGk4hm=A=^I`sRe}dBUo2e`McCQZTFZdFV(Uzdrhe$!m75cWAhi(nN1+-OIi8|- z8zWxt4BKrWj)}TVGa@tXZ8WIPBzMq#BBFl$P_rMQ;}YE5dbei_PlM9!3B*3( ztABGVRkU8yIQzZDrF_vhh6A(l5-`4J5uEac>N*&%tvy8vKRG30R>ik}0T5HE#0gv6 zEYu&Z_R?0OfjG=2*3VDZ!LyLE|5DXVIfJqhm6 zQN*^sVQbSMas&9~7pwTh$a!rCtm{X6G0zlHry{Ri+uG>r zRdWbiZpB0hk%`gxUpHb|+cfg^MOAgiICo}4I<1#o66&BF?@PP`Sy1@*!2VyZ;(x&V zz`w=*f4|FrUl0ENC4m1td-(g8_;-_v|Hi+8e?@bDzsvu0;Qxpl`1_~*4@UT(1N?u_ zfBu&O|3};a$T<Bv?WRc0TLSNV2wlbLlQiVJD~|75F`W(4#9%EJAuX_xI?fIT!L$Gx8N>~ zyEV>yxp&RFcg?%^tv7GY%$gbgqbTYtId$rsz4r-Ll$XYRM*a*94GmZ3E&Kx-+G8*p z8u}JCCeWhiP~?n;R>dd-m-y&1yVvC0sG{QbKy$;-OW@Ao)0B;1Ci%$9OvMs{{p>Lm z8}aPrGhW4HgLdBPe`4eqm0?K(a<8^w+m?*Ia&Cvnly%h7{Q^p`WLI>z$bLu^rE`4~ ziNZM$Fga}6sTAGS82)r4?X@oLl|ujqgSQ`%_#qGoW+)u^0n{&n2{wpA+N@7Mmr)_e>dI#p4NX^ z8u-5*;eWRUvtsKMldF9H{{?kkR z|8N8Ub}|2VxZ3|OTljylCH-G{>Hk+)5}f9^K*94TMD%vmV7-Thg|lL}raiQBShRuv z{&FpJ!Fg%n9Wl7qW<6S(SWVZ{@wgQopQuo+MX~Yrq-*uKn}#D#F6o1oP20%oc*cDd z@}IdD1ph{&VTjnJzZmQNn%I5i^M@0ThflY6OAnIAq~6B~oi#0Yp`Cqk3Z$gE9=7Fk zRt*|$(28-G=}6{kI3F*u*kv1j=)>*s!^``_hx-=H`|XVTy36pT%Rz&#F!zuq)Z(07 z%)T0&(tWSIGvj_6zXG@E<=_4v8m~4qvrhN0i5-vHut=FwZ49V_sNH_xs^HbBf1boMCSPI3eCNe`p)zs z%d@GqrThJ*iDO_bGi7In^d#G(>p0!334iM0GE8m4BnB*W%znPJ-J)=wo~_|yx85@vTd6e zrA_Oj&hJv871j2G$-kNN^|(&Bu(i$92aCMc~)p==B!C*8J2QwwVbQmBR=g2lPjz{K@sq@I74ezWFSd zgJ=J=KVD?=$lai?db2ly87g=JhZ_$hj@s-4$NNASFFN})O4GWj`0{qsyZ$nzVf5c)B6kRcFOy%X4Tmng$hCT zCzzm%ZP)HjSu+E3l17KC<-1<@x7-%4N_(Gm*L&OF>??oT!xyVaJ1qWrK|-c8*(Uxy+EX4XPHsa5v? zoM&3zo5)8_zXP6jM&3czqir&ig_#T$$(pZkWk;I1E+7+h z)0-lOQ{wuo%*I1Fys!GTEjO(jPG9HTWZcbUkRG-?NO0M%cD(z(AFpX;>2mN>rSKD8 zbM~9?FSUU%v}@F%?o@Mz*L70hQkv(5z{*W;jP=eJ8Zq75xt2Tkw?dlt5kd#G)Cry~ zUUwlHmBz$kDElSseUWN`zJOQP1sT^KYTgaM)+8vhu7L9FT7N=H&_d#vE-Vqei`R2BdI4BlNt8fme`a5&$hdUujZ z`pg*$wdCzB>3Z9naa+*P`g!vN{s+^Cr9zfmIbYuL=TT|P{q-u!>k!3a>HV9(CIvUu zwkxSqt>t=xAX16pxm$Z6u0CzV)aip5;J*%-ea`AO(}$nYgV@nuH|)ynCbZnfEti|| z;uy`5vX7oPLU3x5k1whoz@RJ|G^ec zBi78~`LJNKG*fB9*MzCi16ahE&EQ}ELXw~6^r;<0aeUNHb6@s>3Ow+p!=q5+K7^Qs zyhJkbS2Fn3bnX-Zr`lp(&BHxbfG^+O!XV$$b4)eNA7>5e2<%2f`^_QT*IDn9My5(z zyc{%#vHIg8MK08Hs|RR>jQXe?QJ1)7pmLYhfNo=<`Nwjll{Jm?+=ITz(Rf|ibP;4S7=GC!RPAs1)Fx< znMZ5s?gzM)rSf6@rFXNXJlZ>Y7xOWeDh|`8XE(3mob5NWQ_YjMf=3@YZ+gkj+wrZ5 zz#viGt3I_#)OEYqZ9C`qONzo2t9pTfpMo-kRuc|rrLT)AA97Z_bZ=&dc}2oN{sX6D z=IV^0mF-(HZT`wq%z4qr1Mw-i$teo(y$oV-tW+gBB7%RlC*ny*ATEca7GqTw7IorM zl^n!D?Di--V(w)2mw5wLo24fF*0p-5FpscQ-Z}tddxiFA*KNxI?F*p{MC;dNo&Ikf zQlvcfT}%q;^B=|a)NN7O7xqhQd7Yg3=!)#(Pw9L25ItLmUZ{rm8Nn#Ows5wB)Y;%o zbh|f68g94Loa#ol0go(r8^1m^CC;t1)5Ew@xJ$DCCPNiH8MdiB=Fp|9v?bhrT##y=UG_jp-A3|W#Z-!Q^UNQ25`_{=MlBLn^^yI! zo8qPG;)rV^*=Wsv!syw^S-Y(V-u>~al=P1BvVf~GSq>wGGD=>HME{&UE$FHb`ZaOO znQY6v%|5E-p?igY-@!6&*dEhs;^#zLb}RYnuPGf(k2Q)VQ;7Q3bggASDwW&J&fj<4 zi;_W8XI%7ZJ*L64O$xqUVWK9=e(kxDBT9(3Ro~zCPD|kaxDBn_3;R9ys+5 zK>EvaG;znG;?#7=jPJ~@Uw9k56|_`{W%5_Q)|xD|x6+=h8(%V5$HEsa_=lVQsdRCE zi(z=We;a$<`nM?3^g(iWD?O=y@+|GlL$Lc2?7kly5#0e!PE%UK(WSZhYS5Zz9%bTv zvD;~upSCE{I!b-ed~;Bg2v1B{*wnJ$OmjBwJA8PZI(D`_9%?@R43I{tLVP~1Ob5hO>t86#1A%y&1 z*Dvv*j%+;dy|pnqiS6n5@%R$Go?E35dV)K9Gdg<8T-NLB;L{%5S-u4aWh3x0@IXno z;lMMQ-+X&}V)}jWVpW&4!Mb1R@!#RJFKKN^)z2$Uef$Mt-%8T{pm`6YJLM{&M6;`3#H zd}C*&G@IW~bCH$p{?qTgyWzeI9NQvbD}kC@`bgo~-32nuPjG^D0gGv=nKX8e#v_9Z zi21Ar(_=p>vbq~ZJdv4WXb8gc6P!~P@VxHN57HHmU%hAPkWFJ(&+`d2NuB=nNjf1gn3XIC#)nyE?3>HwM7zmw z3A_nfh%eSmP|o?{>h|Z5B#IslyBFPLu@bB~jv@UN!;1NqA#Q`6UOC91Am(uV%)LGx z90S<>b?HOiikE`u)#veQN$QrPuN=k+rhQ!Wnv!r%Wu}N9HFqS|;`JVqcjYif@% z!d~eNrRj5HagJ4cf`EQkh-l2SU;QATVcU+&#|x^0w8Dn?vynQe)VHmsolA{Cur))t zYNLrVUh-su8X)`PX2?7mU<~R)LvgyUw0*(Y#;+{!%^j_cKW;C}T~)^9O*kGl-&jc| z$Fpfp+Fq4&cf68y;}FK$udW*<>2Dyid68eqhauCD1}Z{rHj)n9*W@Ae-1T)EkK>zT zFbANmTQo*=pNPlKCN-^1m7eaKL^Ww`?Q~@UhiPmHFs$eH&ji= zXQjofgO#kF-<3h@hoKqtMX(XHr*SA^SEQ{6}nXy5PMd<;a_y#`O{EgWgbtu zbw;XXBjMt{ydi86Qb{|uD1aNIoU7{WvaN+L&zh= z9)hWzHC zm4*%lr4gq-^&R=?hDLgaq43^K%s~FrFEYIsw8Ta9(h>9eaEz!7Et{Q@EYj+Qmnn0e z0Zqck9lm%W-w~~PjhCyTo%%ski)Umso@Yvv#i8I1`;joMWs;zFk5ywzg6e@^?(HyHP>V9vV?5BNSV#%tU%gHCb zG75SQ=82wwq{M8%kOldwXD&C5Jx*-UMem2ZvV%{7XteTD17sswXHEf+YD+PB&NORAAWdP#E=N*4xaAK~lO2U6@cbeH3<<27|fceZ}8j zcLLknq8g!Xz+y6!5)*2<^`c72kK6elute(@D`&Mrv@d#N-{J?iM)~+5eM9c@819|+ zZ~Pg;jmxp>>`4>bymvL1p6LY0FV{}1O6XYVuTznNMv8~jX$M_+>_#WjSWR*;gKsK= znzid_><7wc#;FdQoQ+GR;0Mbr#z`I44xbiNcrABq=aPALn=$dhN(Z13vpOyxB%avn z9VFb+UORW3(ly1R!KtY!6k+EToKJVZrMYx{rPw@(#}_J*XV@K4T!~&6^FCO6r)qHd z(L3jJi$kcN-adC1=IqnQJ5cQ%f!(4?N|4beF&N|7-G%joyi-BujB2j)qAQajftP+| z^Ct>JiFKGP4&v*)8zcMTJl)&BCeAsV%ws;A7m4m`hs6x;UC;!#_4nKPYGDjp_EvxW zA&bjlG!)%m_x8M^Jo4yO@mURG%&DBMYJ8pybDLzDN(!E%16f=S4)Q~WYU$BA5zCJXv%wU_A{^`YP z`4r9YiJkS=&yxZkmz}sRn+W85-6MRFsvOH$ktKX`?plddPQ!klE6wy z$;W)M4#N@4Z&yAluAG|^dk%hj2%_;y7+?vBEhH4eq;ua;H%i%*U^2>UBn85UIeyzl)6oTkMrw|}j){sMd>eNlOSb^koRP;9ibQOvNJhqIMMC`W}M`$tbhnJ)OIQt$?Y;YKM&e z?n}_E-IYQh%wPD8YXQlN!J4I>% z8qRgBZZDyT(;io}+9}JLg~gLH`mr~zYa% zfn`!E!MyIboEV<(N-pH2B`IWJgLIr3jPF$^pG}57rb`rxj`1H(4z}y#v$XG!i(P}d zc)yq5J8e!-4RRml;AhNO;GyhJyTN68orf~gh)q~RdJVhVeYkn;mO_OeA-((;Op27k z@H1}p@lVE{k*(A;n<~*(D`+M_Hir5;w^q#(Gggcv5SNSo^AfTSyqMqT(=W8n`1;8~ z>3?ymG}I$Q-%ueZ9T08hy|(>Ky-#Gw~q{o?BIK` zs`wJ3{XOZag``%_o0A~1TYcvNG)#>4L_GHSU7@8b`9vARO#VoprrA2-$weF+nOv8z z{Ah;%*cQGj3`Yl57HA!jZ+BCL(X|t{%dwe2deL|HwplCqppWVMms5pCV;aHOvI6Cj zff5NY@v)OUJeM0&>p93V^I$yp5C4-JisYuLH30oGxNwUfc`LRb=+--!HO11!F~=@{QY%u}LCuqh_GjH}?V(O^=ye_?!vf1n{QTS%~^=& z?L+6y`dyAphwFmdOvG+x0?#&tgUat`9=%>TUj4PTpFMOXoPamW;M(mjeq>Ro&79W! zj8b1xmoaj1Rym9~cr~Al^>BS?((K$$GCJ)YoR-KA6JiJhP@ljh*!0P_f|n)&>k)|z z70to~oQ8VUOEEWGwa*c8_A|XvvunrWR#`Y| zy-JTxZ|o@`+np*M#yi3xWiRr;muI@Wo@&wAb{N}QaYZc*R}m46%Dx$~EF`mZMbn=% zl!wRSbId(&fSKllF6)pfPWe&QZs+{3{fwv$=zhlYEdR77A#4-T=rczS%AgY;pLrg& z1;sHwjeV3}qovbtZB-nMxV63Bt2RYZHfFJ|d~~J3Pe;sum;pcw0Z3m22bA+#rKFoG zRcMmj-=mw#nHLw-u=Ra~j=yNaSJ6Ry6<6KRa>C4ZA(9Nn=pyxr?1k24hg@0SEW0TI zIoxAN1d8-=CV~C4f^TXX?4G~xEH-X3X6YPj)0x*~OdE@C2jzno4x_#fa zfyuMd@Pk23Mf<3!`DBkuiTpTb10m{zJ!5prReW&2ou&$1$D#3X`ofvWt61DQylsxu zwlX%$W8ssY>=2W5S4MaCH+5natnD~G)7mP?W`yRd61ImWLm75ds;K9ixhaG3Nmmw@ zej)*Vao60^FZq#lei|ee)m6S|@K&VGHx zfhNh(bhw=mc;-L~qmoRJ%-7IpwuymDd-82*kkgwd?eC*TFOLcR%2&^)LrFQ3TRk3F9~^nICr&@62vsLyppr>aK&25x=BWhQ+K#I%hg8~l&r67<26<*3Ds16vLH zi#)kHdTh47K;CxPk12U4N*l3i#|k0dMDFk*l82~$D(JOE-%0#S~>!|yKp4NOM2E!NX|}u<2duh%nCf9C*DU{ zcwC(zqO;oKv+US-dmbF%L^Ypk{n@4<(C7nLAVO9efK3K81IgV3>k*hH{dq`wfMAdc zc-tP4HdDDt#L--v2XHoCQMf0vOZs$xqyXq2fD){lW$f0*2 z3!L=tWDft6*;M%EUfrfn=T}mlk6O+P;hkhAslT+mFxRlhuJO$+WZyp_NwQsoccr!4x7ZNW+z9bX(|^sR>m_*kSjm3BdX<{ z^)3KvO>tP7()N#2(tXp#^~Z!k;bQ)ST0$bQW{SwgbY<=3D!7waO^X=x_F5!-?`m_3 z_^|ObyK~Ok`y;DnwLwFP&mC$>Y#rIll(FyzV>Z2$P(fI^@obEuGb@O?`YUEbQz(x) zF9}EUrJY*ZVYbpfJwaYov4H)Cb&adI`nRAY*kKJY5r7vOP#kt%60vWPdx(~%R%yK6 znd@xF7b`(bUxzrftZwJ)nhGLBE|=T0$`{;rskDC{UakT#j}n|2>huW{1W`=&yr}z| z36~(E;z8sNA52*QYOY(=RkS*JbJL<4`Wjp=1@FigJug^ACh!rPPc>I`YVC($OLbHa zztCU@WGu(2$vr7aHL9lT^)mg;0GW|o8V>@S|(A769h?jJ0?gWIsdo|wkf z*ij4J+*#4-4tg!UgIB#AwoBrs%p|w; z+3d#ReyOhkyn8!qE*-R~Yd^RZSe+b#`1CMaX`s3A%dX{%(eNi^cABL*0Q4mN`V#uf zDX|ntvDLsz67YG4am&ut&PWpL<|~PWD3=EHvgIs*7wpvjdEH84{@XtUi&|YvF40C= zvNP4@cW`H;D^4hd6+}&q>t?UgTFtP9P75_{$nv}8wrN=OhMW86@fs5`YJsm*zYIw2 zA9XgNhF(}TUtLsF$0)!%>^s5Ilp1nLuZmsPqnYYY>Z>3^P6oEEkM5GWcSJ($hsZt* zB--j;-hE?;BzB(XD*o$4l0*Dg+NA@|UeUX5W#wjReV8(UfhC&e9jC$+jq}sp+$4|Y z9H$lt;*;aqJzuS-RUrjs0jjCp2Q?zu|2n7v8ULb_tDAC;0jg8*50vvK-y(lWqKLZ} zbLok5>_iw@WyqXW3VEaI@hJehb5zAC%L^1kUVS#LCGi(@KJZ)pjT7Yj591FMY*@G< zQPflQt=PQl=9$5AYa1?7)Sv^Ib*IP#fQ?>L_B7a*A@!Y^8<;N+Y|lo!o#Ohbvcjl6 z&w5wW-Hn4zSRbgf` z39chps-sBb^tDjkT110neGk@y_2h$D>6ETm-mV7z*H;;Q)=G&_^Y=qHN2y<|0XG$j zsF+5TbCGIs78M|bfX!~W?hv6{`m>!QQxh00fB5+9;@PoYPL?YBsiZ)z<=5*>N+7tK zC17&8*?0c>D$62IK20eh0$}`bTRg9je3BaMpUzA#Q<@Vew*l`mJ5haz>ATi`mDx&UJ4<*L7pk+Utby8tf0ojLe{43>lH}| z+VE+03(I|Ko(4&w?2`VLY_U=Ka^-E2l9v0f65ev=X)-A|zEsDbg7Hvff5wYNx7~Jt znOMY4OMOShxty7Y`u(=ztc{hAij^yjd$zEoK94(-W@G}A@od=Tpzc=|{V9jH@|DMf z4B8fT=kKqPL==3@#F)X{m-aviD0!XiSo9HICf80|Z-@LjGOb$tiRQ8NHl>+~beckv zom#os_{|FW*fDTtLZ@^e zVJ3j~#&rVP0MZioqc(=DfhCXAyOK69kF-a5qCfZ!D!)wBA8GEmo$uhTT)%|+4Y@zu z;WW&)3h9UQ@f5A&m*N?4dPQV~cbPBLt2JOuRp_PGVr3{K+Suokfqvt1HJFXNuLwZc zb`oy@4=$t~cvNITVMyEMPl9FR6$%-ua|AO}@HQ^0Bpe31!}yQ+jCj3n*AFVhZuU-J z&mknbVyRk8(B4U5SiY!c12Oo851TEyob?UU@LIT-N&@K}iB~`Di(@4hBE>G{HQGp^ zj*GtJR?HtEGYgeK&^uxG&XCP^SP#uGZHsl&xdfNn*>rt90_x}SVS`2W&q-_LWh!@U zxUEGDK4}AGTFB+hI>4H%R5%YNJ4|g zb$wK%+Vkw`f#eluYtzwhS-Olfl%1~N#q`?mP0+w?VD)>!A12oVp0~;wKWC^h=(g!2 zwImlW8(3Qt2kFsz?PuPM$X|KRc)hx`r%9K+8WAmMclfSyFEX5+VNdmN!WWbL5iX3H zPgbl^5INV{(v7tyiY`b%i@xuo$apc)7NY1hz31Q;?JpR%oponWxt(1uGSTJF)Gm_1 z;mwP9*BAIof+%)3I|;$Roum9Z&BlB0ALKjT)jI5{6A|_Xi_e#-!TN#%ZWlA8k}V4# zWCw&Si78_qQU|A*9$W+RO3mDkrQP&3+~RO<{>B} z+a=p~*BtEY+wSuQ#ei(x3)@_cev3s;&bt^;@j4&;%7y-QAG%28vZ?xa6aTi$K9ECg3$)g6-oE z`{LArj%i=h?L1i5$ArYvXfCj?Afx9Lxxw&ZIGYR@jC zTt=8T%MFI-t7kpZtX}yNN{XzVi^4k^>S@mFG40UE!X--l{+I_ZE00xnnErEr(Nq zw%d1vIRA-vpWp`i(GNS04wXhyUd%(9eK5yc7I0hB7w9dl({(d#$rHbi&yC>tIubO{Pd|rOO!|-p*kkogjYn^PuB95s3;jW>n~DTuy~Sh#z1|_uKYf)l4XBp*MqXtv zHv|(}mk?>o|An7zaosy)gofGk#X_(_mi0{OkD`_mn&d#QZ>bY3KBezvbw_>BMLK?)(c?7kFWpK?QD=U^GWZz-~=o9y}5?qfKxL;v?cS0cuz#;R(5Q}8ZhKh1h z82zSZ)C9jgg3w-|$YwDuY18V)ypH8Yq`zARL;c$L&zH-!Bp%*qbx4qJ5ek!LC9ppk zQv(|mpvtInf<)CS#m;%x=Iw(5HdiJUq%d@1s21a_c2G4!{=TkFY8C5gPnO#1E~tHY5_Rh${Dj9liNTLUjH?+>#LmxI$l2up!LCJH$G9)>AQk6Yu%OGrjQG2 zlZ_E+JMpyHYC$kwRQ}m=e69|lHQ*=j$tEFJcoG`F!pHI;dg@CioH_I0Ob|74^9>k0 zC+Eu9t}WXXzt9080J$cY@=vcgAq9-Mrp6b@xGas@TK5oS9J{N?`p+BTh<_|cf6++6 zOQ?S$5dG{86)Qq`5rt2bhKj3%=tJ;!=)8D6E*bR4qBK>r?&xEC47taEV^$kW64H6P z6MLacJ)PlhrCp1K)YO&l4s_~xCH?a4tb|)F(^XDmKg#GREd3ks%*v-P;z$fQgPefl za+GO!e4y#YONehg?n1Si!w`ZkT&-!~j7h!vk#mHUnZv?bph?c+sCIG|x%>_aol@OW zlZztwTwvKAlXy|6>Kixxadr$)0TISiyug}$ilXKH-b@85u1pDgG;PQj*c4u)1V2-R z!};{J#+C&I>Cr7+-%y$i)q0*%EnnB;l`+6EhV?cycIUgN*v9qvHJC!pM+Zn&>#a55 zWt7UA{yGz*Bno{vtH0`|WB5a@pTJU2^wKCm)p>|a!xO5&ioO$wm5i|$=n zmEaDvPy-trsuUgu5OJU{;@mEP?M?W*&Yr4QqKI%d1}Fg<_q)c&$Yp8c5D;%|;;`Uu zs-irIwf4|7)d(yh(1}*L16|!d@FkWSIIkt^XJ1H`wX&;8i8IQk-195g40KcmfO)_fV15d2Epa>?_{JtZy-f{8o|gQ{P&9_6w1z^+E_lr&Fh; zJvJ#CT(Ip9mY^tL(`MZ%N3_B^Oa`5T%LucDTb*7)FGcR6jox6Wl%yuwZU{RUBLD%1 ze)4%PL~R@(bCCR^Ca=c!W=v9Tot&5EXQ6(AnYRV7M#90JOiJ;&0)$>Z#u7Mown(lF zYd;?LgC_pg6cr{CreB5YS7#4>EYu1!U#!T|-iFNGc@GCqhd}+hhFjl$WR>vXDedT# zDO(k2)0SnDU)V1i1(JF6tXFH-EW;*UaJNMj7_m|Kiv6e;8>1PJSU(gRbam{`=%>u~mobSgu3H$piQsbH~JMY=o0-|{w39#uE zNs;c_45#xEU>eo=C$rx9P(L2i>lbYe+XKb%8($qO|Hw;W&_ZA2s|vLXewBE7Bgv^7 zSBZA*CV*Z_P8b70jf51lL46p$>|~Bl$NYr)c}eJgzADTQde3#-z5%ZJW_3;@;-;kv z?+|~N9-h`N)C(C&@puWn7KfvOhd+W!-eMLycn151&A71%HZCGwt$kKB;*99RK=1V0 zIl2Dg%7?N0kcPk(#zxj+9Ylg@2N7`<`oR*mW@wa;gEr%(;B0zUpSEn&bOe4LpfH41 zlbM#ehB)mtg>6e=E=m_j-v;l8NBRUSu4V(64IF^7r{drib~M_?xoqajg{{;KxDw>+ z9R4er)8S;n)$d6NJ5c??zFyt~eo;MIwEi zwoEm!Od0H36JF68m46rd%NDb~`8hb1MQI3YAI~sls9q2doUvKPUAT`(1pU*`(2XIf z0QV*`5CMbNx;m+FoTsQTiHF&kTZp1|32Fwb#p3tT{GS-K2)BpBKCRaDSr#%u{q{SL z%L=L#xNaB}s*nwIV~o7D6ie0NO+!9dGd zd&Il{O_sgXy+&CcUUny)0z=#+CGh(C0TQ>2~rkz#sgx-))DChefjhW@cD;O4m0E2@Waw|&St+db z6n{@cznBIu81^(vEVGj7LiICkURI*AYRIEMMBQNN9={G zT!vjiuk@U{im1`wx)F%hZuGY)N(SNKq&+TgwFq!1Q%f~p)4)=ZFX})X%MFPv-_Hl# z=m%u0F)=~kiXCc6Y#W*;9#0-r*6VM|;2GD&PVG!^Jdto(bR`Xt@Z6uB)p43tb7h<= zK(tc8=hn&gi1Vow)2p8D;8|nM!N$?;T`=d+z%EAqKo7m700%l%&iUiPpRsI??asDG z`^AW5!A3s|T;z3alOV3a-bZ+BjbOKzjM$s$@gag4BZUtNaEt@f)o5lWKpB|7M@AXU zLWh4`^r-QjOSh@N$|`hKgYXPzC;hD3XRd;ID;SY!c`TsWC1X94EhY3>!2d*Ic~oqR z={EkAp0nJ%&YUt>LRg7S+(E;|OMtN$_|3+i4Rg<*QzpdGXW<{3J&5cu{x%%`=kbv> z$ntq9maNAgELXicT+I&`kPSFSHEa4W3F@*n)|%*Qh;_U<>GUcPl3npPZ`|21hCvM| z2*40iElCFt%m!ojPxI|uig=RUEtFv$o7-k?%rc?b)DaS*pjRM}i*hZm$}og#h;LbFtQS@rxZGoBV$KL9(4NoOwXN$q z*+k9zyLbAxUXr%=y6L!@6Hb+32~#7KSxTMT^{DaTKcUdXTtj|!^PKq?-hw>-MukX_ zf%;K>lyexv)GJw2lAdYER=tV3GE-^!yzL{x+Wtw=dv<(yS_q<6jZy)Jn(IXRN>RQ_ z+nBc?G@TnPE8+S957C`0qO<--ntMgjN>nBwdR-Ml z_(g(m%W0HR30ih$+TJ_C2t>)3q3+D$sWIJM<*NLX6JxFK`qJt*7r&&j_l(WxE*N&= zxD|DgUbBQ?UuN<3Ki7*ljzK}ACCt0sG~V^G`KSixk6dprCJ7~$x`sNdLl(9Q5SJZ! zY^AasM;dWzb~S|HGd4I;b(t289QkFV2cukJdtRBe61NQv9(PVg7wqjx%;H)D{?N~g zjvU0>iyT5_adajF;f0Mio4NMRiGVp)eV#Q-ev#Yrisy6?th40`irDL z{cfgo2{FVxaoSCRR9*6poirt$S8UAgG(CxZvKqKKhHxc87en<2lVYk0vQ(N15=`Yh z{<;}$rPX3~6~p0o?_#y{dY$}_AiJ!fP`}h*1P-Gvv)kBEYma?x`l~`WUg0UdqB^Xu zZ_BD<(&?r&$eUP0=nr>e3`CMII+o+@Z;n2k(KeXx!zmf{xELPL+wDjS> zUM-5usn&5gcCe#^lvud>U@sJmE0C3v5QpTZ?f9x=?d0mM5-H9RJhHGW?`xr*=%jxv z>9pMn$O$EcGSievU2yCcX?J2BHmYm53VtBJ5MW$sOlc2D_`^Ku=Wzl4fXxaj1avBZtob>IW3ADl@`h<32lXn)ty`Mf+3umO zN@TryTw;jUw*l8WE_zVBu=U+cMb)#S`O#MQwxYz`NK0W(`D!{y#n0a@IT!d7K_Jz!fr3jbtT+Kn@OLMi)+)xFByHydgI z^KXcVX;UXO@(dnl77EWLkP2Xix(Q}~Ci^k7+bA^#!FSpQ6E#{bu*{7IICmElVW97N z!xagm7k1K66>EO=OjbEx&~hzA5d~T7KU1aXDqwBjrrz@{P&;{mb<3&P8Z=#jV$=W6 z^`D+kyIoE{Feog{->=Y;?Tn$1e3tfEOVXEi;{bDfo|BJAQ-$ZCGg!;4;hL+;i!fz) zeBuvn=`;UY!wZT^efMLzS8_%%Ayr=OoP5!zhl1MEcYed4&wgVu`9<-~wLd=l_UcN! zb;`oG$7y`EC%oh7i~cp;q8HO4tG-wyn%#3Lh~>D}#sp6Q)y91p6@ujXDO3m+LCv4G zyJP)qrjCDgA%xssB;m(x2t1yq~4Fi%Kgzt$&brD2^fvNCKPtPnZ2) z&h6%YJX(V@fPSQ%<-2|5+dgns6vf`QXt;QXyupl@oFfCb2-<|mn$~h z(nXz?`(J>{azaENe?Q2n?8}7Pu8TV%0EXLsF88>CbpmA_6P%%GKweoASpIX`dFhS_ zOzf@TdQ5%8mNv;!Qv1_oBZ)NhFF=mE0=%K z;q&OG?Pfg(ST4H)ODtlrCq2N`%@rdu!RekCu8y!rn5m~jLM?wW)3zfWkK^1G>&Lo3 z2bNugW?$r|k}PiZ&IxlZ*G`#nO!U3E&Q>6JL$d^s|E-N|3a>c@iG zIzl2Imxv=0g%eQ6f{pcTN2UZ5Pk3AKw!qDvy<}6Td(Eea8DQ5W7nJg_1!grrTeC%6*YuYyT>jz#`xw-XteWX9=e2iQKMzW9^X zaKvo{uj8mx!e5|T#bWx%P3;aJ_pU)J9r(UMZQeY!3tq-(X%FAIxMt=a^MmR!@ww+^ zX36b7;p}sxj2n?*rtm7+l3X1j&Au77Gtxd^?sWShSGv1~y|HPX?cMcIJETDD6HAln zvXvF;!Gp*e7l4)!vzqJvYA!?!{)4rD>W35fwQ(#@y+m{+fG`x`QJ8L98d+reY~mljADa3PlVoFONae9e{gUu1Y+;tu&R-JH$wX?#B`Y6M;-6G1%i?1 zhBVY}rW)!vUc1Hk{wtn$=feRlSRnq|VjslnT5*jic9*|7pQRfIsEE7ud4GApwHl~OjxKdR3ODpa%Ha=W@laUKW-%6Q*|_x{8UIC3CK9)K_G|%B*_q zd&~z=0B?cW{>`aTrI0s(Kj>x2;$Mbj*jTk^NjZNA8@1skn(u#tD#%Y)GRXu?P3w3} z);eHGN&Z$gY@j2UPwhDeD1F}hVh`&z=#i1M#u1q-CBR78PN+-;%rGxSVJpceo&W(l#JNiiGk$He5;K*kJ4^9KpvKr^O8ZZ@ zP?m-7?O+m2?9BJXI#TE$z~Jh{M6&)Z{nU|nJciq;pf#qGaOiP!PSS(2i8S>LvlAGZ zLqCcBP@;YF4#I3G!l`J_(N{WoAcl=pAk)7k+cI7IgL|ZHx!{pe&!Akwra+*Mw+{2u z>*X^;3V3w204fnD$$Lnx#;bz!73YSVqd`7}r`ru{5oWlLsf5(b4}ZDQg|ny@J$qdG zMR5yoicaSl?^npmMf3}q^Q%OTXU$GHjR!7Q0UoN*TqssWQ0BGEqRU$CfmdtG`tCu4 zNua2v3Y?P;B4GECz-~SIMlr&EQxr1Gk9ygCNBd#2Xa=%p^irq1KgYQ%?B?CR`-6>w zS4P*c($F6qUaokUrP<2wpoZ%QeKskK)qs;+xvRUO`l4p-5bQsqUycFp8ygpsVR&i( zF=kQ{=TWgH>XTv`1a7Pf$q})8q$!j*;aZTeP)_j$HOo5s)}`;Ku+ctF9}unD$kz*uLpxk!#lb zSX^x)Fr-qNT7%j+>^A*T=&o6%i#UJ|@+Xd3Vc}5{^~ISSU!@A*eDl>CKBB@riPy{v zs1N`|^I74Fhqn}1MwnEqG0ZjQC3T|M&kx=UMAOWgSOv~43e}qTz=j*{uPNG#q8!Fc z>JI&$$nIbY_le*^|8RKIV+Pl~z)|Wm8p&*vP_)ee#0&V_xs(n#lY?;YnPz5i+a9F(~nDx6P z+q2ud-?YQbdXRdl%uDy20|x!U6c8A4FjN+M*U>K;*u2{m)V88P^+eMD~oA@-E(OLI?`5B`YO-EPk^3Zqi&78Bb1 zTV;HuwUa;Toj?T+zW?X?Fyf3}pEN@7beV$&wza0~Dtv*U2%-IUjv@VdBlTadAh7lO zz)?g_jOg|9-&6bP!cM*5;0I4O-9?Oigwu+bHXH=nusPNB{qqi7?hn9MPa#qu7t2A* z!-FB2&CIOz>d+Ii@VKtutbs|S&sv0O4c1MMT%^BeiK8vs>iI;#xG`k~saOAT^tQJ? zX%{CJGt6ACocEbg^NoYBX|)ZDweZ%8kMF8yuM0YTIIE&|heD6!N1|V_OlliS=g%`A zzKot!0(9iM%gr9r9&%r%6YolOAKdyq*Y-j(hX@4bgA!v-tO=qZ$;?D!_3eq>kLp$Q zkni~>jB5v=g={7sM5{t$ZO_$2y7)w4>@3Ib!oq_)VGOOzJ}*dx`CR5#(ZDq_V?k~e zDhW5M2Kl9&v~j1(4TsGOD2Dypc!uxO-u={km^#SVufJ52_X=cFnxW@X_gwymGZ ze4Ko69jnZv)?y}PkP-SF3)lK%a>-U*=S@-wc4L=Z?NO^<0uioI zG(vAOY^6(`3+J zA{i1nl$$q-c|xoDG0u13a-@(9e_3>F4^NJP)u;azZ8*uW9I&kw{5|TMJ)7pUfVJAk^hCd zzlv((f8YSoQYg}5K}skd+}$05w6sWRk>U=;-Jy7Jx8hnT?(Xhd+}+)R?)?6{=j`se z_u;-?o?rqAnaOKcNEA-)d1 z`LsCdI+_h54`jf9qp85(L(Sccu@&onYwV1SD0JI#82|3mswTwOyW)`P5SpcE4HSj@9 z6XoC98(AutM;0g%e>}}I%LE|AS=a4zG#P!wQXn?!YahZ9!`rqs`z1s< z`a3U?=R0Y0Z7mGu$+vrK27IziV)8f=*uZi0SVw5*9Nz~ofnDCap|_fnFGa`I^?X-p zD!!+D=^e<(px==I%I^Ai zsx4^O2~4gli>NfKVaHEtazfiuziiUX)Q$EFCaj2={S8HfMyG4eP zvT;F5>38LL;u^-|lF+&;*EuGA+I|9!su z-Hj1)_FL%j3|DU^CIMqCm8YcEDd|HZpjVDF;sp7aiqFO0!ur%=fA1O&yvGGqzccQu zj-IZ|NgB$M-_@;d{CyxCFzxwgejPDNZ=ABr%<_d%5FA2T`G`o~S@+=68b z(x}h$oD}mUZAk+CF;hu@d?k$o(M`x2v?s-n%MRV<;ZCZ9sDSm3)}BLdGP#oR2LS3v z_Nf=7W|m7QtYhtM7c>TYj2;DX4^_$p9)4u)q&hL(4~Dh7T=1iy=gmTWd?rHE;_ChR z&X&C%rkQCVsAmS_f0#KWX~w2Ww!2<^BSJl~LLJT40$GHf1*2%#7JxF8y(^At6JX?a z-q#1$SrNf6!HD#(Im2h&J*}N<@5jdJG6p(-4OAj;D~hmTAPRZj57)BjG?QP^4r~P81ne!av{?+whDVYWNc5=#R z2M9z~`Dp5Lhxw?KSLoeV07n4?vN5v{RwP}->I}N0z4#r1x>i?>aIar%eviFh%mC?s zw>_}+iyD$}dzX%ekujBT&@_~WE54Z3T9I-zqbOt%1o4&sEcv6!$v}0WlqgEv$CS+XpbyeRnJ0upA zrjY{vg$z4aqDo2;>G;-?hffJ#H6-ZoI zS94QOX&M(Ed7Sm$@J82f_HB-qAm2fWqBW{q=|`;7`5zEpE)MsiH*zzhTbT;u$o;sW zBU>U$R|6h0EG9_0udeh04d;Nv0LFyI;wQepmao?C&T9y&*^^kce!Pp@BFv><4v`g= z*6npDANF_l^%}IpO%Jau(Vh8>{^l4J0V>GKiqE#zEx83w9sHAj699nw4bgSgSeGwL z{Ghq__oUaIIP_2KGiXkE%U|hMV@LOV%dE?aB)yV{<4&i7VFmGr2ptBUEd?k?ZzN)b zzAtYOo|28pue&YaJBn*fI@>`Y@{fCwLIemOu+IK6K=fOh&pLP*vxabRcf;t&YsEo6okmf^gb?HH9GOUr@Cb539i zb6`B-yRmh(g}>V$B~8qby4(R}HxGI`G393wLfJVCpAP*{{U1DFufcTk5{APy7je2O zhX#L>uMtA;5L0`J*u?Dcn0r&XDgwvsr}*M`s+MrO?AcNGo$Ev4CxE)toKHLw(FA7l z@zP_E{!d`dx5-X)^k@m;OAX`peJ9?*a0JudF!l8h3k*JW`zxMEAT#sesfPVq(1R(ZZ7inttYOkokbCh`68M~w*deCGAH-Rit}z{`uKaVEKbyy{6_CWjBsLQk`J{xe5=q& zr8kzs(#7#_YeMR3g*{CINRFagDH=0j1zUWZnpntii!nS>Pamo^X*J~)B-?%+`6bJe z^E_L0oQL0|X#Nn%uJ3*mjk1JTrKi^A;#0ekJaqbg!))0znqwpRXoUjH1sEgqJ@~VD zEr}k#q+)1)nN%QxIsJXq@aIaGPI#I;G(*wsLa-1#B+9E>B(UlE)IILlNb|k5RI8_o z8&9%@Ut9GH?as>gNgcV%^cHRJB4PWoe0ay*^klWkQ0014D_v|-+1`#Nj|TOZ#ZI}H zpW9WcGG>K&-eo7-1(tQJ$Mcnz-%2>42(Odp&Hwc2dE2dOG0sRm)c#mKaW?-Uno{K1 z(;9Q5hr|x?y@snG6n{U+)gt_kPbOSL?>SLxunH*~dCjQYq4UqHwumf!F~u$c@H)f# zYf(7)69|%8PL8TLk<|u$w!1EdiBBP=-kR(Cpy>4kiL^QZmKfY#Z^@|KB;7|KEv)|9ASFfNw0KOjx~8Gk;tnkLB@|O%$f}k1gh! z@7k6tObVJhUiRywZ&_`!i3?Wm-d>KZ=HKkGyjZU5Qejqp;Mnp#a~ioYAF2EIT%h$8 z3bWun`?2<~h!@X%#)9c)(YnpDbM5l?CGX1JXWIocldC<_=8TQ&*;Qr$J6y)JZzS^@ zvaI`pQC3_k;h{`t?Vwrn(^K`S^()-*yu~QP^M+pA{doCo$ujGazNsfPF_0jW#Qn&2 z(SjtyZm_TiAS}?zu4Z`XA%>hC79j*zVZ{7{s?!V*rw@SLIk6ze@lg9XkU-^p!Q$e_ zGqJqDKAu#!6Ah#{ELjoAZIJ1?JCCjT5`sFfdDL|3)pLJc7UZKan*q@WT=83*R1bz?k}2C1M>X_8 zk%uFq85#D;|JcRatczs?l&g2QU3XlZ#!Kd>Ew?Ay_Q$hj-t~di(^!f%)q2zRW}BR? zi|(fi&TX(D_y7EK_12sAxAd6&Tjly)fxMk5FPMC5ze*1;;XC(Fx1!`JrSjyK03BR& z>7mG*`_ztz;xMb=wf6k2U(RD6yAxJ-ac<4edhYc-eZ+CvtmNbdQ0>+3*QtbGeS@oK-(WlzMYd!M%;N; z@x)YFPcz?+)y%6ve9a4oOewQHhgvFy7gnmhCxWs`vP(eD6QjsnL(cQHyB7nVX6E1T z^XVX!0QaH}MAH>XMvZgNYU&6*-%aUZt5xWKw>>Oz4wTQ(w%-ij3x9>ALJlavh!LjVMC_k_z&eE)@F*aP*9YfRRsu?SRvhvDBUA z@v~eg;3=QkE=-2C+l;0^iK%)DX`qvNeKb<&2B7h|f2Hq(xMId=(_I>Yke#e#1pC>I ztyqPUAyHQ%k;lnEpRhcxgAfPBlgFFq2eM)!kN*(u@mYN$&Bm+34L}9GFS~YK10(ka zFu`|bAv}J+hEiPslhr2Cr1!t?|0Z?bgQh7wlR2_A3jwb@3U3MT0+wgcYM%gkI6r%b zuBh$CNS6En)~ycUr_rTUW>3cjp^$k1JoFrjwm7M9TD6jel7OPYV!`cU8JY5I#vi~( zA#^ofd8WC5SnJyyd-IN!SlhLowmtbl=RZIqgLA(LzOyJP(!k2|yLF&w8Xp%(8*Etf z)$6cXo0I`B+4faq+en%0+6yST&WM?G_LtA}q60yDvz@xUPDkB9d=enxFY;^ADh7aP z@U&@pq;M?<`i%W9O94?>(#ZdW|IJ#(09J2%+F~CHI4X!;$!T1GFon>=$zI*ytoAh^%4BF=9hY_m$Ln?{5*rJ9980cdarma-9*6|z^h{PCUSHl za+r>PbleV=U98@3i8AqBz_thDq`Ly1lYfL<0#5))+&C1{m?Q+BDYZ-e&$*U=_Ic3f z^p4Vraxll9`GG^oSgmBx?mI=DQC znAhqt7jrN>*uxgX$bHe$Incvk3EMeN=C{d#FPC1qb*t+q+ugJ&KO1o-O{e*I0P7D- zt6W5I zw42-0vMX>_GEMmLY%>de;}(5J$nSANdS3z6Y%ug@Sv9Z?7bNaVPNnZINj`2|xCtbx zw4VI-xX*aE|A%-n50FrwjCf*uqu-#So`~y+?j&t~XtuvXX!X9D*v=}OlHRlS2-N)& zfMDtSIJH8n(8@f=aj%n(U2-c3zqi zZMz#h=(i?KPY*h4n|j9y@)QnMjsm7C@QJA1)<4H5Tyb1WkRu?|DjvTn_xa32oQn?< z#sSf(7-w!Lb56)lsQ@29{-+jMT;P3JFmd$zX&ELg%_0|Lwyywp zB<}~yOh1!_@-n!ZD6ZWKrKp>8%>awy&_88VkNJt* zQRnAEulD--Ma7;maPD1L@~0op)d6Z{|Ea*EN)KaI4w4DY8<^OPtHS|B09P>~XDIX= zkl-4k>lBzBHSLq{0#UWp)i%RWjuU%i$@`_6}eRvl17 zXBgm!rF1I)?v=X+u9Ty0A?Gm`KqiFL1DJ}K?4`Qv2971|265JIOdup%2J)KM^PZ&2 z0@+1C@u=AdWD6vy@@jS+MW`E%wj2Di6*Y)bPh<>5MQ#MBhp&_J@AXQeP6yNILtxXH zP%z)#ukDW7co=yZ_@@x&aG-5)rF^hb(T`T}-vuUjqgaHW8Bu|Jd=*DsVWQ4#INN?| z?bk`TAleK~RtToZ-5T53x3lVtqlLwK9I(}@}aLvR#OFg%MN(lmi)@@3@<%(&m0tiyVI>kX1u23YBU))D_D5lhq zyw0i017!S-Fpz&5SA#hx<3>;HvF+PA$=poM z0!$BtC73>0B@h&rJhZ9q?i>N0o_hf^%QxrLEg%p&4LZZNK;|;`H`$hn_ckOz=A=P~ z;-(u*DC&jQB~Qx_v%?=(&?u+$p|+*6*qT)a2*mB80BZxb5N|NQz4{q?#)RDJbepYZ ztpU*&587}0(+BarNC#-;yVhn+z~mNnWoZGHt76KT$S)YGgtf~BlV>ig1aku!aj7U! z*$;G_;8T`m<~8OqJT`LWReVApP{tlOz{1~sSen<7M#Cyl!HFRz|=JUvFK=- zcE&gPE2odIZO59F!E7Sr^{t@MCnm)7DB@$}6DJ6yw`XkvPL;5p6vZlpUd+yETJ`)n zS@fd+LI5P*s!rN@_I;j2`4T$(#HVW|mDIt$wl*npHQsfv2|W`o)xUowL&?k7XJ=!} zsDLEsW-6N7G~e=x~1N(59erG$s^#g=YIXE+_kAI+H9QXAuF^ z(a2otk$_;w4r1cX&@z2;@s&Sk>?TSh4l{&)+f4DGjKR2MJ;~<=bT9IQ?l^Qb9tfahYPvIU_q8a z@#Z6ywT8!(1gxeXliR@Xr`X8A=3cVo1j-Wx(HKpfzk^XB<(N4E{%dY ztWrpFn0_d;?h-aSvBt&~Mv_q4K5~87r0^m10atj`&E!Lm_w903=jD)~>hBSM1K0T3 z4g(vSDzX!@q4YJ;8Af{zbM?ite|`8VfOkwyUz2^#4;e#Vh~Y^R+qlXo;TzP(8v3!J z*vx#|`v*#DtXS)R&Mrf;Cw{%aB)}cteu^SaJdF}`OwvpkCzS)cGYqAz`dW(;)9dhH zsslqEWp3B##>{qj$J`W#y|CSA32ZylpZ(eLh4a~|imwx$$)Z*n1m$bvV0?FLNzbZP z`zA%kP2e0lNWrCDF}@>caWq>>?(l%77cT0oG<^^)50l5Z0TZ}E1Xcc=H?!-LU`GeW~ z_cp*irkO*v7S_B3NMOoqwdF3O0*&6@1aR7L%Ervl(d>=0%SJ?m+me%qCDR1L?gAM8 zrp;rVNL(mv2?Vu|cd#R)^SDqBW|KEQ29tF}MdkB701>RT2gswXc%T{*cFInBaC4zd z`bgWDa2?IGvg@HqlRbovasebACQyulL>8#Ue2simt|$uraUt)?-mlCvO`VZAhM@Z@ zU9j#wsLkcP(#Cr*E{*Fky^48(gr|qojB%^5*{GHknAIf~bBL3#C;t@4h#2$^e^r>r zo%#elYX-zi6ibIa1ibG7+!YN)1=J?7%mJ3>6=|au`6b?z7Gxn8470l*a5lK-8I)%-4pqgO!J$C>;qYr*+Yc?TSd*l%~6Cru|MGYy$agjT5<>O&Lh;}giTijF%y$l zU+Va+FhSxnJLRM^BL*_m%v;>E;$ZN++Xrt|75MN4+Xea^JL`F7ktCLIvmL*3L>%q* z`_m5eAdb&d{;-ZccCqeNee|JSF$)%u_z#<^m{mHKoLh2XjLLYJm>7p#m@9y%Jchd` zB)g-3>%y+0q+&TGN1o~k6NYaI=Eru#E^}?8KB)9*S2c?_K#(5@)GSv74b%=R(0+@VcU+Tgt zwS4poSi5FQcFDw!e#!>i_SG0O;YOA|zpq=!ZJ#nMiLR~?cs*SI5q~6cq6gv?`32o( z+Oho8K2Db3%qHW!Lry_gl(I#n-f5A+bK9HBsssV8xToPs21CaQZY@nmne3n%`v)xa z!@+%bg0I$yeyUBQ3I-;~u9F{WgUIWR+agcb`bRo{j?LG6{cvCaxeve;527glyG;0i zj<=OU__NB{#HRc`XR3;;83EsbZa{?*M&*1H-i9^%T=7F}sqyJMGgUH=*}oPk@$XiZ zta9W1d<0y(%;3ox(;Z6jEBF%bSz+cuQpb}V*5@rq&>l`A>l?3xo!hxQI}NKp#6SK#$>u{ID%2QpSVI9z@7UAjux`!%IWN|XsaR&$S^oWWUlb<_NxAP$nK~h@ zxp9_IdkYJasxeo-vYwP}vg9e48Pu&Sc3Hn%YH~aC7|+NS9-Ob^qRCboEwV z)wME~*CGUF!3goyvh6mFUnQWb90@_Ky)4fkZoIwGt}o{7y;e}r#*IG4(8r$>XSZ3) z{A7~!e}?J&|6DUs%f2D!!Z%lRkaCwR-0Xh{5Dz8pMlBZne0aeZ3afaGljz!XvMKA# z0|`M835HJk-_4z=s@j*vGDEr6^*g^OdVX^gbukVzM>3DO?rJIikB<2_l@Ro8eNs*) zP{bWTix!^~VqrkaZngf|S}c1tVoanFkZ=PiEgagd z?e6(EiNojzyV+z3#woP%>87wl1oH!z8i+z8@%aghN!x8doQ0yoEd>Vzya9_ni-(h@ zjO$zgMDLfUh5P`v-Ja_re^TxKLiEk6fP^QOz~`6av|DeyzNZ%hf&6!96cizQEvUg( zY$Tsq^9c;vsab5pNd%oXV)&eX8}!LYhHZ7;6 zC408%T&CX+Tdn-otheDV_k0*V3mkhqohepNBo_4&Ftf5kvrZB8xKp!xx*v)8)SOhT z+0dAOxg{8}SqFaF9#W;rk^U}V9)qEfE`*zkAfJXA_?lYtdd?t{7LYl9G9LNswYWD^ zvKWg?JL(TjyK*y-OS=lTK}Qn;a!9|hXg7b*UGaFlTNx+NW81M~)vS;4xEv9UWo>(; ziL)L{e+n3geD|K|a|AJev}V(d!=3X)Hg&)hnMW<4_L*!Lji0^<-#YKRjXx-EumV+> z&!#I9WOzT%o<%9PJ*Fv;0tk<0rCwLBZaY2haYw^pa*TMA4OS2qSqYAOwfg;Xg-y7} zSG=;QKc7|0R%9`W`BI0|1j`P7PjfmpIiLFctj&(65u9+bs@sfR7tXA1Z^DUSFNg z$*MPG0Cu{AGvY{Rp^m!zROUtoO_WD@Ky z=ynCQ+n>DtdohwGD0;;_2wjfxRy2PbFOWAfmfiyPYV-D92r`fNG1G@4w)N!Ov|W|m zQ-U@nb>`|$6&qH8cMj~lfy{;vqxP3Om+Pl9GxH%Z6ol}{s*EQH{G{n6E_FudHLxjK z-SWfoimk4xQGHAZ+B)@q(Yd&q8l%$jIRA3-NA#(tdsRZx>-wMbK%=A9capW<@I`8r zr?PgFj3@fX2cR`3$D#BPAB#OL_VV%hR)+>iT~@z)sat(!1iK);@&*j4l^c&hCb|L; zH7puv2L<`$P@C;Kw>@xtR(RZI74<)~^9KHlwykhpFBKjZAw!_oA|lqeN%_gPWpjwzu=@T{LI8tFnqmads9{}i z9kFYT?(jGgN3R?^tL-khM6hc(8ujA+bd9xsAJ@><-w(9JEZVGI?mDaRe-inlV@UFT z^a%)eG@>JLJbzey;eX7yIG(r9%qC50d%Qn9m4ukBsNG&!pxp+@_RpLH>U8{r#QVtG zh<2g^SbK-Eh(ucRfrxeL{^k|)K^R=6)OCNdrgEwi!S+d28*cVpxb^YkFiWecu@U7e z)zOLNtz$<;T&T!k6_mfuVqS&rq9C%P)_TS)X8hr}?uA9v?=iz&dfH?$P^9DX{GaM7 zEx=>w-`!$)-!VMOkxV6CVluHpTy`2n58|I=o|qBwM=yc6ju|`&)O4V}gfA6$SAG9z zCtytUZY}oWyqex}?9yjBTj4@z%1iVG9@NolG}f`U7wP>dSAc?Kd(#Bm3H}$$jn^Jp zj&iG=UgPezQLn+jcVlL6yLmN=p& zg;m+p-4ybOi&>K>u?90v3$E*~mMNC&5Y%oaqn&hv6iR2!s_E0j`(m*55n&FxSw55LQ5|2tM z=uY0pk(`4wGJ}+Qxlr}n6JfRWFu>7MW7EdxB&`cJTzDlp=t*&Rq5?hR$Bb?5+KYMS z#s>Mk>dYi3oh??^IoFV01*hsfU(9wCD4SdjRf|5?S)i)(g!pVV^uOiZF@d8a{th?& z7poURo~3iPG@bx!|B_ORl=H=VB%RfARU^yO*0jR2p>E}-#G3o<7>(t}<=)oC33gW3 z!;)J`*UCVl5SaJl=8NwH&08oDFZT#~HU!^M^#Kng#0wR?cnWft7`7QHElu}QU9u4x zg**`BjO3!v$CC@mRdc^a`GY?smmAhP=&6vzX4@}?2A7M(Yf=Ov4x->yb`bU@|;b3_$d#};{OzTr~Zun1A-T1U^*v} zt#}U~j@xyEo>x~^K=hbp5nR_Cl2!gfH=^#n_k!tN(ME9QkH*Kr(|wYEo~*Gz#bqq1t$n zaAA0`;pOIjllM`w5AH574LEz=qZ@j0{mRbU)C1^P8IaG95s|BkspgmGz77NjCl)5} z(YZe>L)r)x=$ep;4#6Fh z;X}2*oDU}&L*L`?nuAnhC#Wk)z-^qCc(aS^v;uFW6B5=~D2U`$D;#PExnsV*x>-Cm$_||Jeq?~sWf8pg6nGR;;(sHh#j#QVG ziEIIO*$MC@yDKV8Vv8svBKWPzNkd&Mpi{fVi@&}*S6+ADInpOZ(fd-G?C7KfJ#$@= zRm7Aq6C$6-_R@j8{uB0NSA4)b=)9-=d4r%0^R@#H~Piu&(gF0Y> zfvN+3{kQ!0)OuFZ7x0U51^s@49Q<(ZCx4C}CvU*O*98ZCLmc_o4&NBZ#t6IDhu=lC zMl-WE;1os+PntYHdLJ5Dra0mf;rH1<7b|H6&KpTQ(3K9vGX8ZlB`hN2+g z-^mUznT?E8y**58g=ux{Ly%1oOVbEId}EJSpy=1>jIFGLg!DKdAaCsQ?`hJ9Y^;gI z3uS{jBIF34B0TR>fZYqp$Fv5QHB_a9)sPl18z&B|i!ol36LlorIH?3H~rtk*^%zeWO*+B{# zxl9bldmoH?|IYi5GLQtY`uWRNnvqUalZ4j9EPuM8$>1Qd*G(mJv`S0(YF!-wChr$R?cyG*8CD% zH)U{9&+RxPq`*AeYudAwj2=P?0r^lE;(ek8hUHpI&^&iNA_xSo&jLnqHlcbjUl<~C zROMFH?IAu${ohg|tX)Z&MPjJt0JimM6i5Vc5P@q0Vva0pP_#g@oAj{%tm_;ai9MDX z$H6M&jw#4Y^!c3eJH^l^(797RjsB@P47J_nob@^(1BVg?LX-FJr;MFXrDxz$)Se-G zV>L5chjZ0%Vj=FRoTu z@-M*uaMB8#iwy3uW+gK(k7BK*JdNxPVe(hZkoU++!R_IoF%$}jsm4M4z1SKjb1yk+ z#gIdegh42W)94yF+%$|v3w#knNPhR8@ zUqwc&Gr+>94x$Ga!(OSp>du9zpp92txMDp8qlS?yC0Nkavw}J_sj=Vy6*YM}8oflj z+W}e`+DC`V38dNPjw^w(4RhNiwZ|M$3#I=+y)$*Tyt`7ZO7_uXSj@ar6;gjdXaj>X z42vHqAU4g_SfE%g>vbn9xVE{?+!oF>(Z}{zF=S#*?9}b9m+H69xM);*2_mWCYu!d+ zHDMOk56?xbZjfF2FN)3Yaf~lL@lBFL;?pSzK-K(hJ?j%Dd#YjjC|_lugoP;iA`Lnx zf*HSvRZH=h2X^Y4>DItUUCZ(&XGGajH4uAvD$xNPn2ri;{2$4J9?7B5g}N6lit>Bk z?a^vZR~oo`z2jjYKA_pWJ$pC;Oar76An_TCRL)@{m7UIw%7G3TDxRqCuRI0#b<;3f z%w4}9HrcZq6lw7*=jrGYPax)Zot9lG28fzdoC3{eBYOo$(;y|H_V{zC9_i8@7FTQG4l%zELax+=;dsKs!nu@{)V|C2pI*9L^J^idOEq?%=&FU^m3OK3&=J}`wFT6?y*dAuKu@g zNvCmXQ*YO z82fAQ8hboc*#3(O6dT9rTWrQ@{xUypG;a5sac3Lp+fUGLrT0o~{(3X0eNSX;vO|ew zsN1_M^tcpO`70NYnDEHGBB`f9>O|D8Y?$Iovi%oy9!!j`p_;{o9e;eHX)PXpJ^`_X z#QoU0R@nJm>-EX_zyZRbg12~>9cj9I_7@L%iJxA@B7S)#i^@>IWRImHo7Q z%!7d?_J$qq9I*Vze6u!Rgpw@E<1CYWfa(rvWvsBT{1J+xSUe<{n@L*P-y&f!q8S^O zorTbZ5Gf$hup2|mW=}Kmj8YEoQW=8}lV@eU87!Ot?U_*LG7f{dkh`q$>nt_Dm5gaI z5fErFV7jHh4H{^A8Jge(+Xf$v?w42n5OO^pGoHwh8;u42x}|<8 zSuHo9>kWS}7D+Pi4gWJalK=OQZ?^6l?=)Il)U}HeWwin(pp_f zCf|{aiFp-jlur(k5>)ntLNe&|(@`_y%2V|pL-Rh3zR;iEV zL^niWLN;SUSYZrR5vB#erYzLmJ5|uxRq-ZRr1QKuf+6ItdnCV{nSBs86&&6880f0> zsD!mIEw!5XfH;(mQaO+JV2NEAaudU0LyAlVr`JCsx5U15-cyM4x!E~q7A`ZdJ(vZeW^;hEwLH@HR;$&j7sYTN4o4~XOHes^ zXc~wd@DBJ!YS80`P>Q}r49gr?wSHv24(iGl`KYMR5FoGMdcP<}?@pR9hodCkz4gZg zTeO%oizyCGQoB0bO1QklLZnz58b%WpHe}4&7nxDGfI?;6&z2b%Sz?WL9)m5TVKUo0 z#X^;ek?Zv}sGKU5QS={l*<$rs4NPquPT?3LoAr52^d;7Y4E+0%=ylb0C$|2#%dxHq z5Q72>i_t7CCuo*YWmw2> zE%rZi(K71NiSi)yX*y`tX3FE*p(M)T+#2jz+cW2DyNDrB} zYg;0PsHHYFxhrSz1bU$0(9;u4nM0LBvPC9r``mTQp=o;d_3{(duZz<3pUOXyJRvoO zwd`A?x#0;cv5uKO!#AxD;vQ)|R8?#y0-<7uU$(wO!?5?bz;CDRO13RMsZ~B5yHP8} zgX|{U9-`3$qm@2%HkxJxI83jYY5j9~pUgu2gEwgz$sj?L^3?6p9XcEwQnv$nlacFITHx z2Ne8uNOlqpxKL44gzD(z;B=l3!#Q4NbT%erX+N09toFCo%DcsWK+C}mG0}GPZ=N&h zha#03mA0ER zxlQgGlT%f~^VMcSFj&9mn-@Q_PO|kxpbnJS|IPC!&;wDt`nU1Tv#LQvi;jc;i!UL&y5U2!VksgNt|UQ)A;~KVrDg zMwMR(tltKqE#Rdya((Ph17u5fL8^bHcYRQb%}~kt--B;NYmL9mrWJI@tS7Ou3%wPv zTBV zC&xhi%>J(Fe6x=c5=i3{gWA1N4$W`zEG78@g_8bQSloT%9kgnI-~-uU0dxPnO6!ib z6wjLPfIfbSU=_U+8?PV!OT zPnz;Wk(hG+XU?}25QrU04AXfi@Y8qbRbR7fnjV?0Jq6&dHAeD=>7)wQDT5|fo7m?H zL%;AW&HR8uskAN{?6w!y$cWCCKZGkM$&jUe^BQXen#G}1@@7nLCt$(2WZ$9FK;3%s z`Wvb$le$GS;OS0&>2!9^#=xjfOKBoved10$T-0VCav;m&YE=cz3!Gjr7`d}ad`MkymtJzFY_ z3#8i7;Y7m%S8f{IpM<48roDiTjD0^;K*+t5M)F&?J0H*hNi+yW!)%74^P?3;J*@s}i<+wv8k)vFdh4YM$* z-U}O9H^uVJbD4rBG@SRZL+rTqpKjy(#OKXxEOp?Nacyl*hlfk^mH!%VhLfu#JnbSM z+h$Jhn(IjP;ggN@2b7wz0-H-UcDf9UJnmzbPdESEpwQut;HNvQST@En-lmgF+ZQvk zpNCZ$TN#&0lyS9RJc4RrK8;MRQ_<#0gO6|p1%S9(@naK2yqp1zw8b`OkK4s8*-njg;-t@Fd*J{G__o}hqZT-3| zL>Q41u}67)Y%fWuQmjT)DwmeVZ_lrp)8sCPO+RlB;V@N2>R4(>%M;Ob9rFOn`Z^Ip zQ3u;?BSpP3mu>;3mTa`nW<3TWxS@Zk;aw-34{KM@^IoFTWGsu^%{(pAYx!SI!}P3t zkXv^8e%)0Tgk4-GmzmdM4(}ppk5eN7}Hdcm&0cMDo>IxH5Uv84X2f;%p9Xbp{;jIYd$jJM6iz@ldg7H(oh>hrZgZ za=na*s%p2@3^iceOC>X5GZ}qMH88^pj5dQg9`ejI^QOLR5ApgLFmc#TAJ&-H$@NzK z8P7@=bmopD+#GSe<7I^K(MoeOKPYD%@m;Gq5i6_MT+u@A!UWblXce?kcQ=UReB68b zO%9LuCZ^Ukg@qS?)-w9$mw{Yo)G1=>M+=n+PBkAa>aF`}(^xd?xf)!~rRz^E@K8{` zH1*jT9g-k`+Pcuz>unr%N41)!P$E_1@qN0vS+p8K3w}IebmT(yB7N(+O-*%yZl6dN z&(8?AcYqz9t6og)ak$OcH2-nT+bQ$y3;f`+R^TMXZ8n?)i9n(U}QR>M1>5gi=v zEWkhi%Jp}P7_1h?I9iebTe}A<6C)V`W9v|V0rLk3V(4S)rBp>btOcNzTyrLj@d(rC zJ0n1bcaIO)}(@R*&iZUvCx;XB>lWpw&i{Z!{4p2Ar#LZ{NS6 z$gs_ruk5{n`EqOQULlN*2}8U>ph$h}*^!=cl~S}s4|LlD3Bog2eI{iDQb?=pe4WvCjdY)=S(QjZ^|>9-{xrz!XJbAwG{1jNaEHtz`7gEvL&cl3KW z<r>#rNnzZnf@4aihAZmI5*F%OT;%YDK?0F?eQkm>aFf>_!Q4UJwJr(DCu~;cco9>A$dKlM_8mqfv^JAm?YKiFb2O%$<>uI&BN%h54q!q2SN%#p zskPk!91&9c2a6o_a(2Gb$YcPG3^hXFg+%%PsP4R@qH5B0uYiCcp~)bz$s(bV(B#xK zQGy79N(PAvO_Z!i*yNl+6p$ba5=4*;jYQ!ii3G_xN>Y+=3%@z{d~;{+S$EAkv(~x% z)vLPM)w{Z?cGa(*=Y1I`Sk3_0<&hL1qRbcC*+Qn!@Z9D7i~hO~7hK-YtB`b>*gP7RSn4yS8Vh%^ zQr4$}-RH};#JZwJbDOTGe^h7Zq}@D}fQ=#I}#IN>k}yOR9gp*C=?Ri4JL(S5B~M{DyHz?rHa zc-}<0Hk;p4fePT5oDtH?(y1Ju;BI0Z?b_K|?He-rn-1Y)q=l~CgUBX?z6zTXA z(IUAnl(E&C6d=l_JlR2#mg=Fqi^nQ)kZSP3wsTg_L{4=N(*0;(rhA^#xdEI_e@XRU zy)x28#0RHAxZEi|wY+NG4O7Nz$>UL1mQznixHIDGU!-yLLF*_Z;(dnexK5 z9=0{;k=1%^G!AZNIGl3*Aj$V%rG(w+h6h6W{IF*E+{q#akf%tA3r=_0q63pkXOB)n zzO8O$cio}0I9+gJq?w|%9<=Phe5B*`4`tI_(ks2hu5VQ-5dskevWIBZFza0m(upuI z*rWYs=9Vd$oEAK@db)Gzh!VyT&qiJ?*L9zGRg`OJpA%k)o3A{u^5iO8XG{@I4jxCy zr<$`msL8w?Pp4)0B+ByB_ARpgAzBO0n{R5zmg?szseC96Q$iq(0Qautw4)afYq);R zfMU2r9e6GY_xRWV_2(F2OD@HVQ$VnCU73;D{X;J&JN+c07I}*rt z)wzf2A?jy1!tK*GbvG={jT#KZHQH}-89{<5XX1qWA~T*qhIf7kF9RC!!t5hy5Ee!S z3KVRgaB{;H%unA-YQK;{j=&2da3PJBa*RY6m-< z=|vp^RA92!K~0F#8SLP7Y<}u2Kh$0jez)mDBfUEnlppbf%S?pEl`mY( zze`FHMci(sf*xHDV7xGTy3b+v;7-zz|ER&oXV(6_GxExK_!1?(O@}lR{)-h$y;-Iy z5EQ~_lUZ6D9qqMX9jy#b9aP$WT?;p8-xFjVw2W|3MapR*w^E_oh>^ZMVnyIz%M?kI#h8g*Bj3y zU8*%`rj9i?K*w}qq$_Dn*!?|grA(i5|26U>(srHfQPtSLbu;`qkMGm{F0wee<2i9w zA04;VUn16x`2zSN)e)I=(s&m_h%BFN_ewsiMqN<}n!z@kRU>JZG6iI$^f5A#)Vs^b ziS;_UMsvJ&cl+QWOch<-sR2J&Jk6G55oYfBgG68L8)Y?9Zo6-8xZkvKF5#IbzfDMB zLWlP7*K~aI-p|uxx3ro}so&#|`4s10b`U8NL}Mg58W9xu62_g*d?#YY zt!KB5-py0u&E3YCswmR;*doZJb=^}g7J#k{9hbiao0th}VJ?~cUV-{4klr zaT7M&75JXOTI;*a(|5x*<1~OTGceu)-Sn)dSb;6TUi@) z3jO|AOdaco)yG-ky8W5ji=*sY&fLu135WZy)2EPYCMs~lwuJC;ho?M=5~lrbhNc;h zb-y4ts4m@D;=pO0k~SR`7EYq|{C52=gL-4cRg^A4rXV`+ppIuHUKV|??HB8;-?sR| zi;dmRPyf*dKh=NWnE5yG3_O9cDP>!AHozI^?0(QRg_&W)IE1{rHdT%4E6Z-2gxtRr zNt0`O#l3&67U5`BQ?OOA%#-@sP|uY>qd{=2ve33&9__BfQMjYakZI)ISP+QFzkc{m zX5rJ}tx#n??t|wYSE9rFd84UuwT+wu8SikA&q~YAl7;HdJ7O3e%}`8K!*-Dd*Nw`{ zr6u$E2R!cGVq={p%}Xq>m3*=`*I}Docfpd_wShexb(ONM>F^d;uZo{dmbfmHzf#^S z+w>=@`0Z^;N{9Z+QaaI&em1Ufs7uJNSv}QoDYH0P2|MaqzwXa;=+W^!hKJa?ppQC? zF^4I!)PQB~`N~>i#1bU?X~@Dqoio5>C)(BlMdAKg)V|&c7h_!P1gw%`Q?xSTsDyX) zmHpouY&B7^nc}A6NF(1toB9m0eP+EF1^d@@PZ2~Md)c0o{dDb~t`lp=8(W`q_J@^r zpG3OcPtp}h@5!#6^iVCGa?{T5_3jHeJGR!fSTI}lEgXCIT#Wv!tFCe1BQ^eWFfmki zZ2lHzb@b~^sEdOMig?RQRs6y|hXA@Di2S!=8%?EoQK${Or___RycTQ)$lrO7Ms3!e zS>Ewd#@7>FH?*t&8#Dl5fmkh=LpFZMVDAgMsD6dEkGk`<(te9L;GE~s;5S-;!G2%( z?`X&-Wq0!L_#5_NgeQ6M9DGNmI)GoKdV%}Ns!4E`1*{EULWP%nrgynie!ilG!B#Fc zLIGIqYjFFfh-Z&4Cpdu!Kj($j{=f34L5K;_=?#AX8#Z>|`T+*RPI3bO4Q2|P6L|;Y zpFiKwFTD+bBz@;Jt&exrC4g)So2xN%3GQnj6WSu~eErRgr%JJ}z`y z^b5Eg?xlcgkB6S$V-D1mQ7qrRZSqCN#w6FJ;c(&EW)|Tj1sChw!}SnKkW?dzIF8U` z!KIN9RJL-g1UM1bf$~W%Jcm@3b!Brhy|SumJnTQn*(~kVepB&0C{@VZ;;Wzqz$9q) z^Y_qfV27RY=H5s`B#WE^3_%Xk8tdIM9gmNWKJ?%MSH?`A0l3zR-XA96gQH`ZnReh} zj$awYM&2ofK^>|W8%KuUOB^Viyo6hjg8;mFLT{TjR3?b-p-^a?1E~{cKm)&a_#df| zm{bdKS7PRptroi68&Wj@Wwih93N+`${$yt(%d$r*tuLOaX=pg4(kiM}Urqub^G$~O z%+hzygZi22?9gDyEVKkb9K|+@S)kf}-wJA1!u2OP3(00@$+_s6&)5Lk$P(@PIKt@8 zNOIme%G5@oLS!~Jc3bu?31uNNPj+HLjLZ`N#k*-xx~VSqa4ZgFjFq&r7oNEVK52u) zSuFV721G|DJbhSwIL|`Tio=}?vi?X)(geK&LiW0e;j5qyM=Y*C-;vM>z5hex(HslO zpkhicMH$;;J6c$HZ!f30C8?sKRn^D2SKt;1bI8sa^LOoend#Em3y)LLEX<@Zn7NdW z3kM-Vzfe$!EyrYiZ}LlxloFy+9clowS*AS)_={_w$+Za1WPjJ&*kFpPi`oZ$FsVN* zjIH8*g)64q_we-}W+HH@fVfy*06LvU8Ba)03FLz0?CsK+CW-go9Zs;w1c`I}W`tl= z{CO7eo3j5u+Zuk4DR6;5iTq!#@EbjX4dbIo2GMKua{j(M%ee{hY6)B^sqrBDseaze zG-)sU<VY}0tUZLyTd)JWGnJtLiW1Swc)O`d_Yl4`&I(l( z1=+s7nUe;CH-rai<|TQUQLEIH73aL%j!@ak3S_2Y!`E$R75;7)U8Gl#f;!+K$$=uT z!xZ+Oay~+{pf;n=*=Y}5f}pZh5JZTFjikTfegUq8SDZ3{)riW4q_Ob8c{Q{agMZx1 z>`609z61f~c_4{!q!}I?D`}>!34JGhmyHchmITq=c;NWe`WCyOi(C-)N^lS)%?JOReMOca{Fz=JKlllISM_`AHrX$vdg1%a(UscXq0BQtkN9+ z0BcX$jSP{()j^GU^1${`N_8JYCxbYOOMie;Zm(0B8; z#a}Soco2!cje_+XUQVibaOi&}ZstPil@TbM2hLz`#J&5L!4^h&T^T%@ZijRzNxkZi zi)7wN3;}*#g;a?_ad(E9orAe! zB?$pzZ%Lz%ZVM1?H4x@I$8tjWK3aHIIO{ctj;x@|3T{3nkOW+NJd0}iiV zbOu%!AzS)FNM2}Lsuy$c9l->tvQvjRTUy>^lLi59%bd4o^=24@WwmvddX3JQIB(HCcLpXruhy*K+IQC(3x5&!u0vP3`&yK%h~f&V&M4 zDmX~TtlU{{T^tW`a&v%q=V~<9&GM#33!b4k-k8+08P&KLR|`m70D40IQ1*KbzWUXR z;H=FainZ>1t-lt}cjr;kR;XpNfU$0pkNoMSMo#r+cV5#|UybDJWbJ}R<#5K586wM8Gm8JC_yNp zL#5Qo^JErBRInJ?Bio|h6}hY#8QDySp+enPKF?WXGbG*b9)5WH_TkKpNl8tPpt>;N zzTswKa&2Aol4JlgBtgEm6T=rc4tpbJZZTE~7K4jE8~?CHItvfD0-rnB=H~McSm^p} zb#}_$2~4=h)G)9XA!%H4?Nv&P=yLx)T^8D8b&3EqVThIGm z6>}u&%pG0B1o-@9E};-ap7xnk);ILBRZu70h=``&v*`2i?`Gj&2F`M zLQl@^RvF?>{QD{TqRQAjwS;&Oq_f!fc@p29DHu&cJW%|z`TBpKj@yx#@>)unsW^8) zc>UVXPGV;}0k$$0yqB*k0DU3!G5sX3j0OCPlVIO%6vUPnxc~UIFKH0!i!KEdGT_vE zbbDH}FT2seBN|z{ybSm&`&k67Qz8>gt1!8`xnG5wATim|Vz z(Qy&n*>!g@r#x^AqeI#-a^H$hMfakip_zA2xrTvkmtWDZmv8v8=@zA|3p1{1HT zfD|foERMaPON&h^$9jl`2~H{~*_|czGl_|;`!Y}oF0~_e#9MNccS{)U1bLa*?;VnhE2SJOdYbHll~m!FE@nR$_34$yho zb7`|><}r;lagKfiHO2i%iizzLZDMoTVr<>Js6}UE!r^GYgt}iy!Go!ccJ7!I9MN!P zr3qPc`TXlRCV5;`3jqvHh1YdbzjRhz`l&v|9-avd_8QR<{X|&f1_6AzEL|g7#;c_j zfDwme4A@rI!=2YTim!A)E_;keeT5oGL^19va9Pd}3 zrj@b%*IrV&szLKS@YMj?zQ9Yw8oxHIc4k7elM5tdPri$H_N09Vx>xj-9awNJ3D z;6AqMIwl)|LfbZr5cT#r&v)A!ftA&PJx#zK-jbU~Im`4uwe5_aCt!y|0$AS|O77=9 znn`X+YmrAWUcjLq2{;%nIfgD0f(B)jXv2_q-!pK9XV?3XNn{}iJ0g&ezlW8_f@wuP z7*cg*@D2vEDD9>s#YMsTJ@12PV}$$fLD!RtaQzxi=t4W|1Q6WVMQMEx5sZ~l;xugv z#4P7u)zWOGj8{xRn0v!MS}ov^7kUa2W(w)yVS-gAVYeC{J0U)py@2ENQgNed($teaJL&EOakQ9|4Hp|(&R6rN$3S}LcBl{xvGT@Sb{5F1 z#@T>gIr^O8nRrP_^JMOrhlsGv zCgth_CNve35lq3z*>~OqyE~hDobjbFi?ZKHYX`M%HT9|)fqDG|ug$RcX*l$z<8E!0 zc<3|UC#iiprI1-T_dV0mOiD)I$P#k>4s^imRz4EFEhrw%K~N1z1(uS#Z!;0OVUz7w z=A2EKFI*n?lm`xsff)n!ZX7@;a=BRYV0|t|j!)ZXh#ii!5rZYX%F0aHie`~}b$-Y7 zRs(sRV9hJEN4F!5Os;0rbJIem7}x#?wj;qq^@KL{Tm8haDhNE!mbu_;@_UAlMG&|Z zW}jb{tc6u=c?=o3IPk z7ts;Xf2B9WI8Yr&V1a9ZTuu-q=!`f``tfqZ`eoZsWuK?gssJXaN4vVUevONuEe$Tj zxg5XLTPAE{WcV>m2}G%|hlIb&Y<($wuMMVNzIb3&9CuN)nh<&|2ipd|$ZPv6mNQK9 zZ}uKwZowl%djg=K6VEN(>(aw)Zd)a%Spkkq(%c z2y^{%cO{M*hN82OsK`KUO!~c;eT;X%&U7=_VY?RThcmhme|_fq$AHssHLgyF6X1~Z zC?XKI+C$nYbF<@T2C_|`18!m3@yNFgF=~s>ZF&?Hm3$0VxNqk(oKC%LBG%6Eo|3cU zK+ql2Uv^&Yop6`}-W)dU#>@vO?%_ByarQnpJQas+DbT@hTiIJCTF!ORS2;)#>`Tey zHz*k%QUR5eD1{v}(Az)U=%7c(k7BD|_}5XcmyPjW(+n%$p%escSZq zEGoTQJH-;t*UO}Vu*6n2>V76sBcFE`vc1d{XQY5JF%;Xrx%pPVRw|ym8N_rNx|gkq zz}_q+m(IL;@zZTh={s-zxKdBq$bzO|%?h#GK3$zVxAEi~A~EgiB}yiEjSCHP#ecA6 zG`4Jo$y#k?7hPEu;nS+7X{W$+go}+aH#d0_kTDCU5Fph3+JuO6;k z8Kc)_7-!pz>bHdl1}&p+IC7vUZpv$(8|ym3s9`p+IRUHP#4!s`a)$a+oGq<$%Wo`M zoF6rE+(hozUd2pphIlp!pAOw}EKjG+w{IE6D7;#IVA)0<9`?zpgPd5qv7XJf(j8HM zj6(2P**6=D*0N-+8ez_?$W!mB*sui6fX4Z!QsH~QXfzbPR!4Cyrrj%$$cdbXO$2(q zr>hY@@=ZfhB;itfEhZ=0xX=lYezkh^&pkeVXoe79U- zrdOafq7xy)v%Vz!pvRD;5E6ON{3(*&GVqn^vzG21k>~K8T(rRb-1=Az)W8RiPo8Q( z@s(pvoU({^v#nO{2?jJ3Yi3}t$xB~y$lwGMPoV$>P2w(gc6P&0B1D=R$m`l}{ki4O zQ%knY`a+IKy9IdZvng0~T$UL7^Iz#{o|DaZB665p|N35u&#`E z2y3_oJ|(aOA|?c$!-z(3PK@O-{eyFsxC#&&1k%t#%=JM;h{-(jBZs$7$m2q9p|C|H zN=5FrNY#8h>f(zYOAkUiv>}X#ZC|ungy)4fy{* zeh@GS{`nyO=cWH+hW39om%X|0?;F~21YKtY0Rjq_h`QKgFMvNaWi3>RqFLbo0#tw( AS^xk5 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_restore_found.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_restore_found.png new file mode 100644 index 0000000000000000000000000000000000000000..c25e660042448709b39ab6b2a99add565f63f8de GIT binary patch literal 48590 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_account_key.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_account_key.png new file mode 100644 index 0000000000000000000000000000000000000000..16877b0671bc91ac1998031085351f024ce849b4 GIT binary patch literal 49472 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

`PntDije;8eEQD{=af1y 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�*C>s#i+$A7zS9wzV3K|o_F3n>!JY> zc~MfYE;%DuZH1Rmty)*gwn8fmF%rPpv3$eXk3uC{?z)EvXKKGk=_SED>L|pR%gmcp zrNS-9N3jP)X@U?Ma2w5KJxO5*h_y||6jzoV%hdrK6V22yKS=2%sSQv-9c6$G6Rfe(Msd7KF0{Ed_g>^WfNd96nrBN63`g(I=oZ_4y>{B?3oBoy&^lK~xT4xQma+#5k9rgXb!wZ_JRdb@BTdrCql3BI+#!ovxSTfF5 zdhYf1k(UZ=a>eKe3yB9u1ksmM2n=)r0h{0nNSznVPM=0e7OE;TSI};tPNtJWy zvN3n&YU30QkvNrqhtZqIHYLR>5eIwtlAYG!K>s^c^o_TQvn);X#i4peih6lJcA zOl$+|*MHLnVod&r4Eg^nI68urYv0(O9+MJ+@j7vv74Z(IhAH|p>#br7d`NTY|>$=g~ z4hQ4XEw|)k?bin1qO{E_aaRl7PL9G{yvt^zFM;Z`B8fyC`-DVoQF?CQUx}QU9 zrM)XgKJu6RCBX`55L^5E?*oI0HLJ;3papt)nlu){|EPkWBZMSR!32E_;7w_lqjW4@ zVey{QibuGoSw-()D2KylIyn1$V@6T__0Il2P?m&lGj`oo&yb&qZg2yey9$QeNzPgZ>R`q#%^8xJ>~omq8#MYp6|>bW+( zq493z29i&Q{+(>LEq3uxje2XZx#ecA7K~uWQ}5HDH$L_bO2Si}^OgW|19p?U#TdqoB9K?N7CA z%bgbRkwCscZoS3)TJ%}QfF>vozB}qg5mlJ~4m;uC^|?jpRfPZvL2vEM-UaFRi2bu% z@8cpF@@pCvR~Fd2@tw9fH=pM^R&OBflai8U1z)YJP`Nrcrl&jiOEXxPNGeoxYm&_t5FDX9P=3*SE?4 z!K*X(2WOKGOzfq55D;PKKM39*`YUP_LS1inXeb0CCS3n9Am(*FxCwsL_*pO2@N%z^ z7ZHyw01224aDU{eZlxZUwi^j&_}cL8r4ADVCJiQ#@BXeEP|X8lVSws~Pj3yZu9a*B z&8Z?d(Vz6J->qCf+%jyquZ64&ct5B)A1!fkp=G@3cW}cqM}DHtK=Dmr;D|^SFp%2Y z9X0K4Z?S;=*sL6>>|Ad+wUk00&s3M-lh0_In9`Vhk?e4CcK{En3WM7|-lhGaojNf4 zfx>vUeRZ^VUggU0@Jkn&Mm`m7hp2qZdxe|HD3yLPZeEw+EV8M~Y1ggspp3|H~rjo`ez2&_TnApWJaLx$_BJn2K>DBN+1e?Q&HbHkk(?5i~Y;!ue zJ-G$c%0SaEHU-t&q=wXa2nalPWWPjp`ceAFZC})2tVOt!9dxf(mjrq1}tFA*L>a&j#3y-VdK;2FXa9A zC?f}1V0<)sUwq7pQ4pu(yrhGfSkGMGLhmjk9`eX2UQFGeEhp-NS>QpAu?aKG;(NXP zM%ZKmu2kg;EP+05&n93$cd53sr`*JkkmfKej$NP0kIKY${IW|{YR*s_64l#*+iZb# zGSJCP>0A7=z*x0u(}}h((NW6zWJ>6@oin%3)@dak8L27u7;)ncwX;Zg0Q^+vl$^E7Kwr*Gl zRNe^jd)~MzgOqsu@%<+^p9u_uNNB&MI#-9{h$Fr(*vDl-4U}gIeI=g};k&uWqehQA zzd6Guus5btsMLDF!$y)D>(XnG<6Kxm@V5%u@e(^a)1W&9+q4Tlo&NH=bKl^d-B=6$ z-%PeC+F}*%@2NrZ3W=OQ%TsFxnm2x?#1l?}raqCK@Ovu+=690u*f#VP{6t1UB!PIU z6QK+G)g%Upm`>5SN%C%BHjtx(b%QsfURMn?_jW4&+?_#H2|<|(G3(Het=|UiNT*Ro zm_q>fn2;n2j$8W&z^kF+3b+53nGF5Ii_e1hTEHo3rW{adk;KAi-`hxy|CX6|*gN~c z?OH4W`8Y1CKKm1WjrR@X+1rgzI{7PZ)awQ#ZtFz@3g@inzP3Ivof2YX3^LTqK&Uc3 zxZpaGS!a0pWJuAOz%!Lnp0mzq?V!_NT`U(QMm8NxnI9=R33xl)#9MP)B|9a&sK~$M z2Y%YArk%-wX0C4jk>;M{IeXbp=266hau(9k`7!rna7)jiqIv~xZoK14+oP!Mr@|zD zCzy6YPHub+f;kwT5`wZsIi9QY9zc=K;B9ETMP*yz9ff_=L}_$jQhyzt58>Su97G=4 z-t0Y~tb0L$yNq@nWtC*AZ$u3&P=hbZq-Cl%c2ppWWHT5LjU_y3d~iZls1q`Auxn1l znUGx@z7?Hw&&|6@@vnxDdtZkffsIRogOAro${VpK) z*ugbY+)lyljFPc9AnYV;ksT?qn{SSXz8|qc1oT8gNbzs5>G^}&H1~xqF zBP+uqa6lsBv@999o6|C3^L81ca_gmUb<%kq*f=i;HY31(*9zsmP)P)G;hbzEN85?N z=ct_&enSRr3sS5EtE;VC2Atul#jHHw$h}D;`FQ?}{MRpNq@VJyw{$RV39k0vXX}5; zoJF^}Ktk5S6Ds7$6S%vpn+f0sfcuwzoQWP1GoUkCTw5i`MACH2UVSbHE+eprk^f;& zl>x%}+Zw9NX$W&&wUJf`H`Lc37BqKnfd;8S`k;!i@Pa5i9(_g`UvnFtDbChy)JqOr zCn!qzcitJf4?k*p&Zwru))Ipg3(7ApwzRWp!3E^T8^mdZqJrL%M2$k|9^xR8w)tIi z17b4_K-6Qk6eGw>)kiEE} z>OAkqy{|T86sPC%{h|`hrt<&~^{IRQ{?mqy_Nft2A$akVg(g4nlpVjumv~wo zslz=pMDbYVH=;fHqwaqS_qg^453hTQT)bXMMxWBI5^a83fA7K<`+KP_GHxd!&eX19 zLs6?>%xn3?_FLXZkqNR=0~^iYXaz+O4on?RtPTKhiNQ+7vRJDnmEIN}NdKSshTvdx zsn%-5iB=syI$Dkcsu)5#wKs1!pCKFYSc*mCFSO?*3;jd+XaRmK>zx-5MRTN_i$Mv+ z`#T<=@HHE}Ow#z~Zx^b@mPuu3XX*wiFv;fb_2_@VqEA^}dfC>Vk%L1fO9-Lv(V1M1 zE1QM7VGSRZs%RrX-kp<&Ra6Tqu(;SJ*_uaw0hz|LKIe#&RmmLB1c`E?p9lca`C+V? z&fjrpm^M$v471|@0Up@Za@U5~6PS+{JA{tBtUILx-+?#>!zo@Lak zn6ysk!)V4rg`Wc*VdoDFdiM6zOBHdd)5x@8IP;}saTk6o-AE={Hba;e+oUnQqdvK| zzmdYcE?VEYiC~o7Nqvu(kb!& zt_~w_9?xDXU%rY9xR6Eq{!oEAFHm>cK7u&Y&j!~R{<(7b9INtNqCt=b0$Gzy;2fAb zbZ~&x>zX_|0RMv7J3j}Ni3E{NXqk9MRn`kW5t;eQVvWwcfQ7GNOO%0q!EJU z9_|rOA`ku?P1d)3&&aS%_{P49D-Ye7Ie0HV^5p_b&u#%F{-s`xXe)Xrtw1Z4{O(!! zDxx<|N9S|3Jv$8l8!iaCrCRUMUEu^Ck@Bu`zfyk*d%yMzKbXjpPeXDY;Cs|88Bhv2 z0a!9c!X3WwYb_s+AFqE`<|5is^O|)DC9&!~?|)H%{|Z{eZqk#`(_|Iia|3qZf~GPo z40fpH7PMgZSn7;!B~b2}644{~0z=-m#H4nsw&Y=+pcGCEiTO$mI5Ci?GWjvl-7hlX znwcxCy{Hp0qL02$QAaNGYLbQ7Phm{M0s@1$oOGG*+-%>$Iybfm3B}O~$9V97abv!_ z^9daK5*G5T(Z5SFSWi{2KKA4g=q4k5p*bIX*Y)jAyH%78l7U7lwlwQfmA*Ej!>0;Z zcna(MOqUJ!5C4nDNt`O$W#+VC1--AY4%6sjiKFxm-L#Jwd$;+pPxeYNM1bni*H{?4 zox%i5)y8tCPF!)oBvlFePD}h&R-SeC#$y^5TZ4NJ5rhcT`VqIkZ+cF(m zhU1@$GK9EHHMdrfd=d6FP>zv~TQ5wS$X15Xh+8YaMZ|IFHXqSzO1#&IGZe7cvpveI zou;##aDKUZnTDqu@-6C7X%k~~^mW2oRXLDWZV|di_*Agt!C^n6th=yp!W4jTvgfb` z+MF%7)E(;7oey6(Qvts4rjT|Y)lmMHC#gYYjx(8E<9(B*5ViE91O7GPAf^_&ktZAZ z@K?C*$f^Uw{-i1<`XX$RmYpta?`o3wpdkfQ!3+ZZ6o3>XCBSx<>?A6taEL28c$Lvw z{a2*)KE%HKb2ot?JpNd&OwzIOsG(?paA%(|gl##+^BIHx7~Qp59f?M;me>fV&X+1m zFrj`Yb9^+NGVaqVaH3rmc(8A=QYXQC;w&b5>8emOtIRbsQ4p(;_~KzAvuJtBWaHPj zeD^RhL!X95*}(5+eS{QotUH|PN1o!|stGz+tS9U;%Swq;^W(>)D!7HaF_R7)Bj1!$ z!MY71BGyiYU)D-mLLfPN%!+yBjT82#MUb2&%5Tu1`0T~!3ZV(yiTgQekqoFbJKXNx zk90Idq&B)=r~<^qxnH`MjM|ffrRXf>yVkHGnQqSwxA)^S4_Ia2+kH>7${^%QKEK`F z!i6(X7w{7m)B1?WTDeVlW2V#XpykMf&e5xjRr)>ENX+IUgR{=gXLmxj5}aixRkG;H zi&Bt08&TKAx@33n!0$Oh!lSL_OH%I;w}EE2Exb+j!uUN@uO1GW z5UCPxZ?uUM{4lppGGEF?Bofp;<^mDi5kD>_s9SY?Z=VO|`ia+Uk@4~iyHuI|1V8=`0UVd&Rxy0nh1P@ihC9Z^<L)r32#2Bd$r@HTJ_$uG>x1l zxp_k4=gdqUSHSqtnG*IM{G}L9yOXMuBs&2VWi#D(R+;tVyL%crcx5)SX1c-q-3XMU zdn7s3rxt3SFU5Z6ZV!h2ciyl#iFrls7Mlf1+R*W7f}~EVa@G6C3lpBU`I)MkB^PR# zsqKc8*YaOiinu2OA+eH{45Ap)flu*&DZB^c+C47fTXX$BPYRP02;0dN&^J`3QnxTP zl38o!9yjK9`TS~q8$e;ltHj8<%8hlun?evflL^yn-NH0{KhVX-w(RyS&MIj0p8X^j zdjt?-}u(d$@Rv80SZvu-b^Y&EnJ`c9}`sq-t1_Ea& zag;{00XzxAP+w*8ZtB1|AXY!MxCSf7L~HM@~XD|TjV+@=htuWmd~>wVeQe`ifj zi)vjVwqlF(9u%_^VYJ_MKcNhZ7#LKrtF{g( zJf+^^rW)#yC90b5S{dX4VzaJI4Z*J;)e3&)jL!n|hJ&724S6rj_ z+EaDd+k7OdXm&etsH(so^-xsAg5-`y1F}f!b)yZjM`Sp`aIIwba18y)BKfx%azO7ObZpXM4B1KrN{UpNsy_Pv>#gLZji%Ll=h(c|Dor;L2Om z{;5bDiNVivuF&qge_}-P~=;5cx}Se8aknZl)SqNGEsS zFNGnI5P3jMw&-xzL$`A}U%A$@ZN^bRdfD&GXfS#k0U#cezVj26k7gUU61z`v3}sv) z7T)R-9Z?CwB^n|beBk!6fed%K5x7)%6Hw#)_Qq0b^Ra(-Ofo&q(Ei%1;j`_TD0jp6 zBUOk+H{+Q2wbg-x+wK{8`c;9iB0<`)UVu(7xT+^(9s4y>;yin-&l@O*0%bKKY-a4z zT%y-cGuqo7%C%Mn;8>eP70bDw-rx8SjJC0bdnU6 z6t8REturTwS{Cdag+&XMv8xiV*y%rb%mdy}cbUoi|DdH9cZzt4 z?S3_4%{cDvPQ@S=jS+;-!*b;0dC7MJ0WI3)w^nJN&e)#pL`59svv(LkEF9u9QIaQ9 zMXSUd4O99oyLuO+|0;Z0?`jy?cvvAVB}8oeYhaG_pwJgb1pTsf0%jL^vB2nEZ)}{- zefXef#78@;uJmHC`?QirN?6GXVB_9fCJOh$?xL3785t%QPEyUs+B|+IziL-fm8^*4 zj32jK8RClsb=Jy}i4N zyUA?4e}xw9fF2NTIR*f0aOtZ|SJMn{mxa5i9b0X*0O@J(xeKpHVuBqV8h5jBw%jFA z%^;}=p|ZpAr>oxJP!Fb6WD;;W*AT~z7r5UF2tJ}k3WRO=)`(7#qfv{n)}Gjfd)cmp zwr7T1l*P@yw}_?y1J__J{q%f-LV4;Wr2&FS03ig8U`; z;&H-*P0mGx>J;EaN$uZbL*F*e6)QkIo4i1Qxi-s-2i%=m(Ed$~c1*tNEd^nS7rO#M zv%wRp^^C*$QiN@drY*k0AsP|{aS8i%?AU<4#gCLIn)?cv7@N`0^!|jF5xEmx+1%Dx)WR-D*Yf72^?w`QlDo`xz4w|I^D0o~%6~?|Z z{W-e7Vv|Pevo+F}V55)*$L3_VF#Pm^7HR{VJK~jP;jr5$bo+X%1JEVu-ef>v6Nb^q z5GUKhB|b$bXN6!ap!Tc~+Vzp5q?l-*ZaDD`LmXIodq-gxygTs+*$+SPjrY)#{Jguv zT@yHV?CzN7=R$JO#BqJj>?ak~kn)2aCX40Uo^5Q;6p6BTUSLtyAp8}FkHY#v2m4fG zQww9v?~h9=wdgWv#+ZF-iNo0WD1dt20G!kjTeVpdIzBE+YT39rux?Y;y4 zgm1PyV|KX~b{y2)w3Jh$ZADE0{+am_EO$3s(9#V~EdA`gP|Qb@C)-QpM298<&LWxU zf#h&JXUx3XW9CZ^hl7KUTs#$TnCw-D z!8&~=-Ym}_)fmjBH?7Zkt&1?8NMq7}sBW>Kqx6)^cAj zzRf%$^)Lj}c;I38>Dbk{FS8%)iHrJRluB#K190x?;oA?gQQU`xW2CrK%yrM9!AP}S zQQw}%F^M+8L(iWr2#uH3{0W_lbTHRF{7nu&f|aG+nlQBjmp z_>=5GgBk5qlq*Dll)BiK!_HS^(2G!v;(@lDwJNt*)`Y8Ec>(hUkS*=@Ic*XpDmeO5 z+9)Ov(<;O3!7;aPe~2+w0)vTWHmXAdOKJT%)=8ox*1wCc<>1SKDxQKmS>grntt!&K z&68u1DK!l!SgRF#J4+B#C{>o-9PzOlk~6Ue(<&1f1;vUy4W7{OF)4Q#Xg2kRN^vt# zK8a((SsA6lwll>NZ}JcVQPh4M5 zNb`Ow61G&JcRWdTkO9(6^YCsH4-&B-v(~ z^m78(N1PEbtKlwKKyjwq{W9k--+;pU?Ji%kLSWU7AqmEhA;c-JuT*@UpMy z@{6mpKQ;=mkh72eCZHcSO7r28F&t_EnwK4-;4Zb_e4>?7sUJDGMWIT;IS7P5bC608 z{vfvR`=J5slg#GFE@mPw+-?zCm-mKXJm@Q|A(zZYA=;gYNKmFKOKI9z3^Pv@bp};; zqAiGsELd4lliQ6PjPBQz6jU$ba$<#8@aG*L<}!a3=ODBVaa-hhk^4k5B$J?WTwhKO zlNhG##Phh6+Ru9o?Yv?{3eJmF0pleA1xhM~@4b4@`AO)-Y3cca8& z?iM`e<1Cr}UEsjULg;Ovbad8t4J-?jRd>B#Hmz??tfR!;x%UN3z=5ASIF|&#%SWsO zsGv!)UDXtcXV7LtiH!+SfEW|>ZR~|j$mVvPSC<~B*-lo2Gpo1(<7Uj%+ zDCoGN&x}Jn@de0CbA@(y=VOUsT#yrKROQb0_rDl!jc3d!n^SC?e$_J}+op$ioX^!C z%71$X6IRmA+`gBk9X{X~*Q*T|&y^~Fa2|DyI5e?(7zrZeQ=)X<3!&YF!%)E$g|~Gj zj;9;dxqkqBAQ3`4r|OwHrp*qO1kvsRm$nIjs*2MDJq>eJUoy5-A;(uAxxEgvT%U8^ z7CCzfTZ9P^BR=f&?r%E);xHyOEHfSpx|bt}CTLQ0+nxj16b=zEfQ2aF;9~)#oGQpli_f<$-;49DY0xtsW*|ItY?x9sk&=vI^q-XxX(B=oa=D_% zGl>O(uz*1Ei_3;Q6D&G?vU_BLQ2~Pw!-bqa%0{mRn-|)qPe1Tpo~#Bm`bNrm5lvs7 z(kVEvfWfN@k|bZ$X{$Tf$jq67)J;Zp^xqj#f~&rI=p=Ih<@jgqW1}j9LDa(DEOxm) zDLK9att*mTW|CpOaVRfEoP{xjAul?ocH=WrSp#aBA1{~Z94vG6zm>BkZQ`KT`9Lv-R+_ijAaL?Fy&Rx2g zI`eh4;wzfRX}&${;_&e<=~PX@83@FWGTWUE?Lv~nttj*5Ucie0gM2?BSmzBtyQL8O zX?+0dmIEw3krxt@1r^bYMqtuSE}^Y?fEd0_edkW0#=Mx?FM!kl58rs7AWS!xEFmb> zYIHovz!?R)8i5Lb`HawlsoVBQXLJJ0zOa7XOkPdvJeNYtKcN#1WHOpI7nUm8ZJYOS zOS_z_gv&qtww<*@_eAW|)2k6$Qgs)3_#z*L12e+*rArF?<9k3!xK{wtwKp1>hPaPO zhy=CSX%lbO$zoY9B>chUW!VT@Pdgn;aCxC4IB=umRslNJIWl2;yj-tebdExxl(_f- zSUjQ59znsg33Um`U>b{bfR3-xLyKzqrq{QfQQJZ16ZlsJWg0z|I<*;AIeiu8!oXa3s$X` z_q?u79VkFI#l=4*)R?mL;3{T7SXJ50{^+M5PKa@;{==y^hs1WFnOtBnotx3Kc41X+ zjPaKH$LGG_)wMN~5_}56I{@4~B$=+q&2dAxVzQPp^=bsO;5y%>?&&afdVa|o zGEp~Taq?nYBuA7g-qjz(l>~1QEbQ}58fW-H-SYr=Qi3Uw4wHV*kWdsJ_+qtomBlg2 zCZFu-ijdA0`DOuM&!aD!AI5-J%q2`#A!wG)rX5qy51%TIsp5vH+((D%eR3H0c=d(Q zhZAx4p!K^9*l0rIO2qK(;2#$!LVsoNfkr!^+NbRWFfc0${J;@tu_h9az*ha`e&O-# zr1D76HX%HmiG6NW5XlLt6b#@9P8Z7}a?dz^#`;z7&#{Th8zZzRZ77#c@t)5?Jf>U@ zfwAqmq0}S+EU`+B{2#*s8xKw1T)e&Y$G|=54n>N9m`3>T&%Hb|78WE*)kwd40=KAN zaft$N(sPrFt}vO|*f)z?-wjd1p$nxmC5))2mP&(ptvzz_-8vt$ObB8=*&hqyv1q_} z570<6=YbL;P?xOliMa1b1vjn8)YyIgvd&NKhfNU7G~E&huy!mN1^uCHyci zVg{~$QDkTOTeU&YSNJ0FR0v#p3tv9FPrFIElac5=QwGvGcTXUF{t5_BBO!S!X>7HZ_$rdR)V#E4f%+ zho?VdNX^_H*isoOOMVW93HF~$YGKP=2l+XV_q^EMOrFa{J;^odzY{V{efZko>$?Ov z6XbYTnw<7&CC#Rb&%yy^YxMgEQ`JH;UtdRAK1rj&DOF8|4&jK%&sXz+`r$p;SI~iH zit``YMLxu$IY_Zi?9zbWg559eGLPR{+BE}g?r*kqY*accRvY@JBVwi2{a=mnYt{dkZSskHZylSaO#=X108D34Luz{aPjD<+ zvN|~c{Pk}bM=|6^%=@3goxhL%o5C01cAIGu5aSg8lr^~_=z@uss@jh}Tl@_H{e22B z;csNYik%`IeaIV308rN^0Mbr@UlrC&^e<*rV1NRG^H=p7CvmlwGN(7_zN`%XR@e1i zXOGJmhDOv3J^Ht}hlj1Lat*M*b+|l>MvcfOI?hRI!8M0#*H81x0ez@AUUJpj+38oF zygduVgoL4QYMmBRzv@^1=x4vNUg-2hwl{ndW?#|xV zXyAdooo`AvJ=YPJya4Q=MsBj`#ghr2xAU`f8n}L&`C=7@wV4Cg*Wx}GCtsN!Ja_ra z*$a?z-bjjVZghzLBgqv2DQMsZu-M*PT6v5$YVF)$T*wG$6lmC+ z0U0!t5Wv6-UCg86HIQnGv{dDLV$z%GckB-gOR>XJhaxkV^Wj?MOtTMv_;s>k=jC}> z$hE6x4124~$_$g_3G^N^imD8q)yy#7Ev)i8TcJlj4bWqqf%y;_uS#@)tsHfxsyDy@ z%4i+A!=3$iqb#Xc`ac>n-w8Z?c)44&Jzf4{CRLa!m`nq3V<6j*l3HO;ODiFD*|AVYO>@3RqUEC=vfr#47{5Vvg~mw&Lmr5*f|-nk4&bk;hSY=PN> z-abI5GYjpl_MJa=CCfpW`73&l031ae=5HQ5XG_0DSMMw;xZf#w3KPH&y3vHDA*JAN zL)4PrhK%6j)#wud^B*jzoidGZZS_6vuG6)7ABm`DxwAZ)y&^|%)a(s~F{RuOBx5W? zY;66c&jA4pL_=Wr{!B7;qWzl^4TR#~n@bwTb)!(7YdST0Hfaul1i?WUet z86U6|NC}oBH^=T?-Z);d7&X3~JKMVu(s}ZCUmvJvT7@cX&AQa6zqJ}?C1U}=yX8>@ z$&uTE?~b?gU7|p2+Cte0B3%-+ZE*zLiqFCA(y4#JmpfEOG+BwY9J_{-@J1x zA-%Vo;gAP_PtTe~Ha8T0;Gow~?{{7*s0>NsHKa^3c?XQou}yQcq3dlI37%i?!9l?C zwMe_$K6+o_!Jy-!#B60#=iy|L>yiP^gPhQO)jgi7kVTc0wUC)Hg4Vb?AEoU}iq={1 zM;wHx;@mw~`qrP@l%=S?0(|EL9HtHk6Pq<)q+f4#*8Z{VO9n~b<^frGlT8zzi=1~1 z1Jp4eFqBa2v>J>zldzVw5-9)97^SAB%w9uJv3y0ojo)rW5OQZZXG_coRUJLvw*GZ3 z2#8jIXN-h{>(EmY(X@_z7Pc5hS+X$cY32#32f)QbUMex`&8toZ5+o5e&o-Yk5h@E{ z%qt*3m;m}G!Nr<_=o{_YoS^Cm(O~mw=l~20{x@fWe-;k^fol8@2>AaobpGda|1F^Y z^P_*;EBr%9{-&U21Kc=*Sr|+%bdRi09$(Pq+zBWI{0)+L^wS)FPBOfl9UU!=+Xp70!s|l` zhgpy@Fy@sZyI{sJSyb85!k+61RHo;e6T-&yuy6%Ek3P&lBkj zQ%_IL!l;O0x*EM!|CL@XMIe|g*#>`91MD>L(?#7wH#!#=j~7YyqZlLy$0Q>3fsZFp z^FvU*QsJC1n3aE2#O}?HC(0LjkQ|)K=elJkbP$sFxHnEeaA5Gl%=PYGBeH-P@QnTI zS_=F&IGjJFerq%o7!UWC5T)Py=?oCo*B)1QXVeY?3i^C0PS z-FY4Y(c9S$92aw%7a~K^PDs2jmjrAjQtwB|+y~ZUs}Ivn_56fy7H!t^ZoF=moO`X) zarppKkv{Um;I{*mJbL0-7|bYo>1`s=;1_~l#>g(V0i)}+B!rnT;Ut)=FX+bXrT9B- zaDCaFC^B8^*~kZtVHF#U(|vv5`u1%j%TD`^u1YXBPwZ>J!ie%4&?It{obkz=1T!Q> zYxBns;KCCMvwiQ<*z`1dDu#`B@88(8JUdq+SD-DiX+=!el|$+1XWzC*A`t3i4l<$F z$Ul&vS2UUNH|HTsMDT*HkpRhMM~tB8+xO~FF5sx&A!M(0;v3QNmq6eWQb^$b+i~a%Q0Qn1QTC4l?!*YV1^w-e1Ukm7 zJ>nUqA%27YxOs_etiZ^6NS*J$D6AmC%$a%)X?bcMzw$YLE$e#$J5Iew6Z6=1fG-Fe zo>e-{1~8qEmd-Jp@0K|((2RREFYrz&TKNZFBg0%p3XVs=7LkK>&+sc^8N|iec8Q6H zpttuE>N!q2qUmN#i4Ri~3hhfJrYDjw$LkMS7ErZl`1h@Or=4kv(o5a-VfXFx>)wb2 z=4ex0<_uthH{7u2Q9xyg)t^hTGZ`~amSLH?0V-)Zf8!|LQ{QPiQz^FE#c0}`=I6Y= zyA4}N+J3@Et0ZqCvEXxLTes#)#b*^8?qSvAU2D}ShUEe*TFAk!y0GmbhPjE6|n!{9>pD(bN+4C*%R}ok3`(*7A{^#uq-|0TMVXdwYw(FU`&Cg5JR6GaF zUVwP}74g|ZmyhR41miw&*wXa2n4%EL!aJc0gSaH8d-Y1sdKIe+wxjo0G!a8~={059}Y4|_G2r<)5B?|6KV_wVAP zv^uiZv8NY*#^AKF0mnwpdzJ>6bXOM7v}<4S;ytQU>1zvdzgFK}-{X#&>{;fitF^35 zi5J4!LI;dxMng60m|9C$&0{($zLzG4{KJ`!o4qf<``mC^8Tf|t@pYJIvy2cw`ntcX zk6QuC6^c_L*K)oWzumeD@2k#Y^k+Pok=nuc*$PM2jYJzEE-m;Bu7vu+`3di*($%;9 zoGd`pC9lt9t&Ok^fl^LRr!Y{`((7zX_N~m=Cnvh75r4R?@{p&jUvV$y+8@)hog5x& z=*xa}JyEC`?wxN=1}yhY6kzEYj8Ox5Mn@KUAz*j8Ya7ELo#c10xa6?#Z6XSCCwu?A zp6v1@P+=y40b1$Qr`Q$H+l9AqIZ|J@@el<#&JYn>2PC$V1g$E&7M^4`d8$qRg-*#! z;OIy{6@HF?W-;G*T`?g_a4k@zwdv`8`8#^i;P5 zdypp=hC(o|bwPI6XCXi$WB27^#@u)o^kQI!aSh(Nr+x+vd#-Z-&Z>$K0p-&E3VT$3 zah9ZSo{||;^CI}79!8*7^diOxAjWCwpg;1G)H;%kux!06 zVg($B$ias|d72?6d#gnoMq0e^QZPdB_$kSs8nL{6_4zkStb4P?q}OJ<)BcWLddsR^ zc-j-p5E-8YYgjo<(z zXIOD8@D8s~sBxt_W3$2(JBywpTEQV*^;Z-1!VYdjo+Q|gRw!nFBm`kwCAp%qyA6Iu zn4D4SWeTHg_Q1JydTMLyLmkE}J)3O)(Tf+Vc`!4A#=MYlvU;KY7KA8;(Zj&|((s3u zTc`I?W0983-rDY2MWo;-oe0czG8>u$$g#CxRgWMVPIj8Giy>10AX?Yboi&e9?Oa`dKnA7Dj4PD>xb_KJ|!=)Yss4 zE}|BjQbhMNVAvxOb`;=+kJvmq<3o28WSP+;1z6I*Eiiz=xz_Cmz1M$M`}6Oz)n$9{S)6u%D>$_NxU^S|rL zd90(3cR7Vx_sWAnhRaTpPb)>E6<`-DFS;HKl+9N8}<` zr8U?^cWBf{)Ln;MWA!E}(@L7jsognQp^;o3kY4EiZxk8#3$ROGSLaii6*EB%E(Uvn z@(-=5>~{jC%w@w53bX?rQQdZlusfys)gTtWAVLNw7(y2;UBsUHd|R#J8kA)KbYoZg#E0}7b^$%v3M^wdqOn|z-X7xD zQ2*+Ti_VK*}zFkc)!?}UGQ?Am}9hAh#!7LIYEXk0j1hxY>pe3k=}97v*X$+Lc2 zm(N9#7AnA)9Hw^;V#61BmDv5+sBo$1974%TY%M;X@^LYONqoloP}hLa##cF$#K8sm z)_u5%G{?|TO7_MS70C-}Kr!pn7f&vX+pc&?^aPnmlPy0ab{sjz9^oo?NDu4Mw{=kt z`%c;RsQQm!j$f)%uflD@Fu$N-j%5?ZO#0|Hoe|8sbMJ&!)FE{Y8so_qV3PY=lpQ0Y z!>(M0^fV_{#qRl~B+I$|^|iq;Kbk=_YeAH}w1-m|XPhGBS$udnokMTeEKVoR>0hKx zGplC8IZU%}Y=VP-45KlArALL z-ROHdQK<{#F{t8b>I7t!l*NN~DYgT!iHEswA>+3fJ@;GxwmmfiGEaS{GP-Rb=~Slz zB%tlr8r88`@4)R*4s#7d@)SVQ!gh9Ei+c_I4cM;!p$n$1&;nqe0{jcUE6*PQw&G5n z!0p4M2jmQ#1&xgq6kD$%RE$%teb?*J_a5|TTj4jcFQt(I<* z6yD%q=)2ZNJ4u|*BLpH}Eje^QHS=Mz_swtUag7UJf6rkANS;et+OXp4iuvzMDUzC+ z`regCT9{CQGOP{of^=Ttyt(;%`9+)k+6nZp!e_8gkzVcX?K_$IH;GTgB9QH!%-Fq` zSI$W4A?INJhMCRi?YeUVHO+fw?5-#W+ zY}(bjY_t9iVWwv(mvSUG-8CT%3_v%De=aUP{3++dyDj^-}{m88Ec1h-Guz6P)d@?ff2X7vaNH;CR4bGDI~w;IMe20%K`Yr$I>2{E%URRA}nvB zO?Ij9-*4cM1fvJ?^&8gZe@21+uOUYN0ek%yqtCx<1ONQ!e=l(MuR&yB;U~bn`{$tB zKR^1f-RIvh!v6}z{T~MQUmU{!tBB-(Yll14|JgkLyMpvzX7@kPkN>*{_Wxs0_y5gI zQVdB2?0)~JFYkZc<6oSY|KjldJp;#st{Gj(PWPC?#zKH^s@+mm)PR-Bn+5$3U3G$I literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_found.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_found.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9cbd3ecff3f684d7b15bce3d2c40521b150f2f GIT binary patch literal 43971 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_off.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_off.png new file mode 100644 index 0000000000000000000000000000000000000000..872aff65ab70d148eea9af003de27535aa3799c0 GIT binary patch literal 49113 zcmcG$cT`l*+9s-ifQmu`LL<3R0m&jcLjx*Vl$;R|$&zU@3QYz{k_A*mat6s6iGm0; zImaevnlRP=&bjMb-#s(;&a5^5XZ7B-tKNF!^FBqesP~1K@KB6 zCYL08mk7Uws7B1Ui60-g9c}c{_zG^j6)A2oS%=-(Qm=_mN?SzJ0~h;RKUxt7v|G2& z(Z*J_@E7$;+n1V^KXP+*rzPssDe{oP~;d8O<6Rlt8p~MLG zlZkw-EO|C;=Ou;-@;Pqsqcm{iq2@IYyY=AjZw8WQ`zn`C{9dO{)CyP;4AlA_?y=DKY(4rGR1W(Ufe`-dG9FPz=}i`Zpv>r^}*|Wefk?AlFMsV z0o6h*VLks>B5S3Vzn9R|)5jYjzQ@g!^-)Tx!hZt6TWatji}`jXl-=dw)(gDWt+PIX zQsy+bM~4 z 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 literal 0 HcmV?d00001 diff --git a/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_on.png b/apps/android/app/src/test/snapshots/images/com.codedeck.plus.ui_DesignSnapshotTest_settings_backup_on.png new file mode 100644 index 0000000000000000000000000000000000000000..009a25b0e458b7b0a3f9f59e69592d9a49a067f1 GIT binary patch literal 43572 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 nBESchC77;AdfKWm0K;E$V*&RC Date: Thu, 1 Oct 2026 02:56:25 +0200 Subject: [PATCH 7/7] docs(client): describe the config backup Co-Authored-By: Claude Code --- docs/CLIENT.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/CLIENT.md b/docs/CLIENT.md index 6c6cd38e..124e3efe 100644 --- a/docs/CLIENT.md +++ b/docs/CLIENT.md @@ -108,6 +108,32 @@ cost one ack per window rather than one each); one NIP-42 `AUTH` per relay connection that challenges; and a grant, rarely. Everything else it signs — commands, Blossom upload auth — follows a user action. +**Config backup.** Opt-in, in Settings → Backup, and offered once right +after logging in with an existing key. The phone saves what only it knows — +each paired machine's relays, label, direct endpoints and new-session +defaults, the settings, the quick prompts, and its session keys with their +expiries and each machine's confirmed grant — as one NIP-78 event (kind +30078) on a relay the user picks. The content is NIP-44 encrypted to the +identity itself, through the signer, so a NIP-55 login works too; the `d` +tag is a hash of the identity and an app-private context, so it names +neither the app nor what it holds. What a bridge sends again in its +heartbeat (sessions, agents, models, credentials) is left out. + +A save follows 30 s after the last change worth backing up, and only when +the content changed; "Back up now" forces one. Turning it on looks on the +relay first: a backup already there waits for the user to restore it or +replace it, and nothing is saved over it meanwhile. Restoring merges: the +machines the phone lacks are added, the ones it has keep their own setup, +and the settings and quick prompts become the backup's. The phone takes the +backup's session keys only while it has granted none of its own, so a +restored phone reads its bridges' messages at once without asking the +signer to grant every bridge again; a session key never signs, so it can +read payloads but never command a bridge, and only the identity can open +the backup. Turning backup off can also send a NIP-09 deletion. The backup +relay is used for nothing else, and the Tor and AUTH rules of every relay +apply to it. A login kept on the phone can show and copy its `nsec` +(Settings → Account), the one thing a backup cannot hold. + **Orbot.** A settings toggle routes the relay connections *and* Blossom traffic through Orbot's SOCKS5 proxy (`127.0.0.1:9050`); DNS resolves at the proxy, so `.onion` relays and Blossom servers work. The app does not launch