From 757d9e829d5fd154a827f5b61de9e36204ef76ef Mon Sep 17 00:00:00 2001 From: highlander Date: Thu, 26 Feb 2026 16:19:34 -0700 Subject: [PATCH 01/10] fix: CI checkout selectively inits only needed submodules Replace `submodules: recursive` with selective init of hdwallet and proto-tx-builder only. The recursive checkout fails because keepkey-firmware has deeply nested submodules (lwip.git) that cannot be cloned from git.savannah.gnu.org in CI. Also update hdwallet submodule pointer to develop branch with Solana support (keepkey/hdwallet#15). Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build.yml | 5 +++-- modules/hdwallet | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e3effa0..4c0ed93 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,8 +42,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - with: - submodules: recursive + + - name: Init required submodules + run: git submodule update --init modules/hdwallet modules/proto-tx-builder - name: Setup Bun uses: oven-sh/setup-bun@v2 diff --git a/modules/hdwallet b/modules/hdwallet index c75ed97..3fcc05f 160000 --- a/modules/hdwallet +++ b/modules/hdwallet @@ -1 +1 @@ -Subproject commit c75ed97e3e89336775bd5938e61fc19a91200771 +Subproject commit 3fcc05fd33578e0c0b17df869a7793138a6fae10 From edd8bc060c8abef8b5ff19782bf4f9c065cd6446 Mon Sep 17 00:00:00 2001 From: highlander Date: Thu, 26 Feb 2026 16:23:40 -0700 Subject: [PATCH 02/10] fix: remove redundant mv in AppImage packaging step The AppImage is already created in the artifacts directory (cwd), so `mv file .` fails with "are the same file". Co-Authored-By: Claude Opus 4.6 --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4c0ed93..83178d4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -157,7 +157,6 @@ jobs: # Build AppImage (--appimage-extract-and-run for CI without FUSE) ARCH=x86_64 "$WORK/appimagetool" --appimage-extract-and-run "$APPDIR" "KeepKey-Vault-x86_64.AppImage" - mv "KeepKey-Vault-x86_64.AppImage" . # Cleanup rm -rf "$WORK" From ccc8982161d0d4d2f45e45394858cdc313bfa632 Mon Sep 17 00:00:00 2001 From: highlander Date: Fri, 27 Feb 2026 11:34:15 -0700 Subject: [PATCH 03/10] docs: align all documentation with v1.0.1 build pipeline and current architecture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BUILD.md: added signing deep dive (3 passes, entitlements, Mach-O detection), prune-app-bundle stage, version-aware dedup, DEV_BLOCKLIST, corrected bundle size - API.md: complete rewrite documenting actual RPC methods (70+) and REST endpoints (~60) - ARCHITECTURE.md: fixed stale references (React Router → tab state machine, updated file tables, lodash/rxjs cleanup marked complete) - ELECTROBUN.md: fixed build targets, added collect-externals to pipeline, entitlements section - collect-externals-guide.md: updated to 9-step pipeline with DEV_BLOCKLIST and banned packages - README.md: removed keepkey-desktop references, documented direct USB architecture Co-Authored-By: Claude Opus 4.6 --- README.md | 153 +++--- docs/ARCHITECTURE.md | 41 +- projects/keepkey-vault/docs/API.md | 463 ++++++++++++++---- projects/keepkey-vault/docs/BUILD.md | 240 ++++++--- projects/keepkey-vault/docs/ELECTROBUN.md | 16 +- .../docs/collect-externals-guide.md | 18 +- 6 files changed, 686 insertions(+), 245 deletions(-) diff --git a/README.md b/README.md index ef08d79..32987bd 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,144 @@ # KeepKey Vault v11 -Desktop hardware wallet management UI built with **Electrobun** + **React 18** + **Chakra UI 3.0**. +Desktop hardware wallet application built with **Electrobun** (Bun main process + system WebView) + **React 18** + **Chakra UI 3.0**. ## Architecture ``` Electrobun Desktop App -├── Main Process (Bun) ──── HTTP REST ──── keepkey-desktop (port 1646) ──── KeepKey Device -└── WebView (React + Chakra UI + Vite) +├── Main Process (Bun) ──── USB (HID + WebUSB) ──── KeepKey Device +│ ├── Engine Controller (device lifecycle, USB events) +│ ├── SQLite persistence (bun:sqlite) +│ ├── Pioneer API integration (balance/portfolio) +│ └── REST API on port 1646 (opt-in, KEEPKEY_REST_API=true) +└── WebView (React 18 + Chakra UI 3.0 + Vite) + └── Tab-based state machine (dashboard | addresses | settings) ``` -- **Main process** (`src/bun/index.ts`): Bun runtime, window management, RPC bridge -- **WebView** (`src/mainview/`): React 18 + Chakra UI 3.0, client-side routing -- **API layer**: Direct REST client to keepkey-desktop on port 1646 (no Pioneer SDK) -- **Theme**: Black/gold (#000/#111/#FFD700) matching KeepKey branding +- The vault talks directly to the KeepKey device via USB -- no external desktop app dependency. +- All device operations go through Electrobun RPC (no REST required for normal use). +- The REST API on port 1646 is opt-in (`KEEPKEY_REST_API=true`), compatible with the `kkapi://` protocol. +- No React Router -- the UI uses a simple tab-based state machine. +- Theme: black/gold (#000/#111/#FFD700) matching KeepKey branding. ## Prerequisites -- [Bun](https://bun.sh) >= 1.0 -- [keepkey-desktop](https://github.com/keepkey/keepkey-desktop) running on port 1646 +- [Bun](https://bun.sh) >= 1.3.5 +- [Yarn](https://yarnpkg.com) (for hdwallet monorepo build) - KeepKey hardware wallet connected via USB +- For signing/notarization: Apple Developer ID certificate + Xcode CLI tools ## Quick Start ```bash -make install # Install dependencies -make dev # Build and launch app -make dev-hmr # Dev mode with Vite hot reload +make vault # Build modules + install deps + run dev mode +make dev # Build and run in dev mode +make dev-hmr # Dev mode with Vite HMR ``` ## Make Targets | Target | Description | |--------|-------------| -| `make install` | Install dependencies | +| `make vault` | Build modules + install deps + run dev mode | | `make dev` | Build and run in dev mode | -| `make dev-hmr` | Dev mode with Vite HMR on port 5173 | -| `make build` | Production build | -| `make build-prod` | Production build (prod channel) | -| `make clean` | Remove build artifacts and node_modules | +| `make dev-hmr` | Dev mode with Vite HMR | +| `make build` | Development build (no signing) | +| `make build-signed` | Full pipeline: build, prune, DMG, sign, notarize | +| `make prune-bundle` | Prune app bundle (version-aware dedup + re-sign) | +| `make dmg` | Create DMG from existing build | +| `make upload-dmg` | Upload signed DMG to CI draft release | +| `make release` | Build, sign, and create new GitHub release | +| `make modules-build` | Build hdwallet + proto-tx-builder from source | +| `make audit` | Generate dependency manifest + SBOM | +| `make clean` | Remove all build artifacts | ## Project Structure ``` keepkey-vault-v11/ -├── Makefile # Top-level make targets -├── hdwallet/ # Git submodule: keepkey/hdwallet +├── Makefile +├── modules/ +│ ├── hdwallet/ # Git submodule: keepkey/hdwallet (yarn+lerna) +│ ├── proto-tx-builder/ # Git submodule: @keepkey/proto-tx-builder +│ ├── keepkey-firmware/ # Git submodule: device firmware (C, CMake) +│ └── device-protocol/ # Git submodule: protobuf definitions +├── docs/ +│ ├── ARCHITECTURE.md +│ ├── COIN-ADDITION-GUIDE.md +│ ├── coins/ +│ └── firmware/README.md +├── firmware/ # Firmware manifest + binaries └── projects/ - └── keepkey-vault/ # Electrobun app - ├── electrobun.config.ts # App identity & build config - ├── vite.config.ts # Vite build config - ├── package.json + └── keepkey-vault/ # Electrobun app + ├── electrobun.config.ts + ├── vite.config.ts + ├── entitlements.plist + ├── scripts/ # Build scripts (collect-externals, prune, etc.) + ├── docs/ # BUILD.md, API.md, ELECTROBUN.md └── src/ - ├── bun/index.ts # Main process (window, RPC) - ├── shared/types.ts # RPC type definitions - └── mainview/ - ├── main.tsx # React entry + Chakra Provider - ├── App.tsx # Router + layout shell - ├── theme.ts # Chakra 3.0 black/gold theme + ├── bun/ # Main process + │ ├── index.ts # Electrobun RPC + engine controller + REST + │ ├── engine-controller.ts # USB event-driven device lifecycle + │ ├── rest-api.ts # Bun.serve() REST API (opt-in) + │ ├── evm-rpc.ts # EVM chain RPC calls + │ └── ... # DB, Pioneer, TX builder modules + ├── shared/ + │ ├── rpc-schema.ts # Electrobun RPC type definitions + │ ├── types.ts # DeviceStateInfo, FirmwareProgress, etc. + │ └── chains.ts # Chain definitions + └── mainview/ # React frontend + ├── main.tsx # React entry + ChakraProvider + ├── App.tsx # Tab-based state machine (no router) ├── components/ - │ ├── layout/ # Header, Sidebar, StatusBar - │ ├── dashboard/ # Dashboard overview - │ ├── device/ # DeviceStatus, PinEntry, Settings - │ ├── addresses/ # Multi-chain address derivation - │ └── signing/ # Transaction signing - ├── hooks/ # useKeepKey, useApi - ├── services/ # keepkey-api.ts (REST client) - └── types/ # Frontend type definitions + │ ├── Dashboard.tsx + │ ├── Addresses.tsx + │ ├── TopNav.tsx + │ ├── SplashScreen.tsx + │ ├── OobSetupWizard.tsx + │ ├── DeviceSettings.tsx + │ └── device/ # PinEntry, PassphraseEntry, RecoveryWordEntry + ├── hooks/ # useDeviceState, useFirmwareUpdate, etc. + └── lib/ # rpc.ts (browser-side RPC transport) ``` -## keepkey-desktop API +## Supported Chains -The app communicates with keepkey-desktop's REST API on port 1646: +- **Bitcoin**: Multi-account, SegWit (p2wpkh, p2sh-p2wpkh, p2pkh) +- **Ethereum + 6 EVM L2s**: Polygon, Arbitrum, Optimism, Avalanche, BSC, Base +- **Cosmos ecosystem**: Cosmos, THORChain, Osmosis, Mayachain +- **Other**: Ripple (XRP), Binance (BNB), Solana +- **Custom EVM chains**: User-defined via Add Chain dialog -- **Auth**: `POST /auth/pair` (get Bearer token) -- **Addresses**: `/addresses/eth`, `/addresses/utxo`, `/addresses/cosmos`, etc. -- **Signing**: `/eth/sign-transaction`, `/utxo/sign-transaction`, `/cosmos/sign-amino`, etc. -- **System**: `/system/info/get-features`, `/system/apply-settings`, `/system/wipe-device`, etc. +## Tech Stack -See [docs/API.md](docs/API.md) for the full endpoint reference. +- **Runtime**: [Electrobun](https://electrobun.dev) (Bun + system WebView) +- **UI**: React 18 + Chakra UI 3.0 +- **Build**: Vite 6 +- **Device communication**: @keepkey/hdwallet-* (HID + WebUSB dual transport with automatic fallback) +- **Persistence**: SQLite (bun:sqlite) +- **Signing**: Apple codesign + notarize + staple -## Supported Chains +## Documentation -Bitcoin, Ethereum, Cosmos, THORChain, Osmosis, Litecoin, Dogecoin, Bitcoin Cash, Dash, Ripple, Mayachain, Binance +- [Build and Signing Guide](projects/keepkey-vault/docs/BUILD.md) +- [REST API Reference](projects/keepkey-vault/docs/API.md) +- [Electrobun Integration](projects/keepkey-vault/docs/ELECTROBUN.md) +- [Architecture](docs/ARCHITECTURE.md) +- [Coin Addition Guide](docs/COIN-ADDITION-GUIDE.md) -## Tech Stack +## Submodules -- **Runtime**: [Electrobun](https://electrobun.dev) (Bun + system WebView, ~14MB bundle) -- **UI**: React 18 + Chakra UI 3.0 + Emotion -- **Build**: Vite 6 with HMR support -- **Routing**: React Router 7 -- **API**: Direct fetch to keepkey-desktop REST API +After cloning, initialize the git submodules: -## hdwallet Submodule +```bash +git submodule update --init --recursive +``` -The `hdwallet/` directory is a git submodule pointing to [keepkey/hdwallet](https://github.com/keepkey/hdwallet). To initialize after cloning: +The `modules/hdwallet/` submodule must be on the `master` branch (which has lodash/rxjs removed from source). Build with: ```bash -git submodule update --init --recursive +make modules-build ``` + +This builds proto-tx-builder (bun + tsc) then hdwallet (yarn install + yarn build). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 51b59d5..7678f37 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -10,7 +10,7 @@ │ │ Main Process (Bun) │◄──────────►│ WebView (React) │ │ │ │ │ │ Chakra UI 3.0 │ │ │ │ EngineController │ │ Vite 6 + HMR │ │ -│ │ REST API Server │ │ React Router 7 │ │ +│ │ REST API Server │ │ Tab state machine │ │ │ │ SQLite Cache │ └────────────────────┘ │ │ │ Auth Store │ │ │ └───────────┬───────────┘ │ @@ -38,24 +38,26 @@ |------|---------| | `index.ts` | App entry: window creation, RPC bridge, event wiring | | `engine-controller.ts` | Device lifecycle: connect, pair, PIN/passphrase, firmware update | -| `rest-api.ts` | HTTP REST API (port 1646, opt-in, keepkey-desktop compatible) | +| `rest-api.ts` | HTTP REST API (port 1646, opt-in, kkapi:// compatible) | | `auth.ts` | Bearer token auth, pairing requests, signing approval | -| `db.ts` | SQLite persistence (balances cache, pubkeys, settings, custom tokens) | +| `db.ts` | SQLite persistence (balances, pubkeys, settings, custom tokens/chains) | | `pioneer.ts` | Pioneer API client (portfolio balances, tx building, market data) | -| `txbuilder.ts` | Transaction construction (UTXO, EVM, Cosmos) | -| `schemas.ts` | Zod schemas for REST API request/response validation | +| `txbuilder/` | Transaction construction (UTXO, EVM, Cosmos) | +| `schemas.ts` | Zod schemas for REST API validation | +| `evm-rpc.ts` | Direct EVM chain RPC calls (balance, nonce, gas, broadcast) | +| `evm-addresses.ts` | EVM multi-address manager | +| `btc-accounts.ts` | BTC multi-account manager | +| `camera.ts` | QR code scanning via system camera | ### Frontend (`src/mainview/`) -| Directory | Purpose | -|-----------|---------| -| `components/layout/` | Header, Sidebar, StatusBar | -| `components/dashboard/` | Portfolio overview, chain balances | -| `components/device/` | DeviceStatus, PinEntry, Settings | -| `components/addresses/` | Multi-chain address derivation | -| `components/signing/` | Transaction review & signing | -| `hooks/` | useKeepKey (RPC wrapper), useApi (REST client) | -| `services/` | keepkey-api.ts REST client | +| Directory/File | Purpose | +|----------------|---------| +| `App.tsx` | Tab-based state machine (dashboard, addresses, settings) | +| `components/` | TopNav, Dashboard, SendForm, OobSetupWizard, SplashScreen, etc. | +| `components/device/` | PinEntry, PassphraseEntry, RecoveryWordEntry | +| `hooks/` | useDeviceState, useBtcAccounts, useEvmAddresses, useFirmwareUpdate | +| `lib/rpc.ts` | Browser-side Electrobun RPC transport | ### CLI (`projects/keepkey-cli/`) @@ -74,12 +76,11 @@ Standalone Bun/TypeScript CLI. Same `@keepkey/hdwallet-*` packages as vault, but | `keepkey-firmware` | C (CMake) | Device firmware — protobuf handlers, crypto, OLED UI | | `device-protocol` | protobuf | `.proto` message definitions shared by firmware + hdwallet | -> **Note on hdwallet lodash/rxjs dependencies**: `hdwallet-core` imports `lodash` and `rxjs`; -> `hdwallet-keepkey` imports `lodash`. These are declared dependencies in each package's -> `package.json` and are required at compile time. They are **stripped at bundle time** by -> `collect-externals.ts` (pruning step) so they do not ship in the final app. A future cleanup -> should inline the ~6 usages (`isObject`, `cloneDeep`, `omit`, `takeFirstOfManyEvents`) and -> remove the deps entirely from source. See `keepkey/hdwallet` for details. +> **Note on hdwallet lodash/rxjs dependencies**: The lodash/rxjs imports have been removed from +> `hdwallet-core` and `hdwallet-keepkey` source code on the `master` branch (commit `179c5668`). +> `isObject` was inlined, `cloneDeep` replaced with `structuredClone`, `omit` replaced with a +> local helper, and `takeFirstOfManyEvents` (dead code) was removed. The build scripts +> (`collect-externals.ts`) still strip lodash/rxjs as a safety measure. ## Transport Layer diff --git a/projects/keepkey-vault/docs/API.md b/projects/keepkey-vault/docs/API.md index 991f416..432e5c0 100644 --- a/projects/keepkey-vault/docs/API.md +++ b/projects/keepkey-vault/docs/API.md @@ -1,139 +1,428 @@ -# keepkey-desktop REST API Reference +# KeepKey Vault v11 API Reference + +KeepKey Vault v11 exposes two API layers for communicating with the KeepKey hardware wallet. + +## API Layers + +### Electrobun RPC (primary) + +The built-in frontend communicates with the Bun main process over Electrobun's WebSocket-based RPC. This is the primary interface and is always active. The schema is defined in `src/shared/rpc-schema.ts`. + +RPC calls use request/response semantics (`rpcRequest('method', params)`) and one-way push messages (`rpc.send['message-name'](payload)`). + +### REST API (opt-in, port 1646) + +An HTTP API for external applications (dApps, SDKs, CLI tools). Disabled by default. Enable it by setting `KEEPKEY_REST_API=true` in app settings or via the Settings UI. + +- Base URL: `http://localhost:1646` +- Compatible with the `kkapi://` protocol (maps to `localhost:1646`) +- All endpoints except health, ping, and pairing require `Authorization: Bearer ` header +- Signing endpoints require explicit user approval via the Electrobun UI before execution +- CORS is enabled for all origins (bearer-token auth model, not cookie-based) +- Swagger UI available at `http://localhost:1646/docs` +- OpenAPI spec at `http://localhost:1646/spec/swagger.json` + +--- + +## RPC Methods + +### Requests (WebView calls Bun) + +#### Device Lifecycle + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getDeviceState` | void | `DeviceStateInfo` | Current device connection state | +| `startBootloaderUpdate` | void | void | Enter bootloader and flash update | +| `startFirmwareUpdate` | void | void | Flash latest firmware | +| `flashFirmware` | void | void | Flash firmware (when in bootloader) | +| `analyzeFirmware` | `{ data: string }` | `FirmwareAnalysis` | Analyze a custom firmware binary | +| `flashCustomFirmware` | `{ data: string }` | void | Flash user-supplied firmware | +| `resetDevice` | `{ wordCount, pin, passphrase }` | void | Generate new seed on device | +| `recoverDevice` | `{ wordCount, pin, passphrase }` | void | Recover device via cipher recovery | +| `loadDevice` | `{ mnemonic, pin?, passphrase?, label? }` | void | Load a known mnemonic | +| `verifySeed` | `{ wordCount }` | `{ success, message }` | Verify seed backup | +| `applySettings` | `{ label?, usePassphrase?, autoLockDelayMs? }` | void | Change device settings | +| `changePin` | void | void | Start PIN change flow | +| `removePin` | void | void | Remove PIN protection | +| `sendPin` | `{ pin: string }` | void | Respond to PIN prompt | +| `sendPassphrase` | `{ passphrase: string }` | void | Respond to passphrase prompt | +| `sendCharacter` | `{ character: string }` | void | Send character during cipher recovery | +| `sendCharacterDelete` | void | void | Delete last character during recovery | +| `sendCharacterDone` | void | void | Confirm final word during recovery | + +#### Wallet Operations + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getFeatures` | void | any | Get device features (model, firmware, policies) | +| `ping` | `{ msg?: string }` | any | Ping the device | +| `wipeDevice` | void | any | Factory reset | +| `getPublicKeys` | paths array | any | Derive public keys / xpubs | + +#### Address Derivation + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `btcGetAddress` | `{ addressNList, coin?, scriptType?, showDisplay? }` | any | Bitcoin / UTXO address | +| `ethGetAddress` | `{ addressNList, showDisplay? }` | any | Ethereum / EVM address | +| `cosmosGetAddress` | `{ addressNList, showDisplay? }` | any | Cosmos address | +| `thorchainGetAddress` | `{ addressNList, showDisplay? }` | any | THORChain address | +| `mayachainGetAddress` | `{ addressNList, showDisplay? }` | any | Mayachain address | +| `osmosisGetAddress` | `{ addressNList, showDisplay? }` | any | Osmosis address | +| `xrpGetAddress` | `{ addressNList, showDisplay? }` | any | XRP address | +| `solanaGetAddress` | `{ addressNList, showDisplay? }` | any | Solana address | + +#### Transaction Signing + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `btcSignTx` | `{ coin, inputs, outputs, version?, locktime? }` | any | Sign UTXO transaction | +| `ethSignTx` | `{ addressNList, to, value, nonce, gasLimit, chainId, ... }` | any | Sign EVM transaction (EIP-155 / EIP-1559) | +| `ethSignMessage` | `{ addressNList, message }` | any | Sign ETH message | +| `ethSignTypedData` | `{ addressNList, typedData }` | any | Sign EIP-712 typed data | +| `ethVerifyMessage` | `{ address, message, signature }` | any | Verify ETH signature | +| `cosmosSignTx` | amino tx object | any | Sign Cosmos transaction | +| `thorchainSignTx` | amino tx object | any | Sign THORChain transaction | +| `mayachainSignTx` | amino tx object | any | Sign Mayachain transaction | +| `osmosisSignTx` | amino tx object | any | Sign Osmosis transaction | +| `xrpSignTx` | XRP tx object | any | Sign XRP transaction | +| `solanaSignTx` | `{ addressNList, rawTx }` | any | Sign Solana transaction | + +#### Pioneer Integration + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getBalances` | void | `ChainBalance[]` | Fetch all chain balances via Pioneer | +| `getBalance` | `{ chainId }` | `ChainBalance` | Fetch single chain balance | +| `buildTx` | `BuildTxParams` | `BuildTxResult` | Build unsigned transaction | +| `broadcastTx` | `{ chainId, signedTx }` | `BroadcastResult` | Broadcast signed transaction | +| `getMarketData` | `{ caips: string[] }` | any | Get market prices for assets | +| `getFees` | `{ chainId }` | any | Get fee estimates for a chain | + +#### Bitcoin Multi-Account + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getBtcAccounts` | void | `BtcAccountSet` | List BTC accounts (all script types) | +| `addBtcAccount` | void | `BtcAccountSet` | Add next account index | +| `setBtcSelectedXpub` | `{ accountIndex, scriptType }` | void | Set active BTC account | +| `getBtcAddressIndices` | `{ xpub }` | `{ receiveIndex, changeIndex }` | Get current address indices | + +#### EVM Multi-Address + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getEvmAddresses` | void | `EvmAddressSet` | List tracked EVM address indices | +| `addEvmAddressIndex` | `{ index? }` | `EvmAddressSet` | Add an EVM address index | +| `removeEvmAddressIndex` | `{ index }` | `EvmAddressSet` | Remove an EVM address index | +| `setEvmSelectedIndex` | `{ index }` | void | Set active EVM address index | + +#### Chain Discovery + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `browseChains` | `{ query?, page?, pageSize? }` | `{ chains, total, page, pageSize }` | Search Pioneer chain catalog | + +#### Custom Tokens and Chains + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `addCustomToken` | `{ chainId, contractAddress }` | `CustomToken` | Add custom ERC-20 token | +| `removeCustomToken` | `{ chainId, contractAddress }` | void | Remove custom token | +| `getCustomTokens` | void | `CustomToken[]` | List custom tokens | +| `addCustomChain` | `CustomChain` | void | Add custom EVM chain | +| `removeCustomChain` | `{ chainId }` | void | Remove custom chain | +| `getCustomChains` | void | `CustomChain[]` | List custom chains | + +#### Token Visibility (Spam Filter) + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `setTokenVisibility` | `{ caip, status }` | void | Mark token visible or hidden | +| `removeTokenVisibility` | `{ caip }` | void | Remove visibility override | +| `getTokenVisibilityMap` | void | `Record` | Get all visibility overrides | + +#### Camera / QR Scanning + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `startQrScan` | void | void | Start camera for QR scanning | +| `stopQrScan` | void | void | Stop camera | + +#### Pairing and Signing Approval + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `approvePairing` | void | `{ apiKey }` | Approve pending REST API pairing request | +| `rejectPairing` | void | void | Reject pending pairing request | +| `approveSigningRequest` | `{ id }` | void | Approve a signing request | +| `rejectSigningRequest` | `{ id }` | void | Reject a signing request | +| `listPairedApps` | void | `PairedAppInfo[]` | List all paired applications | +| `revokePairing` | `{ apiKey }` | void | Revoke an app's API key | + +#### API Audit Log + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getApiLogs` | `{ limit?, offset? }` | `ApiLogEntry[]` | Get REST API audit log entries | +| `clearApiLogs` | void | void | Clear the audit log | + +#### App Settings + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getAppSettings` | void | `AppSettings` | Get current settings | +| `setRestApiEnabled` | `{ enabled }` | `AppSettings` | Enable or disable REST API | +| `setPioneerApiBase` | `{ url }` | `AppSettings` | Set Pioneer API base URL | + +#### Balance Cache / Watch-Only + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `getCachedBalances` | void | `ChainBalance[] | null` | Get locally cached balances | +| `checkWatchOnlyCache` | void | `{ available, deviceLabel?, lastSynced? }` | Check if watch-only data exists | +| `getWatchOnlyBalances` | void | `ChainBalance[] | null` | Get balances without device connected | +| `getWatchOnlyPubkeys` | void | pubkey array | Get cached public keys | + +#### App Updates + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `checkForUpdate` | void | `UpdateInfo` | Check for new app version | +| `downloadUpdate` | void | void | Download available update | +| `applyUpdate` | void | void | Apply downloaded update | +| `getUpdateInfo` | void | `UpdateInfo | null` | Get current update state | +| `getAppVersion` | void | `{ version, channel }` | Get running app version | + +#### Utility + +| Method | Params | Response | Description | +|--------|--------|----------|-------------| +| `openUrl` | `{ url }` | void | Open URL in system browser | + +### Messages (Bun pushes to WebView) + +| Message | Payload | Description | +|---------|---------|-------------| +| `device-state` | `DeviceStateInfo` | Device state changed | +| `firmware-progress` | `FirmwareProgress` | Firmware flash progress | +| `pin-request` | `PinRequest` | Device is requesting PIN entry | +| `character-request` | `CharacterRequest` | Device is requesting character (cipher recovery) | +| `passphrase-request` | `{}` | Device is requesting passphrase | +| `recovery-error` | `{ message, errorType }` | Recovery or PIN change failed | +| `btc-accounts-update` | `BtcAccountSet` | BTC accounts changed | +| `evm-addresses-update` | `EvmAddressSet` | EVM tracked addresses changed | +| `camera-frame` | string (base64) | Camera frame for QR scanning | +| `camera-error` | string | Camera error message | +| `update-status` | `UpdateStatus` | App update download/install progress | +| `pair-request` | `PairingRequestInfo` | External app requesting to pair | +| `signing-request` | `SigningRequestInfo` | External app requesting to sign | +| `signing-dismissed` | `{ id }` | Signing request was dismissed | +| `api-log` | `ApiLogEntry` | New REST API log entry | +| `walletconnect-uri` | string | WalletConnect URI received | + +--- + +## REST API Endpoints Base URL: `http://localhost:1646` -All endpoints except `POST /auth/pair` require `Authorization: Bearer ` header. +### Public (no auth required) -## Authentication +| Method | Path | Description | +|--------|------|-------------| +| GET | `/api/health` | Health check with device status, supported chains, uptime | +| GET | `/api/v1/health` | Alias for `/api/health` | +| GET | `/api/v1/health/fast` | Minimal health check (status + uptime only) | +| GET | `/info/ping` | Returns `{ message: "pong" }` -- SDK detection | +| POST | `/system/info/ping` | Returns `{ message: "pong" }` -- SDK detection | +| GET | `/admin/info` | Version, connection status, uptime | +| GET | `/spec/swagger.json` | OpenAPI specification | +| GET | `/docs` | Swagger UI (interactive API docs) | +| GET | `/api/cache/status` | Cache status (pubkey + address cache counts) | +| GET | `/api/portfolio` | Portfolio stub (returns device state, no balance aggregation) | +| GET | `/auth/paired-apps` | List paired apps (keys stripped) | + +### Authentication | Method | Path | Description | |--------|------|-------------| -| POST | `/auth/pair` | Pair new client, returns `{ apiKey }` | -| GET | `/auth/pair` | Verify existing API key | - -### Pairing Request Body -```json -{ - "name": "KeepKey Vault", - "url": "electrobun://keepkey-vault", - "imageUrl": "https://keepkey.com/favicon.ico" -} -``` - -## Address Derivation - -All POST, all require API key. - -| Endpoint | Chains | Body | -|----------|--------|------| -| `/addresses/eth` | Ethereum | `{ address_n, show_display? }` | -| `/addresses/utxo` | BTC, LTC, DOGE, BCH, DASH | `{ address_n, coin, script_type?, show_display? }` | -| `/addresses/cosmos` | Cosmos | `{ address_n, show_display? }` | -| `/addresses/osmosis` | Osmosis | `{ address_n, show_display? }` | -| `/addresses/thorchain` | THORChain | `{ address_n, show_display? }` | -| `/addresses/mayachain` | Mayachain | `{ address_n, show_display? }` | -| `/addresses/xrp` | Ripple | `{ address_n, show_display? }` | -| `/addresses/bnb` | Binance | `{ address_n, show_display? }` | -| `/addresses/tendermint` | Tendermint | `{ address_n, show_display? }` | - -## Signing - -### Ethereum +| POST | `/auth/pair` | Pair a new app. Body: `{ name, url?, imageUrl? }`. Returns `{ apiKey }`. Requires user approval via UI. | +| GET | `/auth/pair` | Verify existing API key. Returns `{ paired: true/false }`. | + +### Address Derivation (auth required) + +All POST. Body: `{ address_n: number[], coin?: string, script_type?: string, show_display?: boolean }`. + +| Path | Chain(s) | +|------|----------| +| `/addresses/utxo` | Bitcoin, Litecoin, Dogecoin, Bitcoin Cash, Dash, DigiByte | +| `/addresses/eth` | Ethereum and all EVM L2s | +| `/addresses/cosmos` | Cosmos | +| `/addresses/osmosis` | Osmosis | +| `/addresses/thorchain` | THORChain | +| `/addresses/mayachain` | Mayachain | +| `/addresses/tendermint` | Tendermint (generic cosmos) | +| `/addresses/xrp` | XRP | +| `/addresses/solana` | Solana | + +### Signing (auth required, user approval required) + +#### Ethereum / EVM + | Method | Path | Description | |--------|------|-------------| -| POST | `/eth/sign-transaction` | Sign ETH transaction | -| POST | `/eth/sign-typed-data` | Sign EIP-712 typed data | -| POST | `/eth/sign` | Sign message (hex) | -| POST | `/eth/verify` | Verify signature | +| POST | `/eth/sign-transaction` | Sign EVM transaction (EIP-155 and EIP-1559). Supports `from` address auto-lookup across first 5 account indices. | +| POST | `/eth/sign-typed-data` | Sign EIP-712 typed data. Body: `{ address, typedData }` | +| POST | `/eth/sign` | Sign hex message. Body: `{ address, message }` | +| POST | `/eth/verify` | Verify signature. Body: `{ address, message, signature }` | + +#### UTXO -### UTXO | Method | Path | Description | |--------|------|-------------| -| POST | `/utxo/sign-transaction` | Sign BTC-like transaction | +| POST | `/utxo/sign-transaction` | Sign UTXO transaction. Body: `{ coin?, inputs, outputs, version?, locktime? }`. Auto-prefixes BCH addresses. | + +#### Cosmos -### Cosmos | Method | Path | Description | |--------|------|-------------| -| POST | `/cosmos/sign-amino` | Sign amino message | +| POST | `/cosmos/sign-amino` | Sign generic amino message | | POST | `/cosmos/sign-amino-delegate` | Sign delegation | | POST | `/cosmos/sign-amino-undelegate` | Sign undelegation | | POST | `/cosmos/sign-amino-redelegate` | Sign redelegation | -| POST | `/cosmos/sign-amino-withdraw-delegator-rewards-all` | Sign reward withdrawal | +| POST | `/cosmos/sign-amino-withdraw-delegator-rewards-all` | Claim all staking rewards | | POST | `/cosmos/sign-amino-ibc-transfer` | Sign IBC transfer | -### Osmosis -Same pattern as Cosmos, plus: +#### Osmosis + +All Cosmos amino endpoints plus: + | Method | Path | Description | |--------|------|-------------| -| POST | `/osmosis/sign-amino-lp-add` | Sign LP addition | -| POST | `/osmosis/sign-amino-lp-remove` | Sign LP removal | -| POST | `/osmosis/sign-amino-swap` | Sign swap | +| POST | `/osmosis/sign-amino` | Sign generic amino message | +| POST | `/osmosis/sign-amino-delegate` | Sign delegation | +| POST | `/osmosis/sign-amino-undelegate` | Sign undelegation | +| POST | `/osmosis/sign-amino-redelegate` | Sign redelegation | +| POST | `/osmosis/sign-amino-withdraw-delegator-rewards-all` | Claim all staking rewards | +| POST | `/osmosis/sign-amino-ibc-transfer` | Sign IBC transfer | +| POST | `/osmosis/sign-amino-lp-add` | Add liquidity | +| POST | `/osmosis/sign-amino-lp-remove` | Remove liquidity | +| POST | `/osmosis/sign-amino-swap` | Swap | + +#### THORChain -### THORChain | Method | Path | Description | |--------|------|-------------| | POST | `/thorchain/sign-amino-transfer` | Sign transfer | -| POST | `/thorchain/sign-amino-desposit` | Sign deposit | +| POST | `/thorchain/sign-amino-deposit` | Sign deposit (e.g. LP add, swap) | + +#### Mayachain -### Mayachain | Method | Path | Description | |--------|------|-------------| | POST | `/mayachain/sign-amino-transfer` | Sign transfer | -| POST | `/mayachain/sign-amino-desposit` | Sign deposit | +| POST | `/mayachain/sign-amino-deposit` | Sign deposit | + +#### XRP -### Binance | Method | Path | Description | |--------|------|-------------| -| POST | `/bnb/sign-transaction` | Sign BNB transaction | +| POST | `/xrp/sign-transaction` | Sign XRP transaction | + +#### Solana -### XRP | Method | Path | Description | |--------|------|-------------| -| POST | `/xrp/sign-transaction` | Sign XRP transaction | +| POST | `/solana/sign-transaction` | Sign Solana transaction. Body: `{ raw_tx, addressNList? }` | -## System +### Device Info (auth required) -### Info | Method | Path | Description | |--------|------|-------------| -| POST | `/system/info/get-features` | Get device features/capabilities | -| POST | `/system/info/get-entropy` | Get device entropy | -| POST | `/system/info/get-public-key` | Get public key | -| POST | `/system/info/list-coins` | List supported coins | -| POST | `/system/info/ping` | Ping device | +| POST | `/system/info/get-features` | Device features (snake_case format, 10s cache) | +| POST | `/system/info/get-public-key` | Get xpub. Body: `{ address_n, ecdsa_curve_name?, show_display?, coin_name?, script_type? }` | +| POST | `/system/info/list-coins` | List supported coins (from built-in chain config) | + +### Device Management (auth required) -### Configuration | Method | Path | Description | |--------|------|-------------| -| POST | `/system/apply-settings` | Set label, language, auto-lock, passphrase | -| POST | `/system/apply-policies` | Enable/disable policies | -| POST | `/system/change-pin` | Change or remove PIN | +| POST | `/system/apply-settings` | Set label, passphrase, auto-lock delay | +| POST | `/system/apply-policies` | Enable/disable device policies | +| POST | `/system/change-pin` | Change or remove PIN. Body: `{ remove?: boolean }` | | POST | `/system/clear-session` | Clear device session | -| POST | `/system/wipe-device` | Factory reset | -| POST | `/system/firmware-update` | Update firmware | +| POST | `/system/wipe-device` | Factory reset the device | +| POST | `/system/initialize/reset-device` | Generate new seed. Body: `{ word_count?, label?, pin_protection?, passphrase_protection? }` | +| POST | `/system/initialize/recover-device` | Recover from seed. Body: `{ word_count?, label?, pin_protection?, passphrase_protection? }` | +| POST | `/system/initialize/load-device` | Load seed directly | +| POST | `/system/recovery/pin` | Send PIN during recovery. Body: `{ pin }` | + +### SDK / Multi-Device (auth required) -### Initialization | Method | Path | Description | |--------|------|-------------| -| POST | `/system/initialize/load-device` | Load seed | -| POST | `/system/initialize/recover-device` | Recover from backup | -| POST | `/system/initialize/reset-device` | Reset device | +| GET | `/api/v2/devices` | List connected devices (single-device mode) | +| GET | `/api/v2/devices/active` | Get active device | +| GET | `/api/v2/devices/paired` | Get paired device info | +| POST | `/api/v2/devices/select` | Select device (no-op in single-device mode) | +| GET | `/api/v2/devices/:id` | Get device by ID | +| GET | `/api/portfolio/:device_id` | Device portfolio stub | +| POST | `/api/pubkeys/batch` | Batch derive public keys and addresses. Supports `type: 'address'` for non-UTXO chains and `type: 'xpub'` for UTXO chains. | + +### WalletConnect Reverse Proxy + +Requests to `/wc/*` are reverse-proxied to the WalletConnect dApp origin. This allows the WC panel to load as same-origin content, avoiding mixed-content blocks in WKWebView. GET only, no auth required. + +--- -## BIP44 Paths +## BIP44 Derivation Paths + +Default paths used by KeepKey Vault: + +### UTXO Chains + +| Chain | Path | Coin Type | Script Type | +|-------|------|-----------|-------------| +| Bitcoin | `m/44'/0'/0'/0/0` | 0 | p2pkh (legacy) | +| Bitcoin (SegWit) | `m/49'/0'/0'/0/0` | 0 | p2sh-p2wpkh | +| Bitcoin (Native SegWit) | `m/84'/0'/0'/0/0` | 0 | p2wpkh | +| Litecoin | `m/44'/2'/0'/0/0` | 2 | p2wpkh | +| Dogecoin | `m/44'/3'/0'/0/0` | 3 | p2pkh | +| Dash | `m/44'/5'/0'/0/0` | 5 | p2pkh | +| DigiByte | `m/44'/20'/0'/0/0` | 20 | p2pkh | +| Bitcoin Cash | `m/44'/145'/0'/0/0` | 145 | p2pkh | + +### EVM Chains (all share coin type 60) + +| Chain | Path | Chain ID | +|-------|------|----------| +| Ethereum | `m/44'/60'/0'/0/0` | 1 | +| Polygon | `m/44'/60'/0'/0/0` | 137 | +| Arbitrum | `m/44'/60'/0'/0/0` | 42161 | +| Optimism | `m/44'/60'/0'/0/0` | 10 | +| Avalanche C-Chain | `m/44'/60'/0'/0/0` | 43114 | +| BNB Smart Chain | `m/44'/60'/0'/0/0` | 56 | +| Base | `m/44'/60'/0'/0/0` | 8453 | +| Monad | `m/44'/60'/0'/0/0` | 143 | +| Hyperliquid | `m/44'/60'/0'/0/0` | 2868 | +| Custom EVM chains | `m/44'/60'/0'/0/0` | user-defined | + +All EVM chains derive the same address at a given account index. The firmware receives `coin: 'Ethereum'` for all EVM chains. + +### Cosmos-Family Chains + +| Chain | Path | Coin Type | +|-------|------|-----------| +| Cosmos (ATOM) | `m/44'/118'/0'/0/0` | 118 | +| Osmosis (OSMO) | `m/44'/118'/0'/0/0` | 118 | +| THORChain (RUNE) | `m/44'/931'/0'/0/0` | 931 | +| Mayachain (CACAO) | `m/44'/931'/0'/0/0` | 931 | -Default derivation paths used by KeepKey Vault: +### Other Chains | Chain | Path | Coin Type | |-------|------|-----------| -| Bitcoin | `m/44'/0'/0'/0/0` | 0 | -| Ethereum | `m/44'/60'/0'/0/0` | 60 | -| Cosmos | `m/44'/118'/0'/0/0` | 118 | -| THORChain | `m/44'/931'/0'/0/0` | 931 | -| Osmosis | `m/44'/118'/0'/0/0` | 118 | -| Litecoin | `m/44'/2'/0'/0/0` | 2 | -| Dogecoin | `m/44'/3'/0'/0/0` | 3 | -| Bitcoin Cash | `m/44'/145'/0'/0/0` | 145 | -| Dash | `m/44'/5'/0'/0/0` | 5 | -| Ripple | `m/44'/144'/0'/0/0` | 144 | -| Mayachain | `m/44'/931'/0'/0/0` | 931 | -| Binance | `m/44'/714'/0'/0/0` | 714 | +| Ripple (XRP) | `m/44'/144'/0'/0/0` | 144 | +| Solana (SOL) | `m/44'/501'/0'/0'` | 501 | diff --git a/projects/keepkey-vault/docs/BUILD.md b/projects/keepkey-vault/docs/BUILD.md index c02922d..f99bb00 100644 --- a/projects/keepkey-vault/docs/BUILD.md +++ b/projects/keepkey-vault/docs/BUILD.md @@ -1,10 +1,10 @@ -# KeepKey Vault v11 - Build & Distribution Guide +# KeepKey Vault — Build & Distribution Guide ## Overview KeepKey Vault is built with [Electrobun](https://electrobun.dev) — a desktop framework using Bun as the main process and the system WebView for the UI. The build pipeline produces a signed, notarized macOS DMG. -**Architecture**: Vite (frontend) + Bun.build (backend) + Electrobun (packaging) + Apple codesign/notarize +**Architecture**: Vite (frontend) → Bun.build (backend) → collect-externals (native deps) → Electrobun (packaging) → prune-app-bundle (post-build dedup) → DMG (distribution) ## Quick Start @@ -12,7 +12,7 @@ KeepKey Vault is built with [Electrobun](https://electrobun.dev) — a desktop f # Development (from monorepo root) make dev -# Full signed production build +# Full signed production build → DMG make build-signed ``` @@ -22,9 +22,9 @@ make build-signed - **Yarn** (for hdwallet monorepo) - **Xcode Command Line Tools** (`xcode-select --install`) - **Apple Developer ID** certificate in Keychain (for signing) -- **zstd** (`brew install zstd`) — for DMG extraction +- **zstd** (`brew install zstd`) — for tar.zst extraction -### Environment Variables (Signing Only) +### Environment Variables (Signing) Create a `.env` file in the monorepo root: @@ -39,20 +39,22 @@ ELECTROBUN_APPLEIDPASS="app-specific-password" ## Build Pipeline -The full `make build-signed` pipeline executes these stages in order: +The full `make build-signed` pipeline runs: `build-stable` → `prune-bundle` → `dmg`. ### Stage 1: Module Builds (`make modules-build`) Builds local submodule dependencies from source: -1. **proto-tx-builder** (`modules/proto-tx-builder/`): `bun install && bun run build` (TypeScript → dist/) +1. **proto-tx-builder** (`modules/proto-tx-builder/`): `bun install && bun run build` 2. **hdwallet** (`modules/hdwallet/`): `yarn install && yarn build` (lerna monorepo, ~6s) These are referenced as `file:` dependencies in `package.json`. +> **CRITICAL**: hdwallet must be on `master` (or `vault-v1` branch) which has the lodash/rxjs removal commit (`179c5668`). Without this, the build scripts correctly strip lodash/rxjs but the code still imports them → runtime crash. + ### Stage 2: Vault Install (`bun install`) -Installs all dependencies. The `postinstall` hook runs `scripts/patch-electrobun.sh` to patch Electrobun's zip handling (see [ENOBUFS Workaround](#enobufs-workaround) below). +Installs all dependencies. The `postinstall` hook runs `scripts/patch-electrobun.sh` to patch Electrobun's zip handling (see [ENOBUFS Workaround](#enobufs-workaround)). ### Stage 3: Vite Build (`vite build`) @@ -60,30 +62,32 @@ Builds the React frontend (Chakra UI 3.0) from `src/mainview/` into `dist/`. **Critical**: `base: './'` in `vite.config.ts` generates relative asset paths. Without this, assets fail to load under Electrobun's `views://` protocol (absolute paths like `/assets/...` resolve to the wrong origin). -Output: -- `dist/index.html` — entry point -- `dist/assets/` — JS/CSS chunks - ### Stage 4: Collect Externals (`bun scripts/collect-externals.ts`) -Native addons and protobuf packages can't be bundled by Bun — they're marked `external` in `electrobun.config.ts`. This script collects them and all transitive dependencies into `build/_ext_modules/` for inclusion in the app bundle. +Native addons and protobuf packages can't be bundled by Bun — they're marked `external` in `electrobun.config.ts`. This script collects them into `build/_ext_modules/`. **What it does**: -1. Walks the dependency tree of all EXTERNALS (~274 packages) -2. Copies each package from `node_modules/` to `build/_ext_modules/` -3. Strips ALL nested `node_modules/` (forces flat resolution, removes devDep bloat) -4. Prunes docs, tests, source maps, `.d.ts`, TypeScript source, C/C++ build artifacts -5. Removes non-macOS prebuilds (linux, win32) -6. Strips large directories (protobufjs/cli, rxjs/dist/bundles, ethers/dist, etc.) -7. Code-signs all `.node`, `.dylib`, `.so` native binaries (if `ELECTROBUN_DEVELOPER_ID` is set) -**Bundle size**: ~54MB on disk (~274 packages, ~5700 files) +1. **Dependency tree walk**: Collects all transitive deps from the EXTERNALS list, filtering out ~100 dev-time packages via DEV_BLOCKLIST (jest, babel, istanbul, ts-proto, etc.) +2. **Copy**: Each package from `node_modules/` → `build/_ext_modules/` +3. **Version-aware nested dedup**: Discovers nested `node_modules/` in each package: + - **Same version as top-level** → skip (duplicate) + - **Different version** → copy to `pkg/node_modules/nested-pkg` (required by parent) + - Also collects the nested package's own deps at top-level +4. **@keepkey/* cleanup**: Strips `node_modules/` from `@keepkey/*` packages (lerna monorepo artifacts from `file:` resolution — all their deps are already at top-level) +5. **Prune**: Removes docs, tests, `.d.ts`, source maps, TypeScript source, C/C++ build artifacts, non-macOS prebuilds +6. **Directory strip**: Removes known-large unnecessary directories (protobufjs/cli, ethers/dist, etc.) +7. **Banned package removal**: Recursively removes `node-notifier`, `growly`, `is-wsl` (contain unsigned macOS binaries that break notarization) +8. **Code signing**: Signs all `.node`, `.dylib`, `.so` binaries AND extensionless Mach-O binaries with Apple Developer ID -> **Why strip nested `node_modules`?** Bun copies `file:` deps with their own `node_modules/`, creating 64MB+ of duplicated packages including dev tools (`jest`, `node-notifier`) with unsigned Mach-O binaries that break Apple notarization. +**Bundle size**: ~38MB on disk (~237 packages) + +> See [collect-externals-guide.md](collect-externals-guide.md) for safety rules and debugging. +> See [retro-noble-hashes-breakage.md](retro-noble-hashes-breakage.md) for why blind nested stripping is dangerous. ### Stage 5: Electrobun Build (`bun scripts/build-signed.ts stable`) -Runs `electrobun build --env=stable` with a custom `scripts/zip` shim on PATH (see [ENOBUFS Workaround](#enobufs-workaround)). +Runs `electrobun build --env=stable` with a custom `scripts/zip` shim on PATH. Electrobun: 1. Bundles the Bun backend (`src/bun/index.ts` → single JS file) @@ -93,22 +97,78 @@ Electrobun: - `build/_ext_modules` → `node_modules` 3. Code-signs all Mach-O binaries in the `.app` bundle 4. Notarizes the `.app` with Apple -5. Produces a `.app.tar.zst` artifact +5. Produces a `.app.tar.zst` artifact in `artifacts/` + +### Stage 6: Prune App Bundle (`make prune-bundle`) + +`scripts/prune-app-bundle.ts` operates on the final `.app.tar.zst` — a second pass that catches anything collect-externals missed: + +1. Extracts the tar.zst → temporary `.app` directory +2. **Version-aware nested dedup** (same logic as collect-externals): only removes nested deps whose version matches top-level +3. Prunes `.d.ts`, `.ts`, `.map`, `README`, `CHANGELOG`, `LICENSE` files +4. Strips known large directories (protobufjs, ethers, libsodium ESM, etc.) +5. Re-signs all native `.node` binaries +6. **Re-signs the entire `.app` with `entitlements.plist`** — JIT, unsigned executable memory, dyld env vars, and library validation bypass (all required for Bun runtime) +7. Repackages into tar.zst + +> **CRITICAL**: The `entitlements.plist` step was added in v1.0.1. Without it, macOS Sequoia kills the Bun process on launch (hardened runtime blocks JIT which Bun requires). -### Stage 6: DMG Creation (`make dmg`) +### Stage 7: DMG Creation (`make dmg`) -Creates a distributable DMG from the notarized app: +Creates a distributable DMG from the pruned app: 1. Extracts `.app` from the `.app.tar.zst` archive 2. Verifies codesign on extracted app 3. Creates a DMG with `hdiutil` (UDZO compression) -4. Signs the DMG itself +4. Signs the DMG 5. Notarizes the DMG with Apple -6. Staples the notarization ticket to the DMG +6. Staples the notarization ticket + +**Output**: `artifacts/KeepKey-Vault-{VERSION}-{ARCH}.dmg` (~52MB) + +> **Why not use Electrobun's built-in DMG?** Electrobun's zig-zstd self-extractor has a bug where binary files aren't extracted properly on macOS Sequoia. The custom DMG pipeline works around this. + +## Signing Deep Dive + +### What Gets Signed and When + +The build has **three signing passes** to satisfy Apple notarization: + +| Pass | Script | What | Why | +|------|--------|------|-----| +| 1 | `collect-externals.ts` | All `.node`, `.dylib`, `.so`, extensionless Mach-O binaries in `build/_ext_modules/` | Native addons must be signed before Electrobun packages them | +| 2 | `prune-app-bundle.ts` | All native binaries in the extracted `.app` | Re-sign after pruning modifies the bundle | +| 3 | `prune-app-bundle.ts` | The entire `.app` bundle with `--entitlements entitlements.plist` | Hardened runtime + JIT entitlements for Bun | -**Output**: `artifacts/KeepKey-Vault-{VERSION}-{ARCH}.dmg` (~100MB) +### Entitlements (`entitlements.plist`) -> **Why not use Electrobun's built-in DMG?** Electrobun's zig-zstd self-extractor has a bug where binary files aren't extracted properly. The custom DMG pipeline works around this by extracting from the tar.zst and creating a standard macOS DMG. +```xml +com.apple.security.cs.allow-jit +com.apple.security.cs.allow-unsigned-executable-memory +com.apple.security.cs.disable-library-validation +com.apple.security.cs.allow-dyld-environment-variables +``` + +All four are required. Missing `allow-jit` causes the app to be killed immediately on macOS Sequoia. + +### Extensionless Mach-O Detection + +Some packages ship binary executables without file extensions. `collect-externals.ts` detects these by reading the first 4 bytes and checking for Mach-O magic numbers: + +- `0xFEEDFACE` / `0xFEEDFACF` — 32/64-bit Mach-O +- `0xCEFAEDFE` / `0xCFFAEDFE` — Reverse byte order +- `0xCAFEBABE` — Universal binary + +Unsigned Mach-O binaries cause notarization to fail with a cryptic error. + +### Common Signing Failures + +| Symptom | Cause | Fix | +|---------|-------|-----| +| Notarization rejects with "unsigned binary" | Nested `node_modules/` contains unsigned Mach-O | Check banned packages list, run `find` for unsigned binaries (see Troubleshooting) | +| App killed on launch (no error) | Missing JIT entitlement | Verify `entitlements.plist` is applied in `prune-app-bundle.ts` | +| `codesign: resource fork, Finder information, or similar detritus not allowed` | `.DS_Store` or extended attributes in bundle | Add `xattr -cr` step before signing | +| Stapling fails after notarization succeeds | Network issue or Apple CDN delay | Retry `xcrun stapler staple` after a few minutes | ## Makefile Targets @@ -119,8 +179,11 @@ Creates a distributable DMG from the notarized app: | `make dev-hmr` | Dev with Vite HMR (hot module reload) | | `make build` | Development build (no signing) | | `make build-stable` | Production build with signing + notarization | -| `make build-signed` | Full pipeline: build → DMG → sign → notarize → staple | +| `make build-signed` | Full pipeline: build → prune → DMG → sign → notarize → staple | +| `make prune-bundle` | Prune app bundle (version-aware dedup, strip bloat, re-sign with entitlements) | | `make dmg` | Create DMG from existing build artifacts | +| `make upload-dmg` | Upload signed DMG to existing CI-created draft release | +| `make release` | Full release: build-signed + create new GitHub release | | `make modules-build` | Build hdwallet + proto-tx-builder from source | | `make modules-clean` | Clean module build artifacts | | `make audit` | Generate dependency manifest + SBOM | @@ -136,48 +199,55 @@ Creates a distributable DMG from the notarized app: | `--env=canary` | Pre-release testing | Signed + notarized | | `--env=stable` | Production release | Signed + notarized | +## CI / Release Workflow + +### Linux (CI — GitHub Actions) + +CI builds Linux x64 only (`.github/workflows/build.yml`). macOS and Windows are built locally because: +- macOS requires Apple Developer ID in Keychain (can't run in CI without self-hosted runner) +- Windows Electrobun support is experimental (D:\ drive path bug) + +### macOS Release (Local) + +```bash +# Option A: Full release (build + create GitHub release) +make release + +# Option B: Upload to existing CI draft release +make build-signed # Build locally +make upload-dmg # Upload DMG to CI's draft release +``` + +`make upload-dmg` also uploads `stable-*-update.json` and `stable-*.app.tar.zst` if present (for Electrobun auto-updates). + ## Known Workarounds ### ENOBUFS Workaround -Electrobun's compiled Zig CLI invokes `zip` via Bun's `execSync` with a 1MB `maxBuffer`. With ~5700+ files in the app bundle, the zip output exceeds this buffer causing `ENOBUFS`. +Electrobun's compiled Zig CLI invokes `zip` via Bun's `execSync` with a 1MB `maxBuffer`. With ~5700+ files, zip output exceeds this buffer → `ENOBUFS`. **Two-layer fix**: -1. **`scripts/zip`** — A shim that intercepts zip calls and adds `-q` (quiet flag) to suppress per-file output +1. **`scripts/zip`** — Shim that adds `-q` (quiet) to suppress per-file output 2. **`scripts/build-signed.ts`** — Prepends `scripts/` to PATH so the shim is found before `/usr/bin/zip` 3. **`scripts/patch-electrobun.sh`** — Patches Electrobun's CLI source to add `-q` and increase `maxBuffer` to 50MB (runs as `postinstall`) ### Vite `base: './'` -Electrobun serves WebView content via the `views://` protocol from `Contents/Resources/app/views/mainview/`. Vite's default `base: '/'` generates absolute paths (`/assets/index.js`) which resolve to `views://assets/` instead of `views://mainview/assets/`. Setting `base: './'` generates relative paths (`./assets/index.js`) that resolve correctly. - -### Nested `node_modules` Stripping - -Bun's `file:` dependency resolution copies the entire local package directory including its own `node_modules/`. These nested copies contain: -- Duplicated packages (hdwallet-core 5.4MB x4, rxjs, cosmjs, etc. = ~64MB) -- Dev dependencies (jest, babel, node-notifier with unsigned Mach-O binaries) - -The `collect-externals.ts` script strips ALL nested `node_modules/` and relies on the flat top-level resolution instead. +Electrobun serves WebView content via `views://` protocol. Vite's default `base: '/'` generates absolute paths (`/assets/index.js`) which resolve to `views://assets/` instead of `views://mainview/assets/`. Setting `base: './'` fixes this. -### `src/` Not Pruned +### Version-Aware Nested Dedup (v1.0.1 Fix) -Many packages (e.g., `bip32`) set `"main": "./src/index.js"` — their published artifact IS the `src/` directory. The prune step explicitly preserves `src/` directories. +**Problem (v1.0.0)**: Blind stripping of ALL nested `node_modules/` killed `@noble/hashes@1.4.0` (required by `ethereum-cryptography@2.2.1`), while top-level had `@noble/hashes@1.8.0` with incompatible API changes. App crashed silently inside Electrobun's Worker before any window opened. -## Native Binary Signing +**Fix**: Both `collect-externals.ts` and `prune-app-bundle.ts` now compare `package.json` versions: +- Same version as top-level → safe to remove (duplicate) +- Different version → MUST keep (parent needs this specific version) -Apple notarization requires ALL Mach-O binaries to be signed with a Developer ID certificate and hardened runtime. The `collect-externals.ts` script signs: -- `.node` files (native addons: node-hid, usb, tiny-secp256k1, keccak, etc.) -- `.dylib` files -- `.so` files +See [retro-noble-hashes-breakage.md](retro-noble-hashes-breakage.md) for the full incident report. -Approximately 17 native binaries are signed during the collect step. +### DEV_BLOCKLIST -## Security & Audit - -Run `make audit` to generate: -- `artifacts/deps.runtime.json` — All runtime dependencies with versions and sizes -- `artifacts/deps.install-scripts.txt` — Packages with install scripts (security review) -- `artifacts/sbom.cdx.json` — CycloneDX Software Bill of Materials +`collect-externals.ts` maintains a blocklist of ~100 dev-time packages (jest, babel, istanbul, ts-proto, etc.) that get pulled into the dependency tree via `file:` resolution of hdwallet/proto-tx-builder. Without the blocklist these add ~50MB of test infrastructure to the production bundle. ## Troubleshooting @@ -189,14 +259,20 @@ cat scripts/zip # Should contain: exec /usr/bin/zip -q "$@" ``` ### Notarization fails with "unsigned binary" -A nested `node_modules/` contains an unsigned Mach-O binary. Run: +A nested `node_modules/` or banned package contains an unsigned Mach-O binary: ```bash -# Find unsigned binaries in the build find build/_ext_modules -type f | while read f; do file "$f" | grep -q "Mach-O" && ! codesign -v "$f" 2>/dev/null && echo "UNSIGNED: $f" done ``` -Fix: ensure `collect-externals.ts` strips nested `node_modules/` and signs all native binaries. +Fix: add the package to `BANNED_PACKAGES` in `collect-externals.ts` or ensure the signing loop catches it. + +### App killed immediately on macOS Sequoia (no error) +Missing JIT entitlement. Verify: +```bash +codesign -d --entitlements :- /path/to/KeepKey\ Vault.app +``` +Should show `com.apple.security.cs.allow-jit`. If missing, check that `prune-app-bundle.ts` applies `entitlements.plist`. ### UI doesn't render (blank window) Check `vite.config.ts` has `base: './'`. Verify in `dist/index.html` that asset paths are relative (`./assets/...`), not absolute (`/assets/...`). @@ -209,23 +285,43 @@ Run from terminal to see the error: ```bash /path/to/KeepKey\ Vault.app/Contents/MacOS/launcher ``` +Or bypass Electrobun's Worker isolation entirely: +```bash +cd build/dev-macos-arm64/keepkey-vault-dev.app/Contents/MacOS +timeout 10 ./bun ../Resources/app/bun/index.js 2>&1 +``` + +### Bundle too large +Run `du -sh build/_ext_modules/` (expected ~38MB). Check collect-externals output for "Keeping nested" lines. Consider `package.json` `overrides` to align versions. + +## Security & Audit + +Run `make audit` to generate: +- `artifacts/deps.runtime.json` — All runtime dependencies with versions and sizes +- `artifacts/deps.install-scripts.txt` — Packages with install scripts (security review) +- `artifacts/sbom.cdx.json` — CycloneDX Software Bill of Materials ## File Reference ``` projects/keepkey-vault/ - electrobun.config.ts # Electrobun app config (externals, copy rules, signing) - vite.config.ts # Vite frontend build config (base: './') - package.json # Dependencies and build scripts + electrobun.config.ts # Electrobun app config (externals, copy rules, signing) + vite.config.ts # Vite frontend build config (base: './') + package.json # Dependencies and build scripts + entitlements.plist # macOS entitlements (JIT, unsigned memory, dyld, library validation) scripts/ - collect-externals.ts # Native module collector + pruner + signer - build-signed.ts # Electrobun build wrapper with zip shim - patch-electrobun.sh # Patches Electrobun CLI for large bundles - zip # Quiet zip shim (prevents ENOBUFS) - audit-deps.ts # Dependency audit + SBOM generator - artifacts/ # Build output (gitignored) - KeepKey-Vault-*.dmg # Signed, notarized DMG - *.app.tar.zst # Electrobun compressed app - deps.runtime.json # Dependency manifest - sbom.cdx.json # CycloneDX SBOM + collect-externals.ts # Native module collector + pruner + signer (DEV_BLOCKLIST, version-aware dedup) + prune-app-bundle.ts # Post-build pruner on .app.tar.zst (version-aware dedup + entitlements re-sign) + build-signed.ts # Electrobun build wrapper with zip shim + patch-electrobun.sh # Patches Electrobun CLI for large bundles + zip # Quiet zip shim (prevents ENOBUFS) + audit-deps.ts # Dependency audit + SBOM generator + artifacts/ # Build output (gitignored) + KeepKey-Vault-*.dmg # Signed, notarized DMG + *.app.tar.zst # Electrobun compressed app (post-prune) + deps.runtime.json # Dependency manifest + sbom.cdx.json # CycloneDX SBOM + docs/ + collect-externals-guide.md # Safety rules for collect-externals changes + retro-noble-hashes-breakage.md # v1.0.0 crash incident report ``` diff --git a/projects/keepkey-vault/docs/ELECTROBUN.md b/projects/keepkey-vault/docs/ELECTROBUN.md index 20f55b3..6bd9b6a 100644 --- a/projects/keepkey-vault/docs/ELECTROBUN.md +++ b/projects/keepkey-vault/docs/ELECTROBUN.md @@ -32,12 +32,15 @@ Communication between processes uses Electrobun's typed RPC system (`electrobun/ ## Build Pipeline ``` -src/mainview/ ──[vite build]──> dist/ ──[electrobun build]──> build/dev-macos-arm64/keepkey-vault-dev.app +src/mainview/ ──[vite build]──> dist/ + └──[collect-externals]──> build/_ext_modules/ + └──[electrobun build]──> .app ``` ### Production ```bash -make build-prod # Creates production-signed app bundle +make build-stable # Production build with signing + notarization +make build-signed # Full pipeline: build → prune → DMG → sign → notarize ``` ## Config Files @@ -58,12 +61,18 @@ make build-prod # Creates production-signed app bundle | Config | electron-builder/forge | `electrobun.config.ts` | | Asset loading | `file://` protocol | `views://` protocol | +## Entitlements (macOS Production) + +Production builds require `entitlements.plist` with JIT, unsigned executable memory, library validation bypass, and dyld env vars. These are needed because Bun uses JIT compilation. Without them, macOS Sequoia kills the process immediately. + +The `prune-app-bundle.ts` script applies entitlements during the re-signing step. + ## Troubleshooting ### ENOENT launcher error The `electrobun build` step must run before `electrobun dev`. The dev script handles this: ```json -"dev": "vite build && electrobun build && electrobun dev" +"dev": "vite build && bun scripts/collect-externals.ts && electrobun build && electrobun dev" ``` ### HMR not working @@ -73,3 +82,4 @@ Ensure Vite dev server is running on port 5173. Use `make dev-hmr` which starts Check browser console in the WebView. Common causes: - Missing `dist/` output (run `vite build` first) - Build copy paths wrong in `electrobun.config.ts` +- Most common cause: `vite.config.ts` missing `base: './'`. Absolute paths like `/assets/...` break under the `views://` protocol. diff --git a/projects/keepkey-vault/docs/collect-externals-guide.md b/projects/keepkey-vault/docs/collect-externals-guide.md index 7f0d1c8..43bd979 100644 --- a/projects/keepkey-vault/docs/collect-externals-guide.md +++ b/projects/keepkey-vault/docs/collect-externals-guide.md @@ -6,13 +6,15 @@ ## How It Works -1. **Dependency collection**: Walks `package.json` `dependencies` recursively from the EXTERNALS list +1. **Dependency collection**: Walks `package.json` `dependencies` recursively from the EXTERNALS list, filtering out ~100 dev packages via DEV_BLOCKLIST (jest, babel, istanbul, ts-proto, etc.) 2. **Copy**: Copies each package from `node_modules/` to `build/_ext_modules/` -3. **Prune**: Removes docs, tests, source maps, TypeScript declarations -4. **Native cleanup**: Removes non-macOS prebuilds, C/C++ source, build artifacts -5. **Nested dedup**: Strips nested `node_modules/` that duplicate top-level versions (keeps version-differing deps) -6. **Directory strip**: Removes known-large unnecessary directories (protobufjs/cli, ethers/dist, etc.) -7. **Code signing**: Signs all `.node` binaries with Apple Developer ID (for notarization) +3. **@keepkey/* cleanup**: Strips `node_modules/` from `@keepkey/*` packages (lerna monorepo artifacts from `file:` resolution) +4. **Version-aware nested dedup**: Copies nested `node_modules/` where versions differ from top-level; skips same-version duplicates +5. **Prune**: Removes docs, tests, source maps, TypeScript declarations +6. **Native cleanup**: Removes non-macOS prebuilds, C/C++ source, build artifacts +7. **Directory strip**: Removes known-large unnecessary directories (protobufjs/cli, ethers/dist, etc.) +8. **Banned package removal**: Recursively removes `node-notifier`, `growly`, `is-wsl` (contain unsigned macOS binaries that break notarization) +9. **Code signing**: Signs all `.node`, `.dylib`, `.so` binaries AND extensionless Mach-O binaries (detected by reading first 4 bytes for magic numbers) with Apple Developer ID ## Critical Safety Rules @@ -74,11 +76,11 @@ grep -r "require.*PACKAGE_NAME" build/_ext_modules/ | grep -v node_modules/PACKA ### Symptom: Notarization fails on `.node` binaries -`collect-externals.ts` signs native binaries. Ensure `ELECTROBUN_DEVELOPER_ID` and `ELECTROBUN_TEAMID` env vars are set. Check that nested `node_modules/` don't contain unsigned binaries from devDependencies. +`collect-externals.ts` signs native binaries. Ensure `ELECTROBUN_DEVELOPER_ID` and `ELECTROBUN_TEAMID` env vars are set. Check that nested `node_modules/` don't contain unsigned binaries from devDependencies. Also check that `BANNED_PACKAGES` list in the script covers packages with unsigned Mach-O binaries (e.g., `node-notifier` ships `terminal-notifier.app`). ### Symptom: Bundle too large -Run `du -sh build/_ext_modules/` and compare to expected (~60MB). Check the collect-externals output for "Keeping nested" lines — version-differing deps may contain duplicated large packages. Consider adding overrides in `package.json` to align versions. +Run `du -sh build/_ext_modules/` and compare to expected (~38MB). Check the collect-externals output for "Keeping nested" lines — version-differing deps may contain duplicated large packages. Consider adding overrides in `package.json` to align versions. ## Version Conflict Audit From 1991df4ab1ba4a70ba9ff4ff070c72723ab4ac17 Mon Sep 17 00:00:00 2001 From: highlander Date: Fri, 27 Feb 2026 11:51:18 -0700 Subject: [PATCH 04/10] feat: track unsigned Solana firmware binary and add to manifest - Remove unsigned/*.bin from .gitignore (unsigned builds should be tracked) - Add firmware.keepkey.solana-8acfd898.bin (523KB, Ed25519 support) - Add payload hash to firmware_hashes for analyzeFirmware() detection - Add unsigned_firmware section to manifest with full + payload hashes Co-Authored-By: Claude Opus 4.6 --- firmware/.gitignore | 1 - firmware/manifest.json | 10 ++++++++++ .../firmware.keepkey.solana-8acfd898.bin | Bin 0 -> 535320 bytes 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100755 firmware/unsigned/firmware.keepkey.solana-8acfd898.bin diff --git a/firmware/.gitignore b/firmware/.gitignore index 4a7f6a6..5bfb15e 100644 --- a/firmware/.gitignore +++ b/firmware/.gitignore @@ -1,5 +1,4 @@ # Firmware binaries — download via `make firmware-download` signed/*.bin -unsigned/*.bin # Keep directory structure !.gitkeep diff --git a/firmware/manifest.json b/firmware/manifest.json index 3e655ae..6c45918 100644 --- a/firmware/manifest.json +++ b/firmware/manifest.json @@ -39,7 +39,17 @@ "e6685ab14844d0a381d658d77e13d6145fe7ae80469e5a5360210ae9c3447a77": "2.1.3", "fe98454e7ebd4aef4a6db5bd4c60f52cf3f58b974283a7c1e1fcc5fea02cf3eb": "2.1.4" }, + "unsigned_firmware": { + "solana": { + "version": "7.10.0-solana", + "filename": "firmware.keepkey.solana-8acfd898.bin", + "sha256_payload": "8ad2ecd35ad0d9714a3592edfaa6343c0c7c63dc33677907cd8eb9ffb4f8bea7", + "sha256_full": "0906d9343c1a971b069715d84b78b4fce4ff4ba095e2b63ca7de18e6dd60a686", + "note": "Unsigned firmware with Solana (Ed25519) support — requires bootloader policy override" + } + }, "firmware_hashes": { + "8ad2ecd35ad0d9714a3592edfaa6343c0c7c63dc33677907cd8eb9ffb4f8bea7": "7.10.0-solana", "958764cf3baa53eec0002eab9c54e02ce6f5fdab71e7efbbe723f958e26ff419": "7.10.0", "24cca93ef5e7907dc6d8405b8ab9800d4e072dd9259138cf7679107985b88137": "7.9.3", "9e691874bb6966aa0616d36b60489b82fab166d96e5166518eaa3e11468bf6a8": "7.9.1", diff --git a/firmware/unsigned/firmware.keepkey.solana-8acfd898.bin b/firmware/unsigned/firmware.keepkey.solana-8acfd898.bin new file mode 100755 index 0000000000000000000000000000000000000000..6968d1ef3607c1c85090b350aaa670e23a02221c GIT binary patch literal 535320 zcmd?Sd3aPs_BVcS_w6NnNPvWF-0mjONmx3BKuAzJ30!(%6>&gZg17`xjNlT{kp>YX zZovdZaY1oOKp;(sLyHg`Tt}JdR!31s#kE;nszWfh_xDq`yOV}-=KX!2_xb(tK5w3< za_iQuTXpK3Q>RXyb8fYDu60p%v6{gjOaJ}9_9ynS{41PNed-65TJe_z^|wl;bfx(V zap6)a)v9PYz0ySM{r{Cp6$7wb*oP(#&I_OY-*&I+O0wqGvn_K7Bj?HM;R0d^E3G;8 z?6%8|w2XBYkTkEn<4Tb`Q$VhLoziSo*D$L>NEKr5rICQ26OP!YkdOSVzzZ6Z>TR;8 zU(m|WqE09k^g@zF)^X@$gK-LZ_kb#{&M&Ub$PuCr!eWgE>sLn^q>`JxH`90ha z>ysy62Yx#{cs(!hT0aNj#&gZ-M<^ulnm*)P}KcXn`70eM3#AgO^$veGxo znq8Mq#(Q6_QM>YqK}^w?9&hd}HW!=n2^-+}0`g*j(IskCno*_#@B!?8_NSMWw zCjvSXPqv3LNFXf7{bKsxbt}op;MeZRnE&~cN*zFtM_-z9xrpnKRJHmf zuJb}Fbs=!tjPxFo8|i+TQoRG$vq(wLCaR4hSJG7DcQwoamTl=oo~CjQH8J%}z3ps5 zlZ>|kADO1XX7GqC+;=jZVahaTTB=A{DBNcbhupWmmTXFnKK(q5S_~`51i8Qo3PCBT z1e>r{SSQ>ktQY2x@Wmmw`WNN|<~+}cEYDxT@TUA!^@l0vOMx+`$eaSgr7=#0>$kIN zn@nIlBV^o(-_9mTc}A9LR@d!2Nz%R%O&u9#m&k1APmwhGPI9;Hth$N9o?=Qdvvnz^ zIfP}|x;4bcBv~@+<;KjqL~vueF}u#jC!n2%8Dfa#0l^ZAL)*6$KAW+ZmQ7)e9MWJU zJn#Rr@hP;W+RVE7_1U#^>k`e0^^v~Uq3?C*`_M@;M~R*p^sK;jZ8eL2XnV9TscosB zNR$8j@uu{T*U*vtAI7VS_Cx!nBW{=xh>nZ$1Ra;uFYU66)g+rL$x=U^?MeS%p=TI1 zW29~V5&UaUvuuWmt^4nEqco#66D))3=8(Ty)&F5E4KsQHGeM$!%z+=937aN&%KLE{ z4}+|~6qLg_<-%aRvHmp2-G5r4*l=2@eBiW7)pS~|e(-cc0_`_N>bID%iIi_Bw}8*q z$vnJ_Qt%rw`$P*#NRzo(NgjZ5U~8qCLkfn&ke!szC}&cRGiqw`I59%?vfwPcu+Ai$5uc({0&x4$ga=5E4TR(vB8i}t_}{;-6v#>dPK}N z94*`}=FH73=LKc^?tQz(yt>_DLBnp5Z^$S4fxwvGT$vMJ+jsHU(=L*n9dt}9<|LWG4?!SyA%H( zwmny(JkDtg+7qW`h{>aA4L$#q$nc$ha<;U1aJNdM)_l3IblQXa6eYXG!E<+u8R;p< zw~7pN)T5BI`Y-n_cgplPI~o1Wt}{8PVOWF}f!mc&)P4%3Z>-v*RwsJc#MfMz<-7OE zr&f;%?`wBmTqqyOj*{t)Xc-MJ96QBaM&)SM!2O@{iPv9z-o3|v(ZD_GpYq4Oe_cNL z7We;*wRd|y`5gBrdCN< z-I7n5e2VCM3cUA_^j?$g1<&>JFZU&vsE$|nl(HJ1{Oobny`S7%e6Le#%Ye3cW?c4H zrQ?{h8*GWXTq0+m@Si<) z?JAUwOx2lUv;}W`>7zU)A2}vknomCR<)2sMZ$56|etwlMpSXz{jxLN*wdS_VYW{c!5%n6p!HMwQTGa5QW*0~oAKj&t2 z!-PM(Go$=Nd8hiJB=vCUIJx!mD8IbyozrVuWz+(K@vJVa$)WW3DbT;XUpLDq)d2<7 z&HS_tRaZ*CE>}Qa_VeWOpxVj`1DX*Fi1h(R%b8*tUH9t|T|x1yit=ssR$;hxLr0o0 z1lpY<3dvpG0|v1u>_7M*sSFC?s6C&& z<73W)d~Fo+biW*PhiwscH3HLO#=Md5$|K*0Q_ridkJk43BDKHORSHF@%e2tiABHhv zjC7hrulSKJ^Q-7c@1yi0T?K$RxgXOiz`ILS;QtZmneX^mKA$WK=933~*;3ydqc~PZ z`#$LVyM*IX3CF-KdVVaNPc{YS^sZj15me9#|KX(^6AytN5RgN({~xiZqIfF;6jYm! z&|3vO&Gm7B;yQ5-;Sv;7LsJ)!I{?!?z9dkX(i_yqN|kJ*Jb5&a;;T}p5wb1%C~zqr_mU%FEOIr!iKN(V}V z(Q&++EM!4H&L@vZ^X-MO0{Oo{yEx>f+)H`4-kTzE#Pldf#CUg~_k7-s;Q0Pf?s>Hh zQU2K$t^Kf0EA7l8yt^VqSKx5p>~Mv|!{3P)a*!%Yk%-Jm?3X#JKbWhY=-x5h_pr1N z`%h!dlEyk(8f!JiI-`HAJ>nmab;=)(HSIr)wJ=(H`*~v(gORZw4@Jg$)4z>%lXqag z0`}?>t4i3=FJ+P;W1x403dnC_J~sG zFvp(|BXTrGQC0Mf_xs<_3X@SkLZhdnaNiS($eHwigS*@tk*G2Lssw+f2+jSooJ#UX z0Cx-EzBNSW{KaAsc4ztIWznaXeV$KdLt@S$gA=6r-keX?i-$1p(+%0vVzM4`fQiZb z+eM#_GuZY~XqYI{@2^=e>gTQ(4Rfzwx?ZfDn@V)yVOmz;JXK5;Vg2jH3G?#F z1AeQS*LKuocjHMTAPJ&HfariPl_>Fq1@t!>QVHYN;MoXM71`xu3)hRysQ+?kz4!zA--LdT zp#P`ltrve}(ufK9pHRLHtq(<=lgPVKXK0v1Yp0mOrWeK2hBT4~tH$+Vc>zX?@@GpE zt#66j*?1i$kGvBe#LJ_WBG_jRGu>nv!&6?Twv6AOOH?nuk>US^r0NVN-pdh&MW${{>341{~@l0mGDmSuj-0l3(m*pFR%~D%`trL zl*SeUom5@_d3+y-V)Z|Y;v%gd7b>C;CX!3UEb?kFnLO+tLaz5-NWsn!7uRQl)W(qQ zbboes1}99hGMeh1g)6H}FNm-Rf_|qOHeW6u+)J9E-9M{ZopAGwzE*%EfijNzo@5L1{u>iha@>W9qUmh+8xsST-l zC)WQZ_21Vo&e>IS;`5?uR~2Dfua)@~+hu-sliE;8Rt4B{apKSJt0&vfrLGY_G6*U^ zyEcbB=I?P+exh{B2M$DB-}@>_Esjl6ldjR$2Rk_Mj7rj@QpsC^M*Aqhrs~(x^I*SZ zd7U|dj@%gTd;c)s$k^)|cQjIKYfI;ndhKeN{hHM~R?7%0liR;vU3j;gu<{f;=Sfk# zye1Xb;mTIgc;pT29av|pSbd~btZC@Be~F`LyyDQSW+ z2oAdvptagGAGp5}lTZ94jb$pvab#2iL%PZVe+>F&@lpdP?6NnD3k)sxRM>J)IL2Hs zmY0J`d{O^cmL5(e)_}>bi>vjs3;TKVFK%g+^_tbJeaY$~tgTqcZbW}VVL^5$0Y(*AKTID%1Pr0l)SW)*oNNN06y zly+&9--ziazKz;&S73~>ae{BFvxMOm8*J|x_3YzV&1CsPlAY0&)ENZ>c@kQ?!6E0f zz_s3>g4FtwPO#8F2V2s}o!F_RJCgVeGjY#$q|c0(NonBe{2(*#tg}R*`m5SxAoH;L zGy2o61YTwS%*_iD$4B>P_X8$azW66`bs|A8n(>Xe_4(_q&w`6;uq?r`%d;XA$yzR3I3mpsM>YZ^#o-4>#j^~BRSj8Eg zS(t4K_uUm%0=|2k^RWNah_WgJ`CY7c2yyQob2V!WLgf7t;yA2pQj}D>w%2D8RbWTG zO3)Fe_Q8^Jr@7~FMoUeZYk1*|-wpCnfL__AXsIMe{3Sw-Fu|1K8Oj<+ZGhF4Xvdor z?Hk3Rm}h0-R&j)ZDG|WQg}Bx@_d3RFEP}2ny)BdQ@Pmks@!IsZN{l_{1XI{1j1&Iu zE-3uaP4n-&8}l;BKLU*Y2PcC)3R|XYq8j0Nja8uU=LH%4XHG?XdRqn=9N6xlBPk(& zf;`IrZIeLT1zxJ9#PGSM_fLDJkv?D$nl&Y)CL}XY=7+=Pb_#qHTN^1a?GRGbJycd> zZTuxdyJ}{{vmKMIx4`G15ZJaD<(Sq=aAU?)Hyh;Vvhy>;jREpi1RuW!PPi0nLzW~HD<$2h!q@1Sjge=?$wiw#iMN`EQ9hm% z?z`v>6IRzi2Y>B?->SarHjMjH|$m(?mx# z5u=iaD6fC!WJaZHCkwJR_K8YztIq(PbsV`n%;?{9QqC=!RVlnAPBSPx0$T+-8ptW1 z!ZS_I^2*&KEhEjjWLU6GXa|;CJ2=ls73UEWvw%mVa5*qq30>|_)72iCy4O`Auza2+ zA8#;03hDRuZ^XLooX3K9ZdB8E^ui_5J3skmOjmehie8r$@1$7<;hmoXRNGfrvPgCK zZg+|$+062}{`H6AUIUy{Uc3m`c}SEFbx4g!8(8AEacc~;j z-c+*E+vq3;<_2sVdE|9p5Bs#L;C^~g0o;ER#XZ}`0Qa5VW!Q<0BZsgTa7wtZ6zYYSfqSKddjlEmD~259 z!GUGrZg>3rvtwLz+*D?+fc--DXS(jLjjp?Dug$Rx5Uq{lueli0b>gl>&c zBG8#L594$N)?u6tkY@S?DOkmd7PN}Rx6}2kx9es*)}Dl` z?bU(;tA7T0Skz;N8qKe{+l8}8#yxX-*R8A;44CiF2CA%6%=Dfar|upmm0cUCuuhiB z9MA@0rHcZzen((D{DizF(W7UWEgE8jJ;K<-)r^G{`d#GCwcbhhycczjhtG7sXegJr zrm{#%$n|8Yot*w&7&0$Pq_qP#k{O^v>BE#mEC? zWV(1^dl_-<$wHsHnK6&LU7P;j!Z!)NQ8jr^K~N;2NZ=;t}XFKP>X<6iH6@r6O$xsMu{ab{*Ol8ikjsTDGUG2}>N#h)}WJO?@DT6!| z9%8K#*cPJ>Yf($uu1r$zf5Oe`^g>y~IP#Nsolb)>uFM+;-_DcnRP&UmZb$io^3XK! z%oRv*ciV2p^;V?Yk)FmHO=ZO$xIT#cO-K!0^Q@19gN!|w)-akm;Gu|rX)>t~r;wAO zMu!>Wi+L!ho@Ee|c)^?j9%_J0{N;d>3<@oDOpUAcvn%qHBgKbe>rN$P!n;07-5Jht zWWATlocZ=oP9=^nHz!urc*5hKtN~5sE!8O>HG>yRh}uV`ajfURVy{?YKI$H(`Q+44 zoxCk^kBYPe@xE>tbQu+SB>0KgWM~!dheD^bzzgJAB4_mK?nG+g;(4=tS1x(e+YHTz zw*7^d5(wGy#uM4RSDQQQdIvq)i^lU+r+R#;F-TnI~e^v<7Fn5i> z`!VsusT2c~$*xceDG4<>=sNxtN@I~TxnyNHiJxdr!F$wN6z&@f>|YYBcZ@r)=4n@~ z21k~?v01D%B-wX8rh_K0$Cw9;?tUGo5L5}kV%=s>`Tf;f^@b7TZEyQy>`sN}VkU|F zB}g?zs_)cz<$SI=)b~3$-WbR{ueVOAH^U*?0^62EE)E-_Z;b+$Q_bI_Hy*f4f?b}M zaF;9L&Vxvm6G6y8X&)Wq-MPTe%}BQ+QGAiEnbvLK&w60V0xS)aB-~^&3^;l+*yxxB zScdgWxLopWD2cB&=TZr04D~(Rtt5X9EOb=G)%w{LdCHM5vGP&e?2vF%j`3{>pXy(& z#{)Mjyei>sQ}MToxpi6RvfhJh36kjBJ;zPpDKW#eImz?!u!_)KOKIm8^mDh zLT}_y5iF1|JeII4i3|$!I>?3Otl8|V<@u{@X&$$=3OX>KV~*J+!j=^Q^4(5qm-8L+ZsJ99~8XwXb!j|`H57bYWyps1b~?B{H^ z=)33i+LrL5ELR8Ljz&mC-@d>%ZaMI7Fmhz96l>LuK4mW=)(VNzSJjnfWgBBXCtGi| z5A?>OH+iVKiHlmSR77+PJS8r*5V1F8qK#M!TkUGBS-k;xTpS5}B1Z6Xh$BSu2FBve z%q4JNepSN3EI~2mt;I7-iU71ntIvq$MHwGFVD}ay8IPThq zeg1OuU}^mf_1%KCu*JX7acx|!pIwos9C`Ki&El2V!EY9?!a6bo`xg@%?t4z!XENj| z+h%FMceiV^p-rfO)}+`~4cm0Nv`=QpM%!583C*!;>lIJt)Lm1*sP3scUMu&cGEc4L zJo;qLqn2HQsG4i0BeLp@*Trb>6UXu_{$Ijtw6&%k;-x(2X+pjF^Xg?Z${Je5dY&!D znugk!N$)iBpNbFjOz|WqGp^iqD?DvXOPO^Xx!1Q@oQ~b-EaztE?M#W;$?6z*klFDi zP1LeJUQ;V5v8VhwxDdP58lj|#-o20AYBqMO%C^a5dO%}Vwhbb81r{EpvZR>gg*iUo zJmiGJQ^>4!ZxNdfR{N*oCw!uv8~3L3Q}JKO$;Z9njMP?y6R<}O^*MqZk^5*wRg4~M zdME9baJ`mFm106da&t2H@HJ_V8ow_Su-+|0S_-;PLR!^jKy*xui&Dt#uqKqmaX#h6 zL$D@{irOYaeX9>Gt-sqb0@_Zf@3tTxSND`F5?{!X{SIw?q9f1zv-{&3_TyahNyN^r zhpysw@~b&d0%-qyNFlrj>&j+BjxbCJ^-TpYG}$vud1OnF?!IF@+l|OYDl;Q3tH}dz zaB)vN&|`zd$8@dVfbr}_`W)#b66NVV*8LqSVI6pSH+Z@%%F{M~3if1;j#toDSsYKB zFwz&z6QVq=IHV*+zJ-ow;%fcuiag~=jpGS%1f%j4Vla(ID0dqVs%KaJez-3ke+2UiRVCGhJ( z=eGkKViE6+>wR~m_q9(zRx>3G$wjV8$_+(s3UU`Y{~{U<<26jnXX1&AZnG%BcW?S9 zH!(#F@!0OJZ?Lq~2rl$^k*{7+r0!-)2E!M?=$PWR?poLsE0;OyYfpc)YV|Vu|GS$v z!81b3X>TqY%P+B9W6mKj1Xa*pjO0CA1mXk1$pXi}-8L9Vxuro2z(MWl@c^>xTmA$aH%F+GR!Hj zVoO>vb6M^49!09R{y_Z)wO^(k_ONM963lnuE!V1VZ*Gc?A+vUyo6(+hPe3bUXe%kL zm~mVMydivMXREmB$irBTK077XeVG=+hoUGl{=1g7iUyvxw+`0H%vwkNcQ+ePCo}!{ z!Cp;XyPWE|$zQqi(Zl5a9^_IFJFvt1-}P`%>fxBw%9-=_^z2JmJCO89qoK=QjO!Yt zF~}Q`N|7!_Y87{;Yp`F~#Y~1iUY%DuO#z8>!l#e&*7pImxyViRwqo)XtO@J13e#k= zIw&_6KwdoSefuY-o7%4E8b#;NV(U(59M@s~T#oru6rDdOyeXs(`=d+2n?-T+rw#k* zdFJBi{JHL+k~}CbbXekQ{p^Z7m6I2`souM*6T4rQ#cq3RKq>H@ql8J4C33PfhbF*6 z;Iu0}->SzF;x}U5ofEuPhuBp3chh$%JjXv{j_vk90zV$}rpPZRtHRWZ7K62>XB^ZRb9=P)G`u^X>4Z0poTWp|YzZ{x_NSi#0?Dq(4qgHz9l5!o#VpWfh|jNP@i zi6hDWdOJ(4XP5^CSZ}F@M`!KCfCh7*+nwGn2gX(X7%vVCGWWO>XR=sHuGPX*S(V<7 zIT?u1AQx{Ldkz8jC&V2W=qr@o4zrtik?Mm@q<=O~L+C7Ttg5w$w}$xm>#c)HQ4YuUI>` zh=qo-PDU4zGi6OQifFv1N?LafkkpiRWzxEv5~UqocOMiJ`E=_bi?Tfjao{m}UFGNa z6mv&(F8s-_#2#i5=#VG2Md?7-l!t+TIv1L81-tRomia33bZ#uQZh^iu5qP);b7M$! zZd@WJlaIoUjw>+QA#rmf2NYRk9vYn+pTUah$6oQ0xLQBEB2VRHFeowy6iEd|Y@K6; ziPD@X6|AOE-%jl2Emm$XjcDbXt8O(}v+K7tDVq_yYWT!XDYqD!%2>l$Xj|h9%66ti z-8~sA%~VS&@riVeJCXf3NE5X~{h&M-jwXl9gAl~51#5`hks#(&`siBzs88wYP zvyAzqCJf1b-rng0(1`9m&*It>r5&A5A0u5bpQ3aecOD%p$ck_>`4xNq3+Xr!d;S4B zo;{!-S^trahC>lL7Q_2;Asyd=N9n)Q@lNl5qT|qhI{Lj4I_?$a#2ffOp<^@J9H8UP zp#eIc3PmXJHu|D;ybFCD#o9sXm_jy$2k5xPJ3z-h-T^wMldHoqI=ac@qC>5Mud)n z_uuLG9c%{wosKQyAJZ{~j1R}=W0pk6VBZH}IT`YQK*vGkRkS%k#|PoziOokvl#btu zl#ao^&FJeJe~gYVga+ui50R3w`S>>)yA+*|>Ev#F6BFTv!{UW>>_Sarj~(-Ib?`zu zszEzS$4p!^{yQD#yl%Ba=g6%eCrMNVVwUT%r+p0&PYHKIQjLpBRffF3K8LJ;@4N%D zvQbQIX7miPuI0$HejVa8sN`xDCmAxKd3D07uOM~4m(5H0FWj7Gzp6s0AbQ_)QXk|z zE7VHidDv7d$b+!h7=-7{(=q>*@aHtHGYH2-wQV}#d=(QAZOA@lxn45_(rsu+E6DjF z?de1n4u^Nt7eM=*(IFbpi*GTSNuOK6RkDBGYAD)EIAVcQ@qT{$8z%{j$DcO(f zMqE2!{e38#Lh!YBIw=TpJ=3$4!aZgRnaK91ve{o7sZ=X)uy(=sfYL;&>4?}DZqi=Us30lF7*-PzL6v`4n`LTBy zpq%A?U2s7|dKC~Y0A#yyo!Yx}Z>#vdl)DPKtH;x_MSHn(*^Lz54S@HZ0N0ZkEuUN&?5G+0g@P1$5qHZ6`@RjzNr@D#9OK+I zy*u`lQcd77x;M|qe4y)9Ij&bAF(Ym>XXAPe(v3)4k@g{di1Z~=$}8}%_6(YzEhMy5 zkaxuC(1E$056mjz1+xhh83p{`*IR~>jncE5_Y9P;G21Ldb`2wcmY&q@q2qxq<-TKL za`Q2f>6kB|F3a_>H5~axqWAH23StvinHT zPYj<=^=kqhHR0d6yk|=XIIGs{vGH`t{_Rtj)Wlk+# zC`=;Xp|%#acPvy228lAYs7)y|2DL|lGNbz`GmRVykB{QM6uAE)7@^D?yD4R+kv-wj z(Wgat`hhgR_Uz`)b;MC7-<%K19Fm@G-#tK?;pX8IWjdrMExYM>{)jTwmvH2OM46;@ z9O(>anjiXcfHLuXTn&C*h;%(tBho6Qmynu}4kP`Fq-;x6XCYN16(Y??Y8BT))?5ZT zv`&&a!$GM7QZ5I%U!~j-4?~dYQ zHSj_4I<fbkNvT!FP5P@xKYHvPD9QtZu6-wMv$zYWHR%8|$Q1Z1@l7y1N306c( z(ET9O%8{Q?ZX^$4)hP|%V7}tVR`KDoRj?*JB0=@`tF7WuDR<;mmantap?|s5|4*-S zJ&#T-6|O|v9a7t0y~>@t6*6%VN?wslK6zDxUO4i!gy%n@k8o(dxfp$9PNsan4}71E z+|=Gp=x4T+dlhPP(D75+!#7`ien|Y-Z70V4e6s)7zHfY&-%g^~egxQlxPs#Di(Rdv zT+00ux$p3FYOfPHnS|pHkQ1e+?;tlq%DuUZ`+Yfdj!ER#;B+z;_$yS}gj>u8$mBVG zMt_CNDBJ|>m0`!X+-j6&@dv>hqxf0|e4RwCsl6YdoulenM1)*txeldYNu@_n$|cY^ zk*h6BQ2LQn+O>=8`F{0$lwNMR0;TUtr8`kqp1T;Oms%F0^bM)>Ih1-4&oakysX3u# z7_m#Gt-BJo)zEJ&c2o#fTxG9uzdyoq;0YTdKO8{|^sXNcmI*JrIkGP}19x)|O6%Gj z8QFK3BM%2{j#_iARoyV4wXNwb+-2;UV~o_xC)XaJp5>+3tuBN0TgQ*HRG4Aekq;xc zNHAQoi_win-)z|gk*lJX&BUj4!Vv5YCrLYgEq0#tZg6zRPj$0qarp{0&$gVod8CDD z8PcxsOh$V%r1pw;70hHbH)?rc{vMI@6k`GA5U0#zM010=7=!+xMrYJ6wXr(w{nR=! z(!fDx$PmX%Z8cXwzfBageqg%e`Q{<;$umgQKClzlLr9+>okU`GCaSZMW+PEs0$uZ$ zBj14ZCK9zJd?SutYqhq)o=}E;s1e%lC`tRRAjM)5*$I0B_3n-8wlTl87 zP6wt2z97sYJZMyH<|vJ31pB@^fVe%(-8}vx%SD)ZVJ~=&p90vNqU;1m&SL*LA+Ck5 zU6D6sB>B*0aU`ec8C4zX<9yWiZgR$A^EMlTecNG6VDuL|8BLKXmptQDdN#<}mR%1c z;-IBMs1-Jg7mXN1K7bX%aL|q~PuN6WND$dwW5{%GEp`JHbdEoWT7y$?#z74K$Glna z^6Yh2!*bcIL6pdL8X;1I*a4h10XjSodc_^#mjm7u^C>s|mMJ!RTLkt8V*E~RX>@MT zxWEG7vK;9mqy-XQ&sHys^Fk$&@xbMEXf5UiVx7atYV6mSNM0yX9qgNQfFp~6uf=h- zewO@Cq*_L9dxP4RtD?5$P~VNPOVGVxt1W6@_H0%&y2;oB1^Z+^8Ue_V4Yo1lFucdq zD;#L5#XAjH2=s-*@40IcJxI%pURviXZ-qlnWT;8YCSosg8c|{!G(GTZ zVRv=zty_bAAERel>o+k{OXr<{HpajvNxfQfGRJ4a(-YCBgS}(S@41Hv#GP-aR^=j+ zB=z)#kG63vT8s4-n!DW8{yM@miR6SLBhfYm`<_N`>8N=?{J_l$c^2A(;BRom`?A+y z??&5}qK>PJ$QK8wCAtV_bfjZ`b%U#<0Jp*SI%6Mw!xbIp{`h)A!=K6=@IB z`$&}DhOUdP_akOJGCPhw%n5u+nzK^E;^Oe6I4;q-6qp{L!mj+UZ8JO zH;1@$M*l8smb{7j7=wK&zz*LzntTw}31zUTKEDE7KOP=rgc@_6nX(MR0K*jPb45mr zuaO&);@DV04N zEo%zDi?Zx;+TM#&StcnE524H`m9I~FZ_*xwF&c7;KLWnKh&OW-+_ z)fuW#@4k8J(n#sYfmW2ZNu~GCOOKYW4?c*}6H@5|{dF~=d*Qb?O`t6dnwKoq%^-Q+ zRqh1X*sgXDA{)c}%qB;+m4^-#qb}vwj3Ct}7V{A*=aCZ!Z^Mk{p&^zcHYkHE^wrsA zBu(=3$KLziMc=uS|G^#a1wSr%!6WOG0X(-5X&KT}NN*#3i9~rX;?H}$gL*6!0`=!b z;@c(>(Vv9#5AYSt+K4A976C@#JPe=sTq(v4AH?_FeTXB^LGOx>gp0(uQMr4-!6F_m z*tZW>2S$ITb3p5;HU;`-h3P7FiE}jUvAl4xS?ytE$%sicI_UbMC!0e{`N`%$pE>vs zV48X!E{S>`X7_s@B9Z)M0tZcDQZQ!eq<4c6X+bTW9CV3hKV6sf@?GQ89 zmIi!9te|>Q70Q5&qQ1RmO%uK#(qrwCLyq2W$RmBe<>&cuPlFCr4tQ|A(1uOz+EM>r z^#Vj8js}f5fyT(kXfzTudf7K;PNQR19AuP2zaUE9(odnCZ*bV3EtK@d82keiavxx! zHBy@tUG?TT3k5{k;LDF9VG1a8PsoPSX`s;LAZ&Z))p^O}gr9dTMWkJz@6UlxFsmXS zAw(<3d4ytKRLD_KVtJqmI$klnsPxVRf4?b8m$%>vDnv^Q12XagRzT`eO(xg*+w43d z*?CJgxgGZE253crJ^^)_MY?juM)9B&OG(ydNi>+~S38D6>tJTtc>ug<_wGMWW;`D!Gblbd;32j~6(BzXX;s(6^TvMz#!o#=v60d7 z?}f*IO#k?A!uXrv@z=-IijAKo?eO^jxADtKbBM-P2Kr2K|ZqZ=}t zj=T&sKN>bd*SP~;4Lb5WF!D6>iRj30kw!kpm`5gf|8m~QUpy~nD1O|LF^`3QAB%@d zBEN`@j-t5H&@q=|%!U19?s=UfLow#~NT`7^kL!-<>6DHiB3?iZ4P+z6ku{rYfMpG7 z*eb z#z-TZN8@|!Qq1aL-!4BSJ*$F_RnKs+o5tk*Gl&i-!ieYjT$sgFdPd>^%OLd&4fny% zPj~$#(XY26GXElJ&riM0RJP>MSd!=H>Kx6mv|Uo`TMH-L`@$({)e2Lxph4VrO3=YhT6W~)0 z82saTk$?EV&kMv8_#^Y;4ex+lp!4EId?P^T#WmP#$L2*cIp#GwlF0$AfplJ+hRhw9 z7vK9RC-tT0lD6>wY+jr{<|ThH=639M2gZCo#=H?0i9a6m4tyi@-(-P|n8e7KYc3db zadgZly#r%r$<&b1AtPfY{asHQ&KvVGY0RC*Tr&25G-f(?R#@MXe37-1H71e#h@C0@ zim0~V5;Kg9!MLw8Pm?S$fxgoR;}h`{c%x>!BHX`UJU)Tz`4{%_#X^}dUXux~KPb|@KGj>9l1e8p z+_EAQ-`LX~Zl#m+w6fy9p}6Ov<8hu|wNX&)%p}3UL((ZaOpBt8$5#}ZU^1V%lW$KY z8{mPt+*yim;?UQKa&XmM*bz6_Q`<)qpMNeQN;1j4foA()ZE8E`Il)XM2ZKx}Qdh%xn&Z8-R zUD~S-)S0wbdLI3rmd@c7n7fip?8+A&>qxf_7QQ+)_y%rgZheYG)e(r>W;7+RgTTUh z1NMZ2xV90*8K(A(lzuvAlgZ&U#IHy6Z1BdMUDhWg-iSp0sL4@3^;5rM_T$XP7x8W^ zqJ|;Dx@?kzQ}vz)-ACXwmW7=v*oz`Q>S}Pn#gYzi8+_Di@`-;deANGP^SYEXauwUc zJn_k?0=Ctn1Wu=_!+lSOsqaC~r^2t(g!-`G!td*c$`h>KV9-XuYwO(ka8=KyGP0`+Zzv69iXyW z;7803_ay?VS%BgP$#Jd`HTUwv0As5kGpE+M5F?H)Ty0iU4Jk1mz%T7O7{sp8rkT$m_sfVQ~C7<*AxTk*Sn50o} zgU|I|DYpf={m4O5#c}i=;Nc12pe!!Or@F>=xvA3@0)_~jl$ ziC^*zt*33u)Yx;6ZForH?v2*TkdYgq56_gw{kTm{#`zvFH~+-)8!T(kx(ThjT-X29 zDjoqejes;H!6%@t36h7d8o32hZVGaDNV!SKJs{=ABezM)joBlOM9sFqH)Z?e)Jcrx zT5w)?RJiY0kosnpTb7%dC$dPYG@>zpzr2E$-(a}`kjSM{ElMw&Ono*>EK5-;N}lj6 zl-^lIy)#!>u0rWAQfV^0>eon~oXaeiqx3tel-)BE6lb4Owpgtc5=DyzynquBI=PiOH)qy=}Yct|3w{ zm$V!_-$PSwxmfbhWRYhjI1cST&qE_w`*ngE`{e6kp&hTG9vXUA8~qkS-8PYQ`(qxO z(eTiyB@ay&ba^@xHt!x0_0UWtyZjLkjT+|>Wdq*nUXA(JA20OJsL5n6OYZVg>&Sx! ze5>PM{Ug&&`MVhWN&S5>zK-X2>ieVqzzL`m^W9wNx1n=l2A;=sLh83!ihJs}AziD^ zTLIF@ZTO1+7FhHAeeS?bagunk6Y@WxYob=Rdh@UD?;mALe6Iasqk%2?9oIc|?ARXH zC#TY7pPU+-`BaU%yQ${1i}SpxfJMS%#+rK(X2Q4d$S#7uEDxzW^}&=kdzpu!>TVs;%pAh6;qHR>bM z!-9~87_Eqph>rM0M0~3G0<1mN@+^FV#pqj|+5Nn-*{8|pJSLonbU8dLY2;h4oF8m{ zz)iX3MSQcv>aMY^$Cu1nTD^B8~3$BhhHr8@4%GL49fq zut~On&5|u(yQBv^U#fG!pA=lmuQngYsh4*FqY1Fri1sA-a3fm71W41wy%Fsohh1q= zLp!Lzdi;n#rX9TDZ9*$uIL(Y|2haH#aw>dn98~*V*^))82J1x*n?x*-tkYddSG(2vyu^2rFWgzO#!LCG6@2%qZxbjS`^x=V@ZC3FT_d$MO_KQQdWpYQ zO5Arq;=Usi_x)3PdO~{oEx3;*48ZbC#CF6jPl|PUky%bpqlC(ViVfD+8g1;MLve?2;C3|=}wo1^5T6~ zi5C%FPJY80Io-uV-pk?j+vJv>*D~Y*?3E8hxN#)q#y7!@L%@xL>n4({0J|k+4~1eP zs{j{(cg%E2sU8vy4MO ztQ3oIJGgP|zsbN9@ZbBeB1Zh=DQ!6SE$Szy*w%`=#xF6SR>>!qQ@&(2r+_Ozm*RzH z#c^e7G`4{y`G}!s$#!uF@Jms zf5ex8C|`bttEwvmh%O;OTz3|E8 zA)GZw?Jn^YO(*7S^^Vd|&yCn;jt|L45Td z|BDbG!5&EKGlaasjQG_(&7NsWfLu=`zk8GMCHI1`+btu3pxTjY{?MIB&UjNyXQQ&{ zYrxOi6V-R%`ZSUi=@q0-q>qu7Aklq6GU^l{(es3p`sp3+8+8GFp(935(ql;b8xi^z zOYaS~D*3^d!Tn!fL;r^yk#-?vcIo15*a<`tYP1)`QGrFMIk?gtYMt@%-tn@uh z3Rw+H&rpd5tmK7=@y$>D*sXp;2g=eYX&Pa^r?kXTmzPgQd)1Bv^LL0^NhGPhL^8#j zjCgJZpnWp*g*30|nPUe4+q+1=NHETggYmw5@O7F?*H~pw{P$a0=HTB^Y%e;1wh9rrBll#w%7 zwPv^`#*KVZ|2V!n$apg46D_Im@???y=&Res@e|CxzV%`1t1XAmGo3HBl;Y`2czW3N zn|qKX$9{L~8kv%R03r(62NGmV$-B7HZ&8oBa^m`OnY5k0{qXkwOl*;Mfu%0C21norR~cTVPl}}X4?6i60t5MB6xZbu=;DTCCa;{ z`*1cTQcfq%j={AQ*9Ay^;CKY?HzL0r*H)yLk(@}^q3kXs8rw6?$~I9s6Ny{UII5w^ z`}$QQ*ww19HdPbWjk|q)7keSP|Pi?Xn zTZ&EeS+TX)%ynnN8dhYf5ST4l>UFpeC9z8CDtxj|xW}!bK zAs6^Qf$wtlkc9>Ky%oeY+>?NFebkO@^Ve>6Vn(^Hsk7$S;|b(Un4ZRD34Y^dMkdZV z>*nZMJOkhRMtx={fS+?nR1evO>kg!|$Y<|QR3AltKhoz&A0X*aW<*+qbSDz&8W$G} zB8ME;IZ7nFUKW~oqFH+3*MLN5oNeNip_9 z8|0klL*)&5OiQUyg;DJn|AzBLUlC6@CJQ;H6nZ9+poaW#xy!J79%{(~x4s}!A7QV1 zD8~0iAU>Ld19s*G)$o-$+%%$tKw2((oqAQ|QH$TNi0Fu%<=upF(6b|+#?_8Qb+aS5 zx{yvI`H@H$bQ@upbkihZ|g29%)yJ%NlBMrm<6SxY(522wmq#4MH|QmKTz6wsL1_7v!r z=?tVkjDvqgWAf;X~b9!YI{UnYRH0Kv3#at56&ui zho(!hcP*=1A<(?8o*7YAH&(z2dfVLl==@D_UMY^S88HLThN|%!JqF}fLYJfQW@~Ni z1jXpnuFWC~i{X{H%1g@-1Q3*md zn^W24q|i4Br$`LKx&^zSj)PzEp3WTnLdkk&u6Su42RZgEb{{828ebSYkL4<0{U82R z*j_U5-q`SW?m@_>Ab%R?dvQXJwya@LdnshujiJxn3QszoWQG3WP9fRoqpU$|mhm|_ z*CFl1W>JPQJmbvbM_NXim*)*7o3JBvW)*+pDdNG|JKA$u{ zqVu5lNrop#s;=bz`GpgL8)0E`h5J6b;CIHd@EaYG*%j_v7x_*W?@sDUotbJa>_3HO zfn7Ex*-6h8iOoGV`aSH+CRYR$*8Dp9t@dxww`iOj?VIXb6pqZUENj-xn4YX_oNt$v z40XoG9MZMuDd<9aAN>`Mtu^F0%O@aa!P_@KBtxqwp@ru7RMNBWKF=n}z{ObL!sC|V zSH@^Rv_IMxJqJ0l|F_2Qi%`=t>*A#a#ng3COvT`%?=adJe25dNi;woDZ_NBR-2UgY zld(tiMYaAYE$W|QaB_^H>mq!YANwl5ik>di;1ciAR9cgToH|B}6Ra9Gi8f7!eUrFW zlhe=)Eny_dg^g~)tY(~kT8?j>>FLmKt)wgVMWO*Gx_#~c=c#1f7!&OJI$3+QcCmloVKp zq2zX7f|fJpnTMiXrBswVCD=)Y=Cg82EmlV$F`& z)FI#oisw4ufNTSekeV5Wr#KNoFFl*2u11=Jv>u7WnaGdhN@e(P!C>tM#x9b)aAU1X z=~tSR`0a~4LkX}(ziS^NsPSd{2t#6frZBiou`|V!ouDJ11WXQwrx6zyMOW*IfM=O^ zxHZLNQx9uY?}81XD7o8=xX)ZVe#n%coQ2w9=3yAgtUxvW<(F%-tfSk9m}E~Rl3%^m zTKw7y?gyEuB^`cVFK?{Y4zj+rkJ+4T8r_~q{^d=z@W#w~wkoskP4`r)Gel)i?3>ou z*q_1p=-7|q`U{dwhI62SmxeBdpu-tUdM(an!2?|HERKfBbnGG`h)<8a@n9|K? zp)B20CdhV;Fj>|u174Jj7P z*IScKnRO${M98m!Ht72rL?bAp_JNUPq;!saY@X2Z&~cEiWZ_uH)sPl>G~y4MqgBH6 z1gyvV&)L=_e$McJLc7)|Rv7YXkJHYY(#DJh*u z?)S?JIl(%I+ry0h$|;B(^^frr$z6W-qTTxtp);n(#XUoRouL-`j^5AP$2P7S%Q`O_ zTk29idub=-ttWkkX?zZ=*SN4&m?x6Oes!k~zhhA-@I)IPuy5%d4CpN;Z0*c8|4w=N>z2^vrMFqh}$O8$HwA&KX~}eF^$4 z8Jq5kv^mP6+%^hrP(8rrWJXWzU9(q*Saz-XbGI6AY4DcQXSBw=kQnB@nu~G01!+=Oc3kY($I`DX`0UB` znWhmrIAdr8TU>jZlV^W!s{i?BCYPQ%Br7(amNO4_KUB}?zQox@*|qUJq;L+!_kM$g z@7xT3D!T4cSxe9VAzk-(3>Fff$`>-N@?s@^ktw!s&34havT)yl@K(pJ`pGzpyRnx3 zN>rj{Y2E~K5MRsF)i1Wok)w}eA;@j)f?}}^M=}4Yd{*Hs^n78k(A|-5O(3 zWt>opelyxEvE(zBp1>tq^(FNo?*DD_!W_sB2RHZ*B(yfr`Sghz(N76*%_ROla5vLP2=GK zHhUj=fQ1JhlO1{unmk9ychUmvL``Kf+RpxllRR6I4y(THb@4hQR|Twwg~A3dqh_mk z&PcwpWHoel^g7~?Xr!lEHSq5*-zsui*vhc+wM;R-sbot(lzet+QBFX^O~ySfEc97* z4MjR=gm*0}F|l$to+nj?O3J8F+v&+5)n#y{!sxHS`sHKjBK^bj0KWcE!hp~^p_}9r zz(6=`j@p-Kg7q3`qTyC|6Ly#`Z<}Ic;H8c6I@oAGxZ`o|xB|Nn8;0Diuq(U|#^yS| z8($2{6NG<;N%-}{0vo$VTZ$#G|614v)2_w@_h^*ylYAuKH;&-DI}Bfaokpv-ah4JA zH26%hbT_SuhR{?y{0xkW zz=Glk5G?KhPDR6FA9U`8Hj_=!tynt}c2cU_qhX=ZmfOkzi9J1K_R&PImm933?FPW& zaKGa00r8=VeQnlurjR^~M*3EXF~6}d+r|>+Rz$bxFsz9Go7>u9NB1rf%f( z`R~RvoikJD&F1Qvl9yu|JuckhoFMi*AX62?_XpFc73O0{q^aXwKu+2l3+tBAyo!b! z%{zh}!IWUg$7A<^tmDjm(no({mwU$`)E}gKZ$O7Nh#UK_z>;9m-!Ko?*Q%NXk17-ub0O1mWU>NAO?YQVYrpeep5N+=qcP%I*51I9B;qpdCU+B{1BGMIX-b-<|$mvPLz+i`d!CX0F+FGRf9r0iW|AJ@pA%RgZ z-t03$PNMT3=E-#EWs;Y1&f4Sq+#mF1pk1_X)`mwg6C)VtWr`m3VBHM3oNy=GHSp+6 zZA-I;+IA3e8-l)@;XRKj{<`?y%4TGhWr5} z@-Iw&ndxjNTAm)dQXVP%ZrIv)?z5q_uQ_V%JAGj7J1xBSo%*x2?<7kh)|n;zM67+s z1JmCdSo@9>j*EPi?Ko)x(<$my$|V`N7lhP!gc+$4ju=;8j*Ey z9Bd<^*THevLm9dbjuX5C>);%il}4|F$04ReWE~s_e+;2@aE>shf9OhTq)^^FxDK`e z9;co|d@Ll6WjKP*S@7G)I+%<9**bV8BpSZbeiSpJN}3VI@Jd*Lm2jGIjJ-rhD`71k z)0EmmUfxo+juY~GbdaUuT2#nq_855iUR7&KOQKh!(h0NrX?0AeTvcH_BKr8}o*aAL z{>+A$ebBYR+IS|`#+f)56d-4N+(kO zwf$2-Ahh~1BN8C_x03?`8sjvq>eJ#vF!%@yzjVH=ZDY&9t1q0yM)}tBNRXE_OlV&c-_`~7%au|Ngu}(RO{5hn5A>E1f z$o~&GnuJTi2pmm<5RAalB%BWph2zLygyTLj0!Ne35&StEk74gR8jju6aR;BQ~-X2hyMYN^-MuBpT|R|asVH#_QoiDl47q*YnRD zcnW&?MGt>-u6X5S`xf|Py&8MAp?xRWW)or`mg>e?$AL!O+`EkS?_RI8%UX?SVY0Xk z{Ws#O99Jq_jX`^5ttGUVw@U??{D*_fbfwb00*gxU1()dxr7JDH(WDaoi8}-@S!)iS zdvHb2lC@?^yMZeB`C2ByOGb3@NwU*hrpuDv0A1Xs54{V`Fk`U!b;l3H~MzwrrbRW93Am1i*O>nR zuloYg@EQX+(EN>t*CO1z>EFW({52L42?x2$6ubO2;x0yqY0V^>%PN}7_vk*vTuuaU z(ef=4Z!rls^$*VD>-z_3qN6`Dk9ER-L0^{P3Zmxlba%R-59sZcy6gt%9vL!@^Ad+K zVf|mh=UH<1s)X@aQ4l@M#;nZ-&b=C-Ih=*73|zg0tAQB_e0w%PGni(f0i0MRY{Tcg_iO@Q8p{>cN-Qyrhp>sqwcCk8L$bvoqLF&@)JPityam->55+uJqyg{ZHH}knZG3 z^ZW0()=Jk|^u_@deB>&2VuZ|0^VrsGdpb(_vR^)MC&Nyo@=3oEcR-nTV}~BQ@MA#< z-s(>s7@0>s^Q4*oOSJMxcwGLD-xSb-i}(#9jYQsnbUD&3ND*F7G;GB2 z|958)@>ax5!|CGS8H9YV0sdPC&mat8Tx5ZZ)BDQ8Yukt{PiGJ$+iyg&ApQ4e5a~GQ z3+>X;*wY%}e|83uE(HC9-w|B?(-}ko{5MALgHr3ig%xPz45C2zK{~68tWl^x)DOtu zGs_S=D-ts+7Jdelu-Rt|Mq^$^G+nDv+V2sG@F(f~QRvXld0bR5Mi<*!!es~#^yXPc z!XKb~G(~z!Zh;{*j8xi!%nhm&+wqX{;f&xqJS$LfPE zPU=XuC0p@Ko+f+{pmz|zv$u>t=E1wJ^B!5T0y~Q)*I{VPgrZ7?WDe5Tv;k*UAZ z9aPQ08BMY^)v0ohaH?%55mScUvE_V1LOmjT5@hE4p+R?BcGl%Jhx}fzGJH-mQutVc z(GP(2S)?D4XfK>8jN$9-v+J7=#Oo6HI!hh&7DHCl(_AL#&c@hTTnDEbch<8=mWvBe~8?tZQK^C6i#=H== z1Y?D3g0Y+qEhzRg1=0J1CO~6xZ+`JMoWj6nble8BS(|AofL?>1H)}`PMxuXXdeeZx zpY*2Jr`vNJQyuAbRXFRda*#D-8hDqvv(7w9cs_8^6RLTG8?9>qW@*5jf1Lf>c(XWBPnwud4T)7(U)A$>aZ$Y`|OIXng9b_pE=s(?w-W2HG$1o=0U(h}Odk5uXgjLWY;&>IbHbV8yMtw_=QV)-` zkBrh0QMbnk6G4MhY^l~%SE?-)XTz*6-lcP;;7qk?O{!xA^k52vNBz*(7|=%{*xcE} zY1Ltk=mO#HuzxlK@T+te!jy7XqSZWjL|dAY?Ewrb2aOZ zGbD5{+t+6;tX?=XT0bxeHO=f{pZajA?5U5IvIsT6Je6>qtzf;u3TE?nI4y(LaajL@ z=)NmZ78=zpPk(x&-GFe#{ILU#cy&LGFCggmruYo?q&f7sv3UPLDgn zX*sk;*PCNyy=KPe`&VD7bSJZy^mZftUXKW>L^+w!--^zrZ$(FADb7!cCjY9Jo%p_2 zA%CvA`-?w$Qc(7XIP)*AZ4{SPB;o3<-uv{*+6P5P#Yd8!In9TgF!#zaCuk1PoDlH) z0PfM;IEmlCBWdIeH~J5B=Ig7;g*=(?@HBfyaniuK;5TA%(=%e3`5AGNMt*9d{T=hy zu?b(w5y4&btraWL_K3dNbaxtTRgCrwhtZznGS+EbzdkahE$Dk67GFVMf4_n&gSVtI zON?*@IAx6R7(58XAU=cz{}=X}VF^AhI0^r+?ByB?tOfQ$8=Wv@@+_AoID2+sr(BCV zC&L1UF}&RoBaG}n?#Tn>{|xQ+zjd_Zj2w`|Xx)AkG~_l$n_;Ph4+>U43i@>6G(`97 zW$2dD7eQZJ*!G0gDA-sHViE#AL`#USkgWsli~j?#3Lu&Byd9|miC{|fhG0!FO+B15 zppTaY{N9OvKhV!|8ITITK`hHbSh0YWCK$5R==WtG9Z?5wFtFE}+s01PFXasE@kAT+ z+q^+js)Nz%7ew#Ge;3x>hb>3A-I1}5&^;QP^lmPE%WRbpqx?VgGHIGagSysr;17{sl&z{qk05z>`LM)0$f>kBf4| z0(=7}xi+2B9eDjhch6cOj z(=J9B-zVp;LyPLc3pRnzAH-=B!Jz`WWkKKke)^8aQf}7r^Q0P0!bOqpAl3lh`v<&8 z0rEm3YW)E5>x~ak+f?1}K`I;Di`Y=bWye()7&&OHe7(3yt8X~e79+?YXUug^10HrD zXLqw)wXMdQ20fK(_@H>NpURkkcGroiXAKQCM@)G05$UcGcV~)*hE#YuixDycv3O?! zzS$=|Ey2@DSSGPLDxugyJt_rHt8$pY%L)OhGQ6P`XLzWES@0W#D95n%KpcP$7BY+x zeqIUzjSmAs-}QZ8dD1OefIKH zSZ6hX+ii0N)}P39{FM}Qlv;Bob##>Tddg0Dsf_9cgk26tD|0>{aXy6Rf-81b!WM^NU09}-6z#hg}iM4P7WbrAW z41Wk#p|$JVCZIifQC_S*Jr1-a1OAIl_)Y6u(XN5qJ_cu37|q*O@uTt0;UIJ*`by3g z<4eZS*-?l&x+q6(7~%Noo1pJ8|7gq@pYO;1eqUwp$g>IBe6*+pEz84iVNh$=TCCYb?zJCwvCpIg{OpcX@w;+amSx&i+{#*$CHKh>>mWtFeu6 z)PUBewKca@!(ZjyZ7eqvmPo0>rho>PybA8Guqd4Y@3*NGd%C#W&1t7$NB4Dc>!GQ( zsdX=SIYy-&B~0p5ct@ypyh^*rTf&SIjD3rxycYS=K9yGC)yejFGjXNIn>rc1ARHWn z(#P1Ct$Vy9PkoCnU>7yBrY++~0NIeu;BSF&)kU zu2TX3$w&pMYSmRpsf$5Chb!2U!U&bV3b5$jmuWA#4YzN501EaB~bPWO;~T&k{}s9+2)_ z6Ku5KZ^?9iq{>A6a84V;-woXS6Eym(TzA`Z8& zKFe~q+wQ>Fy#UWM3T`bZ)!M!o_)6^e9T9JcYS*C-sXf0jcgCeu@HYa(t$`b@PRz5( z!4_bXvp)9Ho$9BLd@DY^ndPppPec6Tc2Tj59slyBZ!>VZ%{+y5=49winW87x#LfF7A&&h466zcpnypp@ZmfM;NTMwrAE?6Mg ztfSAGJ6C1RgSSUEIo_}AA-kzLwi-SI5s_zGlC{j%O8D`!+vo9i_@Y?I$6kn&R|-Y` zG{mL)PPd3pgAXlv@z~SscxAcnbR1WWe*63}u(y-7IJJ86mDm|Kq5@DHhuj3n?RsHs zzxmRg>=@)qac|X#3CI=pCu`{~ZU6P2v9`F*RjJIDdHfjLSW8uHrSMPmY*h+M%9Qz) zu2O5Iu)jafue_LVlUJT%D%tSDAH zp^a%s=9~EX^NO_OGn(0Boa{5Vm;o6j$$TSw^)+7~B)N~`&M$|bVmO5HT|2~L<3dL$ zzJ%e|=fiZ~cbI1XNJL_=oH*9Qxz1oe>oZY-_{dB`(04Rg$$xM$7G69_YMLC3wsWRB z&-8?%sQM3vI4JCN!}|e)BU|fwZg|QXl)X`u6;+zJG<~ zRDzcRYYbIGs5eia7+U95!4EISEDzONBbWi1lY!9Hhf>X-3|{GjzIVe{*Y<9_81x+r zUr~F17tV*;djMC1@M#SUhfm!=dn4oWWVpS)!$ozBK?zORQG5iy*a%Q*pErmX1M%C8`gT9r4WMEf>i&q5LsqC7nB5)5X|m;| z6Rd>o_3-r;+4W(u&!sjp`gpWN$y@D7u&Pb;s+n)ZNxPt12HRpId|@nK9cpPc&IQ#> z(042DlegCI!}m!Sh3+rM{Ra`R;!F5V3w=Q+iS*=3JTX&AH-+w-!uM^sKNq^CU!EI@ zc?t@nr}rxn)hFn?9nT7+XYoUx72(2{WfBb^jd7Gb}!6W?0g zm``yE??Sl}eh?w;J@py%GK&!3WWh{j3;cY*TgU{r@+n9ydpBig!Pg$(@f2qnxi4mK zthbmg5iaXn&lew2cop&Ua3Wa>oot*_#Kpqis`0u-yaRrLm?k5C{9uJ}8zd&w@N%Sv zD^Y`TThRAqptw!BbAvdy>DlZ(;(Tcz;j#f9lPZ)3tu$}Kx)3V>k6V!FY>43U@PP&P z4rn7V`>}J)Zw74cUWPu&-@pjQLrc95l;G}Fi-~T?Dbh@;APZ&*az(~*>{nOCd*y8X z`OR{zAZL#_SZ}OcFT~1Uy&zA_IsQGP?v-EE@M*{Wjy}g^$B&Q!j`mD;HaN`C{l9?K z=v~g{YOOmH{xokZEq7<|Z#Y#K*2$(gGJ6&dTXv zN?z|cg=am^5!L%U?sBrmb=7}Ab*8g3+}t-E^qAde^B^C-fU@4UVTh ztm#8fJgniTs2S~2QSsA1{c3HUs3`x+qr*Nv$~(bM>0ruwSugBXvzby~M`b2k@Retw zSfF9Ysgh)(B0-fP6Xgl2c$p|ej?H=BQ{sev_~b3KN*wQXeCWxUc#I!}^QQ!3*w8TA zM-SvdFG~qJEo;ev=181`d+g>4VN<`nEc3Ktst&k6iD&m^!(IiJFPVuKWNd}7pwHF5 zDsOGx2$4-r71^&aX8%n46h{od38U&ki_ysu+X%28qy4SI2R?ZhpVV0;gV$WfG%dDPLkdHaV1(keB_Kxb}Q_#OO;S}CT zr$2sY2!p0!7XP)M9ruo>${Bw_nXq`Nfp2iGua=)mX=f|$c6{l18Zx%*0`>&`fzBj< z3X>qRag0H5vsLFk1#LS1HfY6Gz<+d6tpQvq$yPHf;ft0FO4+PgIPKA4hhtn??V}4= z4mF$K@??o}hBaxH#)z!?oF^?jLPS66MoM(yvUM08ot@d=Sfb<;z?p#m5@h})7VnDt zhT*aa|HG{}p!MtfS?}lp$go}x-i8>h6K#5-kH(R5`}{gS@q$85J3-mP0TH$?xiKHUHE z>#0uobOSCDd~JS?A8ZxDEA}v1$cC&)$g;Otba2KLjqkSe_IPv<0zx-e4M zCfO{0h;eB9fZ=wbPpOEllsa&}&cX%~J{WYGI*nD=_{d`l_y{Pf*zMA<{p$l2!q+`R z&+bx%?S3tv&XK&PF^?2(2=7%=*;I!c<;!%bhturo11E*4_B1QCIMr5Ek>aHCUvN~2 zvNC-mYFQJi=jET(vtmd+rf@xxeo#GokmRT~na1il5cDY`Iil4b_)oJ-d7mf*T-pZh({&>fwZ*;iGi1HyV;}w-fD%t}phm zQU_asfpLc)WvORs)b#Ji{=?qEvEM$VOd9*x!!iF$T-p^?o@+>X1pnB>vHyoQ-WgRU z{|jZR{+Df>6IEW`kn%!(j{jelR}@v=rQb)7OQ<~c|FXP5&)}GR{tM;B{U2cXWmK7a zexb|+d%^(bU_O}Cjl=QpP*e%)e?N%tIRCQc*mLVroDrI>cd}Dx;qBem--m-bz+B^74 z1brWc_Xw!o$Iu4C>9vQsIh=j`K=0Xdg6dEU~@A7 zmxYq_|AJR0t3SUEI!dVm(~~4=I=IY6VchX2s?T&Na%n%8q>0)Sh%faW2lHm~8B*HO3Yk9fh(HrOFUpT#Jw3`}Yt z3+pzvJlCy<|J}G#Od;8TL}Yj#EtxGoQ+=_cD0gpO1$=E2ENuZ}TdA}g1A8raYW%^? z*_(8kPR?Q!Tmk6x>MIa6CkOsJR^#bc?kwbX!Ef2e6EfyNUQ({c*G8wJ^V4N9So`h~ z=P;0@<}%Y@)mnJmqp`Dlvz;2tQ+E{$n*%0iDW7p8+ZrSMuJ0W5rs9DWq4~5CIORkl zSP%@H;FHGD(2WF6lf1MYd0Ja;;-9c@0!%_uMXhs-opt6ow%E7Keg~`CEq1raoyc;m zzp=@-c}}WBzPia);z)Hg!OPnFSdppQn&9E>v3l6q%5Z+VZi;K&YUU>BLUWsJ8b?jr zr1qm;c`_sXsqv^+f!{wi_LZ4CziNbcf*IqEtM!Tcz7lii9~yBsgloA@sY|VWN<7KU zZ|f_QLtDYz`A+!V&@-%u;%~R@WKtb#;gtm~+;y9Mt(ATm{ae@-Sz}#e3H{Q4mzDm{ z>};x@#~Xz`f%>la>*nz{VH}w4&LU2ngk zj_zG=UqA4FC1!dNe3@{LjP~UiHN;79U|nilTBmHTYWP+xZc{Yto!^QX&o8;lY?U{| z?@II6c)rNOHvbvFrB0?f&S`SSA}-QoJH=;e7Ec=0hiEr}%4rlco2aA;E0r_bvgEE( zXdOjL36&8k;kbX6WxbQWsOf4nt#=sc?DUXEAFnmr%%FOsdMH1`HUs$)QhvH^I`Zls zy>ps{GgCrsq=D1UY?*kLAAXz7NYxL|X~png|zxeQhX>ao}9_uYZ$I(nA^T4J!h7l+EADZ-VA7Zf8= zRgGCEED7^2YFlJ}(VU|3Z0580=tzcB?bBvwJK^PR#Z>!)Vr^5l^Fgt$X(9gaXliJm zgp>Jh--Q4JFYvEJ2WD_j?MjSCHav)7Ps%jbUM%^3^>iq`bJ;RWiBKf2<6i`Y2>Mu} zAa`Ed+bG_82znAtpdU9bhQ$w^hrzcCwCrSmhUF;Ee(Q?(nwU$X>##V7qjI=fBm5HM z%2-tUl6YxGb@(gLB6$pK3m!ZO8Z?(FKLjst`=AdxSB|!bD_lFl({JZbD`ta1VOn*b-mhce{nB27G8Y;O|V%n|NF{9_ONKc%>{^4Zel z(^_Z&bo(3urXc7m3FZPSk#&<1P-*H1XX2)`AwEfRhC4H#En!cOwEoS5^YjimVjjxc z)7s*=6vVS~pDWd;)}*;L5|k%FKSCD#6KuN|UX$3C057JBhMYF0^mBK-^?gr#dpypb z*@6$iQzGX}x1+7kB7KT<2`MK7I`v2mNU4WS19HLo$0$~19AbKP`;=0vKMxq9T3v@$ zkMAdbV+Y;*XaZ|cy5&`@L3X+TJ^jHW-&hmAuQ*Nj+0*&fPES6{2c0l4ZHLwT{4L_f zf=Zl>XQ7TS`h&h_0-t%B#bz$0eUvSwVM<%*9an8ydm4KC6MFekk$ehUnsBOFY%(Xb zCtKmIwYza{ljy2t%Jz38NWI-BanOj~J|Mjpu`6Ub_7y{jeUuDn<$Xqx263V ztJ=9ZC(RJ=i0#;Ee;Q}jse&K#=t*dX5+7i++rbBR_@4ybR2$gN^XtF;F;z%leqyhc zeJk58cgy!HZ;Sa=tSRnPoKlUoqmtw%75r;%75_Zp(K+%%riP2{_qHOw4y1;Yh=Uc! zJ%o0}p|@Z3-yPjH;ScLmgvou4^;OX2=5+U4?uBeIv3DbE@=dO!vv<$AcVA++@}4YS z{_%CQjE*&qR6fS5in-K5(dnqxi@j^>OAuK;2L3)u5HTf2xUauT;vM!wh~|0u7vj_7 zn%m^uO{o8)zNOK11JZr|2wZ}`hmNuO#fTlY+!Et`R`w9i8XgjN7-NJnh+g;-%)75a z*>@s;HGUQS3f&TmqVx2!OxP4*_Y-{UjCj=?6a1!`9HIIR@C+I&yxbGIw^ck1oMt-r zHxkb+!TGpR@b%D}&DguQOIk1U+|=S`#PDoxmvfh)#jd`w!&S8UX293Oo&{f? zlU;riaomeD7R`hdpeTkm_Ez+H5=yA=BYo{?Tv!)XLc+1P@!eQ!$2o?ZpIHNaE|LmJ zhL8SYRn!+pr1-FGrR;bC^gFYpU5@B?FCTa};Cmu`ZbUrb0pRTd@G|04#Ak^1(f$PS zs3-7@_>~ih<`nTK;!SVheuQrke@#m6j>FzpHrv!}XKzD{23u$ef+*TvIEn zsBo~_$#<@^Vuaqq_!OpO)Lc+X9SV07A8p+h8X!)WMljjHqSzn62jqh)jaHw}C1 zfvC6CM{lws)-C2qPSK{D9;r?_CFh*@%H+Rx*jLv_eI*?ELQEU^arN=8PhY#na?NbU zscgE&!ZawFuC_2v^Ih_$FT~<_8U7om6!UCzXePcpfoWduj1m47xFSTi;Zb>?lVr4g z@PWAc&bjul&M_(3&iL9x{?3bYK#dq3Vsbjxw8788kbZIlZ3+0cyg3~+GP92&NJhgV zDe9fyzNr~UC-}d`+HOYIo3Bo`Pn@0QgntA(}vwuG6EK__T~&L`)to3_S|@+5+%@DT!Xc^!GSgJkam1L@NU32^-Y{`J4kYhZfSee z8_Tfv{T6sn>&ys0Av~vfKzJU&GnxY}c3<_^h#Pb1NqndSq{w`#om zQhkUj9cd3??i&-D!6{!r@22-YKde1#2HFGN>o<1J-Z{tMtaR?QWYzAJ;I#vz7lPMQ zpg%9p%T6ffRTTuYZT$qZttd6M_pxE6@=>L_-+0Vsa&Eb4N42rzTe0k~C}sZ1bFzfL zV0FZ38#DeQD!8Q=WU|QYc z`LH*?8Yl}o*+*v2rg^34&X`xs9};y%1r;$uwFIBJX!rV_+F@V+HtK8h8(*D^*KDl* z?BtYTZ|xT2vIg5T*qVEfDY}1qrDj45Vi?hW!ncrWXLMO#A$YwmE||y|#&s}-Uy2PA zE9<`$?-~84bBsAVvzqt?8-eoQU-_rY)s#vg#3OB+C4Ty_yGi<8 z-*InijQ4dWPIye3|M%?YbdNyN7%RxIw?i>)jp)Zn$&=KKuABC6Abtp``2Mcz_ba;p zy!;Eu$ix?~^+eze{e^bDBxO7bN#)nG@3P)yQ9^2X5K;qHEsz@C^WR~85mLh)piSyN zy>pEfawjE2_axxwf61#n~MA97| z9FY-1!$66U|Jx5Ct9l6apTuFKJS+$sG7eK zxwDKub_?rIdJA@c*G)q_=!LV^;1o6W6MY*r_%dH`O{qDDTN= zuYzVNB)B(fsL-P>Q2-SHoK)%*v1zkV|&)$FY80`e3Z0A_e zqp_ew#4E;tSB$Zf9Q!2fPfU&wOxCsyrQ0K*i!%thzaOQweKZuh1A|YWz+O>g4NYLAzX{dB(!cOx=V5it>Xz-35SmoEe4)Gjo%-Dlif(yWkYWP=?NrS`xCxKXf@Gj zNYODgZ&$)E%8ag?_x{G-G&|GTWG{7QIDdm)US7laS<`=6vlHaqy=&EuzqUVSe++xc zk6Dz>j{(aS^xwGzo|PECrOXs4#jSxJ>xiFo5{ZsSTPRqx*xJAg%@y^xFIaV z*7mHk8JsE5XPAdrSOK3X(W(2aUB0ow`-Va3x+p09beyEw3jR*ZSfQ!!4x7yDRLHzs zY$`ARI}yshmObTp!`yYt|7}+0lm{00q4u; z`>a>4l-fcZHDBVWS4Xu#;~pVs1J_tpPV&FrT&*|_$-0Ow-F{pRYmPne|9)y9mBzZHMlRRy|fgMYF( zC-4+8vo>NUQ*$QZ+uK9y-DrF})<1}EmmSC3#&U^DByXgW$bChaNVm-c}oG6U^55$;CzpGeLoJU#$CC0r(& zyKppc9%&EWBRTsXeDfim6Wxx`-&-U&zYn{zn{p2}V6>?Y=a)fgaA>tWZ`jA*>WIAtu02U9@T5eza z6wF3iMNG!*Y3d(0td@78YMK2e)leg@?{Vhur3Qfz?@>xYW< z)oZYV`1p(LtYsHs*|%{gTjF+%Q2fBR;_Z!qnM*!)l3OvB5k75{bD5~Y(og5$ks25w z@qrP-U41m>M5{#L1>pwKIU4H|7;_qbqIX2EX#EzUaWwXXLxcx}DZf;?s+NqJ#x=UxxXM6-%6#N#>zaQMJbd+ z-{KnRTR3ENHK$(*Z3~qyqk`V~ApFkq{(GfwRtA4#E9URr_k!2V27E6;*L`}|OZy+S zKMJ{rt;lo`O&O6pttrkBKGM#?{g>W)lz@22Q-#Sxn;;LmU2sxTO{SK zLhdRlHy^nxq}*)e=1VyXN|`6+YLKg!a?_!YvdFq9ii-9e1w>l=efI}k9z|(E2kr7K zZztUSL6S1hzcNaqyd&}7VZ6(um#%cu6^FRRP(Xw)&*icVoZOsQrWEc5Wxc=ahW(%Y zK=k^$sG9yv6nFux)dIfzB-sD>8dC@#$?&|b<0pWoGLS{T6^u*vx`6 zq($vMJbRSY8|rj(N~{Xd5+lC>RAvKYGo|1Q6j}3ZaZdOgpZrwy9*oc|(9~4v6frV4 zsI-4Xtss5a&;A#1oA%_1j-J799}>-*1<(m0`bo5u=p@nJ2!AKKOY`P>=(o^3BHkaF zLwDf2Xc|iMj%cyzzPsC=w5L0U_U)yp);NA2@SPI>Ygq4}hKnp1*fEuyTR zoB zIOPC>ss6HJ&5~hI4B?A;t38_}jEkrN=+-r;an#M0N>f0xe z5S>&?bkZnca|V3bnrGW=B(vjAc*eg9Zauy0)mQs{fA4$eU~DttIwX4)#RjPtWO1~5 zW=7BKRH;?XbND)F+&<@0Tu`&B9jXg4@mn@NSv~5D3H8A971*M|zMum8gYyspW4}M9 z7H`Nx_nr>Kz@GToCae$~3q8=gNoZ)3`(vwPcgkvI(57aM^ZB^Vu$S`J>EoV?gY9@s zEjzKU;u8;|op3716bks(oWsQKFl4M3=SpW4stXDk3+(3o3e=>KX}MIZQka1&)M73i zm}ULGnUQ@t;4|S|1SbhUe+hS`b0)k?xJ~#Pnx7i1rKWdfy!vbVuPs^5Ut?z=8|QmJ zY_6%H6~eFP(0oxBTIu`APNi_Df1i`%Yr4$g{ic8q+R2bOAK6Rilb_%$lggd~DR>dIaPMuM2WtKa zEDpc(Qw{2-MRyU$xW^A^rj>H7eokkVXyzW|Lj2=7{~gk^nSHFjW_GQFT^xT$7`yJn ztef6--z&6M)WRB4DeUx@*lC@Z>6~IA{zB`(MKvW+Gi3};-Ns?2zW>i8Y~j#@|HYzzuK4!8>Y~Z$=OKvy7&C zw+*b$1HQiYu!Q;>!i#}@r7#U6+D0+}(L-7XMd;gbnUZ9Rqj*lZMmQ9aB}l$32Mzr9 zeo-<1#i21l+^7rZA2XYHRtL||1$j70+=DZEy>t#T)jrh{iVjj`Peyc*DtnVQ$HfV0 zy-l!j8gCgRObh(J`-l54KNSx>+_A#P{5kXKZ>_mW4{v4~$2@`$RpC=g?W-FD&TM%YZrTXpt)+;NGkZwYy} zlDA?H9(QhlzrZ+MF5*m#LMgxPC9kNV*dSwt-=M5jhz+8_d%0pfG(VH@&YoV-|Z^-=E6fKLwgJg%-JRD`e-d-37A^4SLx7Qf!VJ^D}pw5GrVgj{$V&&l^^Nox|GAHkL6wQZZ) zQqn3H4h30#vd!R1b%r8z?C{tLV$!)Q!HVE?0{*cGP6q&=cMwbD5BMejVBg`Fd?*q; zfoGTH0ahPNu$sSkBXr=iokL-@;OSgp^3R~P1kn0CkSRfBd+#8$w)BReRSal7)=SVT z;fpNUd*zT-nc_3UVD%z=aYDCyD?v++_;tSosc8d{8ijWzL_rE(QUR&*0Z1j|c@eH8 z&thRn<%RQYZMtZIG%R>?zPbujQtuzDGHLs&(y+9mn^BX58utsz)FiRU4#B3L!yDjHTB;qT&q z4y!c4=|8}#K98S;Ik=AI;2qzbyYlr-lJ5Rc+{zUaBxundaAY2?2DF~<4`J5oo)Biy zoLm_Nt!u;3DwiQ+=lQhEVUXi3mf2jv{b^Z(dcQm1g+7bIoL|R`{24-(BLll zqAY36!#i;jw8$G}Nvq_$uThSehmE=%=?=|O5mzB-hUTb%Yw~Irnxp4%6%Ebrz{{hd z`PhG$qmu#4WnsJ{TiIw|rxD!C;b&l;#sZ%6cO*u^Qn6PJnx;f_oa-fzh~uMRxeT!M z_hm|S>^(6AOABCmTpXln?IK|wGy^4A#z?R%nq!hETA{TFo~?*h71||_hr5XS+}^L? zZ*9ZQt3FSPF9m2ekyluHc74CXOtcJf3sPHDdvp0~p38y#+FWo29uS-z<_hFTUL!053?~u&2Mqri z=B&AZ;g8@8X51eI82FwNzy9O87zh3ETXagY2?mbd1>@1$JV-WM})Clh`r<-%`J5_wYvXKIE2 z*=^+*!3X3Y;w~ZG!r^1!0sQ}y@5%VQ5U+6|&dDo~V?y2- zhsT2=j8UU@zK?t{>fxW~zxTyBQb>nyg=k-lMUY8;$rqzWXz)jTF-GJE^2JDfu@p0$ z3hBT1#i$Xki1MjOa>@V97o$d)9Q7UH=1^aQIEis3!FSmYYbY*Mq9xUlFO&`Q$EXoT z!5?F6*ehGUkR#dfQX7cZQ<>B+>JRKJctqpmv6m`gw+#Lm87>Jp9nqgk0aXxsnUag{ z3WN7F)4Yo35V5dO*n_pgIXAOCWC#B@SfxaCf=C`UA(|K2IEDNwGsRVIrew1F?L(Up zg<{{KM}M>P(B_`$+-7mQnJJy{^`3(>D%h$+7dGVApWl!Un?G-HY+dFg{_1Qw{5Y1W zG6Ylq6j=4j_rU@cb3a2^iFt2wnf2BD+Q#fx6ccENeRnl!#AJmvV$7Ip`NDJ3Xk>2BF(2_QEx(j5Au6yQh7H61cRcSTmiZ?wngXeS`uH{uL-q>?+X2oHTpH+GGYU?{D0^wI+?hvlIhVvZ;8iSH;SEkma>zQ;8(Hp0&++nvQ_Ps} z-Pbgf%amRBTrs{zW=e0AO_e(mU=7WV`QzzBB0E=Zy7`UtMmg?YjEW}%n8IgPQI!5| z8qe+i0#x+@M75|ACidk@R}`Vi0v+lq=(1maUdAR%QJOGgZ^*EXfe(K23>DGe%tedk zz2wUu&!GXTu_4NY@Ry!A9mB=!gNsaU_3re!8e*DK1tP16P+Vkg-2IqR_ z;~iBD{)pb1Fn6aS)gY}sTnHQS!I(dxSi4NgM7O+j{Ao^?XDx>uI|-+TGK0J$VT`N; zdTM7=4{?aLm4Ro+g2r~PL0+tJClqJ86-e|X6;BQXTcoej+zLY)c9CMaXpL_*`t($f z3|3MKuG6FB1P{ag6aFH9ih|`{wC@w7pO668`h)f-4}|Q9(>gJdF4)>>(GUDz}|HuzWYM4eMwez zhGL7dnK7(%&s^GAa$N^3ORMOPa)+$ceOj?oJ|(k3(X!07s6lRe-UV3aD7Sp)f^S0^ zYG{VeKV-V2C_82@qcxWs_~PSc{jS{IjgMC=cTPK#Z+PvrVu#{V42v@)X1=IcvW}w5 zEa~Y`Y~iY8QY)1x_uq%GD zQMr>bkOp?5H=f!7i{}TW5@vM$YCltO>?||-Sx>&<{!6a?iXAgbP^C+=WMXLQZmuXu``0z23$W`*CLYRE$@bv|(1|nGv-+vlN>Xy-89p2ohT9`!sx?gztA$&$yI?R_x4D zHk%qYX1sqcF-6go-R8;(`d$baUF5kX&O0^kRu4wN*jz0;#f+WN)%_Z$b>-wErX|i) zU2UEb@Yu{6lSKB&yB_6Eg3AxDDRyvGTqQ=jRlZlzLN)&Y8EHn>pI!^KoNDfPjcOiI zJG6yv>AiRGUZjP`2Hpci#~l;njk~KqK114(>0x<84s6$n(|C%tG-_Z?xAt%rc6vg# zoy?)?L+X;E(@X(V$mnq@GD~jMh;03CM0$G1%P9+bmE8*1Nte_-ZC06Zj8=Uzg=4G^1irk$noC`**5JNnk>_B&dSBGLFEBFRzrWQ?N43{CwRdF#}TG`gyigwit8`o9;bUNWx#Rapb5<3+! z@D{oka?)Sj-<*@NioG0sa@^UU1W&%q6N-H*#OHpz=POT~ZG z#oAO>ir;HACkuDCXYg-_?H21X_pd>^1?fp7;cy;5!u~ku0Ig}&5*={0t!lfz4ZKJJ z&eNJ9co74U_C=U&@_iWsAcsCgVjxj{R|gZLZL}{NhZvmXCnFSpbMB$dhs-63G?NP( z5%sAg1GC=1O}VDD_|#L?Vn-?bM95moAult!w0*g?<}#&dDN~&u1Ah`0c=MfQd>oN~ z9v3e&vRu9`-^y&2?MsHfK3OzJykHp6imadt_@F8q&C6aZKCT+w245}U^934+s9be;8C$O&duDGNa z`&+I-*@M12_;0@(>RlyScm`G*cdcDma{zvp!@Fb`MhGJ%Tf2p5-&(}UDzeKar13?w zRq*Q(X{jC_Ak&3Eibh^P$H41tX02Yxh6nv(SjfKvuO;(ERnm^)I~9HlWboOdF-Ce!(ZmsPugdN;iwRSgJ1=+a zb~eM`gGOFVQOyjGR-5s^rz5*TF8Lmd$bvK;=ldhElK=mf`{qEoYtdfBfj7Xf$dpKn zVbP?M^K#rx`w+bM{#b@*Bo#-;6DMD6aN+9^t&9p9{?W6 z5T{(O^csi6%OlSt3U8$>RC5R;l-`A`{voAzk~}(I+!NwL;AED{w+siDW_=k2C>kB6>Ipy{|;? z=MU@se4`fMFOm(rif{<|r$d~{oj_XbJR#2FvN!D#t;XS_zA38Q{KF}Aa;$*h7e|)j zly4#4(a^>=C)vLgjVVm?mtwI@(YaW!=$xR_BMy6LwL`RR(34HF;OJ9e^+R)))_}Pn{88WXX)=&!>=#w`H zqd)2CNZH6%WHo*_;ESna znck{ggsT^E^%$ zZS1?O(|Gyz>ayeSiVha3LgD>Pt^quVGOh0=%A~LpR4pX4Y{N6)?&6D7<#Y!w`l$Der0Ec2J&&=R}0>1BvNjM6IQEv0u)|A8JM@ZIGU>88nxA2HAn=mE9lVa@s-^-uc8!G>de|Y&H3@yK=wVHY$dqs;mRwUGmX5D4`u#d_!TZ@FWKo`!J@`RWCW~~LkFGzJpqWw^x z9`BLj;z+R~h!(~V@RL~R%Cb8bNp|t{W&_|7qJ`b9ze%a1_s0v4cBjG28wpHuQEsK(km6{k^pm#m=5W!9>JCzJi0go)$*2^g)&o>l_d z%k>0(OM{y6 zS!ny{fKF;T**?*TOQd$s>ThWS?r8Ib&R(V<)UJQPOFqqzb5dmbNV{mI_@&4e z{DfBI4A`1e8}bj6$DvS+gm^pK9B-$(spj)i%*$xbdPodKKp=kf9KOvokne+g><7EA zxSu@uMYz)m;V+FUlmMTV5>ILG`M>a#8^Szg9d@->hIz_8egBE4EDiINRrFTn;xJFS z4p)Obh4=~h3V6&p@EE3MgZQ3Np~oBiQ0{VV&mebM)bq>Sg*Zog@z zl^!kUM*ICxx|4+80prSqvjI=kzTI%XG7+&pqHzE|{GfX{l$$-*qwG9A7k>9e^)GR= z&TrDmAjbuqOxSmN8 za^L|Rv7;e(guWgjd=T~>^6zE8B+@e-h~M%_SXN|8Xw8{um%*|iw4P5EX7|Xk(_$Ou zBPdDuE}#f|a!MAe!aj+JXN=-^%-LZ-b$~pv#aueYp;ybYomWYGKM!`W%vhHj-Y_d^ z&oS)*NEc3egZRZ@SA-1yB9VZHms$idgS#rVQt0EF{9N@waxJUQ6|f8IYFd zrwcbiXF28UM2op2>HK$AC1jS=xj4j6hUXZOQN_pi6iuo zl_rpl;8g=>fiE;B36}@ZlLo>`>eoV%>bPt#q^;YY#!i#cyFO`Tq^|eZ&Z?xkUUPu@ z77AzkzC?+2R*hjRY^|8vsNVX0%r=t3iiBstStp^yv7(u;0o5@yz`k4b>SkKapbzu= z-~+w$Wh4BD_E0HRmT)O+sK+z*rXvP5X6ktK{K`jRXKdtWv}%N_dKb3Q^RbpZK`sV; zL1_OZ3r7QjuNS8+mCzXN8b4!S9xwm=&1#Kfo&)h(;m_<6^j~kNSOQyTXGKl>OkgNz z!fgTQJQJLq6;yxzY>gr16ne3yn9miyqS=NV&6srIwH|u!LIwRdR$dKxl0nP`j2A}x zpRoF-7O5=@N%onUEBx*_t-T^JzQ1eEe(A{rk+qk99M0%Wuo*&n1NpQE_1=^Ow2Oc$v`*O0%zTGXJ2s-euA$y&HffyZg3@@4EIM$%F2ateHlQZI0>g zUduGccxz=bo##?3Knc41ioCSrte%11W3@4(gE%7IWpah(LEJIZxIZKst79Np=L(C0 zbW))V<3~K`PAyKgXrC$QyCHy+in70Skbjz3teS}55wD}YAo3nINQDre9ojvNcD?wN zR^I*DTBD9Qg1s*RyPxd9?q?FtM2*n64Ea4O6OJ8Mpza8*_!oQvX{0&`ZnU?QV2RB0 zCh@6?|3}!Bz&BZ+|M$(+oV^RZ$sja4vw(0#1Rcl*0)k zTe0AUC<<)lrXZUYXHjwbce*8j6GR1%84ew9Dv&o#oBY4eo1{&PZvA}TzIosGcOTF1 zxgX~0$Bm3x;ZQ=p(wB=M<)xVTa+EjaFeJjgFo|zVwU`XZ$oDSxt+X`udKht^ z5&=`wddD3$B|Z8E^HNZ$Y=ozT6-RV1?16)ugr_WCWB9$?yB@9iRT&^gV+lV2I(N$v zv;LjN@K>U&gTAaD!b3I*7+*uAw9YM~j|p2+jtQ@T`aWhEyW$gJZCRob?hXoKv~cng#*o>#N!U>aidf{; z5yejwGUfVO%yj~}z8R1!vylOp>AYc+@Il$;NNw?D@c(6==mth*pxAYclDG!L9DqP8 zh&EqhAWS8Pf40Zu1eLskH3L45DRYx%{q2aq5cD;M*nGVK6mnu3zcr+HY!r^^p*dQd z+HnK0bJCZ$Ob_|40>dCUh_4puq1ZS(N!T5C23QlQ=Y@pV5qBc!d%ou{9xHm^xe&H9 z@V`M`wJc!|RPf6F+FxUL<(Jr%fN~JnYV-u)8irE`L_s;(3%;9^)k+3y;f^zf_%IrPT#wBa(G?O81!G?U7ed~mUDNX zdiS8DG65c}&Yp+XQ}k~n{Y`|WCL+{fr5*|;nZB8me9j6!x&hC-@eH~^D4BRt7+1zt z#JPirb0zCMVF~))4NCNib3xy4g6HNx4t-o!FBu>?kLNqO%Fx50Zztd|dcXvI-(j@E z?_Tb%zjDi>@cWQY7I-`Iz6CKkN|^As5MuEqnOOZdbKH>l{u5XujbwN)FNV+mbZ`nw z6k14fv%wv(^!C04=MU-s-xf@&3qxXAFv;{6!#8v2q-ugzKGsqBz_E6A5oCugb7Od< zbNB^shU=m^i`Db!&-IVz9bIxed#$!1>hrBF2H#3KteXOi3;lnSm0dg45QWGg-y1l8 zR|}aF2g0npE`s9(t7x7dxUzlG16PhMwBWo*yKz%5+}f26J)zz6(nCJRFXI~8AGmUD zF>Ab#F26S1O8(t&W?frk&4Dc-GqJi@HaDIU|-()A9+p)tFNnP`*nGIhlejfc!Cb=Nhqdm;0Z=JTqpmYfF1#J$wT?6jw(zGNtJqW4S+hS4zlVDb2yDU#vzs zc*A^wSQiu@*yH}xBfIul!zaD`S?cdcqr+$Syz>-?kvyP=v1pY8w(pX--sln06PeD| z@sZxpT!zO?)thhNXchST>wzbV_ zG0}@SHlJvOSvb+`0ohgcBK%%RJ7~3FnhyGGdeFy$H?dmCo8BLrS&e!uz5B;<*mR?e zGdVU1aK?t+6OOyO_}^-zFJ>;?BG@C(6BiBZ|PFC76H24)b(1|YTl}%S&GI}rFAe? zND=qj&yClI*X;xSb>r24j8_TQ=TTgjhxq*zEh9RkGVl*;;|jUi*(HdRHWS{I?tM`I zU@SyaxODv2q2v*7+AhJjyjR=-VK_)@zK_4A?8jfz@gIa(u8-z?Hv$8##l+i*^|Qv9 zzD|FeBqDO)4GVUWPRIh1ha^|jn$=CbyT4>d$G?a;cVT&6xU2;9r(bUr;of`*-PeXk zVtEeKlSk2$*K9wCJ&Be>r@Te4Gd;+;h z^ByJpQfJV&0$h@hEbD3+^G4u1#Nn2}zW}45=R3>jS*FIbnx5muXQc|y@SDC7_!)gq zR1$_m&-db4U%(VF(1ohM(gYbF0~@Vhl>tAQ7JkRz9gBC)vPhb_Pr4W{pL9`!ON~o~ODP{;&AdFmn#Co-CB-!fF_WiUgtz$WlE_-I~yYGQUOkf%=<+@DJ0>K3a?%wyZXe!SiXQM zM*%qtVdJrH6_B*Zy!Q-vcL49U4|vDp-LZb}fKe_~TwMb!Zyc!XZ<7?@f%RZqY0U0u z18qG+(YYyE)|oatwnku>DT+?wj_LC7-n`AmiIQG|0#VwK*4C(CILcReKSgCJgv+GD z!~L+F=(-O1-iL>i9-kHUUc&5rZ-~q@s8YgSF~bJNAjOzcs_GExHGyA+c9j}p+XXs( z5b?@-d}W|h<(*$l>w}fxIn1UueUIpaQE88v9}>ZNe1|7GCQh+lgAd7GDl!{zVIwdW z;4<=*_KiYQnF$nO5jVOvh&ZgH?IUVw4vRS^ANbosiih`fsKPP4{+Q5gDW78PTnX-m zj#md2-1#>Bl2y49bH=H7UWN$z&f~S&`;q-{-RpNKXjM&2bju6$Q<3H*7o$b6kf#2(=e&`S@ zZe>VXssI-INHDP$FgbYH_pnHv^_|$*|B%FoX?23t&;1j;2b}xFJ3EHoiywSo(W|Fn zCx+hwXg8dj4qY#9a#Gk@&Q=`5f07RyAVSD*T z;o&k(+eTptzIQgjZ>#iiL0|s+L#%0uQRcmZsAD?>WBKF4_vL0jBfuD}#>a)zxy7|+ zUIs4R(z2{J+10;dcl>~ruugpX8=juS)BdtmhfWFy%HBio$tOv4O!esX8{L_;Z+a+J z<>xN8fMA-}_*KTBXkClU{B5DsI?2_o3nf<_4L!cppcOLL$A!E_sQuR+ID>%s1FwDU zt=QAyI3lo;ESkoH@T&&kv2_s~?G%1L2e_ShI2T?7C65vZiZQUQS|1+|!seBzGpioX0e*X4>Gu(<%`8^^6H$ppy z5p&)SDS4)IMTGxDGh73I29ie!H;UqX;8W%8y*lsFn;ql88HwX&O#J}u@QCerert=BRYFs2&d%rc0A1Ry#mouD~**Fnzc7;f`mJOR0sIs8!5PVir zic&k3oz+G4h3nUs6Ly`CetIJPoQQt9&{ArlH`2l%TtjN#--#BXEkakc9dsYqmb{?c1Hss;>(=K=$(fPtq>$5lezI0;8 z;w@;%62Md1AN=7wN8XgaxZbkPoxo(!-iKwKf23IJ&&oP?n9$ZmXgR!9ht2mWmC!=eO#4z-Uk0n67hV}!3UL`GuzEmiSmb!D){v%FnrL0?(G6axckM8=3C+K3Uo=}o6|r&HnGD3cyDa_5~|1N8PZ+r3IAkw5J(=C*sa z;1!HRsap6Ol@umn#Wj_!Ymc?y_?J5&qGuTL-PIBF?MD>Y{O*gMSonAhyr)LMAv&*U ztmzD+ex*a#D9Y1d5bY>R#l9=7HuR@1b&y9z=kc1TKScRO-ZJdZ!}*R2tHB$32mc4= z?dZ*Wsy8q3UmtZmHf8VCRCso65qITAoH%i?cmN01{E%x2#*ln&EOZ0!DW3tY{e>9G zmdI`pHQD*6{XXA2&@o{OFS{V6e@ND8tT-tM$tMM1be%z?9<~Nd;a8AE5iI=@_dD)p zN*VqyO~A&ncRz6vm1`zjBWROIL~RmlE8Z=<-C^Pnfj8CkAg+bFODuyJyghn?B(t#! zAMEkv1zx+F_`qeiwYA=E;_v8@?z|D!NE4o?e4;BNIey-!bI%lf&tu#je9#M|q&Me#lpM z4%T1@XZ4UVj6M~xo6c=opC?ML=S6KF!1K_-|9=#YM9)}}rt4kHN=PZT8)NqZ?ZAg4 zx%%=X^zveK;9sR1m$ku1s3a_!)eeZ6g#Hj;H|{WN)b*C8Mg8eU zlry~Gp&z> zSf9VfrF`vSaO=}xr4+ZDC_9yt-B1rLHU+e|^pF@?_+vei+=Mf`Y`WtXaLrTrab4j! zOVKt+(S{pD>k7hR8?Eet#>r8B%FpovwY(w9g^2K5(?3J(D5K@@ct;-(xDsO!_5^VQ z?6NZ9Np>tE^=uHD49RU9gcXp(G#f?&&cykPxDhut8_R2pfmwB(fe8F$P=Dz;72WE8qr=Nh{8_s2_+2F<%4xKvWHLya}#f zrMPBGAY)5+W-XO9uNP7+#Tc`6=jJtOoT7QJkZn=IGemN$6l*zAnE^dRvS@)%3uk3y zjaFbDZw=-+a`$H}QS64CuSnZb#bt1r=)rxkMDn=ujp_Du^rF&VWyGm;&mc$f&QyH; zB3K3g52<)cg1>^0?~|b3T7|eV#||=^w6(?1#rh~1U#GW*ZEcTv#u2p>k#k7@s8&jF zMf==}K2o3mf%^~GE)v+V(wH=YhhTzSvrzOw5tVMH@K-Ur3X??i^N~|q1sm;zEqbB(3f<5pMK0frn z?13eS+^vIe%szWy$u1-B?CP@zj_R?on9If<(qN;#9$iOd4@~Q-6_*p&|F#F#@;8R5 z^8l4Y>$5*SpYDuvQ0;vXss7@$M5?_kCLhgT+~EXALN89mz#do!d*EXWwY4b?S@3BQ zdlFIpq#lYy5ys83_(3AA8QmY$AL<9iw*2_O-GCA#ACrL!LQr_b2rcGwyAgq9xf<(; zya+maajP9oTK-$YeimvFA^Q?^28*EWSj?}1mGxA+rggnwE-T@GBS`aQoTFa0k16@W z1x}X(&|P1`&lA}3dk+F~lySn1}>K_=-Y-ZSv-t&jUQI#R=jlcAq!y7+K{D2 zpUD;)z?mHl{Q`%eJY<5VXg-(C$u~>&Ov}i+3T~ub!#|0=waaDVr26u@GCZ%u^Q$g1 zXQ?Z-OZ6IlS@1>AFvr)PVKkRIyE#;B?Q8B5#7$#TAW4xfyFq@_&dUfxF27 zKfkztiE9I{XK-D{^&_rwd@Gk~l$E#`<^$UV-0ScTcysk|M1kG9{u1EXJaHbC-cUun zSpg~VU`~a(EWljOi_GODtdUSaw`M_ZyxDtdlSR+p3Of3G*W1gSIHR5lD!tQ`tkKCi zcdi$y>HP zQMW_RA1APTr2LOTDdzJN7tS$gu*dR@5f8)rq9&zLaNE@-V_~uYWHv3bdD2<6vb|Cfh>Ta4?(Yk zz1)G8x8yN8PF{C9qOL^e5^H|)^W5V&BPi;7Uh5`H*pf4>p*@8EA*A5ots|d2`$Zu; z!~Xynwz4a1eXzOdCSYlZ2`z!YCG7e0XXsh7i*y@^K9rWGgUW2SFy=F$t2W^NDegyb zKjG4Y`@k5joMbogRMPo5K{@dh^56H!N~B(!y-;M) zd5b0Ly_LNb*^mfDCfRKS-~7O`6n=3}!vZ~juRjiumVT}BXYa18k?g6hgzw-FcZptv z;ZIofBD~U6z6_SCE!F5zDr?|x7Y>7d++|tUrZnjdI&YCgcS*`n{h9n^e;PE<)w^Wg z-E1n>`&JK?UhbE3>Yenf-ml(0D?@Lf=&fabDjBPlWm?p&)tuWSEgcl;;lwNTpb2SY zCc@8ccx>Rmc>juJ5=6&#GDdzXBDBx*$V(?)xnaMoG^00PMQ^@g_+>!^p@~Nf_r`~Pk=L#=*RvIeAl!p0601q}_4O&w4-4OBJ zL@+TMxcL#sy9es8C>BxFWZ>k6EN7JnAGZjFD~kD6U_iyDPlRzpj=>|sF(Ea1lW+iD zV;%04YSslW+vg4ovtE*4yYpV6uXEk=P20e0(y(|NAM$_CAM=U5C&S>P+KLRi9YuF+DIF$Vd*Aie(3%eF%v(R^ZP0F-@ zW58_^+ANFeC~iGju|Kw7fjDSGV7p3B5AS~(tx+!6Fkp|J7=-0alsJCm-_0M?_Rio>M+75$vv*vTD1LY zc>?9@EmnutXti%^Xv{9+*9I-^6YLXfHT>`3A8_IoZvQ4>%*5)pO~P34ei(jF)2v*! z*xI?biDrC+D?Hu|-`<3kVS$9BQiAv@2b=UJo%azX+d|$+XbnNf3%=aSflFChi$GUG z1`9l&EvNkD*q7zd6I~;x*{@&w?RU>$$1>(gu1e@^ z?Uu-P#zW4)BmFp+Y;&4<`ISHK+k*J5(jz+WSSdzSqVwL^4?fR;jtZ;)6>x(4a4p5< z0%RuQr0QZ z_oANO<$#>4Z7a)wy&~$Pcjfr~Z6H6Ly!}V_!o{{jq+KlupbjKeE$SyG& z_=!XuWW^;7gBWr>_&w#$8uX)?9ijHJ>M0}N1EdvYZsM8lJDdy}g1jDtaUIq>Nx^#a z_&))ze^N*-w;&q4gxxDhEb9CeewZIHUjly4+K{gma@@ig%u|Z8rw5h! zKL8gD(~s1j1TKk_$LQHe`9gRZ5PO7G@*r&S2KLAz_9%?ArXmhrUawWgD(4Gr%Digw z8s6}()6u{<4K-58!_^LbOgl7aM|@DzAbrf#CU+?Evev9?y5N!Jk#$WNN4*v6c`@Xl zeY)JJ#lm>UC@!_Fa)$kq&%?fAT2lDK@LzAi>}fH3`vqk_`tF3UMIpXl-;+`2$sPur zZc3fPzaW?%tH20COVysjw+M>-uRXH-bK=N^d0bAk!3V!VeHus-=ezS{TnqH~#vWgM zqzt=ed8j-cqvxFj>!kcR=vV#U5gY8l|L%A1zK`+d#cAfueXKL%M4McUb+&p$zU9YT zJ`s+Ms+ji8JQ@7Hely#&Kw4v(tBF|wI<$0o52JVEG@T0T-f3*eXAX_2`5K(gi@;Z- zYl+$>aYonCyYu8|Sv+?GT1NaUlCO`!Iv;~pJ`!B;n5@QhND*lTYlJofxQ4_(OySc6 zcElLyA}FvbQ}}q{(mZ_*TXAW&87(u+d2fyIlD%h?R9j`c>N#896qh?O1ktzpkdQqZJ;=&vm3r{ka`nk ze?hOyGvdU4?+>CiHGQp#Um1M{}x`UzQ)Lf<(jmg$$taInMA?%;vP-GI3M%3EN+zyh zOGL+DrntxQV)ocO^Q4G1ipbgA=o8ZUHh6okIKE2UYmN|nET@-GTZS0UO8KmYxqu#@ z0{$(Y!Fbj3MHyq(#(CA)E1P;u^XE9(iWZx^#xzIaHa%u)UzkDh#b$-@W`P;|Eq0!0 z9lakQEo~;hQ#?JwuzvC3Y{xtEqWde{s(7w2(yF}U8tk(SL?xQ@7^Jt}F-*u;+^=Ri zYR+n>dT;*Ode;S*eC!>u-Y86_IY@IH?XB75Oyi!jWu4H^pX+=M{>#6azjb~}%__u# zqgoM{Gx*JXbImt%uJ0Ma`&p=g{4w>>=%Wvx74AH$<30y%`>`N9inCg~szI^&=mloF zbavck5=NCN)|% z($U29dCh7-yPkmLMqO8*_+`LYPSSjMtDd|;S0NGwn>4FE8JUzM2n_9!}O&`X*Pkn|ID)qxbhus%tkrz zWcUNyDQO)Hd%8rVmsITVRKa4RY#F>+!S|4PxwQF?cJd#?n7?w(TOey4!XE*qf5tV~ z^k+}ee0n}4(uCi8jHbPwK@of+mWL9KP9F5l4R#kMMrJ0(l!pE*#r{W66&d;;hj~dd zk;ZNxEP~F4LvKi~jm~@~&p`Jh0g<4)VR;^pyAXh`9PU>FvHO`;LD|V_NoXrq%!V6`%1vt1kl}IBHoPNsDpp;Lg@U3{kz20K+vkuPaekFxEawaWZvGg6`&GGCdx#1n*Xb!t{rSM+PJ2{MZ zB6(xEL-fW1Z$Zh3wI$|4yw5jF$Ckf~{}LxO+#3eg`~c+d(Ruj(OUO%5|9`_nZiDnc zj8#ClG@^^yZjFPVxk5*uZ9&zw_8BkO6!2pJZ=R>D&^gTHxvsG#>jh=QPb;=1Af{rp~4^WTBXzXEg` z;0N?gTOxh5fT!CcT70vuR&dwCHWZos8Gi@3ok|O9Vj&q)Ti8wO1&vk5CxmFEqitqg zYRFN@`hnJ9BK#OWjWZxzM*5VcZG#4+-5!z}^v-0gT+%*!yMs<2bz4GRWo_o3B3rPLYeRjqIb@0 z*BIafAe4tPqJ9`BqTRm;!Hx>^cd!3<&=W}4Gx(pOPlC4QdLdIkpSwwjt2`;hF?OfC zMf%RHY>7MMTM4XO(jq~-w3ayh*ICr~A8(H+7#go zo0iC1A^YR+55Ddh92qm{J4`Nc=!+D+=eO;1=vea_WzwZ8wzflBW`O>~>gJ~sci2>C za%*F?Z-=87fgodmJV2`q$bXb##eJ4INRXWStXjgyNwi&(&fJRiGYXOp1J zAKbSKhOJ`|3BHK$7N+5Un}2TZZrexjG|HH6NUyw^9eG>!`@rEpz`iGr2F-2P7tpyK zq7&^|2RR1U$MOuAp|1mClc&W(zP-D#Jr5_cG@$rh#e7pkf1Fp%Zws=ch75}X<@ay5 z0=D=e-(w+t1JP|_U7{`J_I%R4mT^j8Nb`EfCElU8FtB=fE2OpS>X^+;p|V2_p0LLL z1L=!lcBAJdt;z?2VH+lDJL$tM0UkXcR|~G6FT43C%HDWg*;NC|eh+1C$JLGNznzzA zJ`a}Gt9tjKJA&hjejBiA!~6~@UIP42*t7GrAl2YO{d@SVM zKysdL-~HW3+c$#?`*@JM_BeFVw}hTWJHNp9S=O*5NDZAh>$TS{I^@MFs@L&9w$E8= zTAD18T$0+hEzPX47ALsY_RIAxbbU9inx_H3)cs>wwbx6I+=HJKaMG5 zgoLOO@K#U$cT$Z@@FYF=uoy}1N7ruyj$9c`oak|dil678-wgQr$ zxsym2FE_Hk$OiR}DBLZ85 zTUnGe$l5t1d6eB!Q^@NPhi47e6xEz0nLGk=!7R}WAGrBuyepH?n;Da!uZlMncyp6P z*ZFKe|0q>Pl%J&YZoo+-K->Bq6XG2uF)c&tsyXsjFKgEGO22F)^Uy54bXW-Ogo|q&B0%I z7--hzM|{AlOd4f7;E*3z6z<=hr%|o|y!hyKf=&G7P0$IVl^WIx>h@&>4zzE;IxXu7 zuK{~-J?12;_d}3kRyVCuQ7>n*j(_F#xl4_aUG(bGl$wcV-RDg)IldEDXgGDqXMAg; zFxg@?t6UGqq&bN+pIAZ3du!!pPQFj(b*lP2lsG1lhZ4pl-v!Jjiz)i*Gqyr$7TogI zkZ))}g0Va0DnOnB>7TjhKsQg0yAoL;d(KOlBew6jYvO#psfDk)_+Lg>&wGm}?ICX@ z-a`4{-Q`#tBu%uM68P27wy)&|@6_@Wg_S6Mr+eFyIJ4UAh-vZiE5F@O#Fj;!3lyI~8`GRXv6r50M9gKOox_54UkNA+#t zeL1=3HIL5w3Og7QsKq^rb#IF+(vj0SUG0D#V;OoiEeGo`1NwAyLbZ3lD9UAqVf_if zH)7WxtvgzSDTjwUWCP%^ta|lQQ%zjOI@_dE(j~ub8;X&LJ)?4<`Tx0<&OO40y5FpZ ztyBVRr7~QsIm=;;(Yik`dK#cqqyHLf3H^ER`xS2`#FXypeSbMdL;pRj%g?NT^Tg6C zN02fxat@KqRnG0b`k%WVKX7NA?&^PLu=}d6eQ=Y7(^e!qGr@yoBpLiax;Ob{m~X{r zg-*iz6HXI;bq2BO{xhS#PFs=W%yfo*Ix~E8lbYYvHGk>ur8t#Lz@DeK*w`-A3Pi-?&03D5w^nNQkUg!k4boO#{5D&aPl`4mZ(EUwqR zD-z7EF%H&{?hN@}?kYIfA{^T?^2RV-fE=ZG9`Bg+sk?d7CvJAU)?GSPZm=Nj+O9%w zWJ7)fY%ctrzF&uScyxR~_!@rC*ChN4*xk!r>^b;l>k1i}{BUX8gkz;f#4VG6PI+2* zPZwxo3U|BN%8G_fZP1?=)OCiW%H!2g)d2)5B0Bm8y+a9c(-p79-4 zFXbG+D~`pxvfWCo&Xrw{wpD@uIk(MPXF!bI4YoKpV+3V2<6YrsX~;-@7!$KLlEao& zg)?0hQRCjmQ6Sg-#lX@$eNm*D4(;l}S`kXCaf!58* z89#zx;j0nZa?+ZNrl;W%xPs_IaXnOul-_1fEH1PUy^q%Us>lcKqw^B$G`$frbahMG zVmUDMTc3NW=tBQBOVdgY-O1%pH$W{D@T?7lFIlgntduiq=sPkrA zFTvOPqqtK{lPH#{b1Z4=zfxWoQX!31*`p)+(i?r>FT2z9vN~C0Og~0h!^|3G6|PoX zG_K?)IO1Kf7QO{Hs0}K_b@}h@mtU3m-}5J2 zm!IpG|LXt9e_4!t7u)`!{qn!}Kl1mLRy9APM{gWur{@V>@cNH4;4bJ! zA%3*^c31rs*CLBug>Mb8yK_OyW(rGBMM(LS<+p7ch4q%XIDcJ>3dK}8kyPu&RD;AP zqxdDUYumDIZQm?w5mV=i?-Y^L8ZmXqPvs02zxe&*+ssSMV%j2(YUKUNb*kNi^z2R* zKTGtuw=kl|qjss_=SwU0K-aYe_7LkKuX*3II6{lRjrDj67wL2=_iB`9@tfAz$GG!{ zbzGkP`2#BFV9`e4Cdgox9!WKqx?7wsXVx2RWv=;|jvRYV{Y`?YF=?I*aif)Q$ez#S zRBxp5CBT*Sri6VrkTp`0v_it;v^5cJ)rH7+L-frx zF``RcU4{seRs8p_XMp=d^lf2@M)|u}G|KPL&Y;-V9BzF z0u~-+ehCZM0>nfsFQvK*JIW30E-iFx*gYmdHPXjW@ox%5Q%800ShVN8U`{W;iN>YB zeY9!G;xqiG~#~6fgQJGXWaG83WW8DE8_{b`8Z5M%u9*1a2 zQvEpeOBEUC2T;=OK}J6YoMj*RAT9ilONy0$3EE>L@a_lTjZERU;=8Y0g?yGDae0N* z!X|FQDdJs_Zjadk%t-w_*CLcy-#kQG7H@df2~uyV^r~B~f8PTv^p~aJ>1Z|bfcokk zoW9P0{$eHkRt4L3)g`%F?oDTGoNVWlLP=9?O#xrmeOJvaXiQ84N9A>47IamR3N+V2 zArT||XqTRQ5ixRJ@Wkn#gXF4^cL_St>jmNbvR$d52v4JB@3Ei}<>(V+TV%UC7m@D#<)ms;{X|tV_v29}{=B zX-A~iWP-u~A7*0#zom!K(@Kp(yEu&L{+>9@wj6S28DjeMohwv#J?h2$R24aXcc2LK z6ZW=I#E*uiB+U&5N|9^svo7P4e&97rV6y8$BMYjx6%sBnW9*rrUbh;PoFcXqZN`6wP6kev%`MX1L z7~zk=-#_9}(8xt>HDbr^7PS9KT%>nG{zl_DeJ$}$!~C0cetgJUT5!4uEy}D*fKSwP z$DCZ5cOsLqWCedG3+;y?1R}BXah|hf`q@mI!$e3#*Z6e-$rl{-*Zv^x(2Ll$3-B&kpk4cotAMY@J~)fF z_u_3F)&o)3w7)-b(Q1cPFJyU40nwk?7HR5wAqU)gSfwSC<)fZcJiA`VwG_d>sk}Ml zd!mOqbjyvqxl+?_t2Ls%nY5*Vet-FrBLuej=L!3!f(pPsSLT*>AN#)l7;edwe)3Znd8raA3LRiw1!lD3n z{1u$aP*SHv3@l~MUdX5m;1{c?t{AOR@|Qwd*mc0)`9reJM>7uuuJMS9lqntlr!Nd# z;zo7eAY&3viECX&uqu1zH;+_njfr@^Gn8eg`?7AW@g|Obd4h_7tTS=v!NAo{CGZ4C z@E+K1bcg!CwFcR7o$gFX<-`;04`Dncc3-`MJ@p|jt1W@~7w%_pUBcA?yP}_uv8+Oz zul~NZ8qS98=?Ir8jj^dSJ4$LZ8%rGO1v zTj$TmN-pU+c_BVxU1g{>II4`@zV8A$quws(a`1grQ0A>-3ixEY!`dw!aARv=kTJua zhOY&|jlyh1N0xc#APs{wb3}`{Zr|?%YGaaJi!^DXe~CVeI2E57C=@N?!ecWN{df+0 zEIfS=f=lw&>YjxjW-cl1f@!7bGT`XceY{RhY`r?R!$BFQU>9 z+LdR!28)tp!XK#Ic#JX8{{`5K9P}c?J5kP6aPv8Krv|vnP-q1y4{6bVJ=*@49t%cl zBjAUG%f|Em9*r@}o{3+(dYGYX-dW+ErnAD#W<*?xyR`n0P4~IPm}XDL_ZND|);+qH zlhBsuyGRG?h0vw-?5LM)vWtvN=3=qGY5}2E^^6()WpvF%Xk;_mN^Ks4JH#o z9tK#fF%Gj2>xE6s&;))?51W5h*n`$=Z$@;LIMbR#HpAySV}U&nt(k$=o)wm$?Jr@Tb3_Q~zVHj;yqaX3`@$?! zwrJm}g?(oh=6Yin+0(^ zEzU;!Xniu{VJD6I|F)@9@!Mj2=F$2lc}esnQ8|9jrcT8_5tEO`Nr=C)IU0=&Ne20(lzDegsBSTO#*(Qyd-A}_Tv3rpm}ut-21Ddg*|S1*GxYB=ru)i#Y=&@%yvCAKUj%GxKe<#!je zUV%k<`pY8b|KG~`=>DHCYt4Txi{e=lzTeE{!ZwQ0Jbu9H_~JtRBnGiW;&6&baoVAL zb7-^}b<+x53fSL~y@(V&0yY%Sb0Zv2bJdf6dr2XkbbMHEni2fmE+eNE^?gh2bT+)* zb^ArNbfRlM&U!n(WC>2ZO$?kBo@+YlRVtWa#azMX^H6I6zZ-aZ0S}uugDL$*o74rY zuf$TE>pJqtjJ9GfODymCu41H(^QK@z8iJMiT|C9UdWC;Y<$ zj4|g^_@xESXfNQGc75s*`G+`9_y5Q=F<)Jk(|8bE51qRzzZJ3GhP?N9Y7`Q5M)3{!pKxxctat^7OLFTn0uz;6M+pF+Ey#`Ub&z9dIdzxI73 zP;ENY@xEA_7Qf#4nc5!gt&RHs>%D5_ODJ=fSZ?gD2>E^+S|Vy5z8{*2JC**NSh@zk zT7IVVNxh|q`|=dpek1CjwYT;_Hf#u{S(0Ctw>;*M4qw4NDQb+ziST-hFlCwqHa}KG z%XvmPWmqc9HcydZ+}L#vHK+~yc8CO za_yQ(8((oUMXh2BQmTJ7DcqJ_L|$))>qmQv9wR|Rq%Y{1pZP7siYav zi8#}|n*awSI7^u)D!8mV$a{nGEw_0FPyLeEM|5?cM(CJFt1m4iZ!x`VsNj(>Pb&13inLtXLC;* zbVK8h_rMAZdQ@na#*)b2gjPw!JW~X+;SKit3b{2=&#?4JM*)eFO^HIlt{A1ds!?s`~wJzB($ZsmljdW&5BcjHkWhc7} zDt`0~sqmsTyhj^@XHZ*?9?0ctU!E=6Erg?iRW4b>WmP7cpXSu3*}PdOEgA!h;dcQF z?djfRfsYbVBj7(SSn2^nTy&AHg^i>3VwA+z?h8JP(QI(GLUU?{P0CB95?(5q*)hwe z1nqy^bNnFlw1Zogt=*Xmnu9ThjmK_@bY~9MX-Ux9F3H;iEne8aEX&!I!~fVNZGLrG(fnb%wTOn49+19}vvXMM zP{h?BKEZi+;rwj=iGXx-s^vLbv+JB^o7W_f7H6I^ETb~0gyUTb?$u@U7KBTYZzy*@!JBa!L%TwJLs15Bd3A zw&bi(1FGl|1<^2DZ0w2n+JAzo0j8Rj#h-%x;QKDZiZq7-6xj-1?(_!4RIOx&opT)$Zf-CP``rD~ zTK%xohz!2LCiT83{oxcdlrfCQXnDKkn{TL>dP9{`Z&Ni}sl2ob(MJwV$~~oMjpvn! z&o^r}tcUPBJ1CCpLza5^=G`{)DVb5elinu=CC}6S#b8lwv0cS~(9P<1cusR)!2WQS zARGHBc8An^D{C++y|*&bmZ8v5W(q&(kZx9aLt~G1R5pAl$eN~3LiFcRve9pQ6quDU zkr{clTV^yksq`;;WJZd-s%TBBiRb^-gWuUQqq2;?{Zo9>8{@^N55y;f@mBHaZOrK( zJtpylqjmQn<}w9yx)rhP8gaI~cwij#E~7FA9T(649(6hqSLUOI@%*bjCg?uQU9zC< z-fRnIbeYIAa3a;F9w|}{v&RG8Z(FtsGM~lZmuM7}>Q}v~R`!t3ihQJcw1=clb0JHb zB63!yh$*M{ro12DpMu3a$(j};>Pm(kZSbyF#Pbc{Rt)9G_okeQlr7No-w3PK>b8yG zz7FMwfg2>@s9pA+BJutStUO~SAWFUlRtSBu(MDqo{<9}6FN%ZSx^hW$Rd4WFpc*EPkmz+u+yhH^7#eDb}7@fVT$bXhQ6&mSa_?b&=LOE81$2mVbDU`>NM+O|XN{ z1HZDici#-&(of`TM!se- zUjp(y6q9dvB;TI`i9eBVHS(<%^Ti|I{Fr=yh~!%rNcf3-OB`Elldk<}qA_5P>yVe8 z7S)COxG<9U{y_Xs#d1T-Bjs9`C5B#JG&Pj4<7CM5P;KZN&CQ|zd!dqO;3X&G zhCg)bd8~nlyo|Jof1*h-oatQMw5hlCNBO6lXX4^$-qt25 z-tA~Qe0ACKaA}8|BzSYM>7LT?^Sezfo{u)EBhRiT26W%YO*Ho5^)|K(es{|CCRUJ` zmBzV^@4z19)CI-JSG{`Xgq8g3<##c>sajfn=HNE)m@^8ko$oY}cY}_mFciq=%^^nr zD?q0x=ZQQV#KC_ycIXH|f^m1m%pMz=y&k_ZGJC9x9r2JSnwBw5kL-l+{oxgI-X9l} za(+xoM`&~F9FMZxTFe5@F29n$ zpVd!*brErIWBD#k&pgLWg#6-VoQ<@GNtQw9B>6QQ%o)I$Tf@a0hruUp^sLC|C&Ald zR&AVD$1-M3M}l#PQI;>yH(HbL+~L(LP+#eLun$r~oBw+&TT$4hxRzS2GuK>H$O^mU z!ne@&ibG^@vKSmzByqoN%WM?fv3wZT6$cp&F=U%*MqT*}!YUwpX!|Uj=G92+l)l(^=RL zcs(+)MjD4ZQ6KS3;$T}j?r2g!+sd;-;n7Tba}M~<(HAeq$AjL|$~IHG*9DysYhU;Q zj>rz-L#aB4%S5|LvmuN}5{34iin}=J-ujE5WZZgDCDnE?rU&@tQW?Kol2Sc_yAc|t zQVVfVhXXeV+jm1w!xe7xkTqpPPqCyHfNFv8mrBQ^4h_W{gpx1bQ4!rn-861Gp8SEjOy+pY9Ylz zX7bDqvZKhWeHTH3m-M&Oh~qcM_{s~XkMETSXpw$Q8)?N*{MnRhibTce2d?a8krKkZ7b=75rnU^I z+c~iAyJG65JSp(yp5cIQ(ZcAw!fvlNyKxZWx6<3R+ChAMC><2iAl?ybHl*M_8TVw| zt6{5`g!{x$k|Vnz_8M5LQH&BmV@hqMai#H!jxCKVjW3ODv>!C4KFHn;b$WP&OX$^X zOgo+H$XRmBp&Wa&@fB|~lg|%>jz4i9GHbK=Vqr|XN}q1O=-b;9@@)t)`Dy1;VNEy_ zp8rzG22nv4O0NyDP--@4YE#hTGooxVdb-d~{98BKNb?b0VQM?ImDa;O*xMHT9u4_` z92#WN(feha{E=JQl*Se5n%a1NQAlZ2)yll-Y&?ITXhjxV`m&jX`UkbX2%=yI{6!dB&B9W9zm>eu!1 zt}qnsJIQIR6Z^$Bq_qrMzv@Xy0iU$*0ljY)>06TXuCpQLBea6$uE%SoW%RVtcAuO4 zf-;5`wX5*_q-}_6gYCJhktZITvRr)gs%?;KBi>}4cqEb{-nDEBrG3?=a&7h2Hf+6G zsNZ_^wT5v18n;xx80%)bI+4t76SN9s&&PS@kc|LN@iKJ+%f6vnp$^ACk^Q?92 z)qU2x>|@6K({pF7->2)=x3l^?>h7>B_`e44s3+=}bi?!A#G_P_{smV4t!S~OoA)gf zNZ-pGq5Xf2(VZQbR$B!+&)2iaIn_~Lo7n)K9dyx8bT3+4>3qSaJMFN`&(%5>IkWI| z#Z?RMT^D_7^!`6RS?8czBtujItO!+b(c17YS+LT%Xzk|A$_B<@lJ(vTh4n zG8Qel6ySX$g$B>yU7uW#zz2g5_O)Ku;N2B_sSdRS^E(k zlcnQ6{`lx0KK$JaS=-)ey>I#_U+yaZVl`r+97Xz(Pid627RTdGFpJ<4t?8%md^@h! zaglDc>9s%@v6yx(-jL#i`kZ)oSS<#gC za%sK>M!OENO&H^Y*lDtEy>YR9A;#y%ooYu)Asg zjq#wDb>4dc6*u`WIn8a^z+CRF+k6oCR+n;DGj|W=*Y-v8ohwH3rTmtLLrsk7W1-yg zu`mqRNQ-%%xh=zBIxXW%`@Z3)n>E!xp0Z1rIaS z44%u!7ZjuN_>^G6&OH89&p5+^dF#PTIu!7BvVmlar1@aL%d>$*Bl~pymDzI+1v-CJ z!aJ(14!-H7Hmq*wmScWhE?9UXf|On*^WLn!34Y;M13%j?OmB|o@9!Dg3;l-+qoMVa z>>Onu4LD!ilh{7WuF@a!jC4#F?U4t=M_dIW`Q+@*=Kmg4ww2p2dzuX;IJLeFG#d(V zKL@+9!4~3d52=`oXlzQa+XOvBQKa!4$dao5}|;(C_o^+wBx zJoua{-Ioc!h6io>hS?1%;Jheh*W784jSLg9h`#e#z?z_S<65s#dT|L@E6KR)evkLK zkHd90E?PUk#=Qeq6yKn;F?#0Q-VmqcasH6rLC)atI=jj7{uQNC1>{Y;ZPQMXwNq5LbS7Yp89s||6G}?b0S&fw z$!kiW8>{E&O~|*ot9{M?wHZwFX*3z=T7skcrOPlf54=y3Ajk8k0unrtFLQcw2MBwe zIeMFCv@oSxQE#|Ti*(Ve{1pk^*}W5Au+FI^d`^E7!gXV z#P`o%;mi@t~a zmwiWj;?Lb;zs2#d3kvuYRCcVfCAwyaUw`Fi@-F)h^w=>@Lwa}m6WHm`2<9c4_B#6| zkNFYC+y!YtEjVY_a0k~6XEMP}xd>Hn_bc10?4QDhD-TwX1a0B(5d6?9F8G3q17^RI zd}=7$$J*cX$i0P1op&a74aJO|36F9=qQpkayYLveFtNO@+`$x)MhB!dc7xtRJ9?{b zw}KxJ4!#w;x&*sg=MVY3T{}EO>n?f7v*V`$XhO9Y*q?v~c^S0FLcTxymBzfcxT+?u!z(xCpU^MNq&+#0>6`srKn9J!uGnZ=D zl-{|Nx$4B(Y8LK1XSds9<}txFS^Tm}pn3eLdwk41KHyUDhe9-q6Ybysmsx~WALb2y zu>@uN$nZR>r$^>-0rXvB=W%(Dvb{7ikAo2Jh-UFOBmr_U8x7E*W?v|%E3ngy-Gf-E zG-LUgu@Q)dp5ArY_el3XamIp}O=bHK`$o)|#Yi6QzYvt5qG-m3V#YEfGo}}3Y_php zko{3{#x{zwoG0BW_TT)Md7(3NXY28k1Lwu~2b_(#eriq{L2nEPPB+}%C!37obg$YF zH_lbuJ0tNf*iGm!_}&j)_9b(cVJAcZNrGI_rHaaP(T|j4AW!RC*c~gV{i}pzH31Lu@-O#*FY-ar~YSR-YSfAJcEQj}*T=h4ppW_eoa?Mm8!ho{EuuvxjzjY0PdX zSba?#VJSvx@J$u#-}pIMnshJS=t@tL0x4xlTb8m(TiRoju(@7TyoN;$ zt`%JBb}5Tm1-vXpLEws4uNJD%g(?NLxcl?EB!X8^xD*!x6!4TSC;R(-PLei7{k`x1 z-_K{7Gs&EpXP$Xx=9y=n#dy@A!n#fCwBPwSR^UsvyYFHfnDrV?14{^blTvsZlu4M( z114_-CMN)s|8RdMVUm+DnF;=u(WL@|erLe1hOC3;Zna1&ty-G`u8{8k2LP-2Sa~Oj z+kwZpkiKFh4vF`@5|7zyz_%hr&QZc&DezZntOx#rT0H&nR}z80A_+?_-}tUkguP^% zg)KdGGZSsYrC-j#C*W_+F>dlf64ukX3i!*B@R#3f(hr z10BGR`Va6!e19a3Z2?|xy#hCwzcV*AGx_fTKkpc2yRxm1-wvKi-iMzwTkDMAX|%N> z(bg>C;4a^9&fTsZz`*1827N>@LhaHh;U({O;|{a!R8$3FZB<2-?G35?wJ5*E^=#L0 ztYWW$h62uPsdxXxjzROe0#p{IOPP9=L~W{`e3{=l4ZFo=<1vS-XS5(F_FEyX! zW$?DU&%$XQGF6M}iGY=1b@|}+HQXW--jw4TRw;Nv1B|{5w-pL*A>jPN>v!(-|K?0~ zeaAETH#-iTVv?>C)iYnIxXD`6&9dx)`Nnw;w)lO=T%3H$_F}tOP;B`hLduDeyh)8HI#TPjQ(X?)YxIG zS}WSXL1$n!<$S|d0mI!N%94sl1BV&Faj}HsxuDfC#!^ylkrhT|8i8$42+4qtDW)hp=8P`8Ia%)Noo;CdPa;#{7B- zpHnU>cG2ij4EZ0uCGe1+Buhp+-+5_v&^#FgC{m3vA)gbGYe!Amx6jgfI6Oay$0Gjg zUzi`?hvo?JTnTHzk0Jev?{32<*~)35^ED6896x8=dpy>6=xfqEda-$vSwS;s0nMP; zTJm9A(y>9B0d~)Cp!qdjX6OZ8Z;yGF9d?cVi|3eOGwdy589XqXY<6+dw!J-UVimqw zvyuGbm)V~|q*kv>g-ACt-qJ=K(r&TLfH=BJ@?u>G4$9|z-6M7k?~-1ixAJisDk+?SM3TH%?F+t1Jh$ z@r(|7i)(j_Ycf_=><8^@_*=kxB)fwC`S*fr)*4RpQ$e-U0AZQuob$N==ELB($P@DL z!qu%k8Wx`XHNl8jn<`G**EN&A(OoU&IukUy^%(c%p3ggY$aGFQIrLEBJK~rCoXvC9 zw3Oq9y>PX%XSmGg6h)TTca+0-M!xW%tJrwL(X@)rU*G`N-^@>ydao1;ytBt7VI>)k zRp~qa?~<47DHrp0(F!%?V)iat1ty?PoC`XJ8B-j=^NQc;L=?Qsws4K?;%h@Sl0KAD z@Ounn$cM_}T?#H8{ruAHcQ(WPWTV)iC(qlz?YuQ-kGQSWgme8Nabsx_G`%!jcdJr3 zj&oj;n$iD+C@QyrlbaTzHj+2fd4cX=UIHDygGBq?Nqp+p#i}ciRv{7nrr?w4TEHH7 zE%?)GVfPxg25AChEvYF+)VyCXPbXQR|$BA zsm6nYyHOAMlhcZ1GG7hW5r#K@F0`Cj|XILk)tD~?J#0$}Q&cL%C z&vJNPOh^0727)NnrQs7B1I`5OGaq87B}?7k^U9Lk4KlXydO|q21NX;~!n{cO`rw$9 z;FEZg3D|Qd{3%a2CSp8Fr19A0n%q@nEbhnCjgo#r>{X0Mw{HmW66WbDfR}HjbNJBy zJc)$&tvGjUja?2EWSBHA8*t{nESBcsRH%S9lvw_tVY0X^#nFaA~gw?-#+W(Aq3&|-X@iiWJ`3q7QUqruHSIe3F znZVRcW1mmbKFX!@g)stCbfP`w%yP}{;v=}X(YGbqrb@pc?i4U}qi+H*6}F*T2uw|u zFg39kQ$a}uNi4`KXh>qQi)KFq%oQ6CIih>{U?2??{C+6`Z{3M!y~H!e3yl~7!h0$3{!jPwziX-tpA2{D|1>R}B zs07w4jcc)91Y-&I$NH2AtWTD3dz)zLnrNKVk3NH^k!vAgI0wGO0IY{&2||k;K0oQq zQS>{khk0icqzZ-o&K%{vxQ>-ZV?6R_DYodP zCY^<|jIRT;8NjID`94l?10~F=LYPefX4w!nX+7|`{t0YSRKq`>_atkN#OKSvb zGf2lb0HZe;8-UT2-^t%%Y%?P;Ivp52>3lmdxoetnS_DQ_k~HU}b34w*=bYy~qq+!# zJXYYaq%C-A+aT^oAiyBq%6Isj|H3*r8Rugautqc9=iGwR@g-ahc?F=pWtcqPWH5fShG&WREpM;MzVsa(0V)()0VIt9j^4&~*~ z)3J|X{mll?e94wH8h30NI$&D`Y-=QJ&jLl~fnI5yFu5ke%TOxZtP(k|HZQskI?h4GMsZws$2;k7ss-(?_S ze6CjUbIh;7cK-WQGFi4&Cymf-<4ux;f~1}#6FuoX<3Hyd>tXUq3su)E^?U(*Q?`E= z?UkVu0`fV#&})Mv9XaXT0T?d2-*d>MHAsfhY{%(*3@{J*M@atWb2j08 zei0*#*R zSZFPj!+&i&V$saS*yTscL~*Yr$Nd(`MCr~dJZ^;;7m|z6UOFDnuWXNz#_u*fhh?H9 zA0c0`b%Klu-wH>W_g^T3&*{E9X=T6oe{^sAXMT{CLaDFM4|109@}A(FpN;!5(pXA? zZfI(+*V`0xN_D1HXZ?59byIN@)DtCa4Y0aIV=O$|!Xx(m`p%gb>*kv+k=mgw=1`Px zqNKr-RHhdGBiS!eqmrII>mevUO!}w}CNS0BHaTeN1qsak_tbx$x_b z@|i+IfFj!^8Z(8@;3023%47;328Oh7@E<|X?*=sZ%o65Et=%5cTDkYm-gSLF+9RLd ztUgRhG4|M~n1iIX5~ig@KseMpPR|};4d)#Je98>xq_}juJLLw2;bh3GH}U9H*OK14 zk`D($KHCQzXzn5Z=?YFM`PvBAtwP-{k7Q#02fk(TEt9kw5mn@x z!;ZZg2A=yU&oT=9D#NdG!&f0lf^%UU{O7>WW32)D3wF zb*wTJ-=Qz6U}MW&Jb7z?-$As=O5Orx@Yw*(Qe6@ckNMdPTR!Shuo>{B@JYYg<>=o6 z4_k7kA6yjgJPc2y1uIe2bohXhmtH4wNzox+VJDrckdO1(b4Zs%&ZnBzh-;W+D{gQF zMz*n~OcGFSO&>!a6*_8_MX*(7 z;U9s870q-XhjOXHzY+DO@1~Qm^|m`EGzW=qiQ}Jd&O>DMD0sE0tj@N^hgPGbxVcUe zmifwn^;aw6?G=!)UuDz@RT6g{ADU%%p}yzcb6Vy6;-o^`X)cgKd+Ma!q>axAz?jMsT())3Z|U z9Y?Y*W7=-%e~UxM51h6W&jY75;eYzHM*M#rDQ()Tj2;*tNS#QZAnir^4-)V_6WRf> z8=()mz4>z^<{&6C}<(J1+r()dKxyF)Asd+p!8B&|%;Of5j?{km_#5azdHxD|B;d3ap>8RsTK!vzr zgwdJcNA{2gkYIbd5_}GZPK@E-@cHt#-}}^> z*g`P?QiT-HS!WugqPi=zG?jw8*T;S}>aH(`J_KTMR8QZExQUNFa5d&$(DxVa!92sQ z3py&{WudwSF;`&kLSA;yc!QrOy;oJsw`U?o@MQB*_- zu;b+thE0oo>w+cmtHh5toJ?d=b|C_eas{3eze)V$X)$U4>tb@()8c4+j_rC8-#>+f zXf7)GTX^R)dgmGGn>lQ3RceOBnO`~$C$y#o9CF7YZdURww5n% zd`O#Zy-k{1WgE1@ya21c(R?F3%w)pm?@MqI*H>$WzaaWbBY64OV2{`!e#yn)>1&SS zlG1nU@Lj$^-tqH_2GKuyeak_S8S{9@)sRh|bbgCFY|&o^EZ-KI9gHw#xl)jcWyV-b zgZSi_LX@u?!@~DyRAGjFlJxD0F*67r)3_JGt)Jxr;&|R8Y1!#)4LFCS zbTo*HG2N(doguYQVf(0~Lu%tyd}A`~7VqOyDhI)LvW8c_#K2FCwS}GxR@jaBINU)i zxYdqK<8zqTjQRt<#99eYdPI#kc=au6v!bVg&8U?LH$tkc?V|OPXq(1}#-s^zg~p85 zO&Y_?$bX3RJra|DkJ6g0uvzNn6 zW`u#u%9^m(T$c);eX}5+Mw2y1$}+aF)!b@K=#1m!TqfUQD#JNR z2YJ|98?8%ajauPmKQrP+dx@1PybkLOlQ_%PSbZ6G{-nG3hUpEXLby%RHu?xM_^%D{ zLbXi+4&l}A*yxTPbs|myf;w8YUfr!u&W4XCBO=+8^jRgm?T^~Hr$?Ts+FV`v@5&SQ z7mTG?sRz2Q<71%j)-7Yu%TJg7P!-oXzNxfHwm!b+c~~RH_dF?oRI|zipU{ojh{5`i z|2a_EatZFwAnB%9kYjc+qh<<^$}lEuStG?_)Ivv+)9A6^AE4Qd&u>JG`%}~(M%c2n zL5zATy0JkV_E3_ba1#$vik=_!l{S42-XWtBKJ6~OGFL17?Exo#6*^0T#0&igz9-SIs^FC z3V-)TOA!1h()%{VwxRor@}=d*3bUb+!Tz6#U2C5BsAh`E&_sI_jWh0xAbFl>BnqH- zrc*Ai*?CO-r5Wv1M4=RpNU!*aDI$@Ly{8IvktYs=Zbo%L3}ew zS&4ozY2bc$<98eKVfDbG@oT7ob{+4t*M&YC$cdJ%en6qUTMl7!Ay?zsj*+3cuo%PgN6qQ*p=Q!LSl*o!;nh-s2<9hwzz|wJC&`q2W$vytB?79o+Qt z`aJ_?=TaBTrf%_SSW8DCQOID^}1m_2Vggt|wZ@S(P)dh9qS`u3oY+3hK{f2!9g~ zwWR9Up)ITC*U5K8^$cN#0^d_%Q&#$Buahzw<2o(#)cTbOf*S)W{e2jZaT$nM*oB|PHY*dar7U}c~Tu^u`G(DS&!9q?0-A$*Vc8Vk2` zxmx%FWAy*F$+-W4|8nNZq>zmJEy5kv387sH`zS_}%CBx7gy^SyO^#N9vt7Yq^wfnS$LE;<2_ z*NY-2`JE>uf18I;AIX2oU;fftBI| z*Py$~;CUVB_W{uC^R9LWMSsZdNP+zRhQLn8Ea>*hgwwe9O5iRzY@!-^3ItgqcMiX4 zg-3i-j57Gp(h8S-d-gG?ah+j2__0MYSSDT3CO3r9G>GeJ;=7}iInX%2-+=Zlz`-n~ zn3nsM=*`o@uiONFIIJh)FMAjJoqpdib0K-fyAJt9ujZ&hNtwbmh(*b?4KdC^WR4e< z*Yd%>%VF18fmnx256Sdq2vfWiJz_ED#nM}`R!X*W0%&ExM#!U)W?`MtBVC7Q3)0D-gXa#KH}@bv4ly;A zygDM1F)M6#W$fd47QPTg_`+ZXx&M&#Io-QQ`W)feD1Bb%sqKiAI}$~A<0hKywrB-q zh2lMtu^)c3lMno$&DA)Z8Lw>jHdk#+#TD!JNB!!nmD(K#?mjZYK({@z&1>Hyn75-0 zofyNj?Qp*`A4_F^^;rAG$oQ;ZnV5H}o_E~VmfVPX+WVEMli>LVWg??xzuK?N>AeIU zBE<({&6Ws1_G=Bjse^5nVAMzeEPaZ(iNZ76fBD1XoABJr#Z{G(uXStSwcm zhYvOlVy-2%h2=18BePyB42P8`gJ0u&WNZd_%)1dUJpo?+<-&1yq)#6;DB!d>tl$`G zRT~e(x5RH)8N+>vh8$uLQVG&*q_1Cw9UuI8#Pchg2V5Z$)ClL{$#MtBHo;mQoIQ9P zRwGTKG;H@kbhk^4?QMr?kB292isTi<7x=UQ;VaLpGKa0-BHvw$cfdX;X^ctp~E?bPc7)wb;7IcR=l5B==FR3p^F}2qp z)Lh_c9Abh;#^E5pSjrxod@ehy#ac8wBa-8g1W>3&|8fSsP zLOPTC`&-J&h1G#Rc{TZoXA8pbB%-}|%#3BeAZ{Wh_iDgY6Bq_d_*AVDS_0&Ivag

!HC3&3#*iRRv)$EK7E(U2_3 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

ap|nJ5MC7Rcvw)!ze-KGEdbyhvyw@(HMu_tF0ZD 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]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 literal 0 HcmV?d00001 From 4f323aa9e9d608c041721a3ce127759f31384712 Mon Sep 17 00:00:00 2001 From: highlander Date: Sat, 28 Feb 2026 15:56:47 -0700 Subject: [PATCH 05/10] fix: use GetPortfolio charts endpoint for token balances, lazy-load dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: vault called GetPortfolioBalances (/portfolio) which only returns native balances. Pioneer SDK uses GetPortfolio (/charts/portfolio) which returns both balances AND tokens arrays. Switched to the correct endpoint. Dashboard changes: - No auto-fetch on mount — loads from SQLite cache only (saves API credits) - Small highlighted refresh button below chart with pulse animation when stale - Removed bulky stale-balance header banner - Token warning when refresh returns zero tokens - getCachedBalances now returns updatedAt timestamp for "last updated" display Also includes: SDK updates, EIP-712 decoder, signing approval improvements, SendForm enhancements, REST API refinements, API audit log improvements. Co-Authored-By: Claude Opus 4.6 --- Makefile | 2 +- projects/keepkey-sdk/lib/index.d.ts | 1 + projects/keepkey-sdk/lib/index.d.ts.map | 2 +- projects/keepkey-sdk/lib/index.js | 2 + projects/keepkey-sdk/lib/index.js.map | 2 +- projects/keepkey-sdk/package-lock.json | 30 ++ projects/keepkey-sdk/package.json | 2 +- projects/keepkey-sdk/src/index.ts | 4 + projects/keepkey-vault/package.json | 2 +- projects/keepkey-vault/src/bun/auth.ts | 4 +- projects/keepkey-vault/src/bun/db.ts | 11 +- .../keepkey-vault/src/bun/eip712-decoder.ts | 222 ++++++++++++ projects/keepkey-vault/src/bun/index.ts | 145 ++++++-- projects/keepkey-vault/src/bun/rest-api.ts | 97 ++++- projects/keepkey-vault/src/bun/schemas.ts | 8 + projects/keepkey-vault/src/mainview/App.tsx | 9 +- .../src/mainview/components/ApiAuditLog.tsx | 33 +- .../src/mainview/components/Dashboard.tsx | 340 +++++++++++++----- .../src/mainview/components/SendForm.tsx | 183 ++++++++-- .../components/device/SigningApproval.tsx | 167 +++++++-- .../mainview/i18n/locales/en/dashboard.json | 11 +- .../src/mainview/i18n/locales/en/device.json | 6 +- .../src/mainview/i18n/locales/en/send.json | 3 +- .../keepkey-vault/src/shared/rpc-schema.ts | 4 +- projects/keepkey-vault/src/shared/types.ts | 16 + projects/keepkey-vault/vite.config.ts | 2 +- 26 files changed, 1105 insertions(+), 203 deletions(-) create mode 100644 projects/keepkey-sdk/package-lock.json create mode 100644 projects/keepkey-vault/src/bun/eip712-decoder.ts diff --git a/Makefile b/Makefile index 93355e0..a7f3237 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ dev: install cd $(PROJECT_DIR) && bun run dev dev-hmr: install - -lsof -ti :5173 | xargs kill -9 2>/dev/null || true + -lsof -ti :5177 | xargs kill -9 2>/dev/null || true -pkill -f "electrobun dev" 2>/dev/null || true cd $(PROJECT_DIR) && bun run dev:hmr diff --git a/projects/keepkey-sdk/lib/index.d.ts b/projects/keepkey-sdk/lib/index.d.ts index 163206f..e8ef801 100644 --- a/projects/keepkey-sdk/lib/index.d.ts +++ b/projects/keepkey-sdk/lib/index.d.ts @@ -128,6 +128,7 @@ export declare class KeepKeySdk { eth: { ethSignTransaction: (params: EthSignTxParams) => Promise; ethSignMessage: (params: EthSignMessageParams) => Promise; + ethSign: (params: EthSignMessageParams) => Promise; ethSignTypedData: (params: EthSignTypedDataParams) => Promise; ethVerifyMessage: (params: EthVerifyMessageParams) => Promise; }; diff --git a/projects/keepkey-sdk/lib/index.d.ts.map b/projects/keepkey-sdk/lib/index.d.ts.map index 8480fa6..4096b2f 100644 --- a/projects/keepkey-sdk/lib/index.d.ts.map +++ b/projects/keepkey-sdk/lib/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/projects/keepkey-sdk/lib/index.js b/projects/keepkey-sdk/lib/index.js index 20ba74c..ae4c08a 100644 --- a/projects/keepkey-sdk/lib/index.js +++ b/projects/keepkey-sdk/lib/index.js @@ -74,6 +74,8 @@ class KeepKeySdk { this.eth = { ethSignTransaction: (params) => this.client.post('/eth/sign-transaction', params), ethSignMessage: (params) => this.client.post('/eth/sign', params), + // v1 SDK compat alias (old clients call ethSign instead of ethSignMessage) + ethSign: (params) => this.client.post('/eth/sign', params), ethSignTypedData: (params) => this.client.post('/eth/sign-typed-data', params), ethVerifyMessage: (params) => this.client.post('/eth/verify', params), }; diff --git a/projects/keepkey-sdk/lib/index.js.map b/projects/keepkey-sdk/lib/index.js.map index 3218828..9befb03 100644 --- a/projects/keepkey-sdk/lib/index.js.map +++ b/projects/keepkey-sdk/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/projects/keepkey-sdk/package-lock.json b/projects/keepkey-sdk/package-lock.json new file mode 100644 index 0000000..4abc4b1 --- /dev/null +++ b/projects/keepkey-sdk/package-lock.json @@ -0,0 +1,30 @@ +{ + "name": "keepkey-vault-sdk", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "keepkey-vault-sdk", + "version": "2.0.0", + "license": "MIT", + "devDependencies": { + "typescript": "^5.5.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/projects/keepkey-sdk/package.json b/projects/keepkey-sdk/package.json index af5dc81..148571e 100644 --- a/projects/keepkey-sdk/package.json +++ b/projects/keepkey-sdk/package.json @@ -1,6 +1,6 @@ { "name": "keepkey-vault-sdk", - "version": "2.0.1", + "version": "2.0.2", "description": "TypeScript SDK for KeepKey Vault REST API — zero dependencies, native fetch", "main": "./lib/index.js", "types": "./lib/index.d.ts", diff --git a/projects/keepkey-sdk/src/index.ts b/projects/keepkey-sdk/src/index.ts index 6e5445e..390027c 100644 --- a/projects/keepkey-sdk/src/index.ts +++ b/projects/keepkey-sdk/src/index.ts @@ -247,6 +247,10 @@ export class KeepKeySdk { ethSignMessage: (params: EthSignMessageParams): Promise => this.client.post('/eth/sign', params), + // v1 SDK compat alias (old clients call ethSign instead of ethSignMessage) + ethSign: (params: EthSignMessageParams): Promise => + this.client.post('/eth/sign', params), + ethSignTypedData: (params: EthSignTypedDataParams): Promise => this.client.post('/eth/sign-typed-data', params), diff --git a/projects/keepkey-vault/package.json b/projects/keepkey-vault/package.json index d6f3510..3f41120 100644 --- a/projects/keepkey-vault/package.json +++ b/projects/keepkey-vault/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "vite build && bun scripts/collect-externals.ts && electrobun build && electrobun dev", "dev:hmr": "bun run hmr & vite build && bun scripts/collect-externals.ts && electrobun build && electrobun dev", - "hmr": "vite --port 5173", + "hmr": "vite --port 5177", "build": "vite build && bun scripts/collect-externals.ts && electrobun build", "build:stable": "vite build && bun scripts/collect-externals.ts && bun scripts/build-signed.ts stable", "build:canary": "vite build && bun scripts/collect-externals.ts && bun scripts/build-signed.ts canary", diff --git a/projects/keepkey-vault/src/bun/auth.ts b/projects/keepkey-vault/src/bun/auth.ts index 998ed94..aa61d57 100644 --- a/projects/keepkey-vault/src/bun/auth.ts +++ b/projects/keepkey-vault/src/bun/auth.ts @@ -164,9 +164,9 @@ export class AuthStore { requireAuth(req: Request): PairedClient { const token = this.extractBearerToken(req) - if (!token) throw new HttpError(403, 'Unauthorized') + if (!token) throw new HttpError(401, 'No bearer token — pair first via POST /auth/pair') const entry = this.validate(token) - if (!entry) throw new HttpError(403, 'Unauthorized') + if (!entry) throw new HttpError(401, 'Invalid or expired API key — re-pair via POST /auth/pair') return entry } diff --git a/projects/keepkey-vault/src/bun/db.ts b/projects/keepkey-vault/src/bun/db.ts index b101fe0..5d2d739 100644 --- a/projects/keepkey-vault/src/bun/db.ts +++ b/projects/keepkey-vault/src/bun/db.ts @@ -166,14 +166,16 @@ export function closeDb() { // ── Balance Cache ────────────────────────────────────────────────────── -export function getCachedBalances(deviceId: string): ChainBalance[] | null { +export function getCachedBalances(deviceId: string): { balances: ChainBalance[]; updatedAt: number } | null { try { if (!db) return null const rows = db.query( - 'SELECT chain_id, symbol, balance, balance_usd, address, tokens_json FROM balances WHERE device_id = ?' - ).all(deviceId) as Array<{ chain_id: string; symbol: string; balance: string; balance_usd: number; address: string; tokens_json: string | null }> + 'SELECT chain_id, symbol, balance, balance_usd, address, tokens_json, updated_at FROM balances WHERE device_id = ?' + ).all(deviceId) as Array<{ chain_id: string; symbol: string; balance: string; balance_usd: number; address: string; tokens_json: string | null; updated_at: number }> if (!rows || rows.length === 0) return null - return rows.map(r => { + let maxUpdatedAt = 0 + const balances = rows.map(r => { + if (r.updated_at > maxUpdatedAt) maxUpdatedAt = r.updated_at const entry: ChainBalance = { chainId: r.chain_id, symbol: r.symbol, @@ -186,6 +188,7 @@ export function getCachedBalances(deviceId: string): ChainBalance[] | null { } return entry }) + return { balances, updatedAt: maxUpdatedAt } } catch (e: any) { console.warn('[db] getCachedBalances failed:', e.message) return null diff --git a/projects/keepkey-vault/src/bun/eip712-decoder.ts b/projects/keepkey-vault/src/bun/eip712-decoder.ts new file mode 100644 index 0000000..5a5dacf --- /dev/null +++ b/projects/keepkey-vault/src/bun/eip712-decoder.ts @@ -0,0 +1,222 @@ +/** + * EIP-712 typed data decoder — extracts human-readable fields for signing approval UI. + * + * Two tiers: + * 1. Known descriptors (Permit2, ERC-2612 Permit, DAI Permit) matched by contract + primaryType + * 2. Generic fallback — reads types[primaryType] and auto-detects format from Solidity type names + */ +import type { EIP712DecodedField, EIP712DecodedInfo } from '../shared/types' + +// ── Helpers ────────────────────────────────────────────────────────────── + +function getNestedValue(obj: any, dotPath: string): any { + return dotPath.split('.').reduce((o, key) => o?.[key], obj) +} + +function humanizeFieldName(name: string): string { + // camelCase → Title Case: "maxFeePerGas" → "Max Fee Per Gas" + return name + .replace(/([A-Z])/g, ' $1') + .replace(/^./, (s) => s.toUpperCase()) + .trim() +} + +function autoDetectFormat(solidityType: string, fieldName: string): EIP712DecodedField['format'] { + const lowerName = fieldName.toLowerCase() + if (solidityType === 'address') return 'address' + if (solidityType.startsWith('bytes')) return 'hex' + if (solidityType.startsWith('uint') || solidityType.startsWith('int')) { + if (lowerName.includes('expir') || lowerName.includes('deadline') || lowerName.includes('validto') || lowerName.includes('validuntil')) { + return 'datetime' + } + if (lowerName.includes('amount') || lowerName.includes('value') || lowerName.includes('nonce')) { + return 'amount' + } + return 'raw' + } + return 'raw' +} + +function formatValue(val: any, format: EIP712DecodedField['format']): string { + if (val === undefined || val === null) return '' + const str = String(val) + + switch (format) { + case 'address': + return str.length === 42 ? str : str + case 'datetime': { + const n = Number(str) + if (!n || n > 1e15) return str // already ms or invalid + try { + return new Date(n * 1000).toISOString().replace('T', ' ').replace('.000Z', ' UTC') + } catch { + return str + } + } + case 'amount': + return str + case 'hex': + return str.length > 66 ? str.slice(0, 66) + '...' : str + default: + return str.length > 200 ? str.slice(0, 200) + '...' : str + } +} + +// ── Known type descriptors ─────────────────────────────────────────────── + +const PERMIT2_ADDRESS = '0x000000000022d473030f116ddee9f6b43ac78ba3' + +interface KnownDescriptor { + match: (typedData: any) => boolean + operationName: string + extract: (message: any) => EIP712DecodedField[] +} + +const KNOWN_DESCRIPTORS: KnownDescriptor[] = [ + // Uniswap Permit2 — PermitSingle + { + match: (td) => + td.domain?.verifyingContract?.toLowerCase() === PERMIT2_ADDRESS && + td.primaryType === 'PermitSingle', + operationName: 'Permit2 (Single)', + extract: (msg) => { + const details = msg.details || {} + return [ + { label: 'Token', value: formatValue(details.token, 'address'), format: 'address', raw: details.token }, + { label: 'Amount', value: formatValue(details.amount, 'amount'), format: 'amount', raw: details.amount }, + { label: 'Expiration', value: formatValue(details.expiration, 'datetime'), format: 'datetime', raw: details.expiration }, + { label: 'Nonce', value: formatValue(details.nonce, 'raw'), format: 'raw' }, + { label: 'Spender', value: formatValue(msg.spender, 'address'), format: 'address', raw: msg.spender }, + { label: 'Sig Deadline', value: formatValue(msg.sigDeadline, 'datetime'), format: 'datetime', raw: msg.sigDeadline }, + ] + }, + }, + // Uniswap Permit2 — PermitBatch + { + match: (td) => + td.domain?.verifyingContract?.toLowerCase() === PERMIT2_ADDRESS && + td.primaryType === 'PermitBatch', + operationName: 'Permit2 (Batch)', + extract: (msg) => { + const details = Array.isArray(msg.details) ? msg.details : [] + const fields: EIP712DecodedField[] = [] + details.forEach((d: any, i: number) => { + const prefix = details.length > 1 ? `[${i + 1}] ` : '' + fields.push( + { label: `${prefix}Token`, value: formatValue(d.token, 'address'), format: 'address', raw: d.token }, + { label: `${prefix}Amount`, value: formatValue(d.amount, 'amount'), format: 'amount', raw: d.amount }, + { label: `${prefix}Expiration`, value: formatValue(d.expiration, 'datetime'), format: 'datetime', raw: d.expiration }, + ) + }) + fields.push( + { label: 'Spender', value: formatValue(msg.spender, 'address'), format: 'address', raw: msg.spender }, + { label: 'Sig Deadline', value: formatValue(msg.sigDeadline, 'datetime'), format: 'datetime', raw: msg.sigDeadline }, + ) + return fields + }, + }, + // ERC-2612 Permit (owner/spender/value/deadline) + { + match: (td) => + td.primaryType === 'Permit' && + td.types?.Permit?.some((f: any) => f.name === 'owner') && + td.types?.Permit?.some((f: any) => f.name === 'spender') && + td.types?.Permit?.some((f: any) => f.name === 'value') && + td.types?.Permit?.some((f: any) => f.name === 'deadline'), + operationName: 'ERC-2612 Permit', + extract: (msg) => [ + { label: 'Owner', value: formatValue(msg.owner, 'address'), format: 'address', raw: msg.owner }, + { label: 'Spender', value: formatValue(msg.spender, 'address'), format: 'address', raw: msg.spender }, + { label: 'Value', value: formatValue(msg.value, 'amount'), format: 'amount', raw: msg.value }, + { label: 'Nonce', value: formatValue(msg.nonce, 'raw'), format: 'raw' }, + { label: 'Deadline', value: formatValue(msg.deadline, 'datetime'), format: 'datetime', raw: msg.deadline }, + ], + }, + // DAI-style Permit (holder/spender/nonce/expiry/allowed) + { + match: (td) => + td.primaryType === 'Permit' && + td.types?.Permit?.some((f: any) => f.name === 'holder') && + td.types?.Permit?.some((f: any) => f.name === 'allowed'), + operationName: 'DAI Permit', + extract: (msg) => [ + { label: 'Holder', value: formatValue(msg.holder, 'address'), format: 'address', raw: msg.holder }, + { label: 'Spender', value: formatValue(msg.spender, 'address'), format: 'address', raw: msg.spender }, + { label: 'Nonce', value: formatValue(msg.nonce, 'raw'), format: 'raw' }, + { label: 'Expiry', value: formatValue(msg.expiry, 'datetime'), format: 'datetime', raw: msg.expiry }, + { label: 'Allowed', value: formatValue(msg.allowed, 'raw'), format: 'raw' }, + ], + }, +] + +// ── Generic fallback ───────────────────────────────────────────────────── + +function genericExtract(typedData: any): EIP712DecodedField[] { + const primaryType = typedData.primaryType + const typeDefs = typedData.types?.[primaryType] + const message = typedData.message || {} + + if (!Array.isArray(typeDefs)) { + // No type definition — dump top-level message keys + return Object.entries(message).map(([key, val]) => ({ + label: humanizeFieldName(key), + value: formatValue(val, typeof val === 'object' ? 'raw' : 'raw'), + format: 'raw' as const, + })) + } + + return typeDefs.map((field: { name: string; type: string }) => { + const format = autoDetectFormat(field.type, field.name) + const rawVal = message[field.name] + // For nested struct types, stringify the object + const displayVal = typeof rawVal === 'object' && rawVal !== null + ? JSON.stringify(rawVal) + : rawVal + return { + label: humanizeFieldName(field.name), + value: formatValue(displayVal, format), + format, + raw: String(rawVal ?? ''), + } + }) +} + +// ── Public API ─────────────────────────────────────────────────────────── + +export function decodeEIP712(typedData: any): EIP712DecodedInfo { + const domain = typedData.domain || {} + const primaryType = typedData.primaryType || 'Unknown' + const message = typedData.message || {} + + // Try known descriptors first + for (const desc of KNOWN_DESCRIPTORS) { + if (desc.match(typedData)) { + return { + operationName: desc.operationName, + domain: { + name: domain.name, + version: domain.version, + chainId: domain.chainId ? Number(domain.chainId) : undefined, + verifyingContract: domain.verifyingContract, + }, + primaryType, + fields: desc.extract(message), + isKnownType: true, + } + } + } + + // Generic fallback + return { + operationName: humanizeFieldName(primaryType), + domain: { + name: domain.name, + version: domain.version, + chainId: domain.chainId ? Number(domain.chainId) : undefined, + verifyingContract: domain.verifyingContract, + }, + primaryType, + fields: genericExtract(typedData), + isKnownType: false, + } +} diff --git a/projects/keepkey-vault/src/bun/index.ts b/projects/keepkey-vault/src/bun/index.ts index 7109e49..eb415d5 100644 --- a/projects/keepkey-vault/src/bun/index.ts +++ b/projects/keepkey-vault/src/bun/index.ts @@ -138,7 +138,7 @@ function cacheAddress(chainId: string, path: string, address: string) { } catch { /* never block on cache failure */ } } -const DEV_SERVER_PORT = 5173 +const DEV_SERVER_PORT = 5177 const DEV_SERVER_URL = `http://localhost:${DEV_SERVER_PORT}` const REST_API_PORT = 1646 @@ -190,10 +190,30 @@ const restCallbacks: RestApiCallbacks = { }, onSigningRequest: async (info: SigningRequestInfo) => { try { rpc.send['signing-request'](info) } catch { /* webview not ready */ } - return auth.requestSigningApproval(info.id) + // Bring window to front so user sees the approval prompt immediately + try { + mainWindow.setAlwaysOnTop(true) + mainWindow.focus() + } catch { /* window not ready */ } + try { + return await auth.requestSigningApproval(info.id) + } finally { + // Restore normal window level after user responds (or timeout) + try { mainWindow.setAlwaysOnTop(false) } catch { /* ignore */ } + } }, onPairRequest: (info) => { try { rpc.send['pair-request'](info) } catch { /* webview not ready */ } + // Bring window to front so user sees the pairing approval prompt + try { + mainWindow.setAlwaysOnTop(true) + mainWindow.focus() + } catch { /* window not ready */ } + }, + onPairDismissed: () => { + // Restore normal window level + dismiss frontend overlay (covers timeout case) + try { mainWindow.setAlwaysOnTop(false) } catch { /* ignore */ } + try { rpc.send['pair-dismissed']({}) } catch { /* webview not ready */ } }, getVersion: () => appVersionCache, } @@ -382,6 +402,18 @@ const rpc = BrowserView.defineRPC({ } return result }, + solanaSignMessage: async (params) => { + if (!engine.wallet) throw new Error('No device connected') + const result = await engine.wallet.solanaSignMessage(params) + return { + signature: result.signature instanceof Uint8Array + ? Buffer.from(result.signature).toString('base64') + : result.signature, + publicKey: result.publicKey instanceof Uint8Array + ? Buffer.from(result.publicKey).toString('base64') + : result.publicKey, + } + }, // ── Pioneer integration (batch portfolio API) ──────────────── getBalances: async () => { @@ -393,6 +425,8 @@ const rpc = BrowserView.defineRPC({ pioneer = await getPioneer() } catch (e: any) { console.warn('[getBalances] Pioneer init failed (will return zero balances):', e.message) + // Notify UI so user can change server or get support + try { rpc.send['pioneer-error']({ message: e.message, url: getPioneerApiBase() }) } catch { /* webview not ready */ } } const wallet = engine.wallet as any @@ -483,53 +517,81 @@ const rpc = BrowserView.defineRPC({ if (chain.networkId) networkToChain.set(chain.networkId, chain.id) } - // 3. Single API call for ALL balances + prices + // 3. Single API call — use GetPortfolio (charts endpoint) which returns + // both native balances AND tokens (ERC-20, etc.) const results: ChainBalance[] = [] try { if (!pioneer) throw new Error('Pioneer client not available') const resp = await withTimeout( - pioneer.GetPortfolioBalances({ + pioneer.GetPortfolio({ pubkeys: pubkeys.map(p => ({ caip: p.caip, pubkey: p.pubkey })) }), PIONEER_TIMEOUT_MS, - 'GetPortfolioBalances' + 'GetPortfolio' ) - // Defensive response unwrapping — handle all known Pioneer response shapes: - // { data: { data: { balances: [...] } } } (Swagger double-wrap) - // { data: { balances: [...] } } (Swagger single-wrap) - // { data: [...] } (raw array) - const rawData = resp?.data?.data || resp?.data || {} - const data: any[] = rawData.balances || (Array.isArray(rawData) ? rawData : []) - - if (data.length === 0 && pubkeys.length > 0) { - console.warn(`[getBalances] Pioneer returned 0 balance entries for ${pubkeys.length} pubkeys — response shape:`, JSON.stringify(Object.keys(resp?.data || {})).slice(0, 200)) - } + // Unwrap Swagger double-wrap: { data: { data: { balances, tokens } } } + const portfolio = resp?.data?.data || resp?.data || {} + const nativeEntries: any[] = portfolio.balances || (Array.isArray(portfolio) ? portfolio : []) + const portfolioTokens: any[] = portfolio.tokens || [] + + console.log(`[getBalances] GetPortfolio response: ${nativeEntries.length} balances, ${portfolioTokens.length} tokens`) - // Separate native balances from token entries - const nativeEntries: any[] = [] + // Convert portfolio.tokens (different shape) into the same format as native entries + // so our existing token grouping logic works on them const tokenEntries: any[] = [] - for (const d of data) { + for (const t of portfolioTokens) { + if (!t.assetCaip) continue + // Skip native assets that leaked into tokens array + if (t.assetCaip.includes('/slip44:')) continue + tokenEntries.push({ + caip: t.assetCaip, + networkId: t.networkId, + symbol: t.token?.symbol || 'UNK', + name: t.token?.name || t.token?.coingeckoId || 'Unknown', + balance: t.token?.balance?.toString() || '0', + valueUsd: t.token?.balanceUSD || 0, + priceUsd: t.token?.price || 0, + decimals: t.token?.decimals ?? t.token?.decimal ?? 18, + type: 'token', + contract: t.assetCaip.match(/\/erc20:(0x[a-fA-F0-9]+)/)?.[1] || undefined, + }) + } + + // Also scan nativeEntries for any tokens mixed in (belt + suspenders) + const pureNatives: any[] = [] + for (const d of nativeEntries) { const caip = d.caip || '' - if (caip.includes('/erc20:') || (d.type === 'token' && !d.isNative)) { + const caipPath = caip.split('/')[1] || '' + const isTokenByCaip = caipPath && !caipPath.startsWith('slip44:') + const isTokenByType = d.type === 'token' && d.isNative !== true + if (isTokenByCaip || isTokenByType) { tokenEntries.push(d) } else { - nativeEntries.push(d) + pureNatives.push(d) } } - console.log(`[getBalances] Portfolio response: ${nativeEntries.length} natives, ${tokenEntries.length} tokens`) + console.log(`[getBalances] After classification: ${pureNatives.length} natives, ${tokenEntries.length} tokens`) // Group tokens by their parent chain (via networkId or CAIP prefix) + // Also log the networkToChain map so we can audit matching + console.log(`[getBalances] networkToChain map (${networkToChain.size} entries): ${JSON.stringify(Object.fromEntries(networkToChain))}`) + const tokensByChainId = new Map() + let tokensSkippedZero = 0, tokensSkippedNoChain = 0, tokensGrouped = 0 for (const tok of tokenEntries) { const bal = parseFloat(String(tok.balance ?? '0')) - if (bal <= 0) continue + if (bal <= 0) { tokensSkippedZero++; continue } // Determine parent chainId from networkId or CAIP-2 prefix const tokNetworkId = tok.networkId || '' const caipPrefix = (tok.caip || '').split('/')[0] // e.g. "eip155:1" const parentChainId = networkToChain.get(tokNetworkId) || networkToChain.get(caipPrefix) || null - if (!parentChainId) continue // skip tokens for chains we don't track + if (!parentChainId) { + tokensSkippedNoChain++ + console.warn(`[getBalances] Token DROPPED (no parent chain): ${tok.symbol} caip=${tok.caip} networkId=${tokNetworkId} caipPrefix=${caipPrefix} bal=${bal} usd=${tok.valueUsd}`) + continue + } // Extract contract address from CAIP: "eip155:1/erc20:0xdac17..." → "0xdac17..." const contractMatch = (tok.caip || '').match(/\/erc20:(0x[a-fA-F0-9]+)/) @@ -552,6 +614,12 @@ const rpc = BrowserView.defineRPC({ const existing = tokensByChainId.get(parentChainId) || [] existing.push(token) tokensByChainId.set(parentChainId, existing) + tokensGrouped++ + } + + console.log(`[getBalances] Token grouping: ${tokensGrouped} grouped, ${tokensSkippedZero} skipped (zero bal), ${tokensSkippedNoChain} DROPPED (no parent chain)`) + for (const [chainId, toks] of tokensByChainId) { + console.log(`[getBalances] ${chainId}: ${toks.length} tokens, $${toks.reduce((s, t) => s + t.balanceUsd, 0).toFixed(2)} — ${toks.map(t => t.symbol).join(', ')}`) } // Merge user-added custom tokens as placeholders @@ -581,8 +649,8 @@ const rpc = BrowserView.defineRPC({ for (const entry of pubkeys) { if (entry.chainId === 'bitcoin') { // Find the Pioneer response for this xpub - const match = nativeEntries.find((d: any) => d.pubkey === entry.pubkey) - || nativeEntries.find((d: any) => d.caip === entry.caip && d.address === entry.pubkey) + const match = pureNatives.find((d: any) => d.pubkey === entry.pubkey) + || pureNatives.find((d: any) => d.caip === entry.caip && d.address === entry.pubkey) const bal = parseFloat(String(match?.balance ?? '0')) const usd = Number(match?.valueUsd ?? 0) btcTotalBalance += bal @@ -595,8 +663,8 @@ const rpc = BrowserView.defineRPC({ // EVM multi-address: aggregate per-chain, update per-address balance if (evmAddressSet.has(entry.pubkey.toLowerCase())) { - const match = nativeEntries.find((d: any) => d.caip === entry.caip && d.pubkey === entry.pubkey) - || nativeEntries.find((d: any) => d.caip === entry.caip && d.address?.toLowerCase() === entry.pubkey.toLowerCase()) + const match = pureNatives.find((d: any) => d.caip === entry.caip && d.pubkey === entry.pubkey) + || pureNatives.find((d: any) => d.caip === entry.caip && d.address?.toLowerCase() === entry.pubkey.toLowerCase()) const bal = parseFloat(String(match?.balance ?? '0')) const usd = Number(match?.valueUsd ?? 0) // Accumulate per-address USD for EvmAddressManager @@ -617,8 +685,8 @@ const rpc = BrowserView.defineRPC({ continue } - const match = nativeEntries.find((d: any) => d.caip === entry.caip) - || nativeEntries.find((d: any) => d.pubkey === entry.pubkey) + const match = pureNatives.find((d: any) => d.caip === entry.caip) + || pureNatives.find((d: any) => d.pubkey === entry.pubkey) const chainTokens = tokensByChainId.get(entry.chainId) // Sum token USD values into the chain total const tokenUsdTotal = chainTokens?.reduce((sum, t) => sum + t.balanceUsd, 0) || 0 @@ -688,6 +756,16 @@ const rpc = BrowserView.defineRPC({ } } + // ── Final audit log ── + const totalTokens = results.reduce((n, r) => n + (r.tokens?.length || 0), 0) + const totalUsd = results.reduce((n, r) => n + (r.balanceUsd || 0), 0) + console.log(`[getBalances] FINAL: ${results.length} chains, ${totalTokens} tokens, $${totalUsd.toFixed(2)}`) + for (const r of results) { + if (r.tokens && r.tokens.length > 0) { + console.log(`[getBalances] ${r.chainId}: ${r.tokens.length} tokens attached`) + } + } + return results }, @@ -1011,10 +1089,12 @@ const rpc = BrowserView.defineRPC({ approvePairing: async () => { const apiKey = auth.approvePairing() if (!apiKey) throw new Error('No pending pairing request') + try { mainWindow.setAlwaysOnTop(false) } catch { /* ignore */ } return { apiKey } }, rejectPairing: async () => { auth.rejectPairing() + try { mainWindow.setAlwaysOnTop(false) } catch { /* ignore */ } }, approveSigningRequest: async (params) => { if (!auth.approveSigningRequest(params.id)) throw new Error('No pending signing request with that id') @@ -1065,7 +1145,9 @@ const rpc = BrowserView.defineRPC({ getCachedBalances: async () => { const deviceId = engine.getDeviceState().deviceId if (!deviceId) return null - return getCachedBalances(deviceId) + const result = getCachedBalances(deviceId) + if (!result) return null + return { balances: result.balances, updatedAt: result.updatedAt } }, // ── Watch-only mode ───────────────────────────────────── @@ -1077,7 +1159,8 @@ const rpc = BrowserView.defineRPC({ getWatchOnlyBalances: async () => { const snap = getLatestDeviceSnapshot() if (!snap) return null - return getCachedBalances(snap.deviceId) + const result = getCachedBalances(snap.deviceId) + return result?.balances ?? null }, getWatchOnlyPubkeys: async () => { const snap = getLatestDeviceSnapshot() diff --git a/projects/keepkey-vault/src/bun/rest-api.ts b/projects/keepkey-vault/src/bun/rest-api.ts index aa275ac..cbee53f 100644 --- a/projects/keepkey-vault/src/bun/rest-api.ts +++ b/projects/keepkey-vault/src/bun/rest-api.ts @@ -1,7 +1,8 @@ import type { EngineController } from './engine-controller' import type { AuthStore } from './auth' import { HttpError } from './auth' -import type { SigningRequestInfo, ApiLogEntry } from '../shared/types' +import type { SigningRequestInfo, ApiLogEntry, EIP712DecodedInfo } from '../shared/types' +import { decodeEIP712 } from './eip712-decoder' import { CHAINS } from '../shared/chains' import { readFileSync } from 'fs' import { join } from 'path' @@ -12,6 +13,7 @@ export interface RestApiCallbacks { onApiLog: (entry: ApiLogEntry) => void onSigningRequest: (info: SigningRequestInfo) => Promise onPairRequest: (info: { name: string; url: string; imageUrl: string }) => void + onPairDismissed?: () => void getVersion: () => string } @@ -32,6 +34,13 @@ function requireWallet(engine: EngineController) { return engine.wallet } +/** SLIP44 coin type → KeepKey firmware coin name (must match firmware coin table) */ +const SLIP44_TO_COIN: Record = { + 0: 'Bitcoin', 2: 'Litecoin', 3: 'Dogecoin', 5: 'Dash', + 20: 'DigiByte', 60: 'Ethereum', 118: 'Cosmos', 144: 'Ripple', + 145: 'BitcoinCash', 501: 'Solana', 931: 'Rune', +} + // ── Features cache (10s TTL, matches keepkey-desktop) ────────────────── let featuresCache: { timestamp: number; data: any } | null = null const FEATURES_TTL_MS = 10_000 @@ -306,7 +315,7 @@ const startTime = Date.now() /** Set of signing endpoints that require user approval */ const SIGNING_ROUTES = new Set([ '/eth/sign-transaction', '/eth/sign-typed-data', '/eth/sign', - '/utxo/sign-transaction', '/xrp/sign-transaction', '/solana/sign-transaction', + '/utxo/sign-transaction', '/xrp/sign-transaction', '/solana/sign-transaction', '/solana/sign-message', '/cosmos/sign-amino', '/cosmos/sign-amino-delegate', '/cosmos/sign-amino-undelegate', '/cosmos/sign-amino-redelegate', '/cosmos/sign-amino-withdraw-delegator-rewards-all', '/cosmos/sign-amino-ibc-transfer', @@ -545,8 +554,13 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 callbacks.onPairRequest({ name: body.name, url: body.url || '', imageUrl: body.imageUrl || '' }) } // requestPair requires user approval via UI — NOT auto-granted - const apiKey = await auth.requestPair(body) - return json({ apiKey }) + try { + const apiKey = await auth.requestPair(body) + return json({ apiKey }) + } finally { + // Dismiss UI overlay + restore window level on approve, reject, or timeout + callbacks?.onPairDismissed?.() + } } } @@ -563,12 +577,22 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 // (we'll parse body again in the handler below — Bun caches it) try { const preview = await req.clone().json() as any - signingInfo.from = preview.from || preview.signerAddress - signingInfo.to = preview.to - signingInfo.value = preview.value signingInfo.chain = path.split('/')[1] // e.g. "eth", "cosmos" - signingInfo.chainId = preview.chainId || preview.chain_id - signingInfo.data = preview.data ? (preview.data.length > 66 ? preview.data.slice(0, 66) + '...' : preview.data) : undefined + + if (path === '/eth/sign-typed-data') { + // EIP-712: address + typedData structure (no from/to/value/data) + signingInfo.from = preview.address + signingInfo.chainId = preview.typedData?.domain?.chainId ? Number(preview.typedData.domain.chainId) : undefined + if (preview.typedData) { + signingInfo.typedDataDecoded = decodeEIP712(preview.typedData) + } + } else { + signingInfo.from = preview.from || preview.signerAddress + signingInfo.to = preview.to + signingInfo.value = preview.value + signingInfo.chainId = preview.chainId || preview.chain_id + signingInfo.data = preview.data ? (preview.data.length > 66 ? preview.data.slice(0, 66) + '...' : preview.data) : undefined + } } catch { /* body parse failed, non-fatal */ } const approved = await callbacks.onSigningRequest(signingInfo) @@ -797,9 +821,26 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 auth.requireAuth(req) const wallet = requireWallet(engine) const body = await parseRequest(req, S.EthSignTypedDataRequest) - const { addressNList } = auth.getAccount(body.address) - const result = await wallet.ethSignTypedData({ addressNList, typedData: body.typedData }) - return json(result) + + // Address resolution: cache first, then scan accounts + let addressNList: number[] + try { + addressNList = auth.getAccount(body.address).addressNList + } catch { + addressNList = await findEthAddressNList(wallet, auth, body.address) + } + + try { + const result = await wallet.ethSignTypedData({ addressNList, typedData: body.typedData }) + return json(result) + } catch (err: any) { + // Distinguish user cancellation from actual failures + const msg = String(err?.message || err || '').toLowerCase() + if (msg.includes('cancel') || msg.includes('rejected') || msg.includes('denied') || msg.includes('action cancelled')) { + return json({ error: 'User cancelled signing on device' }, 403) + } + throw err + } } if (path === '/eth/sign' && method === 'POST') { @@ -807,8 +848,8 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 const wallet = requireWallet(engine) const body = await parseRequest(req, S.EthSignRequest) const { addressNList } = auth.getAccount(body.address) - const msgBytes = Buffer.from(body.message.slice(2), 'hex') - const result = await wallet.ethSignMessage({ addressNList, message: msgBytes }) + // hdwallet expects message as a hex string (isHexString check), not Buffer + const result = await wallet.ethSignMessage({ addressNList, message: body.message }) return json(result) } @@ -1006,6 +1047,28 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 return json(result) } + // ── SOLANA MESSAGE SIGNING (firmware type 754) ────────────────── + if (path === '/solana/sign-message' && method === 'POST') { + auth.requireAuth(req) + const wallet = requireWallet(engine) + const body = await parseRequest(req, S.SolanaSignMessageRequest) + const addressNList = body.addressNList || body.address_n || [0x8000002C, 0x800001F5, 0x80000000, 0x80000000] + const result = await wallet.solanaSignMessage({ + addressNList, + message: body.message, + showDisplay: body.show_display !== false, + }) + // result: { publicKey: Uint8Array, signature: Uint8Array } + return json({ + signature: result.signature instanceof Uint8Array + ? Buffer.from(result.signature).toString('base64') + : result.signature, + publicKey: result.publicKey instanceof Uint8Array + ? Buffer.from(result.publicKey).toString('base64') + : result.publicKey, + }) + } + // ── DEVICE INFO (2 endpoints — read-only) ──────────────────── if (path === '/system/info/get-features' && method === 'POST') { auth.requireAuth(req) @@ -1228,9 +1291,9 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 }) continue } + const coinType = p.address_n.length >= 2 ? (p.address_n[1] >= 0x80000000 ? p.address_n[1] - 0x80000000 : p.address_n[1]) : 0 + const coin = p.coin || SLIP44_TO_COIN[coinType] || 'Bitcoin' try { - const coinType = p.address_n.length >= 2 ? (p.address_n[1] >= 0x80000000 ? p.address_n[1] - 0x80000000 : p.address_n[1]) : 0 - const coin = p.coin || (coinType === 60 ? 'Ethereum' : 'Bitcoin') const result = await wallet.getPublicKeys([{ addressNList: p.address_n, curve: 'secp256k1', @@ -1254,7 +1317,7 @@ export function startRestApi(engine: EngineController, auth: AuthStore, port = 1 addressNList: p.address_n, }) } catch (err: any) { - console.warn(`[REST] batch pubkey failed for path ${JSON.stringify(p.address_n)}:`, err?.message) + console.warn(`[REST] batch pubkey failed for path ${JSON.stringify(p.address_n)} coin=${coin} scriptType=${p.script_type}:`, err?.message) } } diff --git a/projects/keepkey-vault/src/bun/schemas.ts b/projects/keepkey-vault/src/bun/schemas.ts index b2fbb81..f7e64ba 100644 --- a/projects/keepkey-vault/src/bun/schemas.ts +++ b/projects/keepkey-vault/src/bun/schemas.ts @@ -135,6 +135,14 @@ export const SolanaSignRequest = z.object({ raw_tx: z.string().min(1), }).strip() +/** POST /solana/sign-message — sign an arbitrary message (firmware type 754) */ +export const SolanaSignMessageRequest = z.object({ + address_n: z.array(z.number().int()).optional(), + addressNList: z.array(z.number().int()).optional(), + message: z.string().min(1), + show_display: z.boolean().optional(), +}).strip() + /** POST /system/info/get-public-key */ export const GetPublicKeyRequest = z.object({ diff --git a/projects/keepkey-vault/src/mainview/App.tsx b/projects/keepkey-vault/src/mainview/App.tsx index 3675d92..4b22374 100644 --- a/projects/keepkey-vault/src/mainview/App.tsx +++ b/projects/keepkey-vault/src/mainview/App.tsx @@ -120,9 +120,14 @@ function App() { const [pairRequest, setPairRequest] = useState(null) useEffect(() => { - return onRpcMessage("pair-request", (payload) => { + const unsub1 = onRpcMessage("pair-request", (payload) => { setPairRequest(payload as PairingRequestInfo) }) + // Dismiss overlay on timeout or external resolution + const unsub2 = onRpcMessage("pair-dismissed", () => { + setPairRequest(null) + }) + return () => { unsub1(); unsub2() } }, []) const handleApprovePairing = useCallback(async () => { @@ -540,7 +545,7 @@ function App() { )} {/* pt: 54px TopNav + 50px banner height when visible */} - {activeTab === "vault" && } + {activeTab === "vault" && setSettingsOpen(true)} />} {activeTab === "apps" && } diff --git a/projects/keepkey-vault/src/mainview/components/ApiAuditLog.tsx b/projects/keepkey-vault/src/mainview/components/ApiAuditLog.tsx index 988e87e..5d1a793 100644 --- a/projects/keepkey-vault/src/mainview/components/ApiAuditLog.tsx +++ b/projects/keepkey-vault/src/mainview/components/ApiAuditLog.tsx @@ -122,14 +122,39 @@ function truncateJson(data: any, maxLen = 500): string { } } -/** Collapsible JSON block */ +/** Collapsible JSON block with copy button */ function JsonBlock({ label, data }: { label: string; data: any }) { + const [copied, setCopied] = useState(false) if (data === undefined || data === null) return null + + const handleCopy = (e: React.MouseEvent) => { + e.stopPropagation() + const fullJson = typeof data === "string" ? data : JSON.stringify(data, null, 2) + navigator.clipboard.writeText(fullJson).then(() => { + setCopied(true) + setTimeout(() => setCopied(false), 2000) + }).catch(() => {}) + } + return ( - - {label} - + + + {label} + + + {copied ? "Copied!" : "Copy"} + + void watchOnly?: boolean + onOpenSettings?: () => void } -export function Dashboard({ onLoaded, watchOnly }: DashboardProps) { +/** Format a timestamp as a relative "time ago" string */ +function formatTimeAgo(ts: number): string { + const diff = Date.now() - ts + const mins = Math.floor(diff / 60_000) + if (mins < 1) return 'just now' + if (mins < 60) return `${mins}m ago` + const hours = Math.floor(mins / 60) + if (hours < 24) return `${hours}h ago` + const days = Math.floor(hours / 24) + return `${days}d ago` +} + +export function Dashboard({ onLoaded, watchOnly, onOpenSettings }: DashboardProps) { const { t } = useTranslation("dashboard") const [selectedChain, setSelectedChain] = useState(null) const [balances, setBalances] = useState>(new Map()) - const [loadingBalances, setLoadingBalances] = useState(true) + const [loadingBalances, setLoadingBalances] = useState(false) const [initialLoaded, setInitialLoaded] = useState(false) const [activeSliceIndex, setActiveSliceIndex] = useState(0) - const [fetchKey, setFetchKey] = useState(0) const [customChainDefs, setCustomChainDefs] = useState([]) const [showAddChain, setShowAddChain] = useState(false) + const [pioneerError, setPioneerError] = useState(null) + const [cacheUpdatedAt, setCacheUpdatedAt] = useState(null) + const [tokenWarning, setTokenWarning] = useState(false) + const [hasEverRefreshed, setHasEverRefreshed] = useState(false) + + // Listen for Pioneer connection errors from backend + useEffect(() => { + return onRpcMessage("pioneer-error", (payload) => { + setPioneerError(payload as PioneerError) + }) + }, []) // Load custom chains on mount and register their explorer links useEffect(() => { @@ -46,73 +81,79 @@ export function Dashboard({ onLoaded, watchOnly }: DashboardProps) { .catch(() => {}) }, []) - // Cache-first: show cached balances instantly, then refresh with live data + // On mount: load cached balances ONLY (no live fetch — saves API credits) useEffect(() => { let cancelled = false - let retryTimer: ReturnType | undefined - // Phase 1: Load cached balances immediately (< 1ms from SQLite) async function loadCached() { - if (watchOnly || cancelled) return - try { - const cached = await rpcRequest('getCachedBalances', undefined, 3000) - if (!cancelled && cached && cached.length > 0) { - const map = new Map() - for (const b of cached) map.set(b.chainId, b) - setBalances(map) - console.log(`[Dashboard] Cache hit: ${cached.length} chains, $${cached.reduce((s, b) => s + (b.balanceUsd || 0), 0).toFixed(2)}`) - // Dismiss splash immediately with cached data - if (!initialLoaded) { - setInitialLoaded(true) - onLoaded?.() + if (watchOnly) { + // Watch-only still auto-fetches from cache + try { + const result = await rpcRequest('getWatchOnlyBalances', undefined, 5000) + if (!cancelled && result && result.length > 0) { + const map = new Map() + for (const b of result) map.set(b.chainId, b) + setBalances(map) } + } catch { /* watch-only cache unavailable */ } + if (!cancelled) { + setInitialLoaded(true) + onLoaded?.() } - } catch { /* cache unavailable, will wait for live data */ } - } + return + } - // Phase 2: Fetch live data (background refresh or primary if no cache) - async function fetchLive(attempt = 1) { - setLoadingBalances(true) - let hasTokenData = false try { - const result = watchOnly - ? await rpcRequest('getWatchOnlyBalances', undefined, 5000).then(r => r || []) - : await rpcRequest('getBalances', undefined, 120000) - if (!cancelled && result) { - const tokenTotal = result.reduce((n, b) => n + (b.tokens?.length || 0), 0) - const balTotal = result.reduce((n, b) => n + (b.balanceUsd || 0), 0) - hasTokenData = tokenTotal > 0 || balTotal > 0 || result.length > 0 - console.log(`[Dashboard] Live: ${result.length} chains, ${tokenTotal} tokens, $${balTotal.toFixed(2)} (attempt=${attempt})`) + const cached = await rpcRequest<{ balances: ChainBalance[]; updatedAt: number } | null>('getCachedBalances', undefined, 3000) + if (!cancelled && cached && cached.balances.length > 0) { const map = new Map() - for (const b of result) map.set(b.chainId, b) + for (const b of cached.balances) map.set(b.chainId, b) setBalances(map) + setCacheUpdatedAt(cached.updatedAt) + console.log(`[Dashboard] Cache hit: ${cached.balances.length} chains, $${cached.balances.reduce((s, b) => s + (b.balanceUsd || 0), 0).toFixed(2)}, age: ${formatTimeAgo(cached.updatedAt)}`) } - } catch (e: any) { - console.warn(`[Dashboard] ${watchOnly ? 'watchOnly' : 'getBalances'} failed (attempt=${attempt}):`, e.message) - } + } catch { /* cache unavailable */ } + if (!cancelled) { - setLoadingBalances(false) - if (!initialLoaded) { - setInitialLoaded(true) - onLoaded?.() - } - // Auto-retry once if first attempt returned no meaningful data - if (!watchOnly && !hasTokenData && attempt < 2 && !cancelled) { - console.log('[Dashboard] No balance data — auto-retrying in 3s') - retryTimer = setTimeout(() => { if (!cancelled) fetchLive(attempt + 1) }, 3000) - } + setInitialLoaded(true) + onLoaded?.() } } - // Execute: cache first, then live - loadCached().then(() => { if (!cancelled) fetchLive() }) + loadCached() + return () => { cancelled = true } + }, [watchOnly]) + + // Manual refresh: fetch live data from Pioneer API + const refreshBalances = useCallback(async () => { + if (loadingBalances || watchOnly) return + setLoadingBalances(true) + setPioneerError(null) + setTokenWarning(false) + + try { + const result = await rpcRequest('getBalances', undefined, 120000) + if (result) { + const tokenTotal = result.reduce((n, b) => n + (b.tokens?.length || 0), 0) + const balTotal = result.reduce((n, b) => n + (b.balanceUsd || 0), 0) + console.log(`[Dashboard] Live: ${result.length} chains, ${tokenTotal} tokens, $${balTotal.toFixed(2)}`) + const map = new Map() + for (const b of result) map.set(b.chainId, b) + setBalances(map) + setCacheUpdatedAt(Date.now()) + setHasEverRefreshed(true) - return () => { cancelled = true; clearTimeout(retryTimer) } - }, [fetchKey, watchOnly]) + // Warn if no token data came back (possible API issue) + if (tokenTotal === 0 && balTotal > 0) { + setTokenWarning(true) + } + } + } catch (e: any) { + console.warn('[Dashboard] getBalances failed:', e.message) + } - const refreshBalances = useCallback(() => { - if (!loadingBalances) setFetchKey((k) => k + 1) - }, [loadingBalances]) + setLoadingBalances(false) + }, [loadingBalances, watchOnly]) const totalUsd = useMemo(() => Array.from(balances.values()).reduce((sum, b) => sum + (b.balanceUsd || 0), 0), [balances]) @@ -144,6 +185,9 @@ export function Dashboard({ onLoaded, watchOnly }: DashboardProps) { return 0 }), [allChains, balances]) + // Is data stale? (loaded from cache but haven't refreshed yet this session) + const isStale = !hasEverRefreshed && !loadingBalances + if (selectedChain) { const bal = balances.get(selectedChain.id) return setSelectedChain(null)} /> @@ -151,6 +195,8 @@ export function Dashboard({ onLoaded, watchOnly }: DashboardProps) { return ( + + {/* Watch-only banner */} {watchOnly && ( )} + {/* Pioneer connection error banner */} + {pioneerError && ( + + + + + + + + + + {t("pioneerOfflineTitle", { defaultValue: "Balance server offline" })} + + + + {t("pioneerOfflineDesc", { defaultValue: "Unable to connect to {{url}}. Balances may be unavailable.", url: pioneerError.url })} + + + {onOpenSettings && ( + { + setPioneerError(null) + onOpenSettings() + }} + > + {t("changeServer", { defaultValue: "Change Server" })} + + )} + window.open("https://support.keepkey.com", "_blank")} + > + {t("getSupport", { defaultValue: "Get Support" })} + + { + setPioneerError(null) + refreshBalances() + }} + > + {t("retry", { defaultValue: "Retry" })} + + + + + )} + + {/* Token warning banner — shown when refresh succeeded but no tokens returned */} + {tokenWarning && !pioneerError && ( + + + + + + + + + {t("tokenWarningTitle")} + + + + {t("tokenWarningDesc")} + + + )} + {/* Portfolio Chart — or Welcome placeholder for empty wallets */} {hasAnyBalance ? ( )} - {/* Section Header + Chain Grid */} - - - {t("supportedChains")} - - - {loadingBalances && hasAnyBalance && } - {t("networksCount", { count: allChains.length })} - + - - - - - - - + + {loadingBalances ? ( + + ) : ( + + + + + )} + {loadingBalances + ? t("refreshing") + : isStale + ? t("refreshPrompt", { defaultValue: "Press to update balances" }) + : cacheUpdatedAt + ? t("lastUpdated", { time: formatTimeAgo(cacheUpdatedAt) }) + : t("refreshBalances")} + + + + )} {sortedChains.map((chain) => { @@ -355,11 +531,11 @@ export function Dashboard({ onLoaded, watchOnly }: DashboardProps) { {bal ? ( - + {formatBalance(bal.balance)} {chain.symbol} {usdNum > 0 && ( - + )} {tokenCount > 0 && ( diff --git a/projects/keepkey-vault/src/mainview/components/SendForm.tsx b/projects/keepkey-vault/src/mainview/components/SendForm.tsx index 0b52425..ed5aa34 100644 --- a/projects/keepkey-vault/src/mainview/components/SendForm.tsx +++ b/projects/keepkey-vault/src/mainview/components/SendForm.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useCallback, useMemo, Fragment } from "react" import { useTranslation } from "react-i18next" import { Box, Flex, Text, VStack, Button, Input } from "@chakra-ui/react" import { rpcRequest } from "../lib/rpc" -import { formatBalance } from "../lib/formatting" +import { formatBalance, formatUsd } from "../lib/formatting" import { getAsset } from "../../shared/assetLookup" import { QrScannerOverlay } from "./QrScannerOverlay" import type { ChainDef } from "../../shared/chains" @@ -42,6 +42,8 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve const { t } = useTranslation("send") const [recipient, setRecipient] = useState("") const [amount, setAmount] = useState("") + const [usdAmount, setUsdAmount] = useState("") + const [inputMode, setInputMode] = useState<'crypto' | 'usd'>('crypto') const [memo, setMemo] = useState("") const [isMax, setIsMax] = useState(false) const [feeLevel, setFeeLevel] = useState(5) // 1=slow, 5=avg, 10=fast @@ -67,6 +69,7 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve setError(null) setRecipient("") setAmount("") + setUsdAmount("") setMemo("") setIsMax(false) }, [tokenCaip]) @@ -81,6 +84,61 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve const balanceNum = parseFloat(displayBalance) const exceedsBalance = !isMax && !isNaN(amountNum) && amountNum > 0 && balanceNum > 0 && amountNum > balanceNum + // Derive per-unit USD price from available balance data + const pricePerUnit = useMemo(() => { + if (isTokenSend && token?.priceUsd) return token.priceUsd + if (!isTokenSend && balance?.balanceUsd && balance.balance) { + const bal = parseFloat(balance.balance) + if (bal > 0) return balance.balanceUsd / bal + } + return 0 + }, [isTokenSend, token?.priceUsd, balance?.balanceUsd, balance?.balance]) + + const hasPrice = pricePerUnit > 0 + + // Bidirectional conversion: crypto → USD + const handleCryptoChange = useCallback((v: string) => { + setIsMax(false) + setAmount(v) + if (hasPrice && v) { + const n = parseFloat(v) + if (!isNaN(n)) setUsdAmount((n * pricePerUnit).toFixed(2)) + else setUsdAmount("") + } else { + setUsdAmount("") + } + }, [hasPrice, pricePerUnit]) + + // Bidirectional conversion: USD → crypto + const handleUsdChange = useCallback((v: string) => { + setIsMax(false) + setUsdAmount(v) + if (hasPrice && v) { + const n = parseFloat(v) + if (!isNaN(n)) { + const crypto = n / pricePerUnit + setAmount(crypto < 1 ? crypto.toPrecision(8) : crypto.toFixed(8).replace(/\.?0+$/, '')) + } else { + setAmount("") + } + } else { + setAmount("") + } + }, [hasPrice, pricePerUnit]) + + // Swap input mode + const toggleInputMode = useCallback(() => { + setInputMode(prev => prev === 'crypto' ? 'usd' : 'crypto') + }, []) + + // USD equivalent of current amount for display + const amountUsdPreview = useMemo(() => { + if (!hasPrice || isMax) return null + const n = parseFloat(amount) + if (isNaN(n) || n <= 0) return null + return n * pricePerUnit + }, [amount, hasPrice, pricePerUnit, isMax]) + const recipientTooShort = useMemo(() => { if (!recipient) return false // Most addresses are 25+ chars; catch obvious typos @@ -159,6 +217,7 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve setError(null) setRecipient("") setAmount("") + setUsdAmount("") setMemo("") setIsMax(false) }, []) @@ -236,9 +295,16 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve {/* Balance display */} {t("available")} - - {formatBalance(displayBalance)} {displaySymbol} - + + + {formatBalance(displayBalance)} {displaySymbol} + + {hasPrice && ( + + ${formatUsd(parseFloat(displayBalance) * pricePerUnit)} + + )} + {/* Gas balance hint for token sends */} {isTokenSend && balance && ( @@ -285,29 +351,70 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve - - - { setIsMax(false); setAmount(v) }} - placeholder={t("amountPlaceholder")} - disabled={isMax} - /> - - - + + {/* Amount input with USD conversion */} + + + + {inputMode === 'crypto' ? `${t("amount")} (${displaySymbol})` : `${t("amount")} (USD)`} + + {hasPrice && ( + + )} + + + + inputMode === 'crypto' ? handleCryptoChange(e.target.value) : handleUsdChange(e.target.value)} + placeholder={inputMode === 'usd' ? '0.00' : t("amountPlaceholder")} + bg="kk.bg" + border="1px solid" + borderColor="kk.border" + color="kk.textPrimary" + size="sm" + fontFamily="mono" + disabled={isMax} + px="3" + /> + + + + + {/* Secondary display: shows the converted value */} + {!isMax && hasPrice && ( + + {inputMode === 'crypto' && amountUsdPreview !== null ? ( + ${formatUsd(amountUsdPreview)} + ) : inputMode === 'usd' && amount ? ( + {formatBalance(amount)} {displaySymbol} + ) : ( + + )} + {pricePerUnit > 0 && ( + 1 {displaySymbol} = ${formatUsd(pricePerUnit)} + )} + + )} + {needsMemo && ( {t("amount")} - {isMax ? 'MAX' : amount} {displaySymbol} + + {isMax ? 'MAX' : amount} {displaySymbol} + {!isMax && amountUsdPreview !== null && ( + ${formatUsd(amountUsdPreview)} + )} + {t("fee")} - {formatBalance(buildResult.fee)} {chain.symbol} + + {formatBalance(buildResult.fee)} {chain.symbol} + {buildResult.feeUsd != null && buildResult.feeUsd > 0 && ( + ${formatUsd(buildResult.feeUsd)} + )} + @@ -525,6 +642,14 @@ export function SendForm({ chain, address, balance, token, onClearToken, xpubOve ) } +function SwapIcon() { + return ( + + + + ) +} + function QrIcon() { return ( diff --git a/projects/keepkey-vault/src/mainview/components/device/SigningApproval.tsx b/projects/keepkey-vault/src/mainview/components/device/SigningApproval.tsx index 1b1f4d2..a5d60d1 100644 --- a/projects/keepkey-vault/src/mainview/components/device/SigningApproval.tsx +++ b/projects/keepkey-vault/src/mainview/components/device/SigningApproval.tsx @@ -1,8 +1,8 @@ -import { useEffect } from "react" +import { useEffect, useState } from "react" import { Box, Text, VStack, Flex, Button } from "@chakra-ui/react" import { useTranslation } from "react-i18next" import { Z } from "../../lib/z-index" -import type { SigningRequestInfo } from "../../../shared/types" +import type { SigningRequestInfo, EIP712DecodedInfo } from "../../../shared/types" interface SigningApprovalProps { request: SigningRequestInfo @@ -22,8 +22,33 @@ const METHOD_LABEL_KEYS: Record = { "/mayachain/sign-amino-transfer": "signing.methodMayaTransfer", "/mayachain/sign-amino-deposit": "signing.methodMayaDeposit", "/osmosis/sign-amino": "signing.methodOsmosisSign", + "/solana/sign-transaction": "signing.methodSolanaSignTx", + "/solana/sign-message": "signing.methodSolanaSignTx", } +const SIGNING_ANIMATIONS = ` + @keyframes signingPulseGlow { + 0%, 100% { box-shadow: 0 0 8px 2px rgba(192,168,96,0.4); } + 50% { box-shadow: 0 0 24px 8px rgba(192,168,96,0.7), 0 0 48px 16px rgba(192,168,96,0.15); } + } + @keyframes signingFlashBorder { + 0%, 100% { border-color: rgba(192,168,96,0.5); } + 50% { border-color: rgba(192,168,96,1); } + } + @keyframes signingBadgePulse { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.7; transform: scale(1.05); } + } + @keyframes signingOverlayIn { + 0% { opacity: 0; } + 100% { opacity: 1; } + } + @keyframes signingCardIn { + 0% { opacity: 0; transform: scale(0.92) translateY(12px); } + 100% { opacity: 1; transform: scale(1) translateY(0); } + } +` + function DetailRow({ label, value }: { label: string; value?: string }) { if (!value) return null return ( @@ -38,8 +63,63 @@ function DetailRow({ label, value }: { label: string; value?: string }) { ) } +function TypedDataDetails({ decoded, t }: { decoded: EIP712DecodedInfo; t: (key: string, fallback?: string) => string }) { + return ( + + {/* Operation badge */} + + + {decoded.operationName} + + + + {/* Domain info */} + + {decoded.domain.name && ( + + )} + {decoded.domain.verifyingContract && ( + + )} + {decoded.domain.chainId !== undefined && ( + + )} + + + {/* Decoded fields */} + + {decoded.fields.map((field, i) => ( + + ))} + + + ) +} + export function SigningApproval({ request, onApprove, onReject }: SigningApprovalProps) { const { t } = useTranslation("device") + const [elapsed, setElapsed] = useState(0) + // Keyboard: Enter=approve, Escape=reject useEffect(() => { const handler = (e: KeyboardEvent) => { @@ -50,8 +130,20 @@ export function SigningApproval({ request, onApprove, onReject }: SigningApprova return () => document.removeEventListener("keydown", handler) }, [onApprove, onReject]) + // Tick elapsed seconds for countdown timer + useEffect(() => { + const iv = setInterval(() => setElapsed((s) => s + 1), 1000) + return () => clearInterval(iv) + }, []) + const labelKey = METHOD_LABEL_KEYS[request.method] const methodLabel = labelKey ? t(labelKey) : request.method + const timeoutSec = 120 + const remaining = Math.max(0, timeoutSec - elapsed) + const minutes = Math.floor(remaining / 60) + const seconds = remaining % 60 + const timeStr = `${minutes}:${seconds.toString().padStart(2, "0")}` + const urgent = remaining <= 30 return ( + + {/* Urgent action badge */} + + + {t("signing.actionRequired", "Action Required")} + + + {/* Header */} @@ -99,23 +213,32 @@ export function SigningApproval({ request, onApprove, onReject }: SigningApprova {methodLabel} - {/* Details */} - - - - - - {request.chainId !== undefined && ( - - )} - - + {/* Details — typed data vs standard transaction */} + {request.typedDataDecoded ? ( + + ) : ( + + + + + + {request.chainId !== undefined && ( + + )} + + + )} + + {/* Countdown timer */} + + {t("signing.expiresIn", "Expires in {{time}}", { time: timeStr })} + {/* Action buttons */} @@ -124,6 +247,7 @@ export function SigningApproval({ request, onApprove, onReject }: SigningApprova bg="kk.gold" color="black" fontWeight="600" + size="lg" _hover={{ bg: "kk.goldHover" }} onClick={onApprove} > @@ -135,6 +259,7 @@ export function SigningApproval({ request, onApprove, onReject }: SigningApprova color="kk.textSecondary" border="1px solid" borderColor="kk.border" + size="lg" _hover={{ color: "white", borderColor: "kk.textSecondary" }} onClick={onReject} > diff --git a/projects/keepkey-vault/src/mainview/i18n/locales/en/dashboard.json b/projects/keepkey-vault/src/mainview/i18n/locales/en/dashboard.json index a196dca..edb5685 100644 --- a/projects/keepkey-vault/src/mainview/i18n/locales/en/dashboard.json +++ b/projects/keepkey-vault/src/mainview/i18n/locales/en/dashboard.json @@ -1,6 +1,6 @@ { "supportedChains": "Supported Chains", - "refreshBalances": "Refresh balances", + "refreshBalances": "Refresh Balances", "connectDeviceToRefresh": "Connect device to refresh", "networksCount": "{{count}} networks", "addChain": "Add Chain", @@ -12,5 +12,12 @@ "welcomeSubtitle": "Your wallet is ready. Here's how to get started:", "welcomeTip1": "Tap any chain below, then hit Receive to get your deposit address", "welcomeTip2": "Send crypto to your address — your balance will appear here automatically", - "welcomeTip3": "Add custom EVM chains with the + card to track any network" + "welcomeTip3": "Add custom EVM chains with the + card to track any network", + "balancesStale": "Balances may be outdated", + "lastUpdated": "Last updated {{time}}", + "lastUpdatedNever": "Never loaded", + "refreshPrompt": "Press Refresh to load latest balances", + "tokenWarningTitle": "Token balances unavailable", + "tokenWarningDesc": "No token data was returned. Your native balances are shown but ERC-20 / token balances may be missing.", + "refreshing": "Refreshing..." } diff --git a/projects/keepkey-vault/src/mainview/i18n/locales/en/device.json b/projects/keepkey-vault/src/mainview/i18n/locales/en/device.json index 3bc3ade..57c569a 100644 --- a/projects/keepkey-vault/src/mainview/i18n/locales/en/device.json +++ b/projects/keepkey-vault/src/mainview/i18n/locales/en/device.json @@ -43,7 +43,11 @@ "methodThorchainDeposit": "THORChain Deposit", "methodMayaTransfer": "Maya Transfer", "methodMayaDeposit": "Maya Deposit", - "methodOsmosisSign": "Osmosis Sign" + "methodOsmosisSign": "Osmosis Sign", + "methodSolanaSignTx": "Solana Sign Transaction", + "domainName": "Domain", + "contract": "Contract", + "operationType": "Operation" }, "recovery": { "title": "Recover Your Wallet", diff --git a/projects/keepkey-vault/src/mainview/i18n/locales/en/send.json b/projects/keepkey-vault/src/mainview/i18n/locales/en/send.json index 6a74cfb..6fb0725 100644 --- a/projects/keepkey-vault/src/mainview/i18n/locales/en/send.json +++ b/projects/keepkey-vault/src/mainview/i18n/locales/en/send.json @@ -36,5 +36,6 @@ "sendAnother": "Send Another", "failedToBuild": "Failed to build transaction", "signingFailed": "Signing failed", - "broadcastFailed": "Broadcast failed" + "broadcastFailed": "Broadcast failed", + "switchInput": "Switch between crypto and USD input" } diff --git a/projects/keepkey-vault/src/shared/rpc-schema.ts b/projects/keepkey-vault/src/shared/rpc-schema.ts index 1f84489..cece8b9 100644 --- a/projects/keepkey-vault/src/shared/rpc-schema.ts +++ b/projects/keepkey-vault/src/shared/rpc-schema.ts @@ -120,7 +120,7 @@ export type VaultRPCSchema = ElectrobunRPCSchema & { setPioneerApiBase: { params: { url: string }; response: AppSettings } // ── Balance cache (instant portfolio) ───────────────────────────── - getCachedBalances: { params: void; response: ChainBalance[] | null } + getCachedBalances: { params: void; response: { balances: ChainBalance[]; updatedAt: number } | null } // ── Watch-only mode ────────────────────────────────────────────── checkWatchOnlyCache: { params: void; response: { available: boolean; deviceLabel?: string; lastSynced?: number } } @@ -149,7 +149,9 @@ export type VaultRPCSchema = ElectrobunRPCSchema & { 'camera-frame': string 'camera-error': string 'update-status': UpdateStatus + 'pioneer-error': { message: string; url: string } 'pair-request': PairingRequestInfo + 'pair-dismissed': Record 'signing-request': SigningRequestInfo 'signing-dismissed': { id: string } 'api-log': ApiLogEntry diff --git a/projects/keepkey-vault/src/shared/types.ts b/projects/keepkey-vault/src/shared/types.ts index 17bcca9..b088bd6 100644 --- a/projects/keepkey-vault/src/shared/types.ts +++ b/projects/keepkey-vault/src/shared/types.ts @@ -224,6 +224,21 @@ export interface PairedAppInfo { addedOn: number } +export interface EIP712DecodedField { + label: string + value: string + format: 'address' | 'amount' | 'datetime' | 'raw' | 'hex' + raw?: string +} + +export interface EIP712DecodedInfo { + operationName: string + domain: { name?: string; version?: string; chainId?: number; verifyingContract?: string } + primaryType: string + fields: EIP712DecodedField[] + isKnownType: boolean +} + export interface SigningRequestInfo { id: string method: string @@ -234,6 +249,7 @@ export interface SigningRequestInfo { value?: string data?: string chainId?: number + typedDataDecoded?: EIP712DecodedInfo } export interface ApiLogEntry { diff --git a/projects/keepkey-vault/vite.config.ts b/projects/keepkey-vault/vite.config.ts index d702ead..0e75829 100644 --- a/projects/keepkey-vault/vite.config.ts +++ b/projects/keepkey-vault/vite.config.ts @@ -29,7 +29,7 @@ export default defineConfig({ }, }, server: { - port: 5173, + port: 5177, strictPort: true, }, }); From beb4fcb0b2d049b697139f7e0f210fc508208467 Mon Sep 17 00:00:00 2001 From: highlander Date: Sun, 1 Mar 2026 11:37:33 -0700 Subject: [PATCH 06/10] fix: purge dead Binance Beacon Chain SDK, add Solana signMessage, improve dashboard cache display - hdwallet: fix stale version pins pulling bnb-javascript-sdk-nobroadcast (~27MB) from npm registry; regenerate yarn.lock; add Solana signMessage protobuf shims + wallet method - collect-externals: add bnb-javascript-sdk-nobroadcast to DEV_BLOCKLIST - Dashboard: color-coded cache age (green <1h, yellow <24h, red >24h) Co-Authored-By: Claude Opus 4.6 --- modules/hdwallet | 2 +- .../keepkey-vault/scripts/collect-externals.ts | 2 ++ .../src/mainview/components/Dashboard.tsx | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/hdwallet b/modules/hdwallet index 8f12b16..54d7c1f 160000 --- a/modules/hdwallet +++ b/modules/hdwallet @@ -1 +1 @@ -Subproject commit 8f12b16c49735519ec97384507c69c6d09df22ea +Subproject commit 54d7c1f4bbf9b3730a5870a0e20193ecf9d780d8 diff --git a/projects/keepkey-vault/scripts/collect-externals.ts b/projects/keepkey-vault/scripts/collect-externals.ts index 515f98b..20f9503 100644 --- a/projects/keepkey-vault/scripts/collect-externals.ts +++ b/projects/keepkey-vault/scripts/collect-externals.ts @@ -96,6 +96,8 @@ const DEV_BLOCKLIST = new Set([ 'test-exclude', 'throat', 'p-each-series', 'growly', 'is-wsl', 'node-notifier', 'node-int64', 'parse5', + // --- Dead chain SDK (Binance Beacon Chain is decommissioned) --- + 'bnb-javascript-sdk-nobroadcast', ]) // Read deps from a nested package dir and add them to allDeps (so they get collected at top level). diff --git a/projects/keepkey-vault/src/mainview/components/Dashboard.tsx b/projects/keepkey-vault/src/mainview/components/Dashboard.tsx index 5c52d13..f3f088c 100644 --- a/projects/keepkey-vault/src/mainview/components/Dashboard.tsx +++ b/projects/keepkey-vault/src/mainview/components/Dashboard.tsx @@ -455,11 +455,19 @@ export function Dashboard({ onLoaded, watchOnly, onOpenSettings }: DashboardProp )} {loadingBalances ? t("refreshing") - : isStale - ? t("refreshPrompt", { defaultValue: "Press to update balances" }) - : cacheUpdatedAt - ? t("lastUpdated", { time: formatTimeAgo(cacheUpdatedAt) }) - : t("refreshBalances")} + : cacheUpdatedAt + ? <> + { + const age = Date.now() - cacheUpdatedAt + if (age < 3_600_000) return "#4ADE80" + if (age < 86_400_000) return "#FBBF24" + return "#F87171" + })()}> + {formatTimeAgo(cacheUpdatedAt)} + + {" · "}{t("refreshBalances")} + + : t("refreshPrompt", { defaultValue: "Press to update balances" })} From cbef0325ff7d4334b964d98950cca8b7c75a7def Mon Sep 17 00:00:00 2001 From: highlander Date: Sun, 1 Mar 2026 11:43:08 -0700 Subject: [PATCH 07/10] chore: bump version to 1.0.2 Co-Authored-By: Claude Opus 4.6 --- projects/keepkey-vault/electrobun.config.ts | 2 +- projects/keepkey-vault/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/keepkey-vault/electrobun.config.ts b/projects/keepkey-vault/electrobun.config.ts index 1609ab7..0461a96 100644 --- a/projects/keepkey-vault/electrobun.config.ts +++ b/projects/keepkey-vault/electrobun.config.ts @@ -4,7 +4,7 @@ export default { app: { name: "keepkey-vault", identifier: "com.keepkey.vault", - version: "1.0.1", + version: "1.0.2", urlSchemes: ["keepkey"], }, build: { diff --git a/projects/keepkey-vault/package.json b/projects/keepkey-vault/package.json index 3f41120..e73d81d 100644 --- a/projects/keepkey-vault/package.json +++ b/projects/keepkey-vault/package.json @@ -1,6 +1,6 @@ { "name": "keepkey-vault", - "version": "1.0.1", + "version": "1.0.2", "description": "KeepKey Vault - Desktop hardware wallet management powered by Electrobun", "scripts": { "dev": "vite build && bun scripts/collect-externals.ts && electrobun build && electrobun dev", From 3f561024fa59961a40e5ea7cdd119d5f2e35cdb2 Mon Sep 17 00:00:00 2001 From: highlander Date: Sun, 1 Mar 2026 12:46:32 -0700 Subject: [PATCH 08/10] fix: auto-update URL and subtle bottom-right toast for errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix baseUrl: BitHighlander/keepkey-vault-v11 → keepkey/keepkey-vault (root cause of "Update check failed, will retry") - Warning/error notifications now render as small bottom-right toast instead of full-width top banner - Auto-dismiss after 20 seconds - Actionable phases (available, downloading, ready) keep full top banner Co-Authored-By: Claude Opus 4.6 --- projects/keepkey-vault/electrobun.config.ts | 2 +- projects/keepkey-vault/src/mainview/App.tsx | 3 +- .../src/mainview/components/UpdateBanner.tsx | 119 +++++++++++++----- 3 files changed, 90 insertions(+), 34 deletions(-) diff --git a/projects/keepkey-vault/electrobun.config.ts b/projects/keepkey-vault/electrobun.config.ts index 0461a96..d62a878 100644 --- a/projects/keepkey-vault/electrobun.config.ts +++ b/projects/keepkey-vault/electrobun.config.ts @@ -56,6 +56,6 @@ export default { }, }, release: { - baseUrl: "https://github.com/BitHighlander/keepkey-vault-v11/releases/latest/download", + baseUrl: "https://github.com/keepkey/keepkey-vault/releases/latest/download", }, } satisfies ElectrobunConfig; diff --git a/projects/keepkey-vault/src/mainview/App.tsx b/projects/keepkey-vault/src/mainview/App.tsx index 4b22374..746881b 100644 --- a/projects/keepkey-vault/src/mainview/App.tsx +++ b/projects/keepkey-vault/src/mainview/App.tsx @@ -512,7 +512,8 @@ function App() { } // ── Ready phase ───────────────────────────────────────────────── - const showBanner = !updateDismissed && update.phase !== "idle" && update.phase !== "checking" + // Warning/error are now bottom-right toasts — only push content down for actionable top banners + const showBanner = !updateDismissed && update.phase !== "idle" && update.phase !== "checking" && update.phase !== "warning" && update.phase !== "error" return ( <>{firmwareDropZone}{signingOverlay}{pairingOverlay}{passphraseOverlay}{charOverlay}{pinOverlay} diff --git a/projects/keepkey-vault/src/mainview/components/UpdateBanner.tsx b/projects/keepkey-vault/src/mainview/components/UpdateBanner.tsx index 80db06b..4a2dc98 100644 --- a/projects/keepkey-vault/src/mainview/components/UpdateBanner.tsx +++ b/projects/keepkey-vault/src/mainview/components/UpdateBanner.tsx @@ -1,5 +1,6 @@ import { Box, Flex, Text, Button } from "@chakra-ui/react" import { useTranslation } from "react-i18next" +import { useEffect, useState } from "react" import type { UpdatePhaseUI } from "../hooks/useUpdateState" interface UpdateBannerProps { @@ -14,25 +15,101 @@ interface UpdateBannerProps { export function UpdateBanner({ phase, progress, message, error, onDownload, onApply, onDismiss }: UpdateBannerProps) { const { t } = useTranslation("update") + const [toastVisible, setToastVisible] = useState(false) + + // Auto-dismiss warning/error toasts after 20 seconds + useEffect(() => { + if (phase === "warning" || phase === "error") { + setToastVisible(true) + const timer = setTimeout(() => { + setToastVisible(false) + onDismiss() + }, 20_000) + return () => clearTimeout(timer) + } + setToastVisible(false) + }, [phase, error, message]) + // Hidden for idle and checking phases if (phase === "idle" || phase === "checking") return null + // Warning/error: render as subtle bottom-right toast + if (phase === "warning" || phase === "error") { + if (!toastVisible) return null + + const isError = phase === "error" + const bg = isError ? "rgba(255,23,68,0.12)" : "rgba(251,191,36,0.08)" + const border = isError ? "rgba(255,23,68,0.25)" : "rgba(251,191,36,0.18)" + const accent = isError ? "#FF6B6B" : "#FBBF24" + + return ( + + + + {isError ? ( + <> + + + + ) : ( + <> + + + + )} + + + {isError + ? t("errorWithMessage", { error: error || message || "Unknown error" }) + : t("checkFailed", { defaultValue: "Update check failed, will retry" })} + + + + + ) + } + + // Actionable phases (available, downloading, ready, applying): full-width top banner const bgColor = - phase === "error" ? "rgba(255,23,68,0.12)" - : phase === "warning" ? "rgba(251,191,36,0.10)" - : phase === "ready" ? "rgba(34,197,94,0.12)" + phase === "ready" ? "rgba(34,197,94,0.12)" : "rgba(192,168,96,0.12)" const borderColor = - phase === "error" ? "rgba(255,23,68,0.3)" - : phase === "warning" ? "rgba(251,191,36,0.25)" - : phase === "ready" ? "rgba(34,197,94,0.3)" + phase === "ready" ? "rgba(34,197,94,0.3)" : "rgba(192,168,96,0.3)" const accentColor = - phase === "error" ? "#FF6B6B" - : phase === "warning" ? "#FBBF24" - : phase === "ready" ? "#22C55E" + phase === "ready" ? "#22C55E" : "kk.gold" return ( @@ -61,17 +138,7 @@ export function UpdateBanner({ phase, progress, message, error, onDownload, onAp > {/* Icon */} - {phase === "error" ? ( - - - - - ) : phase === "warning" ? ( - - - - - ) : phase === "ready" ? ( + {phase === "ready" ? ( @@ -95,8 +162,6 @@ export function UpdateBanner({ phase, progress, message, error, onDownload, onAp )} {phase === "ready" && t("readyToInstall")} {phase === "applying" && t("applying")} - {phase === "warning" && t("checkFailed", { defaultValue: "Update check failed, will retry" })} - {phase === "error" && t("errorWithMessage", { error: error || message || "Unknown error" })} {/* Progress bar for downloading */} {phase === "downloading" && progress !== undefined && ( @@ -129,16 +194,6 @@ export function UpdateBanner({ phase, progress, message, error, onDownload, onAp )} - {phase === "warning" && ( - - )} - {phase === "error" && ( - - )} From a224bd972ef22b7a6c1bb3cc9e87344a10efa7e3 Mon Sep 17 00:00:00 2001 From: highlander Date: Sun, 1 Mar 2026 14:37:06 -0700 Subject: [PATCH 09/10] fix: hidden titlebar eliminates blank area, add stability hardening - Use titleBarStyle: "hidden" to remove native titlebar that caused ~150px blank gap between chrome and WebView content - TopNav now serves as draggable window handle with traffic light padding - Add global error handlers (uncaughtException/unhandledRejection) in Bun - Add frontend unhandledrejection handler to prevent silent failures - Cap RPC WebSocket reconnection at 50 attempts (was infinite) - Debounce Updater.onStatusChange to prevent RPC spam on errors - Fix misleading "will retry" text in update error toast - Fix hdwallet transport ArrayBuffer casts for strict TS Co-Authored-By: Claude Opus 4.6 --- modules/hdwallet | 2 +- projects/keepkey-vault/src/bun/index.ts | 42 ++++++++++++++----- .../src/mainview/components/TopNav.tsx | 8 ++-- .../src/mainview/components/UpdateBanner.tsx | 2 +- .../keepkey-vault/src/mainview/lib/rpc.ts | 7 +++- projects/keepkey-vault/src/mainview/main.tsx | 6 +++ 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/modules/hdwallet b/modules/hdwallet index 54d7c1f..fd141c7 160000 --- a/modules/hdwallet +++ b/modules/hdwallet @@ -1 +1 @@ -Subproject commit 54d7c1f4bbf9b3730a5870a0e20193ecf9d780d8 +Subproject commit fd141c7f6e346117c07ccad68e3d8b2892b33de9 diff --git a/projects/keepkey-vault/src/bun/index.ts b/projects/keepkey-vault/src/bun/index.ts index eb415d5..15b9b25 100644 --- a/projects/keepkey-vault/src/bun/index.ts +++ b/projects/keepkey-vault/src/bun/index.ts @@ -1,4 +1,13 @@ import { BrowserView, BrowserWindow, Updater, Utils, ApplicationMenu } from "electrobun/bun" + +// ── Global error handlers (MUST be first — prevents silent crashes) ── +process.on('uncaughtException', (err) => { + console.error('[Vault] UNCAUGHT EXCEPTION:', err) +}) +process.on('unhandledRejection', (reason) => { + console.error('[Vault] UNHANDLED REJECTION:', reason) +}) + import { EngineController } from "./engine-controller" import { startRestApi, type RestApiCallbacks } from "./rest-api" import { AuthStore } from "./auth" @@ -1242,11 +1251,19 @@ evmAddresses.on('change', (set: EvmAddressSet) => { try { rpc.send['evm-addresses-update'](set) } catch { /* webview not ready yet */ } }) -// Updater status changes → push to WebView +// Updater status changes → push to WebView (debounced to prevent spam) +let lastUpdateStatus = '' +let lastUpdateStatusTime = 0 Updater.onStatusChange((entry: any) => { try { + const status = entry.status || '' + const now = Date.now() + // Debounce: skip duplicate error statuses within 5 seconds + if ((status === 'error' || status === 'download-error') && status === lastUpdateStatus && now - lastUpdateStatusTime < 5000) return + lastUpdateStatus = status + lastUpdateStatusTime = now rpc.send['update-status']({ - status: entry.status, + status, message: entry.message, timestamp: entry.timestamp, progress: entry.details?.progress, @@ -1259,15 +1276,19 @@ Updater.onStatusChange((entry: any) => { // ── Window Setup ────────────────────────────────────────────────────── async function getMainViewUrl(): Promise { - const channel = await Updater.localInfo.channel() - if (channel === "dev") { - try { - await fetch(DEV_SERVER_URL, { method: "HEAD" }) - console.log(`HMR enabled: Using Vite dev server at ${DEV_SERVER_URL}`) - return DEV_SERVER_URL - } catch { - console.log("Vite dev server not running. Run 'bun run dev:hmr' for HMR support.") + try { + const channel = await Updater.localInfo.channel() + if (channel === "dev") { + try { + await fetch(DEV_SERVER_URL, { method: "HEAD" }) + console.log(`HMR enabled: Using Vite dev server at ${DEV_SERVER_URL}`) + return DEV_SERVER_URL + } catch { + console.log("Vite dev server not running. Run 'bun run dev:hmr' for HMR support.") + } } + } catch (e) { + console.warn('[Vault] Failed to detect channel, falling back to production view:', e) } return "views://mainview/index.html" } @@ -1312,6 +1333,7 @@ const mainWindow = new BrowserWindow({ title: "KeepKey Vault", url, rpc, + titleBarStyle: "hidden", frame: { width: 1200, height: 800, diff --git a/projects/keepkey-vault/src/mainview/components/TopNav.tsx b/projects/keepkey-vault/src/mainview/components/TopNav.tsx index 8ceee2a..b195e42 100644 --- a/projects/keepkey-vault/src/mainview/components/TopNav.tsx +++ b/projects/keepkey-vault/src/mainview/components/TopNav.tsx @@ -59,8 +59,10 @@ export function TopNav({ label, connected, firmwareVersion, firmwareVerified, on borderBottom="1px solid" borderColor="kk.border" align="center" - px="4" + pl="80px" + pr="4" zIndex={Z.nav} + css={{ WebkitAppRegion: "drag" } as any} > {/* Left: device icon + label */} @@ -107,7 +109,7 @@ export function TopNav({ label, connected, firmwareVersion, firmwareVerified, on {/* Center: navigation tabs (icon above label) */} - + {TAB_DEFS.map((tab) => { const isActive = activeTab === tab.id return ( @@ -139,7 +141,7 @@ export function TopNav({ label, connected, firmwareVersion, firmwareVerified, on {/* Right: settings gear */} - + {isError ? t("errorWithMessage", { error: error || message || "Unknown error" }) - : t("checkFailed", { defaultValue: "Update check failed, will retry" })} + : t("checkFailed", { defaultValue: "Update check failed" })}