From 30df451ffaedf5ca04c3ef6d93e123f5d17c034b Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 11:10:01 +0100 Subject: [PATCH 1/8] feat: add crypto deps --- core/Cargo.lock | 13 +++++++++++++ core/Cargo.toml | 12 ++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index 505ff79..f66e494 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -376,17 +376,21 @@ name = "commonchat-core" version = "0.1.0" dependencies = [ "bytes", + "chacha20poly1305", "commonware-codec", "commonware-cryptography", "commonware-math", "commonware-p2p", "getrandom 0.2.17", "hex", + "hkdf", "rand 0.8.5", "serde", "serde_json", + "sha2 0.10.9", "tokio", "wasm-bindgen", + "x25519-dalek", ] [[package]] @@ -1142,6 +1146,15 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" version = "0.12.1" diff --git a/core/Cargo.toml b/core/Cargo.toml index a9c72bd..0f86aee 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -16,6 +16,12 @@ serde_json = "1.0" hex = "0.4" rand = "0.8" +# Cryptography: x25519, ed25519, chacha20poly1305, hkdf, sha2 +x25519-dalek = { version = "2", features = ["static_secrets"] } +chacha20poly1305 = "0.10" +hkdf = "0.12" +sha2 = "0.10" + # Native (non-WASM): tam cryptography + p2p + tokio [target.'cfg(not(target_arch = "wasm32"))'.dependencies] commonware-cryptography = { path = "../commonware-source/cryptography" } @@ -24,5 +30,7 @@ tokio = { version = "1", features = ["full"] } # WASM (tarayıcı): blst yok (sadece ed25519), getrandom "js" [target.'cfg(target_arch = "wasm32")'.dependencies] -commonware-cryptography = { path = "../commonware-source/cryptography", default-features = false, features = ["std"] } -getrandom = { version = "0.2", features = ["js"] } \ No newline at end of file +commonware-cryptography = { path = "../commonware-source/cryptography", default-features = false, features = [ + "std", +] } +getrandom = { version = "0.2", features = ["js"] } From f3d031474f9e1df650653a93fdc03d3034791c40 Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 13:01:18 +0100 Subject: [PATCH 2/8] config.toml --- core/.cargo/config.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 core/.cargo/config.toml diff --git a/core/.cargo/config.toml b/core/.cargo/config.toml new file mode 100644 index 0000000..8831040 --- /dev/null +++ b/core/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +rustflags = ["--allow", "deprecated"] From afbe8b1509eeef921ab6982cadc82575b56908bc Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 13:01:42 +0100 Subject: [PATCH 3/8] feat: end-to-end encryption --- core/src/lib.rs | 130 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 124 insertions(+), 6 deletions(-) diff --git a/core/src/lib.rs b/core/src/lib.rs index 859bc5e..37a442e 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,10 +1,14 @@ +use chacha20poly1305::{aead::Aead, AeadCore, ChaCha20Poly1305, KeyInit}; use commonware_codec::{FixedSize, Read, Write}; use commonware_cryptography::ed25519; use commonware_cryptography::Signer; use commonware_cryptography::Verifier; use commonware_math::algebra::Random; use hex; +use hkdf::Hkdf; +use sha2::{Digest, Sha256, Sha512}; use wasm_bindgen::prelude::*; +use x25519_dalek::{PublicKey as X25519PublicKey, StaticSecret}; const CHAT_NAMESPACE: &[u8] = b"commonchat.v1"; @@ -25,18 +29,132 @@ impl CommonwareIdentity { /// Signs the message with Ed25519; returns the signature as a hex string. #[wasm_bindgen] pub fn sign(&self, message: &str) -> String { - let sig = self - .private_key - .sign(CHAT_NAMESPACE, message.as_bytes()); + let sig = self.private_key.sign(CHAT_NAMESPACE, message.as_bytes()); hex::encode(sig.as_ref()) } /// Exports the private key as a hex string (for localStorage). #[wasm_bindgen] pub fn export_private_hex(&self) -> String { + hex::encode(self.ed25519_seed_bytes()) + } + + #[wasm_bindgen] + pub fn get_x25519_public_key(&self) -> String { + let seed = self.ed25519_seed_bytes(); + + // SHA-512(seed) → 64 bytes, take first 32 + let hash = Sha512::digest(&seed); + let mut x25519_input = [0u8; 32]; + x25519_input.copy_from_slice(&hash[..32]); + + // StaticSecret::from() clamps the scalar internally + let secret = StaticSecret::from(x25519_input); + let public = X25519PublicKey::from(&secret); + + hex::encode(public.as_bytes()) + } + + #[wasm_bindgen] + pub fn encrypt_for_peer( + &self, + recipient_x25519_pub_hex: &str, + plaintext: &str, + ) -> Result { + // Decode recipient's X25519 public key from hex + let recip_bytes = hex::decode(recipient_x25519_pub_hex) + .map_err(|e| JsError::new(&format!("invalid recipient pub hex: {}", e)))?; + if recip_bytes.len() != 32 { + return Err(JsError::new("recipient X25519 pub key must be 32 bytes")); + } + let mut recip_arr = [0u8; 32]; + recip_arr.copy_from_slice(&recip_bytes); + let recip_pub = X25519PublicKey::from(recip_arr); + + // Derive our X25519 secret from Ed25519 seed + let hash = Sha512::digest(&self.ed25519_seed_bytes()); + let mut x_input = [0u8; 32]; + x_input.copy_from_slice(&hash[..32]); + let my_secret = StaticSecret::from(x_input); + + // ECDH → shared secret + let shared = my_secret.diffie_hellman(&recip_pub); + + // HKDF-SHA256 → encryption key + let hk = Hkdf::::new(None, shared.as_bytes()); + let mut enc_key = [0u8; 32]; + hk.expand(b"commonchat.e2e.v1", &mut enc_key) + .map_err(|_| JsError::new("HKDF expand failed"))?; + + // ChaCha20-Poly1305 encrypt + let cipher = ChaCha20Poly1305::new((&enc_key).into()); + let nonce = ChaCha20Poly1305::generate_nonce(&mut rand::thread_rng()); + let ciphertext = cipher + .encrypt(&nonce, plaintext.as_bytes()) + .map_err(|_| JsError::new("encryption failed"))?; + + // Return hex(nonce ‖ ciphertext) + let mut combined = Vec::with_capacity(12 + ciphertext.len()); + combined.extend_from_slice(&nonce); + combined.extend_from_slice(&ciphertext); + Ok(hex::encode(combined)) + } + + #[wasm_bindgen] + pub fn decrypt_from_peer( + &self, + sender_x25519_pub_hex: &str, + encrypted_hex: &str, + ) -> Result { + // Decode the combined nonce+ciphertext + let combined = hex::decode(encrypted_hex) + .map_err(|e| JsError::new(&format!("invalid encrypted hex: {}", e)))?; + if combined.len() < 12 + 16 { + // 12-byte nonce + at least 16-byte Poly1305 tag + return Err(JsError::new("ciphertext too short")); + } + let (nonce_bytes, ciphertext) = combined.split_at(12); + + // Decode sender's X25519 public key + let sender_bytes = hex::decode(sender_x25519_pub_hex) + .map_err(|e| JsError::new(&format!("invalid sender pub hex: {}", e)))?; + if sender_bytes.len() != 32 { + return Err(JsError::new("sender X25519 pub key must be 32 bytes")); + } + let mut sender_arr = [0u8; 32]; + sender_arr.copy_from_slice(&sender_bytes); + let sender_pub = X25519PublicKey::from(sender_arr); + + // Derive our X25519 secret (same as encrypt) + let hash = Sha512::digest(&self.ed25519_seed_bytes()); + let mut x_input = [0u8; 32]; + x_input.copy_from_slice(&hash[..32]); + let my_secret = StaticSecret::from(x_input); + + // ECDH → same shared secret + let shared = my_secret.diffie_hellman(&sender_pub); + + // HKDF → same encryption key + let hk = Hkdf::::new(None, shared.as_bytes()); + let mut enc_key = [0u8; 32]; + hk.expand(b"commonchat.e2e.v1", &mut enc_key) + .map_err(|_| JsError::new("HKDF expand failed"))?; + + // Decrypt + let cipher = ChaCha20Poly1305::new((&enc_key).into()); + let plaintext = cipher + .decrypt(nonce_bytes.into(), ciphertext) + .map_err(|_| JsError::new("decryption failed (wrong key or tampered)"))?; + + String::from_utf8(plaintext).map_err(|_| JsError::new("decrypted data is not valid UTF-8")) + } + + fn ed25519_seed_bytes(&self) -> [u8; 32] { let mut buf = bytes::BytesMut::new(); Write::write(&self.private_key, &mut buf); - hex::encode(&buf) + let mut seed = [0u8; 32]; + seed.copy_from_slice(&buf); + seed } } @@ -58,8 +176,8 @@ pub fn verify_signature( message: &str, signature_hex: &str, ) -> Result { - let pub_bytes = - hex::decode(pub_key_hex).map_err(|e| JsError::new(&format!("invalid pub key hex: {}", e)))?; + let pub_bytes = hex::decode(pub_key_hex) + .map_err(|e| JsError::new(&format!("invalid pub key hex: {}", e)))?; if pub_bytes.len() != ed25519::PublicKey::SIZE { return Err(JsError::new("invalid pub key length")); } From 23c2453e4179c1ae91b922cca842793b60199ade Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 17:13:26 +0100 Subject: [PATCH 4/8] generate new lib --- .../src/commonware-lib/commonchat_core.d.ts | 20 +++-- .../src/commonware-lib/commonchat_core.js | 81 ++++++++++++++++-- .../commonware-lib/commonchat_core_bg.wasm | Bin 147504 -> 223802 bytes .../commonchat_core_bg.wasm.d.ts | 5 +- 4 files changed, 92 insertions(+), 14 deletions(-) diff --git a/frontend/src/commonware-lib/commonchat_core.d.ts b/frontend/src/commonware-lib/commonchat_core.d.ts index ee5aebf..969562e 100644 --- a/frontend/src/commonware-lib/commonchat_core.d.ts +++ b/frontend/src/commonware-lib/commonchat_core.d.ts @@ -2,35 +2,38 @@ /* eslint-disable */ /** - * Kimlik: Ed25519 public key + içeride private key (imza için). + * Identity: Ed25519 public key + private key (for signing). */ export class CommonwareIdentity { private constructor(); free(): void; [Symbol.dispose](): void; + decrypt_from_peer(sender_x25519_pub_hex: string, encrypted_hex: string): string; + encrypt_for_peer(recipient_x25519_pub_hex: string, plaintext: string): string; /** - * Private key'i hex string olarak dışa aktarır (localStorage için). + * Exports the private key as a hex string (for localStorage). */ export_private_hex(): string; + get_x25519_public_key(): string; /** - * Mesajı Ed25519 ile imzalar; imza hex string olarak döner. + * Signs the message with Ed25519; returns the signature as a hex string. */ sign(message: string): string; readonly pub_key: string; } /** - * Yeni rastgele kimlik oluşturur. + * Creates a new random identity. */ export function create_identity(): CommonwareIdentity; /** - * localStorage'tan okunan private key hex ile kimliği geri yükler. + * Restores identity from private key hex (e.g. read from localStorage). */ export function identity_from_private_hex(hex_str: string): CommonwareIdentity; /** - * İmzayı doğrular: pub_key_hex ile message üzerindeki signature_hex geçerli mi? + * Verifies the signature: is signature_hex valid for message under pub_key_hex? */ export function verify_signature(pub_key_hex: string, message: string, signature_hex: string): boolean; @@ -39,7 +42,10 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl export interface InitOutput { readonly memory: WebAssembly.Memory; readonly __wbg_commonwareidentity_free: (a: number, b: number) => void; + readonly commonwareidentity_decrypt_from_peer: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; + readonly commonwareidentity_encrypt_for_peer: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; readonly commonwareidentity_export_private_hex: (a: number) => [number, number]; + readonly commonwareidentity_get_x25519_public_key: (a: number) => [number, number]; readonly commonwareidentity_pub_key: (a: number) => [number, number]; readonly commonwareidentity_sign: (a: number, b: number, c: number) => [number, number]; readonly create_identity: () => number; @@ -48,10 +54,10 @@ export interface InitOutput { readonly __wbindgen_exn_store: (a: number) => void; readonly __externref_table_alloc: () => number; readonly __wbindgen_externrefs: WebAssembly.Table; - readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __externref_table_dealloc: (a: number) => void; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_start: () => void; } diff --git a/frontend/src/commonware-lib/commonchat_core.js b/frontend/src/commonware-lib/commonchat_core.js index b4f24c3..04a2377 100644 --- a/frontend/src/commonware-lib/commonchat_core.js +++ b/frontend/src/commonware-lib/commonchat_core.js @@ -1,7 +1,7 @@ /* @ts-self-types="./commonchat_core.d.ts" */ /** - * Kimlik: Ed25519 public key + içeride private key (imza için). + * Identity: Ed25519 public key + private key (for signing). */ export class CommonwareIdentity { static __wrap(ptr) { @@ -22,7 +22,61 @@ export class CommonwareIdentity { wasm.__wbg_commonwareidentity_free(ptr, 0); } /** - * Private key'i hex string olarak dışa aktarır (localStorage için). + * @param {string} sender_x25519_pub_hex + * @param {string} encrypted_hex + * @returns {string} + */ + decrypt_from_peer(sender_x25519_pub_hex, encrypted_hex) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(sender_x25519_pub_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(encrypted_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.commonwareidentity_decrypt_from_peer(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * @param {string} recipient_x25519_pub_hex + * @param {string} plaintext + * @returns {string} + */ + encrypt_for_peer(recipient_x25519_pub_hex, plaintext) { + let deferred4_0; + let deferred4_1; + try { + const ptr0 = passStringToWasm0(recipient_x25519_pub_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(plaintext, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.commonwareidentity_encrypt_for_peer(this.__wbg_ptr, ptr0, len0, ptr1, len1); + var ptr3 = ret[0]; + var len3 = ret[1]; + if (ret[3]) { + ptr3 = 0; len3 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred4_0 = ptr3; + deferred4_1 = len3; + return getStringFromWasm0(ptr3, len3); + } finally { + wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); + } + } + /** + * Exports the private key as a hex string (for localStorage). * @returns {string} */ export_private_hex() { @@ -37,6 +91,21 @@ export class CommonwareIdentity { wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); } } + /** + * @returns {string} + */ + get_x25519_public_key() { + let deferred1_0; + let deferred1_1; + try { + const ret = wasm.commonwareidentity_get_x25519_public_key(this.__wbg_ptr); + deferred1_0 = ret[0]; + deferred1_1 = ret[1]; + return getStringFromWasm0(ret[0], ret[1]); + } finally { + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } /** * @returns {string} */ @@ -53,7 +122,7 @@ export class CommonwareIdentity { } } /** - * Mesajı Ed25519 ile imzalar; imza hex string olarak döner. + * Signs the message with Ed25519; returns the signature as a hex string. * @param {string} message * @returns {string} */ @@ -75,7 +144,7 @@ export class CommonwareIdentity { if (Symbol.dispose) CommonwareIdentity.prototype[Symbol.dispose] = CommonwareIdentity.prototype.free; /** - * Yeni rastgele kimlik oluşturur. + * Creates a new random identity. * @returns {CommonwareIdentity} */ export function create_identity() { @@ -84,7 +153,7 @@ export function create_identity() { } /** - * localStorage'tan okunan private key hex ile kimliği geri yükler. + * Restores identity from private key hex (e.g. read from localStorage). * @param {string} hex_str * @returns {CommonwareIdentity} */ @@ -99,7 +168,7 @@ export function identity_from_private_hex(hex_str) { } /** - * İmzayı doğrular: pub_key_hex ile message üzerindeki signature_hex geçerli mi? + * Verifies the signature: is signature_hex valid for message under pub_key_hex? * @param {string} pub_key_hex * @param {string} message * @param {string} signature_hex diff --git a/frontend/src/commonware-lib/commonchat_core_bg.wasm b/frontend/src/commonware-lib/commonchat_core_bg.wasm index b556b17a10ec7778cdb62d9f3e4bd8a895e8446e..cb8c1734974c65a28e965723a94fe9bbff0f0d53 100644 GIT binary patch literal 223802 zcmeFad7NEUmG^zlxntG6Rds7hD)YG~0V)z82}xB25pqjqXtd#J?QXgsyF-RTs32rA z;O7ZRVFqK18WlAPw$WCJN;HlgCk%=j1>2ygQ9z=iMn#E&ZET{v-{0Ej4wY2ZtvpZj z&-*+Dxo6L7?X}llYwf+)*~eSD_7%S8dHx;2?5l!JoBT~zB{tcEh-YE%sw62yeEy{r zv@j(-{iEDf{tf;O`q|`)@^s}0q^$xqJpQ+auJQ!IfKh3a>IXO6;FU|d${PfPMsALu z8{;Q6<3@m(xZwr?ra7wnn=A#~m9lZ8YtY&e4%UzY)>4dB84-KxN5~{MS*4__lC%oJ zukw>8o_)^p8(#5>8?Ik|&C+#Cmfx^uV9BzVpFOyC+L9$VE_?Zs&h1-q z_55W^m(82sv#jUb70bQG(dtci^;WI9Vfnz?wM!N(Sl+vI-hzR7^9B}O-Lq(5^olcF z#q|Sg)?RzV^=p^R@9kMOzjx8XW%HKzES*1Z(dad&xSH4Buwr0I--3aqeZ318%$qlV z;er**=8aw}Ms&@<>Q`Q?PA?c(v24ZitIr*nzjWTf)pNa3DHDTRzVy25mdsz#+c$6d zysHVabm80;eao+2v2emn4xa7ubfgPjJ zH-F*Wd41q9uV-M%1({MvO(*Im1O$5x%fqw_m^I@kCmk(UOWZgAu zZn$wt&x#c*dgd-#)-!+6g1IXgo?tY(Om#ha;hHs&w(s2D1@o6J=(&3CyyXM)=dbYE zMynQ+vj*_BYnR-xY;a)tx+ToVWy|To!bRdR24z(C9I=(P>(*R*{mYm14qV-{Y*FvB zx$_sy@4I^G!04^SgEAbKt6zEj@^whDCFd^hThPju_bzh>a-CF_$_rA7wAY+yZcd~FFOirL zq>?GmODCF>=|n1%OsA8{=CBy0{iILvWZ-2I)Jf8g{+cFD^1S@aY$_GZI<39EJ=2+P znlP~|nNRvDPmS|ONg*8szLzGLPbPy@;L%Pdlkxpj3x-AjN-Zs*rBEi5NHzqk{2On) z!5hk^628}#Za|NhhKBZgxy&ue_VgkR|Q^K$(jPbap{_YYgY_hzwX*~uUc~T znt=iDC9|Ar9+tCWz;rStZg|C#RRaTSyu19FBa|DsJ}$@9vSJ_hPaCP&O{;ELvu??% zHP^0Rx^7^}H3K(!|L%8>P!RpGWYsH|U58LyIq)iPpFeqovJ|k~&-fEZ z$X$Ew%dhu7?YAsnGa!)VK70Q#sT_hGPeA zx_-&pb=WW7kNt^DPUQL}XzLr6doS%ARwJGmYkj}9CjAwz>~6oUCJ|h%g^&7^PHucf zoVlr`riKmSgMOhV32m}woj0-JknejXKezs$R(-&KzyFYb(EqBx$G_7*;6Lp@;6LmS z1yA_@c++!%VZ6Me-j&UP|}CNmaW;u-qL5tKCV} zbSG8Qom8beG-cgs-w-CknH!>9I4zt3%oza8se3u=Ue3DL|IPcp@a{Li`GMPiM~~7Q zzypj^hH=U;P6=mf^DB&JfN{YvP6*>f6=Q;Bj1{b6oT$M#QG;=!f-y}Q#+@6&bXeRF zl|6&O3}BcawQ^I%}7YY@)YAe^rtOjCw%#|DNIB*YU!xLE*C;)!?cdi&nn@4olg58z@7 zk1+4j#>M;!<7P0PYZx~R=ln}7S3Z++zL zkN)1FTyN@$FOEEGe9;omy`~x!(jAY`!`~7#`vHv?eoz_yXYD1isC{w>j`1`PFB)|NLw3|M(OGUvDOL3Vf%5 z?=Eo-hrpbniha>4_m`Fz_$XvUEtdde7ghxu1|jX3wONnx4Q}kzTT{u zAn+3m`~(A!xrxMR7WifZ-|WECW3f2kJHxiH9q?^{?-ck>1K;Vuf9k`Zc=*V^UmR}P zAmZ0kFB1iRqJf`i;ISQ<{Y?VjWZ;_|czP^$rO63ld)Nv1cEC>%_z4Dnf&>4veINhA z*FLj*8D^;3ojSL*P3M ze1`+S`Rlj;;RA1d&u71ZNCek;CDIr5B~8rzq;>pA3F4~gI|yNrU?ENgFnUKV{rx^Sx4*qxdKX&T_-~ILBUmz^U!G2l6&l>!!!AI^e$tMW@1cN`p z!KcqL`%MZbhf{z*8TgX~f0DtU{H)+-4Sv?azvl~Y+4rB@KK++(Ir#PXuTk(D4Su7+NAfVu zI|RSO;CDFq^f~6gh7b(s|0Liy2!4aXZ*cJM_{o>IZ+XqG@9cN*>+xTU;I|n37K4xI zVV-vhewV@Ta`2}}Bbe}O1bzeXv%qf@{6>S{=-}Ud_>ni?f6JfWxX6aT9{c449vjtE zj5H6Thj~6(;3pgS$qxJ^X#`_GfQOBMZy1sM4}I*rzu5Nu+wXeL%@N|ap76^HJO(G= z^VWMr57T^#z)vyoQylo5G(r;WB2i!98%L!66If-0 zJd%f5K1tvw8Td&Kd|nzMCGcYt|LDV?Ie7H0Z`{^l;Op^Tlfbh90Qe>YkKmE`75Ed> zKEzK5{Mf`l{^)^EKX~v<51nD)>#<%z;0p%6VBnEElD-0eg4&1p>H5U~z?*OX@zy&J zy#8zhUyt=#1-{k5w;FiFj)bqkpP=?3ex^S0fAifP-}}lJZ-3i2k-U(q9`CgYew)E> zGx&%d317iKLGMF-9M?d|<_h0=fX+G#*kNrk6`$p0H(BIf^Z2G_R zy2*rjb!(YqWPh}@!#0=|H@nc_|Qk5cuyN><-P4D{Q^9+1F_8ZCY8%6O$eq+C}$$xP3o^O8ZzF&X6Z(Q6r zlHE6o-iP|eePdJq$U|Q`@RQ?T`SjW2V!o5~KE}l;dLQDCL-8Kn^UDW6`?uchg16Xl+T4ci;Hb7yfel+mAT-^|%QTGUpV@yKmYjlr^jdXor2bf z{^L-)x83^0U4Oazi+4OZKBMmx)IRhdhu%H({o9}V(>+#UF|-f_(Bb=70NQ8a&}z&9HBMhCuK`@hC|I+fEIlMZ=KCjJLL_TIPs zaNnaJYaEx=cM6K1MWC_X*u?+H?T`KOzM-GLo1-`;UOm=31-%dPjrGPR{_Su0-OdMo z{-u3W#%1-5r1qI%Bkl4-d}F<_iNEFPH|_lPUmp2QH(P@Bw^~Nh`pmGAHu)ibnyubC z$D42Y`W@Ro`NW5QHs8S4W4)1-J~M2jJ${Iv5%{r*|M@?E;3Mz3=cC^`-@w}aGI-f&T@g7Z%&HA6-`llZ}{`Noo++E@DnwHC!r&TgdH&?+!4cvj=%M%-}=Niz9^@zPR2@pb4}(q*JOTk zO%Soh(T`(($=#Z5e%s_f>4;6#PqPaV$?vW#chZ8MHt1;w{qa9M^u15~;h~>B3UqUr z!>J1)#jiQ(37MQBlM^!RXS16O_?m5g+vGo~`y#%%;N<~tUUaG~@WZ?u-@f-<-@f-_ z+ur*);F~w#2b;ss5UrLR08_w)abnz(mCJH>J_a?GDGQ9~e z_oL_e#Z95t9ZZ#XZgub8Mf@TPI# zorwc)BJ{iQ3JXfl+;Tj#x|F>M=iaWHTx<<2Sq!I^Cf~?U=Z$Om&D^+l5D(iKgje%B zI9S^G=FSBAdYQ-q~262NQd+BY+tLm~j9fImsj7^MX; zZ2;2-Fs)fgMScaa5r72)*jxqJTm!Ik5bD!VBeOsN^Qv?bNgvws&^Ho;0(j!EQacr< zsmQMY%B8Hs0OqRz^ECh`3_=nb$^)>GdKpzZiKM^#w|l?E08(y5rV&71qaBPx(_)BlNGi3nlF^xzX zjz!YRVw$=nJ@TO+e=!&r(}<+A#v*A~%rs+@^p;P*{x;+th}B~nk+gd(k~YLlGd4-@ ze%)8!6O4;#MAA89ku(=G&DdP}<)=Tk+i__7-Hv_s= zpj!=es{{STyWac|Vw`gI*r#2f+YNNPfkqQDC-MTFH_&+pnx2Z0XwqB-0bKxen?Sc2 z=r#xXzm9HuwF6y`kvasr!$5Z!==Q;o*^v?GjDgNL(DYO+1!!{<1avE)+XcGaK({;4 zU;W&+zj%Y{bv@M1iHgOcR0}Z zfBECP5D=8BCy^!y^aKMv!9b%YnK8`*-E5$n9cbJG#bz|wiF;rNpxXi6DbSq;y3>Jv z;?Vn^aG>icw21;e(Lhf$&}hs?aW0?>2D;!t)6 z`#TtDpjeO1CJFQ;13k$=qdS?ltpeR@pj#bidK$Btc_jk66VMX{dZK}z=s-XGoiF_i z0SV}OY&Kb-CmZO=1{y8O1a1@PHUr(}K-1Hh%_hks5zrF=JxQP^8R$t4^bg-*+5Trpg;1+w!4vG zfUd`84FcU@pc@P{@`MT8AEM<5zvzX-5}5n2D-t4-naM3XRv|+U60M0 z1iHyUHyLQ;2@`mNKu<8x6C7xI8nYRmU||=ay8xXN=$wJhInbXOdgoRLx*nUg2y}~q zZZXiv6DIIPfu3lfCpyrRCE87zX)iPf=mtPH33QWzZgQYsf8?11PJPs4vqph#G|-I( z8hO$#&IR-&13k%s?viLXX$Ii13DCI_3I3T!e*A3=x|aHEmKW%}fzBIf8 zILIc@SoHqIx8L_3j7rMYbhCkOHqeL@iBf?+L0v;{Hht^Sd*7EHKk7i&#^BLrr9X!8iE^}jZN^UKk)C5qcZ_rkIhCh%|=nz5Zu^oY=S@f zk)dCqGXY(X%|_~iq?L2-?P z%|_g$7ZAG>jr^tFwhMSbgNckDedBj;M&E}R?5i)|HM0v9&n)RvDqm4 zx<#N{40MYF-KLdTTA;@!_%|N>$$w%XQLY}For1oG;GD+UR?-**|JH3!K8%4xxq56i zlD=jZjkLUm;I?fxHo>2K^fUKhAOX6bG#g1@GmA!AUPJI?eS-gX>)r3eKmv3Sp1|9RBzl zfAj-vvx)WDY!rQc@)CgENwFDCas*`il-evzXpNh&HEzPKagROy(|5Q{;Eax&GIrd= zt{*#|8K_os`cq(02f62X7nN@?V&RZ6mT7*N0G% zUpwg%;M(Q2)7K~OU71Kpvg+r^k_~BENB}yiUMH>BN!RPQe&Fs$u+1o!Rj;$wYc?F| zbr#eGnqLFWq7L9S3v63npR{8aCd6bks9Su>vMeRQDFd8xfM2`s9oyN>K%6xKLA2r5 zbrC!o4G(sjbr8$d3W8j-jbqE}lRE7Nn)zBe9;9+wkkbY^?I6G54WGRq!z@3@IdLP$ zkenLx@}KqqIaJPa5XxzCI-EYpNprwCY%!ucGX^<+PKL!n4x@F&2oj_i9DWMI1Z&1K!>*w(A`;+((MICq&u)aQmIn|0w=Vn7uQ4N%5s>A|K5x z+KGKOI?tW%C!>psXWQX@^dbm8vv_)VQSls}XN2cP)1m!E#ks`hh0}}k3C{{&6ith! z7N5(}{*3Un!RWL-;Thqg!Dx}8#_OXFZmDo%bbgo+3WL$P$^#1}UK}P!xn$3la0WH4 z(pKK;qFgC|V`NRuu;QmtP)Wd8MCpt7gy#<{ofUv{%Z*c(gp0#VT-(B`T>4I!kA|m) zeS=Zoo^WpXg2CtomdSlcRcue=9xubT+rT?)XNMWET>$*4)QnrSazf3Tni{tjc87hG zRyu&X_fSKF70%uho;Iu^cv8pGRG#SUaDf9N^oErM^SNQS@ZLiAX-iGkAZ--*TcyV2 zJy#U?J4(;3QotCYg0FR5r9t%X9Zj}`=T@nkH>=AW>zXc*JAAGOQdC%Nzo&&fT-6n8kTU45Ja> zqe=uWv1VcX>0$3+1Wu=iXAMTZmWtm`%wphjRv6TdvqNxp7{uc|otiO*R!(F(T}@6` zDqIv8<>+89{b6v=8de%i&eDK6CZa3}mEjdu<gF<bKdYZ zWI&bjbOGx2Q<_OsrY`BA6jQa#lQu5Bdl+&s2C3qqYUPTnyRJ z2CFcfGZ^(4Fz%*_8vvI%VS^iIHv$g9Gs6bP`LDpRNX-*5M7Iq_MeEPB7)M61htg;6 z3Fize4JLEc`%2>^oEiR=Yg<^AOB)%dg;BV8FbemCXNRT1Xt8B-Ck#G`nss1X!nxPD z@-hPt^+|kj*a)_N4g83jaf=nMJX=jhackja5W;aK-cOh9p@wngi}!@3VHLrXIxj9m zAzBLm+5r)I!^*+{VR+eKbT$~wsWw#MN~6F(TT|s}1O=8*nx@JlTH(rR!qNHZGJ1|GuiGCRm}lh?#$)(CqMKaiJtLsv_(rTA|a?kpGiH3&MYl3kA}u zWzo`Qh0cLB{+dE(LKcTpV=ePfvO;0_oNx(+{wnYp{&bYZ4rs3v@@qR8X#G_{AB%o%=iO!lt_@qr{ zA$*=oX=Z9!!@1HBeg;M^!czK!vLqDcWvI4=UEDTcCBnk_;RS=ytUckp@OgvL^BmSM z-4p)JFcg?>7jSW>VZE^2Fo_q2DX@MaEzhTgxQdk%*4E_wxYckWgh?6dvj(Gud#GU) zx^Pc;!LW+pOPvc13gwAj5Wdg>5t_rw(t~-T_AD@fmC6k{N`PMtB_h#+Bq*_v((|e^ zxI*RW6%xcWo)?1Z1(aqcokZoALS;kJ(fA7R*t3NdNlnXBj5Frp$}2%;t*oC*ipwL=k)#$Fc;ePb`r*jss@ zU6?@A7t*yF68{Y=9Xm65j?2iBDeS{0cP^Fk-FV1>m@0@3&^VzfOqV(TC-{MRQKj&cRw{#?KBUxgv zfVNA=@Si7e=@brs6YC>yedL!Ct99pgY13M3i9O*`VjanckKXGI(s3@AR7j`Cgw`GWy;NN${>I1?x%&pNQM>d1HW1hN+dsMCj|D zZ)iedA@Z64sKHbKa9zc;5iC$7A9)vnYEbH+JH#n9#qjc*e4`+E7>a%wJ73uOq~bHq z4|{^%lwvZmI83s$;zyp685(}nnok~4weFW2Mi^#F^p$6to`5G1rdE0rfh>q#EVRNj zJy3}L+E!FkkZ+)xVvxVd&u6)+Q!y_TRrH2NS~Hp!3z1Jn`mUl@rpx*QQbs>zXu?yu zE3cXr3bG#t4a3BxLZ4v)4+25x75%)I^K!-m>^yD^GdHfbe!w|{MJrcItkJ%h9|n4D z#74zeNm1tuf%t*T8Dc29T<}0Y>nKx}OLG@doceIO?B_0W%~9O-P%D zu=GmWHsGQH4ke&kW~nG(h8%P3RrJBE%GRI`AFqoNt6xYNr2{@mAHW(8iVxK`NM<-_$Q)*dBeT|6z0B{>Sq$PxZLFIp z6*Sd@N}mbo;3W}vH=)xnZA@0W%aC*1Xxv}#g#I#L>2JE)-(;A!{`%GaCK-FUUMZYm zxc<_kYJU+mzIZ81w|Quz)Vl4d+iu1{3DEQ^;{=PqwqiTSB7V-1qcTu#a}}y)DM=5I z3h<7mxX2JNEh@9dWQhjML+pWQsx*mQfBi}-q)Rg{p0ci(R9-^WAg6={6iZ!-P~ZWp zgbD1FFev(ACQ3AU6lUOPjDe(l2L)7;cVkM^)|Zm2krIU{xOj?ErxfWW@=_cSzbECd zame`ae0m+7rl;_H!)kSeIWcaHmE?Uk%rJ7WF-Xr zk)$DPS0fEIRzeSAi=6bob*GZ%GA@u)*ORoZf4m)R9VNzprE%;IRO%R>Qj~% z-->+Oj`WWXB?tK;&4$(J_`-VHdghtL>XLUcDqt}m+9+*8$1QNXMv$GtU@Ow_qHg< zJxnsF!ONzQqmGr1$NhjMN(Zq-iXIcs7d<@A6-AaPJ$O+Q*r;tyCP|)K9RxR*L;uB7 zgpd*q$y{j%!O}CF9C@XOY1HYP2NgmBdIrc!mL4a~M5vOVQba?kh@O?4HNJ)K-vmLZEa@X)>8t4w^`#n51KD8KE=>OWlZ;(ss>OzIGu2BP$x)@=~e= zFJ6OkWZvg-Q1PWGd8`jJ7d0iE1gMGu0SWy}B~=I_3=^?1k&G#8axY3tcg2E47K~Zi zC$)~sDNCYYu@E*{8UqCq&;5Q3H}glHIn5CBe> z!j&@nATe~n_9_grv`dueX3|ic9eA86qXP#^hY&qPdm%u=h#fW(t|R?a$?50>FQuC3 z^-41NzzwG)R5mu5jmJez`c6zjT52Qf40{tAMZx$xtKPJosyQVK(NMD4S|#h3=>LgI zma#G=%iOCdS(KAhlO@r9*}iomR|`U!XmCeGH)%0q_AO9l2W4bzn6d&PFoqw5am=!! zCa*Wg=0e)>u@W)u%qCvR5q+Ypm*6!b$6#jwU(|%phcptalGP<&t5sG*ng)L1a!^VQ zQWgDv8fvAA2~o?E z%FB9LrB#z8B{W1B+%0&-wul}ek!3MxwuGX1Ux1c%z1)9z0DDRkTtu$+puBK^)tCTj zw_32V2^NbI2!&G1i&4rVovpCV_O*~kr(B=KU}QFL&BEiTgonu#RTg46+Xw@=u7UxJ zNW+R;*OoZOkfFaSn%1D7(3eSTF2pbic%D>N|V=`>4M*DY$p`DJ7wTI$8Dj7+{5y;b;x?v7*V zREf9CuP7$XTnTv3X9GYQckRukQhpo_IvUP0tdf0aU=;HG_Ur) zcfY(mtFZqQjBVzk2?<909NmYC+NmYd7q!BRg z251G@kVpkrHixRHvKFdhijSD2IJXoCQ|4YUo1QZggcLqZcyAm&M0j@`K1g_196msJ zXB^JD((v2q~6B1fPqQD>vn=nix!X*@u=vobj1}n)e2yUY& zRl0CB3*b~Ky*^UwuDvk5r`jM*6{axtv}#9~Qg;6{?9Q$p43lLXlIMXe;2ryC2djOe z?+hHB*~v;tzMezAW`Mtkk7qr1n~)z$M7jQkZ4qDH=}+MCHJ-1m<@)_?@h8DJ)oH1G z`Y_i&BmVSZ{8_l7tsCk0g|<>JUAQ(%(o572LjwNn8j{(!wv@R{HjJCFS^yiPX_|{Y z^c2VFDGt!{aQxKBE3Q%3QzIVcjF$-6Sksn9z>;@p)`?68g2e9Nu=aL%J|=%So<{=h z*K`Mu2l9>U4vq%w;PQMbz#E9?F*(ukJRV^0*m&(uR5^1OVc{my?j&61%pHWwoVlH_ zab|cP<3ic$of`zpx7VOvpJM3nA}?QJL$D_Es4}zF%xrDuq9D}|k5K&~SHo35fcq6>W4tAU!G z*e}JbnN4_~6muNjOL%`A-c5L49NtBEZyc5)-yVmh;CIAfDgK>tSO&qaI4nb9cN`Yn zp*SqK$HWBSAh<{4u;3nv!-9L5wHsx;LqV@6Z*PJJ3Ch)*-~ocR5jor2PY`PrWe%ZG zDrKu8z+%OY&FyOq{7pq2$qumyNnpVyN=LO=z*OW7ZC{U6;eU}jB)gTb6JvwA1Xxq~ z*@#Q?t;7yjqM-GntHNe7FSc0tpetR#)^(+Kxzb%xW4S#_b9a<$iZHJlSQxAYrz_$W zOH0`6YKBohu6dBsjd9JRRx@b@cM)cv-om`mtyV(jk89;HnfbVq__h%n#`;MZQ^rA} zOe$_*FX{QX%zi7=Xk~T~#!216hpkM`!Urwgm4Vij$-6R8H!&My0dJSvk3aC{kA3oM z!N#bqAA?DMnaxo{|8MU6{x9DD)1AI+hzbq;x7_!s|M=rq{>$OG-?gznz$BurA>7^B zZ;W1OSS3un7@H*_4@PMw&-5PDhlm2D5Qp?u)|RJ z(-*$u8Af}FriNpLVXC%w1Y8Qka|pkC7Byf5YK@iyYM7X?H36>wW4`%OO9+ky;n)%u z9F7z8v>6#8t zs_Afcc!%ezgO&dB(bO<@$6DT`JI}${63oyH_nPZ?_-vKBx;L;P~8eoUZW1 zm=5eIG4vHWK#A5eC8nQDi5WGNNDimO;+1s0LJ5xjlEVl=w44b!l2ItQhhfnsJjX;1 z8}q%%sHlwnWZ2m65EJ8krV&XE~yDLr8H{XV~QuuGCdTF4)IiOdT$W0?CJMF1!yzwajxU z9LICKZR9A6#S5%sP!7!4=6@DYV02NPo&n7fk>5OSmp7r#@nHy3=HXfn~2G9KVQ9@h@<&4m*PRyc{J zNlRFC4P&d&@BwQWhIh@D8*OxrW~#gaWG8VEx%9pgu5irFEIKcI&4vnx+|0UDak0qF zNY)Eq6V6}&9Sk>;OCClX_g`kuDH!PPOdVf!Qa{3@N@4R@W?!jUcYdiKgnTMqhCIorQPhUWJ_VO1>=?Lc$k9%XCXFzxF<+y>;@HF2<-H=AktXU zdq}i=ZOC#h&1zW4TCtF|oCw*EBgDRx1%* zK{gbL;f=Ikdy>!ixX`SO8g;m1yG@M>xVOd|-A<25lq+nv=?WSL!>sL;q_|cM_T|RK zmBozqIx^L&8CNxl?~mJZ%D643jJBKv!ZjK;YRf5ZmG&xIPBMAG5Pq%Ma$+}29it0u z45q`0wk4Y2C2Xys&hvHzr4ZTCQVK7h!sbZ=ZvfZ7bm>B!`O{xsh1E`wZu@j(F7IZI z(nsebV8sC-dijGn!@&m0s8Qbbg741q4kS3Nk8l964X^Z`Xp%O(5Mq0Ss7o7Oll6&2 zHoPWPKY35E{Kihgnh*z+G@-grG@-Kf!j{+jl-XI$?5xe) zrOb|MW=C!29m;I4X13R6?o{Sz+ibTfbF^J8R-15pwb^0&VYe!Cw4Jo=WXj?zV!as~ z?nYBHWL}GVWZeTXfg8OTvS0gM6?TL@|4+G5!(T$~IKC)znFjIk1XJUL9j`Y^6so5Y zllxW|(Z|6^@++{}fFp#NvJ`XA!zEF?}ExF>6?vr%5I{`+e6-?7d^4nYCifryoYGAP^` zaT?9$SJ-+dE^E)sSRLUmDEGiZIc|OlLCAY+g1b7(%7H)N1&6qNgWeqgt#W>&UaSbh z_HsO@vv1HUm(QDXHm^Ly^_z4=u9Nfb!7}}JSzjOlJu+H~Rt4*q12Y3(2#qlLL-t#t z>o8izAoR+Em4ZesMvF4CJ;4iH4r3(Bv%HGY)(aC>2kJU1Rv}+Pj!}_OD35b%mFgGp z3P!cRdI!TAVz3-=M~N1?@FH?-x5OH9!($sb8Xg1tU=1?&8hC-d{PKm8K9D~m=uFg8NGMa9lU@PLRJPONx6g+LzgmoW2-yR zi(!P=4#uXh;TFd#V@|An*7P`M*6z6Q2vh6xan=ZPi}!oL-bB}llWV`Ss(fLxYB*o; z;!!PQ?2X$RVSe4Ktdsd7mVfaCd*ATpcDd#PZUCvA-3N2U8pqB*lB3*_YA^IjMw)xf5H*p1T+qVkE6k{&2~$LQSQNFKBg(^~*a&i_ z;$cw?mPVpHEXrc8fhZ4)-p1OFD39{-Uw~{4gTf0!k0fndCR|w3wKup#$x>6j$W#lW z4Ut+FL>t1~7DOAu_4tRe@fT=`jKZ@fXY*cLZ?MWraX{G1t7)phX^dNpYsj4;|N(;SX99W|{Q(P?~In4)S_-&{NsV?=M zjWH{A$bJu|*l1B%zI4NHW2G!d+bX-A69mh5twBWH)|42K+& zW7{VP@vPIW)K(e8^a4}b*$VK2YiMT~xXTd;Y1O7!xo2rW%G!2mqz&S>l9Z{og%cLT z+UHsv7n$}`Vcc}u8y6mdQ1`}JBT(v-an=Z=I-smEY4v%PsCIB)+|~%xx?frK$aUB7 z=60tXA#f zMzyVOH_JJ)Knlq^o5_R8A4w=BiJj^kEi0D848rV0ok?0&EF;jdtXM`MWLdF{KuJ?9 zW0KMoOSS)H#WDghO|jIYrYV+cb5bnkj=_?J5MtN}s-**a5~WmO5ve;lzt+K3!txN2 zT2_=AE$@h(ZEKmKf!L8yUb56-dHaaTQ&__ilsJ+kkGtM1Z@W2Imh0`6XCL+ETizjJ zwurKNY=|1X$2>AwNgF7xinGEJHfrAF`A&qm(;L_(WxatZQ`Q?;LS?-X+$6O@htrbx zZ_frZH#YGhEEy^J=yYBg+rwE98ZaN7u_tQYsPtsiZRzbw@8BAksAHpB&nzG;Vi3ZBlqoa zR-=~Y>|rBLIp^%*kmhVFSRl$i55Emuff7w6kPe&qWlx@8K1sxHV<_BmVcSNwhubZ= zliz$efnP2*<#%E@+uEB(I1N-aAk^4Y<+m{eP869=n`ydfMnxg%*q{6DHqySD&WCDx zLa2rk*3iW83~RcT6totd8_5(NotE5cU7Q%6sb)xJe~n+Z|M=wtaQtQs5Z9T|!J>6= zmUZy7N(Zxaumz+zQqu4@fux$4!f%2Ly&?f_2q*K)i7CGvzVOQy0KXUl{LZj;9m$-T zz^1JF%6T5y1*<&85aDh@Quyovzv;LMM=bS~12cY4v*x(Q#un7hHJn4Yjht<%=gl?( zxp;8pzDObmSp0I0AHRI?li#cjPD6~K?2S~V%OPE!8JiMOY?CC7EJ?wZO+pVU#pUkN zMbpq<{b?}@HCe9`+!aMqgOMw3gOo8UaqlJRoCETkvJP==Pu!tdv^OgTpNK7)qC-O; zz%&e!lyNn*n8$%6ivvlE9m6DI2NG!s-kp=X1@DlU$ABCN%=>}~X)YreNfqY?bM7$R zQoufJ-xw8K9p|x8zzu~uU6_MpHM?3aE33)N9xwYbWI6W=*|&|cI|c{5?8aLSSg|4MtwA4`c%%CdgQmzc?WtWmr%{ZqHc|O2rRs;<|GY;xes+OHV*g*t4+%hP^Zn_=fYx|5l+W?m0OA7^?!@+xFX7)82s`HbAOXOQ1WWV9Z^>t zBCdpfu|EXsQw|X0Q)Jd!VXJEkGlRCe%580Mja80H6Pw*hB4zgb4rg2yth=k?-pZN5 zx_gvBlgLiX6{nLU^25kDxYtNRg@XR*o!%hXgeRhvJdq zq~8Xp;5v(3x(B$CTU2qS zw0AG6uQKonO1$w0m67Ks&cKjU#+OdYu;v;|Uv?RKjl*ha`&nk29X)33wQhmdSr#aT z-XO5evy+6Aa8N1jeaj&9dC8yMY&nSItS`?{x$g6RKmFt-a7?>O&j}_gokl#Cjx#u! z)y0O|emAm^8nNHJl3wn2uH1{HoJo}t_q!&;`kg+h-#T3X@9sB4*k~6Tln4IBc;lCL zzh}Q!I#U-O^J!FtALOTStM8$P^*&J2Jv<%(?825c47VS0rr@{P*8%xORlJOQRem47S*yMRDp4aDa&LN8{p@k)eramd>+GDa>7cX@@S*pBAA4|5{Vn1ISZUxb8#EgmbJB zNCF+882uvKnlLJGaj-Q3czxrK9I(+BoT_L9B#dE@GCGG$L|HN#sPh0M?9lW`{iB&Gt-J7_^h1hw&%7xf?ztV-+eZ9hk zIA*`Zg*atjjGp9y0<|X#c6*}J?YS#{?u?)8qFXwO$eu$eVM)fMB)u9d$%cYc(Jgw1 zFD+S`LcS@ju`I@LL%{&!N4bseX;L~N`If-p!-?r|HnA{;54hj!^{GW!S-sv|7u-#- z+XZ(K3|)|QwZ{><%CfHZU|a=RS9^w&w7-rdyCEn02Ga}@I)}m4yQr9hh@$|fm#EQ6 zbLYzMOT~%Vfj1&GcPHLQZNo@R!uVgwhspsU^g5&`Ry!E z0VZunJOh~kogvdcs~JcO&29$D;%-Mvn)|)k81|oD`Eh+9kCc-nH=XZhtsl9=^NbwKNhzVHc6Y%C@zN*lV4bq z3LLC5ePFZ12D(u|C7$@0N# z)y;~WomShV7(&-Ns#Ly$;t)0>kz?{`q9n>hNfc*BMId%QWWLbr}VjN{3f1r2+=SuQ7pK0P)8$eF5x4sWW<>C!QZ z%?ENikexjq?m5B*mLa0)K_m}b^mr^W6v5Mkh-M2BeK4TMlbJ-slZ<5Y)Yv$U&c^YP znecN^I)Ak}uF0y30*Ju8Psa8Q?-e>@EYQq@o6Gi1Lp6i>uZ-BfsmY)nY|XNLQ)voS zI)Z%zGBWK1-6pL~pmExDNTl;HcQIu2c5&{Ww4d1&EDmI2Hpk*x{}p{Ii6Sg;-5o5H6A5Y~iAsd#T=&f4 zR1>Aa{cI;d}V%=Od0EpY2=4l z34O^tE&^${p9R==i@}se4PeMw+tn((_KW+9mg%`n8Pq%4E4R!ZqYo8-i>(>KbZOSJQzJFq8M5qjihk zk7eN%Kxj67;;9MC7E_R%DNI)*zruHV{i`NY!-TX_$)W4mKbmDpQJBfR#7k3>cgWcr0UEcY?vUCBuze7bk(I4mE&Jt=^CwcscjwC#vJvyYSKY)wOlm_%S{kkxxs&h=Ykz_ zunA?vBOf)!>u+N(2`2L4UYYax%Zz;X?l*>+FywJD*FDAq<_79Tj31Tqk_+q!shAc9 z468`OeK zYtEHkbO}mBzm4f)giJu(FtO68C=z&l#3nKV6`LTAyV9a5cQg}pZwj=RdlZ8rflUf_ zvvH|7Qy%UXo*T`vJshRuHW9ki#oFbveAWok?i>br;hA!+v3gSPa}<+)$3GD z&cSpkb!+d(=V5*jxFd5ksW!00CDj(r6(ir5C{wEa>fC$S-4FI{v8SF)<$vBh_; z+AnjS+S`5SseP3kwdF*mH#NG06)bsp?C{xS;du?4EIe-W*=6B*9lI<%cKY1v&2trB zM&faY&#nv4bwx(IJJ{tHi+aA#FGhOq_KP$1yvr{#`rTaDTs%$BPx{5v_1xzd&(QPp zevx%ucd*|t&ero@Uwc6|>x^@UHyFx zp`5LuR}gBnb@f$*8f>loGD6u<7iC{bC}V5#ml9&ZM%opGX4u;OMTDmD{imMb5<K&NP$OLGV@a)jt7GhBw|2h*J1 zbkxpxozgI>I+I~kc@&CpKil>QH6C6uD^*z1K?tvr*h$3@VI-c;VBG7jti0JVS3G{z zmICa*T49}(l-~*FL?p>;9D3_kuUul+S(x({UO2MgL8}?RZ%nu`e&d%(Ng3B7r#xs0 z6{j^Q9H49c^2A`ep%d1gERFuA?sr)wbGyMcNQwn=9nP36}d z*$!dX(rxK)N0Q7=u;)(skk`;SREUo_a;n353FSEQb)}iK4ds_cZ&F3h0#vcVRg7yk zs3wY#I*nnwt9cDdF+QDvDRA!K-C)&B538A0O<0E$iOK;Cl8b|6*UE0gmctlT%?_)o z0}(1^D9E;;E6(7Sk1p8a0qT{mX0oQH&KAs3V}!E>mVD+9;f?fDqR{3oUVz< zXRDeg*^YXXp{N-lCFX@`cTU5r^#x+JFQApD%AJ{jHQB~eSWKWG53?A<>&=-$Ukj+6Uy_uE0j62s*^)k7&yF@5;Srao?s|l@~IHQG9 zddR0La~b#JnVF(JBpD|()Q9PBuaIf!lHyKu8gmZUsHK(8ftxi1Y4|Xe4lun~fDaaK z1TI~=QcYYTv*uE+I;Zpaw6dOXPSdV|E0k>J18aAMu7K*Y7OjB}9-v;}!Igk{8bAIu zT{@Y~xw9hQw#vHbAIl=vPujcVJKRWYsGo1mc#t0kOUw?ky;Qdl_x!O^wIz#XM7(dP zZvjvU16;<9mKt=IhS0<8yWYv?dl<~tq*wA#qsV<{B+;ENjfBvisy$5$%~FGOi@sum zH{1!$#0qW^mRzYTXla4bBsFO-+9^dg5>O$E8_nUBA_k64I zO?YMr7jC8$=*;RBM28p`Lz=nGVjGBX2Cunc^?9YxAyGl?gmgo$jF?|?S3wbv%QJ0Y z*Grpd7J|sYf-?gN?^#|;u0&Gd>)7HD1+!(U9oJ|OUnVNCB;u1Eys}C4H)Z0Rlf#YFWm6Bbm6g>6ldY02jCpZ=Cbt*6J&4hKk5X` zg>w0<$Qr8}W@>XY2t=x0Li3fEkrSI$urEy47L?GXAj-B@mZ=~I0<{GtVky{1!5R^$ zg56>A=Kh0!HgrHNK7o}`$Wlilw&ui^CS(^#UCI{5R*G#O`5?;}R*Lj)*%ZbgwlvvB zzST4DVx>u!Vm9zRz`|QktT5A}2YtPQs~vUOj8Zr<8nxMu1m}6!m-VPqd!#(iBW6X; zPTZt7c5zXV5h;zzX&KKeWlUHRlZ0z_94#e+oA0?})Tazw6Z3(>2HayX-CGf`P~ zY#A%sMDz-x6T`OJQL9||!Qf8_^R-!WiJ($QrP>4Z&M;S7N`?TXI3gIP4Licd+ER_K zl$2WK6>}iAhYhuyA=7}inB`cFqcStw)wNB>oQw*GFf}~Sfk17sn2$NcfnYVonn&bf z3?B$tQ>wOwhtutLj*2{9i00 z+*GK_2*>kPA>o+2DkY4IYsAD&u+YB{UL~JwESP>!G71dm0MWA(+^1ow6fbKBS zOEV)|5i&Pwg)aq1wjyM1)QVpUj%-E9+!)!4m-fdT$r%zum?IxKWVRi-fgV__<4Q5ARFPQy+y7(7#+)vQU`gB9{0?)^NmGM2CS} z`eCMW)Z<*rS>^yi-{5fH5>rTCIW)&wS7mHfhk?nVjJDKerV7ZVd`Bmxbu99vaDA9! z*~aAHkz}RMm3FM%RhX?g7H)2V=yoo&w&Exu@^!?(LYk{SIAvf3$@;Ry1S_#pR!1|X zhCyyvr!d7Y)eXX#DQp&am$1pGjWrQV1X#jK#y z2odgx*RF@KFR=g|hJD^0cDNHj^LA7Z)aUXhh)~w11syEJgc3+n?9O?S9rV-(hu_bA zW;Y#^+`Gi z^I{wR)sQif(?Zx&$8~+Y4Lv(jW%RL%9c(qABHHY6gRL4=WV@8NUZ6Y6YEhk?C)mno zTVa!i+Q=o0BnfF_#KC4TzQZ<3skQVl4_jE56CN)oz!|<>z9KFtv3v|B&4srQI$ixiv(-B)7sl9i?3^Ep2J(t@Nm)w9}SX#?gG+9UKfJ-Y_T45_{ zt)sNxr8QVu!&Y?G1RV}f;CdO%>Zmi`qlCgiX^11{%=%i=rYgG*tfjb-tg`P=P3LZ} zb}jCf7BH1$I4FA!j90TeP%W2<%Z24Za*N;EvgIuYmXfZ` zusnEfWvm^G6L%lN@>sgnGH*Kw5q4-ALFN*W$?=77r6j`~DM(Wm@kU=nYMzunQVOAs zAk(mol)0od@U?r@;#wP0x=F$1kx)p8U1&mDK(ml1q(w3-d_tOa?Bfyga$C|tc4LFR z`L<98i3@{JKO8wO3^<2e$eAQRg~;BIp}Y1*kG)uvws6M6k|z38}BG z7NTuA`juKp!I_-eQW7ez zovl`lm3#_IdD_Geoy*OVgm6qJkB+viR*H&GvP@b>U-4clg{G6@Tlc0}2*;3?)kXqb z*s0cG{lmLR)u-lm`@Sy&=y3V&969jv*0LV#&FazZ9&GF?#)hmOY~$-8rsaVc18BUf z%uaQpPcF8kvK*0zt%bVfU~8dJ{>@i0*+q61@_Id<;3iY;>1+^eOfX-y zC5fWp;=D`b0LCV6`Q4HL>0#G`>*_U`2uKCYmdUbLbV#6N)VNs39NbXQoWWy*4U!?w z=6WM9{!9R-2o{TdCZODG>328;wcr+0Znpvr{}fCma{$3Cia#!ZsOj(9#?R1S5}W(G zw{20de8-!D)jQr2{aHR_Z_;h?7B zpr+xV(lAZw@;I*R(j+!=L1GM+gXWJTl9je^!?f7xdl-I3!_rPAT*(}y4ug&0`)|hw z{;|gAJ}ZsSb&YpFD~;e&x&5|!Q;c`bVRAhj=Q zf~}w&VH>e*BN%yo{qToxK`*&Nxs;2ttpR#h%;L0*#Y##a2UdoKV&o6 z`~9$`Hak9&la{M7pjC389~MR^DJ^(H$-REqK0-;EDJPWN?S~U;J63rmQ{+6^BzI>i za%dSo4mIa394e7J?DQ%=ak9Pe+9M~q)C?adZ67)=)rpNGljxLD$>!QF#Yasr`0%49 zIpTrlxmL2Thk`ETuEQp z?u|^ad>QpW%k^l;w>yCu7|xhk;$|==kCu(e(k^zNk`*xtE%fr6PhE_zitN-*izNmI zfo&M=Gqe0lQP2jJYI@<{sueCm)@jNG)z5nEBkZo*(j8`%3&6O9v2rt5Vi)0Kvi7(% zN4qB0pVl!*RfGO;*rjWYKBSztXz zax13ok}#=nY*ASDd1&t9Ns`$R2r6R~rV+t6*Yd-#tgf5Qq0B_{er*=j49u{Cg>u2x z_ycL96=eBt<1MkyeTu_dEYCS%#eL|mAeXA`R>6^YLl?8{A~V)EFac!ZMa2`yBtpl8 ziHU|!Mm;iVcNC4ZU$D!)DkELN$-tvwMf=judyO}Zl}K{f$fa=jpux(OA+s}!dYFjs z%k2{sqZrGug~Q7%YpUBf&0@|~PIvAL*cNNr8lj6;(E~DW!Zp#DcWc3C$+{>l~?M+s$0op^|iq?G^Rb zE=F}Kvf5&qN422?0koY1w!>Ju!ho$Y_px=Ovf98=r#nWFPudNli1vc64CM&dpb^oM z&P=W=CGahDm6om+!h@Ul*+jWj+BUM#O}5%aezD-xtNRE2B63ZF`xu{G#0IeN|Ht0D zK-qPr^_}OOdvD!ab*rQ+S(eIrSo_?T<&q^?<(EpfWvfoLY|GfDm01pWC0?_XjAx;g z9NMxyju_N-bz8_q(g}hzLC{Ti0j67l77@e&v4%$l46S6EMkF0tA%+yR2gF)U5JM9b zaN6_xf8Rdm-qOPl=&XcEtL(eKz0W@Ty}$jv_IEA-&qw$?Fh{zj<7yB47l+RQb1bts zB&>d(a~Km|>>xkYHv_#%8Av!=ge@ zTcPsk;S(c@&04N`G^dW2&JT5+>eXel*MQrz{Df0Avxr*+6O{ zHkplvTwH>C(;z@oAgF)lAotr{_HQZ>ORYZ>GEbL4jPw?=OLDiWbjiR-NAINc;VNB1 zDAJKcD!o&six4Dzg{QBm(j|lHkfhAMr7 zr;mC1Sd}i}4&`j|^et8T7Ed4d^zkZv+|zIO^xLa+*|<~A4o}}vrSI_cou0n4N|&8H z`6oSnvPz%y^xdAmyGq~f>3ckVPnEvM(;xQqhpY65JsqA&HDhmeV+b=r$14pKjG>7J$-+b&Z<>8PkQ>3Rr-^j z{*M{A)k>2T6U&Szhowni@cK=WmdRB=9#mwVvwk$;+uJm~)#y5Bog60_)E zLuaM*zVFR=AOmsDDgkO@eHmK;gVmyWT0_10sK4+I+RHaa*PE3%O~TIFhP!w{W8XgA z$XYL?&lj6fQ@l!B)!mj<7PN104R`O5)6?xWy68N}hOuXL>m+wg-HN+bbTkbV-r1NB zNJ3r1$lXG=3rbDyEh+xO*Gc=H^j*5eKN$xe zW(G~;K-zZc)?DxV?Sy9e8iFcx(lTY#O1k*UvEl!bbfl(6Tl=jVTgzp|lJ3X)TE%!6>Z^|(ZG{Fd zuarfxF5welfjGu>Ei<#C2T|=`S~P@1`XFs$tv)iMTfJB869Xm|8J%e?Fr|Ve6ZFTd z^UFSwsy<1jswG9A5(?IPq^lu0)*{XJ$$GXTDn3c>j^b9+@%MG+gENaRKUZ7KX_W4o zlU;dD1Vx1IT5}-@D<|3mwKfhz<&=@=hVD9hW>}@uy^elwU`f6MkD* zK&Yp32+1{)n03su4m=O{pyA;rkYxo0J}WPcT!NDiM~e571KHVia0Ai9s5{J*!%M^p z&$E)NK6c33!M$U+j**Y6>H(YJX7p8+G7G|lAQIBYiZdY@=)q(hP_ zn>WjD({<%hog6RgB1l#qUXqyDorb&XZdXIgN(!-=9`8pOD?j0`u69@4_FxaTj(Sik zuH(I7I5^%|>~T|KJTqQL2X4|*zGmQh`{;3#8>gXOHF4By#to8H;15*u79N;f)XH%u z;4Lv}QuD{6bh)`#6vF)?GqeuA%QJOb<0VPp*M{usL&n<5?6hI?ZOX?zK2VO|Iyoj7M-an7T;Lq z0)))620Ii)mP0&(>&VvkzUZ*e^Syyy`WUdT_-CSe9M`Uh^8u2E6W3N*1)J0dVJK1BSf;Ewc5!uLdlr zT5EtFT(JQ&ye4u~l)bXISqGi}C)IU#zi&qThP1QN=$1TT4zVkwrl51x`{n z?*__;fIRYRH1yvk#VJC+!j{~pS;sL*t>BfXRZxwWir+m;&UM9?2`uBuCHVbeWd?Up z*vHEFDqZ{=QoLfM@m~#5L%odjhb={#33R)hl8ndzk=1sesHDatPmeT(sL~fuR9+Kg9m0H4tB2^XL+XlKZt- zbI4+d;OU~6H~6S6uj$HDa$QoxG!ayrF8mI(CWhQeN%zk zC+G)ms>(NGz4&t~hKi)!#h)0cR!grk&2;M#D$7mj@B~n!_^+f~Yb94zOA6H3mae!v zX$`kPPDrv+@k_5Q(3NC(s6Xj^s-(gGq}MHJ(TlHH5+r1=tkaeR@0h_2n;@X~>~mI+ zElZ}Rc@Sc}{ysMz&NLC(WZ+ZQ1-DMs%{LS5go`wCMm)ptg#6660Jb9&3A4Zyvq*mI z``Zr?T~M@G_?4jtsQ=>^h8{S0kkkubXdfsJJ}7YJ0^n~w>F~_(f#T!O8hrMXz~Ac0 zAKG!C__N=A)FKyN-0>j(j%3zbH!n$e?is9s&*i5_8bieBAO5}Fc!7gcK!dY2`3J-@ zdFaA}??WQsS(X?$6raWEp!;#9DeEOGayDCiKGwCn<9ov*;K>zBDgUqySsnoY5|M-iv-kmB% zKRMiFt!aGf#YevA+nF)anrPu03EvT#HW_{uCp5BO!hnfw-jvHDGi_(XKf|!rRf)B9vy^^xBmbb>b?-wih#yGlM>qHo z>qj>$-xa!9*+Vz$t>g;b$m|ewb3N#$U6@1PM8X(J?3v6Dx^Jfn2fZrXU~9O@_>!s& zF*8|PatU38+^^M3H+hh5EhZiQeV(&zBqVqQ;lN^k;|LJ(ua`yzc(6+BT_A{K2I7LPnKm{bLy5Y(lj zZ0T~Ylx2|97P2Y5Apx}5z%jHCxr&+{bi<-%e$}{t5C)NC;sinOSRq{){jZn%Hx5ZI zNEG|z)QSi~RbuadXbrBYw7gWF&JfUq>d*j#f8k~EMy=4~HXvb83o=?i50%G9l`*Zv zG+B}|k^^}|7-gW6(oh;3%nn)za7k%goRTN(n3`>0s@E=dY;Fgy+}+t_hf-=H#Hg)S zCz&w_%~GmCTR??0*AYQl73yLV#0nCV2zd%CEH2cMpGbWxQ;my44<@DF{wMXcjYwNf z9#oLHn5iXs7S#-lq!KUF7&-JJ!KN_|jD|-~ggBZaL4d(nfsfY?a~w8U6LRFp2DqP8 zf&-ANC8^O6l~D{qpz%Zvk8Z=^z$IU=acbx`&Slw|&;IPHi_zCRd5zpUC5jn59I8GP z>+}f2=)eDw6K9iW4up}X{aK6EsVA-KN$Y72Vmu=rih=qeeHg8;Jz}VchCyFj=W05N zRK9mXdyNgHg~2=Y1iTGORntggjgz98sb_jC(>i1A`OD;_)m)P5Hnj8^K^~jq^CpX( z#Q@UO)@G^i;9<5t_Q@Fb|cj1rN&>&_A=w zMYoDIU3}Q-zpa7bK@aQY!%?i5{6)QK?j5>(TAgC;PCzWtESzj zr9iT`uT3?9MC8_xX;Fn0iJ14rsasX1%OiuxFN=GFCT<~Zy`|NAZC~KQHq~=o`_F6D6~ciH#@T7#nlM~c9GIAsNgIS> z^#ogeU(G_T0`nnu8C$?MPBy8((3po%UE7Qf0)6cviVAQgh4k)Sh9lWbd( zf_5*-CTX`$QlpNbu#A2!to~e>(ESUICAx>36{tQaR~G_xfzh;e#Bj;0uGhCE26Lpf z?bNCtMCnMi5i}y$COukPZ zlPVs7N$L195Ew+?foD2@L*8yv22Kcz%3MUqEby%Z`dv{}tY45D#~kDetRdJ^Z;5&< zeoI)9#iWYNn&@~8J`R}VqtXIQCyz>y9&-g!O$ZA`YQ3)vsuQSK7 zT=U$a@m8svn7a14#WLUqOw^@TK+(eX5KWeD<8tFf_x>7jYURy~L6s{n#Le>KMGGiW z-n)P{W#h7EHVCVkJ!C@GhZ98Z=|7}KbYf$c<*BAeF2*xx0TqY8$4eUaaBSG#`$iBG z)NmEXO4a>j@=nSZmM}{&8!WA1$yTg=GQR1n6HTD1Zi$lcH?3kR1c?UxQrTdz(QP<3 zxPlkYQ5=89100g7I2BI~eMkd-H~NvKHl1mVhS8bi64puVpqQPRm*iN@UT_~*oj(vm z!ob=^S&Mx~9h#65K+KuuT}w??2NLP>Vw86%VBc;HXeS;l&X53I(IM6vsba_$@;bMHe9K!a`4*i zpR1*fi0oS>vS)sT`20q?a3x%g&?K}hoVeXYFPcT*R2q8jn`BOt7R~pqLDtEfLzuE? z;VRrEIIz}CGq;0yK#O}mVbtwHJDc6sICCmJ8GFVD%9b~R0}TLlFH%G<6EbQ#qzAYR zDN;CoP^e}SjKWw=Zt(*&SjLV=gz1U-E%6#h37d%nMi=p!H5knmor`P`s)%S_ck)|w zK8rn%j7H}24Gn}Iu^FpjXxli{t~3tx22K+$=<~nK!M2%`oBOJ-3O@ZA1UL5CAE+LL zp9RIjsI1{wM1^~R9zX_($_RAd7YjpSw5;!Y#s}Wh59{BqWdqMIfyR)62W`9pF5gJc zW9MAp$~duMc`H$XbuGGUc`H$X1uhfKZE<2PE|L?g3Aemy42o_g zjvgrFL9RA^Qc0F?g(sz+WW{!>ToAyf;WTw-y-z>M-OaG9$`)3HYkI|St^7bCYfP$v zRZ#)Dmt1O4rCQaH@I8y(JFcqr8p>}da^I$x;Zhx}_Tz9spj!4Pe!#G5V<3YuIH*dE zc|zstYT5XSL8I2I?BW*q7*DT4Z_(nf7MiNn%5&ALsdS}!y~uu)1m@?*h;OTCIjR@T(+N#m{W;@ILYt(Ez=2fmcOf zBJ!r`&bPBa{bjwW)l=sPts}dXgK-|E4@xE@ujE8}Udi>6ypp5j=PeF%^ZuZ!S=mia zQPH{#vV8s9v+OAQ<#aS@`&x)#^D@?iCkLSry<9PC+WOv67JzJCE(Ocx;U2 zXA9FOUy|9TtS%L9=7PW9%^btdXs?S3lVpO~0+Vbaa!wxsl2|NWy6b`i%15Tj0TJ3Y zjv1W^3}DS-x_KaU?5}YnfFkLbJ=0YXNG3k_s|x0HYVyo4gPb8or}%8Io?#Sj@9Fjm zvU->#y|==i%@bpi;(O=q85rN59g~1igJbWVCZ_jpwPy>&diBlHJ=OPmVh>LdRiS!O zY>i$q)`U1iv#G{+iXh?)rw!)_oOuYQqJI*hQ%0DSb@4p0Ui-8 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"|E7x+HGdgysjyGSDul;Ef- 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 void; +export const commonwareidentity_decrypt_from_peer: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; +export const commonwareidentity_encrypt_for_peer: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number]; export const commonwareidentity_export_private_hex: (a: number) => [number, number]; +export const commonwareidentity_get_x25519_public_key: (a: number) => [number, number]; export const commonwareidentity_pub_key: (a: number) => [number, number]; export const commonwareidentity_sign: (a: number, b: number, c: number) => [number, number]; export const create_identity: () => number; @@ -11,8 +14,8 @@ export const verify_signature: (a: number, b: number, c: number, d: number, e: n export const __wbindgen_exn_store: (a: number) => void; export const __externref_table_alloc: () => number; export const __wbindgen_externrefs: WebAssembly.Table; -export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_malloc: (a: number, b: number) => number; export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; export const __externref_table_dealloc: (a: number) => void; +export const __wbindgen_free: (a: number, b: number, c: number) => void; export const __wbindgen_start: () => void; From fb4d43f4df13782293a5774f2eeeb5a6512c4bc5 Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 17:15:32 +0100 Subject: [PATCH 5/8] nvm --- frontend/.nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 frontend/.nvmrc diff --git a/frontend/.nvmrc b/frontend/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/frontend/.nvmrc @@ -0,0 +1 @@ +22 From 55543748c35f055102e05fc6068fbf72527820ea Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 17:57:00 +0100 Subject: [PATCH 6/8] feat: add ed25519_pub_to_x25519_pub --- core/Cargo.lock | 1 + core/Cargo.toml | 1 + core/src/lib.rs | 22 ++++++ frontend/app/hooks/useIdentity.ts | 63 +++++++++++++----- .../src/commonware-lib/commonchat_core.d.ts | 6 ++ .../src/commonware-lib/commonchat_core.js | 26 ++++++++ .../commonware-lib/commonchat_core_bg.wasm | Bin 223802 -> 228562 bytes .../commonchat_core_bg.wasm.d.ts | 1 + 8 files changed, 105 insertions(+), 15 deletions(-) diff --git a/core/Cargo.lock b/core/Cargo.lock index f66e494..8d89438 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -381,6 +381,7 @@ dependencies = [ "commonware-cryptography", "commonware-math", "commonware-p2p", + "curve25519-dalek", "getrandom 0.2.17", "hex", "hkdf", diff --git a/core/Cargo.toml b/core/Cargo.toml index 0f86aee..e678cfd 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -18,6 +18,7 @@ rand = "0.8" # Cryptography: x25519, ed25519, chacha20poly1305, hkdf, sha2 x25519-dalek = { version = "2", features = ["static_secrets"] } +curve25519-dalek = "4" chacha20poly1305 = "0.10" hkdf = "0.12" sha2 = "0.10" diff --git a/core/src/lib.rs b/core/src/lib.rs index 37a442e..fb2207c 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -4,6 +4,7 @@ use commonware_cryptography::ed25519; use commonware_cryptography::Signer; use commonware_cryptography::Verifier; use commonware_math::algebra::Random; +use curve25519_dalek::edwards::CompressedEdwardsY; use hex; use hkdf::Hkdf; use sha2::{Digest, Sha256, Sha512}; @@ -195,6 +196,27 @@ pub fn verify_signature( Ok(public_key.verify(CHAT_NAMESPACE, message.as_bytes(), &signature)) } +/// Converts any Ed25519 public key to its X25519 equivalent (Edwards → Montgomery). +#[wasm_bindgen] +pub fn ed25519_pub_to_x25519_pub(ed25519_pub_hex: &str) -> Result { + let pub_bytes = + hex::decode(ed25519_pub_hex).map_err(|e| JsError::new(&format!("invalid hex: {}", e)))?; + if pub_bytes.len() != 32 { + return Err(JsError::new("ed25519 public key must be 32 bytes")); + } + let mut arr = [0u8; 32]; + arr.copy_from_slice(&pub_bytes); + + // Decompress the Edwards point, then convert to Montgomery form + let edwards = CompressedEdwardsY(arr); + let point = edwards + .decompress() + .ok_or_else(|| JsError::new("invalid Ed25519 public key point"))?; + let montgomery = point.to_montgomery(); + + Ok(hex::encode(montgomery.to_bytes())) +} + /// Restores identity from private key hex (e.g. read from localStorage). #[wasm_bindgen] pub fn identity_from_private_hex(hex_str: &str) -> Result { diff --git a/frontend/app/hooks/useIdentity.ts b/frontend/app/hooks/useIdentity.ts index ff00bac..c39133e 100644 --- a/frontend/app/hooks/useIdentity.ts +++ b/frontend/app/hooks/useIdentity.ts @@ -20,13 +20,24 @@ export function useIdentity() { sign: (msg: string) => string; pub_key: string; export_private_hex: () => string; + get_x25519_public_key: () => string; + encrypt_for_peer: (recipientX25519PubHex: string, plaintext: string) => string; + decrypt_from_peer: (senderX25519PubHex: string, encryptedHex: string) => string; } | null>(null); + type IdentityInstance = { + sign: (m: string) => string; + pub_key: string; + export_private_hex: () => string; + get_x25519_public_key: () => string; + encrypt_for_peer: (recipientX25519PubHex: string, plaintext: string) => string; + decrypt_from_peer: (senderX25519PubHex: string, encryptedHex: string) => string; + }; type CoreModule = { - default?: () => Promise; - create_identity: () => { sign: (m: string) => string; pub_key: string; export_private_hex: () => string }; - identity_from_private_hex: (hex: string) => { sign: (m: string) => string; pub_key: string; export_private_hex: () => string }; - verify_signature: (pub: string, msg: string, sig: string) => boolean; -}; + default?: () => Promise; + create_identity: () => IdentityInstance; + identity_from_private_hex: (hex: string) => IdentityInstance; + verify_signature: (pub: string, msg: string, sig: string) => boolean; + }; const coreRef = useRef(null); const loadStored = useCallback(async () => { @@ -105,6 +116,25 @@ export function useIdentity() { [] ); + const getX25519PublicKey = useCallback((): string | null => { + const id = identityRef.current; + if (!id) return null; + return id.get_x25519_public_key(); +}, []); + + const encryptForPeer = useCallback((recipientX25519PubHex: string, plaintext: string): string | null => { + const id = identityRef.current; + if (!id) return null; + return id.encrypt_for_peer(recipientX25519PubHex, plaintext); + }, []); + + const decryptFromPeer = useCallback((senderX25519PubHex: string, encryptedHex: string): string | null => { + const id = identityRef.current; + if (!id) return null; + return id.decrypt_from_peer(senderX25519PubHex, encryptedHex); + }, []); + + const updateDisplayName = useCallback((newName: string) => { setDisplayName(newName); const raw = typeof window !== "undefined" ? localStorage.getItem(STORAGE_KEY) : null; @@ -116,14 +146,17 @@ export function useIdentity() { }, []); return { - displayName, - setDisplayName: updateDisplayName, - peerId, - signMessage, - verifySignature, - isReady, - isInitialized, - initializeWithDisplayName, - error, - }; + displayName, + setDisplayName: updateDisplayName, + peerId, + signMessage, + verifySignature, + getX25519PublicKey, + encryptForPeer, + decryptFromPeer, + isReady, + isInitialized, + initializeWithDisplayName, + error, +}; } diff --git a/frontend/src/commonware-lib/commonchat_core.d.ts b/frontend/src/commonware-lib/commonchat_core.d.ts index 969562e..5f3aa4c 100644 --- a/frontend/src/commonware-lib/commonchat_core.d.ts +++ b/frontend/src/commonware-lib/commonchat_core.d.ts @@ -27,6 +27,11 @@ export class CommonwareIdentity { */ export function create_identity(): CommonwareIdentity; +/** + * Converts any Ed25519 public key to its X25519 equivalent (Edwards → Montgomery). + */ +export function ed25519_pub_to_x25519_pub(ed25519_pub_hex: string): string; + /** * Restores identity from private key hex (e.g. read from localStorage). */ @@ -49,6 +54,7 @@ export interface InitOutput { readonly commonwareidentity_pub_key: (a: number) => [number, number]; readonly commonwareidentity_sign: (a: number, b: number, c: number) => [number, number]; readonly create_identity: () => number; + readonly ed25519_pub_to_x25519_pub: (a: number, b: number) => [number, number, number, number]; readonly identity_from_private_hex: (a: number, b: number) => [number, number, number]; readonly verify_signature: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number]; readonly __wbindgen_exn_store: (a: number) => void; diff --git a/frontend/src/commonware-lib/commonchat_core.js b/frontend/src/commonware-lib/commonchat_core.js index 04a2377..92e8fe8 100644 --- a/frontend/src/commonware-lib/commonchat_core.js +++ b/frontend/src/commonware-lib/commonchat_core.js @@ -152,6 +152,32 @@ export function create_identity() { return CommonwareIdentity.__wrap(ret); } +/** + * Converts any Ed25519 public key to its X25519 equivalent (Edwards → Montgomery). + * @param {string} ed25519_pub_hex + * @returns {string} + */ +export function ed25519_pub_to_x25519_pub(ed25519_pub_hex) { + let deferred3_0; + let deferred3_1; + try { + const ptr0 = passStringToWasm0(ed25519_pub_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.ed25519_pub_to_x25519_pub(ptr0, len0); + var ptr2 = ret[0]; + var len2 = ret[1]; + if (ret[3]) { + ptr2 = 0; len2 = 0; + throw takeFromExternrefTable0(ret[2]); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + /** * Restores identity from private key hex (e.g. read from localStorage). * @param {string} hex_str diff --git a/frontend/src/commonware-lib/commonchat_core_bg.wasm b/frontend/src/commonware-lib/commonchat_core_bg.wasm index cb8c1734974c65a28e965723a94fe9bbff0f0d53..dbbf421ce69f13fe949b1dac12e4f888cae167dd 100644 GIT binary patch delta 32796 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 CsXiD0 delta 27779 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 P@G{BqgL2;*^T7WB&NH@? diff --git a/frontend/src/commonware-lib/commonchat_core_bg.wasm.d.ts b/frontend/src/commonware-lib/commonchat_core_bg.wasm.d.ts index 0ae18fc..d01bf86 100644 --- a/frontend/src/commonware-lib/commonchat_core_bg.wasm.d.ts +++ b/frontend/src/commonware-lib/commonchat_core_bg.wasm.d.ts @@ -9,6 +9,7 @@ export const commonwareidentity_get_x25519_public_key: (a: number) => [number, n export const commonwareidentity_pub_key: (a: number) => [number, number]; export const commonwareidentity_sign: (a: number, b: number, c: number) => [number, number]; export const create_identity: () => number; +export const ed25519_pub_to_x25519_pub: (a: number, b: number) => [number, number, number, number]; export const identity_from_private_hex: (a: number, b: number) => [number, number, number]; export const verify_signature: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number]; export const __wbindgen_exn_store: (a: number) => void; From a7ef83ce3324174c4f60b4e7e731d41f9d0d2373 Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 18:35:28 +0100 Subject: [PATCH 7/8] add nvmrc to relay too --- relay/.nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 relay/.nvmrc diff --git a/relay/.nvmrc b/relay/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/relay/.nvmrc @@ -0,0 +1 @@ +22 From ca5d0065a32f508f8b910e1baa8e4227c3953f01 Mon Sep 17 00:00:00 2001 From: loa212 Date: Wed, 4 Mar 2026 18:35:58 +0100 Subject: [PATCH 8/8] feat: encrypt/decrypt P2P messages --- frontend/app/hooks/useIdentity.ts | 7 + frontend/app/page.tsx | 1709 ++++++++++++++++------------- 2 files changed, 955 insertions(+), 761 deletions(-) diff --git a/frontend/app/hooks/useIdentity.ts b/frontend/app/hooks/useIdentity.ts index c39133e..405d8cd 100644 --- a/frontend/app/hooks/useIdentity.ts +++ b/frontend/app/hooks/useIdentity.ts @@ -37,6 +37,7 @@ export function useIdentity() { create_identity: () => IdentityInstance; identity_from_private_hex: (hex: string) => IdentityInstance; verify_signature: (pub: string, msg: string, sig: string) => boolean; + ed25519_pub_to_x25519_pub: (ed25519PubHex: string) => string; }; const coreRef = useRef(null); @@ -134,6 +135,11 @@ export function useIdentity() { return id.decrypt_from_peer(senderX25519PubHex, encryptedHex); }, []); + const ed25519PubToX25519Pub = useCallback((ed25519PubHex: string): string | null => { + const c = coreRef.current; + if (!c) return null; + return c.ed25519_pub_to_x25519_pub(ed25519PubHex); + }, []); const updateDisplayName = useCallback((newName: string) => { setDisplayName(newName); @@ -154,6 +160,7 @@ export function useIdentity() { getX25519PublicKey, encryptForPeer, decryptFromPeer, + ed25519PubToX25519Pub, isReady, isInitialized, initializeWithDisplayName, diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index 0a51661..5688b05 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -12,808 +12,995 @@ type MessageType = "general" | "private"; export type PublicRoomId = "general" | "commonware" | "sloth"; const PUBLIC_ROOMS: { id: PublicRoomId; label: string; emoji: string }[] = [ - { id: "general", label: "General Chat", emoji: "🌐" }, - { id: "commonware", label: "Commonware Community", emoji: "🦀" }, - { id: "sloth", label: "Celestine Sloth Community", emoji: "🦥" }, + { id: "general", label: "General Chat", emoji: "🌐" }, + { id: "commonware", label: "Commonware Community", emoji: "🦀" }, + { id: "sloth", label: "Celestine Sloth Community", emoji: "🦥" }, ]; interface ChatMessage { - id: string; - text: string; - signatureHex: string; - fromMe: boolean; - displayName: string; - peerId: string; - recipient: string; - at: number; - type?: MessageType; - roomId?: string; + id: string; + text: string; + signatureHex: string; + fromMe: boolean; + displayName: string; + peerId: string; + recipient: string; + at: number; + type?: MessageType; + roomId?: string; } function formatTime(at: number): string { - const d = new Date(at); - return d.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit" }); + const d = new Date(at); + return d.toLocaleTimeString(undefined, { + hour: "2-digit", + minute: "2-digit", + }); } function truncate(s: string, len = 12) { - if (s.length <= len) return s; - return s.slice(0, len) + "…"; + if (s.length <= len) return s; + return s.slice(0, len) + "…"; } function peerIdShort(peerId: string, head = 4, tail = 4): string { - const s = peerId.replace(/^0x/i, ""); - if (s.length <= head + tail) return peerId; - return `${s.slice(0, head)}…${s.slice(-tail)}`; + const s = peerId.replace(/^0x/i, ""); + if (s.length <= head + tail) return peerId; + return `${s.slice(0, head)}…${s.slice(-tail)}`; } function getPeerByPubKey( - pubKey: string, - peers: { id: string; name: string; pubKey: string }[] + pubKey: string, + peers: { id: string; name: string; pubKey: string }[], ) { - return peers.find((p) => p.pubKey === pubKey); + return peers.find((p) => p.pubKey === pubKey); } function getPeerByName( - name: string, - peers: { id: string; name: string; pubKey: string }[] + name: string, + peers: { id: string; name: string; pubKey: string }[], ) { - const q = name.trim().toLowerCase(); - if (!q) return null; - return peers.find((p) => p.name.toLowerCase() === q) ?? null; + const q = name.trim().toLowerCase(); + if (!q) return null; + return peers.find((p) => p.name.toLowerCase() === q) ?? null; } function resolveRecipientId( - raw: string, - peers: { id: string; name: string; pubKey: string }[] + raw: string, + peers: { id: string; name: string; pubKey: string }[], ): string { - const r = raw.trim(); - if (!r) return ""; - const peer = getPeerByName(r, peers); - return peer ? peer.pubKey : r; + const r = raw.trim(); + if (!r) return ""; + const peer = getPeerByName(r, peers); + return peer ? peer.pubKey : r; } function resolveRecipientDisplay( - recipientId: string, - peers: { id: string; name: string; pubKey: string }[] + recipientId: string, + peers: { id: string; name: string; pubKey: string }[], ): string { - if (!recipientId) return ""; - const peer = getPeerByPubKey(recipientId, peers); - return peer ? `${peer.name} (${truncate(recipientId, 10)})` : truncate(recipientId, 24); + if (!recipientId) return ""; + const peer = getPeerByPubKey(recipientId, peers); + return peer + ? `${peer.name} (${truncate(recipientId, 10)})` + : truncate(recipientId, 24); } function resolveRecipientLabel( - recipientId: string, - peers: { id: string; name: string; pubKey: string }[] + recipientId: string, + peers: { id: string; name: string; pubKey: string }[], ): string { - if (!recipientId) return "Broadcast"; - const peer = getPeerByPubKey(recipientId, peers); - return peer ? peer.name : truncate(recipientId, 16); + if (!recipientId) return "Broadcast"; + const peer = getPeerByPubKey(recipientId, peers); + return peer ? peer.name : truncate(recipientId, 16); } function getPreviousPeers( - messages: ChatMessage[], - myPeerId: string, - onlinePeers: { id: string; name: string; pubKey: string }[] + messages: ChatMessage[], + myPeerId: string, + onlinePeers: { id: string; name: string; pubKey: string }[], ): { id: string; name: string; pubKey: string; online: boolean }[] { - const peerNames = new Map(); - for (const m of messages) { - const other = m.fromMe ? (m.recipient !== "Broadcast" ? m.recipient : null) : m.peerId; - if (other && other !== myPeerId) { - if (!m.fromMe && m.displayName) peerNames.set(other, m.displayName); - } - } - const seen = new Set(); - const result: { id: string; name: string; pubKey: string; online: boolean }[] = []; - for (const m of messages) { - const other = m.fromMe ? (m.recipient !== "Broadcast" ? m.recipient : null) : m.peerId; - if (other && other !== myPeerId && !seen.has(other)) { - seen.add(other); - const online = onlinePeers.find((p) => p.pubKey === other); - result.push({ - id: other, - pubKey: other, - name: online?.name ?? peerNames.get(other) ?? truncate(other, 12), - online: !!online, - }); - } - } - return result.sort((a, b) => (a.online === b.online ? 0 : a.online ? -1 : 1)); + const peerNames = new Map(); + for (const m of messages) { + const other = m.fromMe + ? m.recipient !== "Broadcast" + ? m.recipient + : null + : m.peerId; + if (other && other !== myPeerId) { + if (!m.fromMe && m.displayName) peerNames.set(other, m.displayName); + } + } + const seen = new Set(); + const result: { + id: string; + name: string; + pubKey: string; + online: boolean; + }[] = []; + for (const m of messages) { + const other = m.fromMe + ? m.recipient !== "Broadcast" + ? m.recipient + : null + : m.peerId; + if (other && other !== myPeerId && !seen.has(other)) { + seen.add(other); + const online = onlinePeers.find((p) => p.pubKey === other); + result.push({ + id: other, + pubKey: other, + name: online?.name ?? peerNames.get(other) ?? truncate(other, 12), + online: !!online, + }); + } + } + return result.sort((a, b) => (a.online === b.online ? 0 : a.online ? -1 : 1)); } function getDirectMessagesPeerList( - onlinePeers: { id: string; name: string; pubKey: string }[], - previousPeers: { id: string; name: string; pubKey: string; online: boolean }[], - myPeerId: string + onlinePeers: { id: string; name: string; pubKey: string }[], + previousPeers: { + id: string; + name: string; + pubKey: string; + online: boolean; + }[], + myPeerId: string, ): { id: string; name: string; pubKey: string; online: boolean }[] { - const byKey = new Map(); - for (const p of onlinePeers) { - if (p.pubKey === myPeerId) continue; - byKey.set(p.pubKey, { id: p.id, name: p.name, pubKey: p.pubKey, online: true }); - } - for (const p of previousPeers) { - if (p.pubKey === myPeerId) continue; - if (!byKey.has(p.pubKey)) byKey.set(p.pubKey, { ...p, online: false }); - } - return Array.from(byKey.values()).sort((a, b) => (a.online === b.online ? 0 : a.online ? -1 : 1)); + const byKey = new Map< + string, + { id: string; name: string; pubKey: string; online: boolean } + >(); + for (const p of onlinePeers) { + if (p.pubKey === myPeerId) continue; + byKey.set(p.pubKey, { + id: p.id, + name: p.name, + pubKey: p.pubKey, + online: true, + }); + } + for (const p of previousPeers) { + if (p.pubKey === myPeerId) continue; + if (!byKey.has(p.pubKey)) byKey.set(p.pubKey, { ...p, online: false }); + } + return Array.from(byKey.values()).sort((a, b) => + a.online === b.online ? 0 : a.online ? -1 : 1, + ); } export default function Home() { - const { - displayName, - setDisplayName, - peerId, - signMessage, - verifySignature, - isReady, - isInitialized, - initializeWithDisplayName, - error, - } = useIdentity(); - - const [messages, setMessages] = useState([]); - const [input, setInput] = useState(""); - const [editingName, setEditingName] = useState(false); - const [editNameValue, setEditNameValue] = useState(displayName); - - const [operatorName, setOperatorName] = useState(""); - const [modalClosing, setModalClosing] = useState(false); - const [selectedRecipient, setSelectedRecipient] = useState(""); - const [p2pNotification, setP2pNotification] = useState(false); - const [onlinePeers, setOnlinePeers] = useState<{ id: string; name: string; pubKey: string }[]>([]); - const [relayConnected, setRelayConnected] = useState(false); - const socketRef = useRef(null); - const messagesEndRef = useRef(null); - const messagesContainerRef = useRef(null); - - type ViewMode = "public" | "direct"; - const [activeView, setActiveView] = useState("public"); - const [activePublicRoomId, setActivePublicRoomId] = useState("general"); - const [activeDirectPeerId, setActiveDirectPeerId] = useState(null); - const [unreadPeers, setUnreadPeers] = useState>(new Set()); - const [tabUnreadCount, setTabUnreadCount] = useState(0); - const baseTitleRef = useRef("CommonChat"); - const activeViewRef = useRef("public"); - const activePublicRoomIdRef = useRef("general"); - const activeDirectPeerIdRef = useRef(null); - useEffect(() => { - activeViewRef.current = activeView; - activePublicRoomIdRef.current = activePublicRoomId; - activeDirectPeerIdRef.current = activeDirectPeerId; - }, [activeView, activePublicRoomId, activeDirectPeerId]); - - const previousPeers = getPreviousPeers(messages, peerId, onlinePeers); - const directMessagesPeerList = getDirectMessagesPeerList(onlinePeers, previousPeers, peerId); - - const isPublicRoomMessage = (m: ChatMessage, roomId: PublicRoomId) => { - const t = m.type ?? ((m.recipient ?? "Broadcast") === "Broadcast" ? "general" : "private"); - if (t !== "general" || (m.recipient ?? "Broadcast") !== "Broadcast") return false; - const msgRoom = (m.roomId ?? "general") as PublicRoomId; - return msgRoom === roomId; - }; - const isPrivateMessageWith = (m: ChatMessage, otherPeerId: string) => { - const t = m.type ?? ((m.recipient ?? "Broadcast") === "Broadcast" ? "general" : "private"); - if (t !== "private") return false; - return (m.fromMe && (m.recipient ?? "") === otherPeerId) || (!m.fromMe && m.peerId === otherPeerId); - }; - const visibleMessages: ChatMessage[] = - activeView === "public" - ? messages.filter((m) => isPublicRoomMessage(m, activePublicRoomId)) - : activeDirectPeerId - ? messages.filter((m) => isPrivateMessageWith(m, activeDirectPeerId)) - : []; - - const openPublicRoom = useCallback((roomId: PublicRoomId) => { - setActiveView("public"); - setActivePublicRoomId(roomId); - setActiveDirectPeerId(null); - setSelectedRecipient(""); - }, []); - const openDirectWith = useCallback((peerPubKey: string) => { - setActiveView("direct"); - setActiveDirectPeerId(peerPubKey); - setSelectedRecipient(peerPubKey); - setUnreadPeers((prev) => { - const next = new Set(prev); - next.delete(peerPubKey); - return next; - }); - }, []); - - const storageKey = peerId ? `${MESSAGES_STORAGE_KEY}_${peerId}` : null; - - useEffect(() => { - if (!storageKey || typeof window === "undefined") return; - try { - const raw = localStorage.getItem(storageKey); - if (raw) { - const parsed = JSON.parse(raw) as ChatMessage[]; - if (Array.isArray(parsed) && parsed.length > 0) { - setMessages(parsed); - } - } - } catch { - // ignore - } - }, [storageKey]); - - useEffect(() => { - if (!storageKey || messages.length === 0) return; - try { - const toStore = messages.slice(-500); - localStorage.setItem(storageKey, JSON.stringify(toStore)); - } catch { - // quota or parse error - } - }, [storageKey, messages]); - - useEffect(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }, [visibleMessages]); - - const handleInitialize = useCallback(() => { - const name = operatorName.trim(); - if (!name) return; - setModalClosing(true); - setTimeout(() => { - initializeWithDisplayName(name); - setModalClosing(false); - }, 220); - }, [operatorName, initializeWithDisplayName]); - - const handleSignAndSend = useCallback(() => { - const text = input.trim(); - if (!text || !isInitialized) return; - const sig = signMessage(text); - if (sig == null) return; - const isPrivate = activeView === "direct" && !!activeDirectPeerId; - const recipient = isPrivate - ? (activeDirectPeerId || resolveRecipientId(selectedRecipient, onlinePeers) || selectedRecipient.trim() || "") - : "Broadcast"; - if (isPrivate && !recipient) return; - const msg: ChatMessage = { - id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`, - text, - signatureHex: sig, - fromMe: true, - displayName, - peerId, - recipient: recipient || "Broadcast", - at: Date.now(), - type: isPrivate ? "private" : "general", - roomId: activeView === "public" ? activePublicRoomId : undefined, - }; - socketRef.current?.emit("message", msg); - setMessages((prev) => [...prev, msg]); - setInput(""); - requestAnimationFrame(() => { - messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); - }); - }, [input, isInitialized, signMessage, displayName, peerId, activeView, activePublicRoomId, activeDirectPeerId, selectedRecipient, onlinePeers]); - - useEffect(() => { - if (!isInitialized || !peerId || !displayName) return; - const socket = io(RELAY_URL, { autoConnect: true }); - socketRef.current = socket; - - socket.on("connect", () => { - setRelayConnected(true); - socket.emit("register", { peerId, displayName }); - }); - socket.on("disconnect", () => setRelayConnected(false)); - - socket.on("online_list", (list: { id: string; name: string; pubKey: string }[]) => { - setOnlinePeers(Array.isArray(list) ? list : []); - }); - socket.on( - "user_online", - (user: { peerId?: string; id?: string; name?: string; pubKey?: string; displayName?: string }) => { - const pId = user.peerId ?? user.id ?? user.pubKey; - if (!pId || pId === peerId) return; - const name = user.name ?? user.displayName ?? truncate(pId, 12); - setOnlinePeers((prev) => { - const without = prev.filter((p) => p.pubKey !== pId); - return [...without, { id: pId, name, pubKey: pId }]; - }); - } - ); - socket.on("user_offline", (data: { peerId: string }) => { - if (data.peerId === peerId) return; - setOnlinePeers((prev) => prev.filter((p) => p.pubKey !== data.peerId)); - }); - - socket.on("message", async (chatMsg: ChatMessage) => { - const myId = peerId; - console.log("Incoming message:", chatMsg); - - if (!chatMsg?.text || !chatMsg?.signatureHex || !chatMsg?.peerId) return; - const valid = await verifySignature( - chatMsg.peerId, - chatMsg.text, - chatMsg.signatureHex - ); - if (!valid) { - console.log("SIGNATURE_ERROR"); - return; - } - const recipient = chatMsg.recipient ?? "Broadcast"; - const msgType: MessageType = chatMsg.type ?? (recipient === "Broadcast" ? "general" : "private"); - if (msgType === "private" && recipient !== myId) { - return; - } - const isForMe = recipient === "Broadcast" || recipient === myId; - if (!isForMe) { - console.log(`ID_MISMATCH: Incoming [${recipient}], Mine [${myId}]`); - return; - } - const isFromMe = chatMsg.peerId === myId; - setMessages((prev) => { - if (prev.some((m) => m.id === chatMsg.id)) return prev; - return [ - ...prev, - { - ...chatMsg, - fromMe: isFromMe, - type: msgType, - }, - ]; - }); - if (!isFromMe) { - setP2pNotification(true); - if (typeof document !== "undefined" && document.hidden) { - setTabUnreadCount((c) => c + 1); - if (typeof window !== "undefined" && window.AudioContext) { - try { - const ctx = new window.AudioContext(); - const o = ctx.createOscillator(); - const g = ctx.createGain(); - o.connect(g); - g.connect(ctx.destination); - o.frequency.value = 880; - o.type = "sine"; - g.gain.setValueAtTime(0.08, ctx.currentTime); - g.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.08); - o.start(ctx.currentTime); - o.stop(ctx.currentTime + 0.08); - } catch { - // ignore - } - } - } - if (recipient === myId && chatMsg.peerId !== myId) { - setUnreadPeers((prev) => { - if (activeViewRef.current === "direct" && activeDirectPeerIdRef.current === chatMsg.peerId) return prev; - const next = new Set(prev); - next.add(chatMsg.peerId); - return next; - }); - } - } - }); - - return () => { - socket.removeAllListeners(); - socket.disconnect(); - socketRef.current = null; - }; - }, [isInitialized, peerId, displayName, verifySignature]); - - useEffect(() => { - if (typeof document === "undefined") return; - baseTitleRef.current = document.title || "CommonChat"; - }, []); - - useEffect(() => { - if (typeof document === "undefined") return; - document.title = tabUnreadCount > 0 ? `(${tabUnreadCount}) New Message - CommonChat` : baseTitleRef.current; - }, [tabUnreadCount]); - - useEffect(() => { - if (typeof document === "undefined") return; - const onVisibility = () => { - if (!document.hidden) { - setTabUnreadCount(0); - document.title = baseTitleRef.current; - } - }; - document.addEventListener("visibilitychange", onVisibility); - return () => document.removeEventListener("visibilitychange", onVisibility); - }, []); - - useEffect(() => { - if (!p2pNotification) return; - const t = setTimeout(() => setP2pNotification(false), 4000); - return () => clearTimeout(t); - }, [p2pNotification]); - - const openEditName = () => { - setEditNameValue(displayName); - setEditingName(true); - }; - const saveDisplayName = () => { - const v = editNameValue.trim(); - if (v) setDisplayName(v); - setEditingName(false); - }; - - const activeUsersCount = onlinePeers.length + 1; - const showModal = !isInitialized && isReady && !error; - - return ( -

- ); + const { + displayName, + setDisplayName, + peerId, + signMessage, + verifySignature, + isReady, + isInitialized, + initializeWithDisplayName, + encryptForPeer, + decryptFromPeer, + ed25519PubToX25519Pub, + getX25519PublicKey, + error, + } = useIdentity(); + + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(""); + const [editingName, setEditingName] = useState(false); + const [editNameValue, setEditNameValue] = useState(displayName); + + const [operatorName, setOperatorName] = useState(""); + const [modalClosing, setModalClosing] = useState(false); + const [selectedRecipient, setSelectedRecipient] = useState(""); + const [p2pNotification, setP2pNotification] = useState(false); + const [onlinePeers, setOnlinePeers] = useState< + { id: string; name: string; pubKey: string }[] + >([]); + const [relayConnected, setRelayConnected] = useState(false); + const socketRef = useRef(null); + const messagesEndRef = useRef(null); + const messagesContainerRef = useRef(null); + + type ViewMode = "public" | "direct"; + const [activeView, setActiveView] = useState("public"); + const [activePublicRoomId, setActivePublicRoomId] = + useState("general"); + const [activeDirectPeerId, setActiveDirectPeerId] = useState( + null, + ); + const [unreadPeers, setUnreadPeers] = useState>(new Set()); + const [tabUnreadCount, setTabUnreadCount] = useState(0); + const baseTitleRef = useRef("CommonChat"); + const activeViewRef = useRef("public"); + const activePublicRoomIdRef = useRef("general"); + const activeDirectPeerIdRef = useRef(null); + useEffect(() => { + activeViewRef.current = activeView; + activePublicRoomIdRef.current = activePublicRoomId; + activeDirectPeerIdRef.current = activeDirectPeerId; + }, [activeView, activePublicRoomId, activeDirectPeerId]); + + const previousPeers = getPreviousPeers(messages, peerId, onlinePeers); + const directMessagesPeerList = getDirectMessagesPeerList( + onlinePeers, + previousPeers, + peerId, + ); + + const isPublicRoomMessage = (m: ChatMessage, roomId: PublicRoomId) => { + const t = + m.type ?? + ((m.recipient ?? "Broadcast") === "Broadcast" ? "general" : "private"); + if (t !== "general" || (m.recipient ?? "Broadcast") !== "Broadcast") + return false; + const msgRoom = (m.roomId ?? "general") as PublicRoomId; + return msgRoom === roomId; + }; + const isPrivateMessageWith = (m: ChatMessage, otherPeerId: string) => { + const t = + m.type ?? + ((m.recipient ?? "Broadcast") === "Broadcast" ? "general" : "private"); + if (t !== "private") return false; + return ( + (m.fromMe && (m.recipient ?? "") === otherPeerId) || + (!m.fromMe && m.peerId === otherPeerId) + ); + }; + const visibleMessages: ChatMessage[] = + activeView === "public" + ? messages.filter((m) => isPublicRoomMessage(m, activePublicRoomId)) + : activeDirectPeerId + ? messages.filter((m) => isPrivateMessageWith(m, activeDirectPeerId)) + : []; + + const openPublicRoom = useCallback((roomId: PublicRoomId) => { + setActiveView("public"); + setActivePublicRoomId(roomId); + setActiveDirectPeerId(null); + setSelectedRecipient(""); + }, []); + const openDirectWith = useCallback((peerPubKey: string) => { + setActiveView("direct"); + setActiveDirectPeerId(peerPubKey); + setSelectedRecipient(peerPubKey); + setUnreadPeers((prev) => { + const next = new Set(prev); + next.delete(peerPubKey); + return next; + }); + }, []); + + const storageKey = peerId ? `${MESSAGES_STORAGE_KEY}_${peerId}` : null; + + useEffect(() => { + if (!storageKey || typeof window === "undefined") return; + try { + const raw = localStorage.getItem(storageKey); + if (raw) { + const parsed = JSON.parse(raw) as ChatMessage[]; + if (Array.isArray(parsed) && parsed.length > 0) { + setMessages(parsed); + } + } + } catch { + // ignore + } + }, [storageKey]); + + useEffect(() => { + if (!storageKey || messages.length === 0) return; + try { + const toStore = messages.slice(-500); + localStorage.setItem(storageKey, JSON.stringify(toStore)); + } catch { + // quota or parse error + } + }, [storageKey, messages]); + + useEffect(() => { + messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [visibleMessages]); + + const handleInitialize = useCallback(() => { + const name = operatorName.trim(); + if (!name) return; + setModalClosing(true); + setTimeout(() => { + initializeWithDisplayName(name); + setModalClosing(false); + }, 220); + }, [operatorName, initializeWithDisplayName]); + + const handleSignAndSend = useCallback(() => { + const text = input.trim(); + if (!text || !isInitialized) return; + + const isPrivate = activeView === "direct" && !!activeDirectPeerId; + const recipient = isPrivate + ? activeDirectPeerId || + resolveRecipientId(selectedRecipient, onlinePeers) || + selectedRecipient.trim() || + "" + : "Broadcast"; + if (isPrivate && !recipient) return; + + // For DMs: convert recipient Ed25519 → X25519, encrypt, sign ciphertext + // For public: sign plaintext directly + let wireText: string; + if (isPrivate) { + const recipientX25519 = ed25519PubToX25519Pub(recipient); + if (!recipientX25519) return; + const cipherText = encryptForPeer(recipientX25519, text); + if (!cipherText) return; + wireText = cipherText; + } else { + wireText = text; + } + + const sig = signMessage(wireText); + if (sig == null) return; + + const msg: ChatMessage = { + id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`, + text: wireText, + signatureHex: sig, + fromMe: true, + displayName, + peerId, + recipient: recipient || "Broadcast", + at: Date.now(), + type: isPrivate ? "private" : "general", + roomId: activeView === "public" ? activePublicRoomId : undefined, + }; + socketRef.current?.emit("message", msg); + // Store plaintext locally so our own DMs display correctly + setMessages((prev) => [...prev, { ...msg, text }]); + setInput(""); + requestAnimationFrame(() => { + messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }); + }, [ + input, + isInitialized, + signMessage, + displayName, + peerId, + activeView, + activePublicRoomId, + activeDirectPeerId, + selectedRecipient, + onlinePeers, + encryptForPeer, + ed25519PubToX25519Pub, + ]); + + useEffect(() => { + if (!isInitialized || !peerId || !displayName) return; + const socket = io(RELAY_URL, { autoConnect: true }); + socketRef.current = socket; + + socket.on("connect", () => { + setRelayConnected(true); + socket.emit("register", { peerId, displayName }); + }); + socket.on("disconnect", () => setRelayConnected(false)); + + socket.on( + "online_list", + (list: { id: string; name: string; pubKey: string }[]) => { + setOnlinePeers(Array.isArray(list) ? list : []); + }, + ); + socket.on( + "user_online", + (user: { + peerId?: string; + id?: string; + name?: string; + pubKey?: string; + displayName?: string; + }) => { + const pId = user.peerId ?? user.id ?? user.pubKey; + if (!pId || pId === peerId) return; + const name = user.name ?? user.displayName ?? truncate(pId, 12); + setOnlinePeers((prev) => { + const without = prev.filter((p) => p.pubKey !== pId); + return [...without, { id: pId, name, pubKey: pId }]; + }); + }, + ); + socket.on("user_offline", (data: { peerId: string }) => { + if (data.peerId === peerId) return; + setOnlinePeers((prev) => prev.filter((p) => p.pubKey !== data.peerId)); + }); + + socket.on("message", async (chatMsg: ChatMessage) => { + const myId = peerId; + console.log("Incoming message:", chatMsg); + + if (!chatMsg?.text || !chatMsg?.signatureHex || !chatMsg?.peerId) return; + const valid = await verifySignature( + chatMsg.peerId, + chatMsg.text, + chatMsg.signatureHex, + ); + if (!valid) { + console.log("SIGNATURE_ERROR"); + return; + } + const recipient = chatMsg.recipient ?? "Broadcast"; + const msgType: MessageType = + chatMsg.type ?? (recipient === "Broadcast" ? "general" : "private"); + if (msgType === "private" && recipient !== myId) { + return; + } + const isForMe = recipient === "Broadcast" || recipient === myId; + if (!isForMe) { + console.log(`ID_MISMATCH: Incoming [${recipient}], Mine [${myId}]`); + return; + } + const isFromMe = chatMsg.peerId === myId; + + // Decrypt DMs: convert sender's Ed25519 peerId → X25519, then decrypt + let displayText = chatMsg.text; + if (msgType === "private" && !isFromMe) { + const senderX25519 = ed25519PubToX25519Pub(chatMsg.peerId); + if (senderX25519) { + const plaintext = decryptFromPeer(senderX25519, chatMsg.text); + if (plaintext) { + displayText = plaintext; + } else { + console.log("DECRYPTION_FAILED for msg:", chatMsg.id); + } + } + } + + setMessages((prev) => { + if (prev.some((m) => m.id === chatMsg.id)) return prev; + return [ + ...prev, + { + ...chatMsg, + text: displayText, + fromMe: isFromMe, + type: msgType, + }, + ]; + }); + if (!isFromMe) { + setP2pNotification(true); + if (typeof document !== "undefined" && document.hidden) { + setTabUnreadCount((c) => c + 1); + if (typeof window !== "undefined" && window.AudioContext) { + try { + const ctx = new window.AudioContext(); + const o = ctx.createOscillator(); + const g = ctx.createGain(); + o.connect(g); + g.connect(ctx.destination); + o.frequency.value = 880; + o.type = "sine"; + g.gain.setValueAtTime(0.08, ctx.currentTime); + g.gain.exponentialRampToValueAtTime( + 0.001, + ctx.currentTime + 0.08, + ); + o.start(ctx.currentTime); + o.stop(ctx.currentTime + 0.08); + } catch { + // ignore + } + } + } + if (recipient === myId && chatMsg.peerId !== myId) { + setUnreadPeers((prev) => { + if ( + activeViewRef.current === "direct" && + activeDirectPeerIdRef.current === chatMsg.peerId + ) + return prev; + const next = new Set(prev); + next.add(chatMsg.peerId); + return next; + }); + } + } + }); + + return () => { + socket.removeAllListeners(); + socket.disconnect(); + socketRef.current = null; + }; + }, [isInitialized, peerId, displayName, verifySignature, decryptFromPeer, ed25519PubToX25519Pub]); + + useEffect(() => { + if (typeof document === "undefined") return; + baseTitleRef.current = document.title || "CommonChat"; + }, []); + + useEffect(() => { + if (typeof document === "undefined") return; + document.title = + tabUnreadCount > 0 + ? `(${tabUnreadCount}) New Message - CommonChat` + : baseTitleRef.current; + }, [tabUnreadCount]); + + useEffect(() => { + if (typeof document === "undefined") return; + const onVisibility = () => { + if (!document.hidden) { + setTabUnreadCount(0); + document.title = baseTitleRef.current; + } + }; + document.addEventListener("visibilitychange", onVisibility); + return () => document.removeEventListener("visibilitychange", onVisibility); + }, []); + + useEffect(() => { + if (!p2pNotification) return; + const t = setTimeout(() => setP2pNotification(false), 4000); + return () => clearTimeout(t); + }, [p2pNotification]); + + const openEditName = () => { + setEditNameValue(displayName); + setEditingName(true); + }; + const saveDisplayName = () => { + const v = editNameValue.trim(); + if (v) setDisplayName(v); + setEditingName(false); + }; + + const activeUsersCount = onlinePeers.length + 1; + const showModal = !isInitialized && isReady && !error; + + return ( +
+ {/* Full-screen modal when no displayName */} + {showModal && ( +
+
+ +
+ + setOperatorName(e.target.value)} + onKeyDown={(e) => e.key === "Enter" && handleInitialize()} + placeholder="Your call sign" + className="mt-2 w-full rounded border border-zinc-600 bg-zinc-800 px-4 py-3 text-sm text-zinc-100 placeholder-zinc-500 outline-none focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500" + autoFocus + disabled={modalClosing} + /> +
+ +
+
+ )} + + {/* Left sidebar — only when initialized */} + {isInitialized && ( + <> + + + {/* Right: chat */} +
+
+
+

+ {activeView === "public" ? ( + <> + + {PUBLIC_ROOMS.find((r) => r.id === activePublicRoomId) + ?.emoji ?? "🌐"} + + {PUBLIC_ROOMS.find((r) => r.id === activePublicRoomId) + ?.label ?? "General Chat"} + + #{activePublicRoomId} + + + ) : activeDirectPeerId ? ( + <> + Direct:{" "} + + {resolveRecipientLabel(activeDirectPeerId, onlinePeers)} + + + ) : ( + <>Direct Messages + )} +

+ {activeView === "public" && ( + + Active: {activeUsersCount} + + )} +
+

+ {activeView === "public" + ? "Public channel. Ed25519 signed." + : "Private conversation. End-to-end."} +

+
+ +
+
+ {activeView === "direct" && !activeDirectPeerId && ( +

+ Select a conversation from the left. +

+ )} + {activeView === "public" && visibleMessages.length === 0 && ( +

+ No general messages yet. Type below and press Enter or click + Send. +

+ )} + {activeView === "direct" && + activeDirectPeerId && + visibleMessages.length === 0 && ( +

+ Henüz mesaj yok, ilk mesajı sen gönder! +

+ )} + {visibleMessages.map((m) => ( +
+
+ {activeView === "public" && ( +

+ {peerIdShort(m.peerId)} +

+ )} +
+ + {m.displayName} + + {(m.recipient ?? "Broadcast") !== "Broadcast" && ( + + E2E + + )} +
+

+ {m.text} +

+

+ {formatTime(m.at)} +

+
+ + Signature + +

+ {m.signatureHex} +

+
+
+
+ ))} +
+
+
+ +
+
+ {activeView === "public" && ( +

+ Sending to everyone (General Chat) +

+ )} + {activeView === "direct" && activeDirectPeerId && ( +
+ + To:{" "} + {resolveRecipientLabel(activeDirectPeerId, onlinePeers)}{" "} + (E2E) + +
+ )} + {activeView === "direct" && !activeDirectPeerId && ( +

+ Select a conversation to send a message +

+ )} +
+ setInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + handleSignAndSend(); + } + }} + placeholder={ + activeView === "public" + ? "Message everyone… (Enter to send)" + : activeDirectPeerId + ? "Private message… (Enter to send)" + : "Select a conversation first" + } + disabled={activeView === "direct" && !activeDirectPeerId} + className="flex-1 rounded-xl border border-zinc-600 bg-zinc-800/80 px-4 py-3 text-sm text-zinc-100 placeholder-zinc-500 outline-none transition focus:border-emerald-500 focus:ring-2 focus:ring-emerald-500/30 disabled:opacity-50" + /> + +
+
+
+
+ + )} + + {/* Loading while WASM/identity check runs */} + {!isReady && !error && ( +
+ Loading… +
+ )} + {error && ( +
+ {error} +
+ )} + + {/* New P2P message notification - bottom right */} + {p2pNotification && ( +
+

+ New P2P Message Received +

+
+ )} + + {/* Built by - minimal signature */} +
+

+ Built by{" "} + + Holosko + {" "} + with{" "} + + @commonwarexyz + +

+
+
+ ); }
- {/* Full-screen modal when no displayName */} - {showModal && ( -
-
- -
- - setOperatorName(e.target.value)} - onKeyDown={(e) => e.key === "Enter" && handleInitialize()} - placeholder="Your call sign" - className="mt-2 w-full rounded border border-zinc-600 bg-zinc-800 px-4 py-3 text-sm text-zinc-100 placeholder-zinc-500 outline-none focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500" - autoFocus - disabled={modalClosing} - /> -
- -
-
- )} - - {/* Left sidebar — only when initialized */} - {isInitialized && ( - <> - - - {/* Right: chat */} -
-
-
-

- {activeView === "public" ? ( - <> - - {PUBLIC_ROOMS.find((r) => r.id === activePublicRoomId)?.emoji ?? "🌐"} - - {PUBLIC_ROOMS.find((r) => r.id === activePublicRoomId)?.label ?? "General Chat"} - #{activePublicRoomId} - - ) : activeDirectPeerId ? ( - <>Direct: {resolveRecipientLabel(activeDirectPeerId, onlinePeers)} - ) : ( - <>Direct Messages - )} -

- {activeView === "public" && ( - - Active: {activeUsersCount} - - )} -
-

- {activeView === "public" ? "Public channel. Ed25519 signed." : "Private conversation. End-to-end."} -

-
- -
-
- {activeView === "direct" && !activeDirectPeerId && ( -

- Select a conversation from the left. -

- )} - {activeView === "public" && visibleMessages.length === 0 && ( -

- No general messages yet. Type below and press Enter or click Send. -

- )} - {activeView === "direct" && activeDirectPeerId && visibleMessages.length === 0 && ( -

- Henüz mesaj yok, ilk mesajı sen gönder! -

- )} - {visibleMessages.map((m) => ( -
-
- {activeView === "public" && ( -

- {peerIdShort(m.peerId)} -

- )} -
- - {m.displayName} - - {(m.recipient ?? "Broadcast") !== "Broadcast" && ( - - E2E - - )} -
-

- {m.text} -

-

- {formatTime(m.at)} -

-
- Signature -

- {m.signatureHex} -

-
-
-
- ))} -
-
-
- -
-
- {activeView === "public" && ( -

Sending to everyone (General Chat)

- )} - {activeView === "direct" && activeDirectPeerId && ( -
- - To: {resolveRecipientLabel(activeDirectPeerId, onlinePeers)} (E2E) - -
- )} - {activeView === "direct" && !activeDirectPeerId && ( -

Select a conversation to send a message

- )} -
- setInput(e.target.value)} - onKeyDown={(e) => { - if (e.key === "Enter" && !e.shiftKey) { - e.preventDefault(); - handleSignAndSend(); - } - }} - placeholder={ - activeView === "public" - ? "Message everyone… (Enter to send)" - : activeDirectPeerId - ? "Private message… (Enter to send)" - : "Select a conversation first" - } - disabled={activeView === "direct" && !activeDirectPeerId} - className="flex-1 rounded-xl border border-zinc-600 bg-zinc-800/80 px-4 py-3 text-sm text-zinc-100 placeholder-zinc-500 outline-none transition focus:border-emerald-500 focus:ring-2 focus:ring-emerald-500/30 disabled:opacity-50" - /> - -
-
-
-
- - )} - - {/* Loading while WASM/identity check runs */} - {!isReady && !error && ( -
- Loading… -
- )} - {error && ( -
- {error} -
- )} - - {/* New P2P message notification - bottom right */} - {p2pNotification && ( -
-

- New P2P Message Received -

-
- )} - - {/* Built by - minimal signature */} -
-