From 3bab9589a0f09d03c5c6034ec196032819138373 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 4 Nov 2024 15:18:34 +0100 Subject: [PATCH 01/87] feature(private-credential)(wip): add mina_storePrivateCredential --- .../src/background/handlers/web-provider.ts | 16 ++++ apps/extension/src/background/index.ts | 2 + packages/web-provider/package.json | 1 + .../src/mina-network/mina-provider.ts | 32 +++++++ .../web-provider/src/vault-service/types.ts | 1 + .../src/vault-service/vault-service.ts | 5 ++ pnpm-lock.yaml | 88 +++++++++++++++++++ 7 files changed, 145 insertions(+) diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 06e71669..d8d049c3 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -11,6 +11,7 @@ import { SignFieldsRequestParamsSchema, SignRequestParamsSchema, SignTransactionRequestParamsSchema, + StorePrivateCredentialRequestParamsSchema, } from "@mina-js/providers" import { serializeError } from "serialize-error" import { z } from "zod" @@ -189,3 +190,18 @@ export const minaSendTransaction: Handler = async ({ data }) => { return { error: serializeError(error) } } } + +export const minaStorePrivateCredential: Handler = async ({ data }) => { + try { + const provider = await createMinaProvider() + const payload = StorePrivateCredentialRequestParamsSchema.parse({ + method: "mina_storePrivateCredential", + // TODO: might have to add parsing + params: data.params, + context: data.context, + }) + return await provider.request(payload) + } catch (error: unknown) { + return { error: serializeError(error)} + } +} diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index 7d57059b..a2d2ffc3 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -15,6 +15,7 @@ import { minaSign, minaSignFields, minaSignTransaction, + minaStorePrivateCredential, minaSwitchChain, palladConnected, palladSidePanel, @@ -40,6 +41,7 @@ onMessage("mina_signTransaction", minaSignTransaction) onMessage("mina_getBalance", minaGetBalance) onMessage("mina_createNullifier", minaCreateNullifier) onMessage("mina_sendTransaction", minaSendTransaction) +onMessage("mina_storePrivateCredential", minaStorePrivateCredential) /** * Wallet handlers diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index 696683bf..962c344a 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -27,6 +27,7 @@ "@palladxyz/vault": "workspace:*", "dayjs": "1.11.12", "eventemitter3": "^5.0.1", + "mina-credentials": "^0.1.0", "mina-signer": "3.0.7", "mitt": "3.0.1", "superjson": "2.2.1", diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 1798aa91..89a7d360 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -20,6 +20,7 @@ import { showUserPrompt } from "../utils/prompts" import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" import { serializeField, serializeGroup } from "./utils" +import { Credential } from 'mina-credentials' export function getMinaChainId(chains: string[]) { return Number(chains[0]?.split(":")[1]) @@ -312,6 +313,37 @@ export const createMinaProvider = async (): Promise< await _vault.setState(payload) return { success: true } }) + .with({ method: "mina_storePrivateCredential" }, async ({ params }) => { + const [credential] = params + if (!credential) throw createProviderRpcError(4000, "Invalid Request") + + const confirmation = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Store private credential request", + payload: JSON.stringify(credential), + }, + }) + + if (!confirmation) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + try { + // TODO: change serialization + const credentialDeserialized = Credential.fromJSON(JSON.stringify(credential)) + Credential.validate(credentialDeserialized) + } catch (error: any) { + // TODO: add error + } + + try { + await _vault.storePrivateCredential(credential) + return { success: true } + } catch (error: any) { + throw createProviderRpcError(4100, "Failed to store private credential") + } + }) .with({ method: "mina_sendTransaction" }, async ({ params }) => { const [payload] = params if (!payload) throw createProviderRpcError(4000, "Invalid Request") diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index d9b5b725..132cd5e9 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -19,6 +19,7 @@ export interface IVaultService { getChainId(): Promise getChainIds(): Promise setState(state: Json): Promise + storePrivateCredential(state: Json): Promise getEnabled({ origin }: { origin: string }): Promise setEnabled({ origin }: { origin: string }): Promise switchNetwork(network: string): Promise diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index 800afb50..6d2672eb 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -101,6 +101,11 @@ export const createVaultService = (): IVaultService => { const store = useVault.getState() store.setObject(state) }, + storePrivateCredential: async (state) => { + await rehydrate() + const store = useVault.getState() + store.setObject(state) + }, getEnabled: async ({ origin }) => { const { permissions } = await chrome.storage.local.get({ permissions: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20fd3130..9be16f86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -757,6 +757,9 @@ importers: eventemitter3: specifier: ^5.0.1 version: 5.0.1 + mina-credentials: + specifier: ^0.1.0 + version: 0.1.0(o1js@2.0.0) mina-signer: specifier: 3.0.7 version: 3.0.7 @@ -3212,6 +3215,7 @@ packages: boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} @@ -3320,6 +3324,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cachedir@2.4.0: + resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} + engines: {node: '>=6'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -4215,6 +4223,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@10.0.1: @@ -5079,6 +5088,9 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-fetch@3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + isomorphic-timers-promises@1.0.1: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} @@ -5621,6 +5633,12 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + mina-credentials@0.1.0: + resolution: {integrity: sha512-SmKlnwlnAONPaKz+THM6WKNYjzrVsq0wCr9ikWsmr795DjSyOuVafq4PEbPEe3vtmxoZLFk6ySMo18iMWC5Q3Q==} + engines: {node: '>=22.0'} + peerDependencies: + o1js: ^2.0.0 + mina-signer@3.0.7: resolution: {integrity: sha512-7eYp/6WWj2VzJjvfC8dNeGMud/brdBrzkUsCdysFFXnfV2/FVpVhAGCMfaS6hs0HJtS4+eplmiD2hXfshQS8CQ==} @@ -5763,6 +5781,15 @@ packages: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.1: resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5823,6 +5850,11 @@ packages: nwsapi@2.2.12: resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + o1js@2.0.0: + resolution: {integrity: sha512-mYCxUkdCgmfF4v8JOTreYJP/PsAUXGkAbDZJn1uRxWlfZ+Eepls1O2fpTKQ5W9DC64vu0LlQZp9uqWKxW4lrVQ==} + engines: {node: '>=18.14.0'} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -6441,6 +6473,9 @@ packages: redux-logger@3.0.6: resolution: {integrity: sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==} + reflect-metadata@0.1.14: + resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} + regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -7071,6 +7106,9 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -7585,6 +7623,9 @@ packages: webextension-polyfill@0.9.0: resolution: {integrity: sha512-LTtHb0yR49xa9irkstDxba4GATDAcDw3ncnFH9RImoFwDlW47U95ME5sn5IiQX2ghfaECaf6xyXM8yvClIBkkw==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -7600,6 +7641,9 @@ packages: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -7612,6 +7656,9 @@ packages: resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} @@ -10520,6 +10567,8 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 + cachedir@2.4.0: {} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -12463,6 +12512,13 @@ snapshots: isobject@3.0.1: {} + isomorphic-fetch@3.0.0: + dependencies: + node-fetch: 2.7.0 + whatwg-fetch: 3.6.20 + transitivePeerDependencies: + - encoding + isomorphic-timers-promises@1.0.1: {} isows@1.0.4(ws@8.17.1): @@ -13300,6 +13356,10 @@ snapshots: mimic-response@4.0.0: {} + mina-credentials@0.1.0(o1js@2.0.0): + dependencies: + o1js: 2.0.0 + mina-signer@3.0.7: dependencies: blakejs: 1.2.1 @@ -13436,6 +13496,10 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-fetch@3.3.1: dependencies: data-uri-to-buffer: 4.0.1 @@ -13532,6 +13596,17 @@ snapshots: nwsapi@2.2.12: optional: true + o1js@2.0.0: + dependencies: + blakejs: 1.2.1 + cachedir: 2.4.0 + isomorphic-fetch: 3.0.0 + js-sha256: 0.9.0 + reflect-metadata: 0.1.14 + tslib: 2.6.3 + transitivePeerDependencies: + - encoding + object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -14194,6 +14269,8 @@ snapshots: dependencies: deep-diff: 0.3.8 + reflect-metadata@0.1.14: {} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 @@ -14881,6 +14958,8 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tr46@0.0.3: {} + tr46@1.0.1: dependencies: punycode: 2.3.1 @@ -15543,6 +15622,8 @@ snapshots: webextension-polyfill@0.9.0: {} + webidl-conversions@3.0.1: {} + webidl-conversions@4.0.2: {} webidl-conversions@7.0.0: {} @@ -15554,6 +15635,8 @@ snapshots: iconv-lite: 0.6.3 optional: true + whatwg-fetch@3.6.20: {} + whatwg-mimetype@3.0.0: {} whatwg-mimetype@4.0.0: @@ -15565,6 +15648,11 @@ snapshots: webidl-conversions: 7.0.0 optional: true + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 From 893a1620f7537485a74d0d50226fdb5dfd45fab0 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 4 Nov 2024 15:19:18 +0100 Subject: [PATCH 02/87] chore(private-credential): lint --- .../src/background/handlers/web-provider.ts | 2 +- .../src/mina-network/mina-provider.ts | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index d8d049c3..74e539d5 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -202,6 +202,6 @@ export const minaStorePrivateCredential: Handler = async ({ data }) => { }) return await provider.request(payload) } catch (error: unknown) { - return { error: serializeError(error)} + return { error: serializeError(error) } } } diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 89a7d360..be9b7adc 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -14,13 +14,13 @@ import type { ChainSignablePayload, } from "@palladxyz/key-management" import type { SearchQuery } from "@palladxyz/vault" +import { Credential } from "mina-credentials" import mitt from "mitt" import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" import { serializeField, serializeGroup } from "./utils" -import { Credential } from 'mina-credentials' export function getMinaChainId(chains: string[]) { return Number(chains[0]?.split(":")[1]) @@ -316,7 +316,7 @@ export const createMinaProvider = async (): Promise< .with({ method: "mina_storePrivateCredential" }, async ({ params }) => { const [credential] = params if (!credential) throw createProviderRpcError(4000, "Invalid Request") - + const confirmation = await showUserPrompt({ inputType: "confirmation", metadata: { @@ -324,24 +324,29 @@ export const createMinaProvider = async (): Promise< payload: JSON.stringify(credential), }, }) - + if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } try { // TODO: change serialization - const credentialDeserialized = Credential.fromJSON(JSON.stringify(credential)) + const credentialDeserialized = Credential.fromJSON( + JSON.stringify(credential), + ) Credential.validate(credentialDeserialized) } catch (error: any) { // TODO: add error } - + try { await _vault.storePrivateCredential(credential) return { success: true } } catch (error: any) { - throw createProviderRpcError(4100, "Failed to store private credential") + throw createProviderRpcError( + 4100, + "Failed to store private credential", + ) } }) .with({ method: "mina_sendTransaction" }, async ({ params }) => { From 9cd3f417f24fa998daecefff2d36e5eb517fc8e9 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 4 Nov 2024 16:00:08 +0100 Subject: [PATCH 03/87] chore(private-credential)(wip): add getPrivateCredential --- packages/web-provider/src/vault-service/types.ts | 1 + .../src/vault-service/vault-service.ts | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index 132cd5e9..b0aae07c 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -20,6 +20,7 @@ export interface IVaultService { getChainIds(): Promise setState(state: Json): Promise storePrivateCredential(state: Json): Promise + getPrivateCredential(query?: SearchQuery): Promise getEnabled({ origin }: { origin: string }): Promise setEnabled({ origin }: { origin: string }): Promise switchNetwork(network: string): Promise diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index 6d2672eb..fcc76fd4 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -101,10 +101,21 @@ export const createVaultService = (): IVaultService => { const store = useVault.getState() store.setObject(state) }, - storePrivateCredential: async (state) => { + storePrivateCredential: async (credential) => { await rehydrate() const store = useVault.getState() - store.setObject(state) + store.setObject({ + type: "private-credential", + credential, + }) + }, + getPrivateCredential: async (query?) => { + await rehydrate() + const store = useVault.getState() + return await store.searchObjects({ + type: "private-credential", + ...query, + }) }, getEnabled: async ({ origin }) => { const { permissions } = await chrome.storage.local.get({ From 6b23b7d119b56b0953d46c4214e02dd505447291 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 6 Nov 2024 16:50:56 +0100 Subject: [PATCH 04/87] chore(private-credential): use minajs from pr and bump mina-credentials --- apps/extension/package.json | 3 +- package.json | 2 +- packages/web-provider/package.json | 4 +- .../src/mina-network/mina-provider.ts | 11 +++- .../web-provider/src/vault-service/types.ts | 3 +- pnpm-lock.yaml | 51 ++++++++++--------- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 472ab75b..cf39e4ff 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -15,7 +15,7 @@ "test:e2e:ui": "playwright test --ui" }, "dependencies": { - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d", "@palladxyz/common": "workspace:*", "@palladxyz/features": "workspace:*", "@palladxyz/key-management": "workspace:*", @@ -23,6 +23,7 @@ "@palladxyz/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", + "mina-credentials": "^0.1.0", "mitt": "3.0.1", "next-themes": "0.3.0", "p-debounce": "4.0.0", diff --git a/package.json b/package.json index 52b8a382..c2b47f1f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@tsconfig/strictest": "2.0.5", "@turbo/gen": "2.0.9", "@vitest/coverage-v8": "2.0.5", - "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4", + "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d", "autoprefixer": "10.4.19", "happy-dom": "14.12.3", "husky": "9.1.4", diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index 0e08afa8..a3ce69b8 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@mina-js/klesia-sdk": "https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@a51d3b4", - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d", "@noble/hashes": "1.4.0", "@palladxyz/key-management": "workspace:*", "@palladxyz/mina-core": "workspace:*", @@ -27,7 +27,7 @@ "@palladxyz/vault": "workspace:*", "dayjs": "1.11.12", "eventemitter3": "^5.0.1", - "mina-credentials": "^0.1.0", + "mina-credentials": "^0.1.1", "mina-signer": "3.0.7", "mitt": "3.0.1", "superjson": "2.2.1", diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 961ddeac..5bd834ea 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -347,19 +347,26 @@ export const createMinaProvider = async (): Promise< if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } - + let credentialSerialized try { // TODO: change serialization const credentialDeserialized = Credential.fromJSON( JSON.stringify(credential), ) Credential.validate(credentialDeserialized) + + credentialSerialized = Credential.toJSON(credentialDeserialized) } catch (error: any) { // TODO: add error } + // TODO: update error + if (!credentialSerialized) { + throw new Error("Failed to serialize credential") + } + try { - await _vault.storePrivateCredential(credential) + await _vault.storePrivateCredential(credentialSerialized) return { success: true } } catch (error: any) { throw createProviderRpcError( diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index 38e6da41..e18b63b5 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -19,7 +19,8 @@ export interface IVaultService { getNetworkId(): Promise getNetworkIds(): Promise setState(state: Json): Promise - storePrivateCredential(state: Json): Promise + // TODO: change from any to type from minajs + storePrivateCredential(state: string): Promise getPrivateCredential(query?: SearchQuery): Promise getEnabled({ origin }: { origin: string }): Promise setEnabled({ origin }: { origin: string }): Promise diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70dd9d8e..7aa1a097 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: 1.8.3 version: 1.8.3 '@mina-js/utils': - specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4 - version: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4(typescript@5.5.4) + specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d + version: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d(typescript@5.5.4) '@testing-library/react': specifier: 16.0.0 version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -69,8 +69,8 @@ importers: apps/extension: dependencies: '@mina-js/providers': - specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4 - version: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4(typescript@5.5.4) + specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d + version: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d(typescript@5.5.4) '@palladxyz/common': specifier: workspace:* version: link:../../packages/common @@ -92,6 +92,9 @@ importers: buffer: specifier: 6.0.3 version: 6.0.3 + mina-credentials: + specifier: ^0.1.0 + version: 0.1.0(o1js@2.0.0) mitt: specifier: 3.0.1 version: 3.0.1 @@ -722,8 +725,8 @@ importers: specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@a51d3b4 version: https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@a51d3b4(typescript@5.5.4) '@mina-js/providers': - specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1 - version: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1(typescript@5.5.4) + specifier: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d + version: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d(typescript@5.5.4) '@noble/hashes': specifier: 1.4.0 version: 1.4.0 @@ -746,8 +749,8 @@ importers: specifier: ^5.0.1 version: 5.0.1 mina-credentials: - specifier: ^0.1.0 - version: 0.1.0(o1js@2.0.0) + specifier: ^0.1.1 + version: 0.1.1(o1js@2.0.0) mina-signer: specifier: 3.0.7 version: 3.0.7 @@ -1918,20 +1921,14 @@ packages: peerDependencies: typescript: ^5.0.0 - '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1': - resolution: {tarball: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1} + '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d': + resolution: {tarball: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d} version: 0.0.1 peerDependencies: typescript: ^5.0.0 - '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4': - resolution: {tarball: https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4} - version: 0.0.1 - peerDependencies: - typescript: ^5.0.0 - - '@mina-js/utils@https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4': - resolution: {tarball: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4} + '@mina-js/utils@https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d': + resolution: {tarball: https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d} version: 0.0.1 peerDependencies: typescript: ^5.0.0 @@ -5460,6 +5457,12 @@ packages: peerDependencies: o1js: ^2.0.0 + mina-credentials@0.1.1: + resolution: {integrity: sha512-afJh2PTK4AgxD0wodgo7vRwFeUFCOk+67fl+oSUj2+EEwJ8rq41mIy8hbacoq3vlTyhCxihbyXG73CTqWmU5FA==} + engines: {node: '>=22.0'} + peerDependencies: + o1js: ^2.0.0 + mina-signer@3.0.7: resolution: {integrity: sha512-7eYp/6WWj2VzJjvfC8dNeGMud/brdBrzkUsCdysFFXnfV2/FVpVhAGCMfaS6hs0HJtS4+eplmiD2hXfshQS8CQ==} @@ -8874,15 +8877,11 @@ snapshots: ts-pattern: 5.5.0 typescript: 5.5.4 - '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@1(typescript@5.5.4)': + '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d(typescript@5.5.4)': dependencies: typescript: 5.5.4 - '@mina-js/providers@https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4(typescript@5.5.4)': - dependencies: - typescript: 5.5.4 - - '@mina-js/utils@https://pkg.pr.new/palladians/mina-js/@mina-js/utils@a51d3b4(typescript@5.5.4)': + '@mina-js/utils@https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d(typescript@5.5.4)': dependencies: mina-signer: 3.0.7 typescript: 5.5.4 @@ -12918,6 +12917,10 @@ snapshots: dependencies: o1js: 2.0.0 + mina-credentials@0.1.1(o1js@2.0.0): + dependencies: + o1js: 2.0.0 + mina-signer@3.0.7: dependencies: blakejs: 1.2.1 From 798d2885d73ada2594a91dfe6100ec71c72830fc Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 7 Nov 2024 14:21:14 +0100 Subject: [PATCH 05/87] chore(private-credential)(wip): validation in sandbox --- apps/extension/manifest.ts | 2 +- apps/extension/package.json | 2 +- .../src/credential-sandbox/index.tsx | 5 + .../src/credential-sandbox/sandbox.tsx | 61 ++++++++++++ apps/extension/vite.config.ts | 2 +- packages/web-provider/package.json | 1 - .../src/mina-network/credential-validator.ts | 95 +++++++++++++++++++ .../src/mina-network/mina-provider.ts | 27 ++---- .../web-provider/src/mina-network/types.ts | 11 +++ pnpm-lock.yaml | 17 +--- 10 files changed, 185 insertions(+), 38 deletions(-) create mode 100644 apps/extension/src/credential-sandbox/index.tsx create mode 100644 apps/extension/src/credential-sandbox/sandbox.tsx create mode 100644 packages/web-provider/src/mina-network/credential-validator.ts create mode 100644 packages/web-provider/src/mina-network/types.ts diff --git a/apps/extension/manifest.ts b/apps/extension/manifest.ts index fe576768..fc96bb18 100644 --- a/apps/extension/manifest.ts +++ b/apps/extension/manifest.ts @@ -32,7 +32,7 @@ export const manifest: chrome.runtime.ManifestV3 = { ], web_accessible_resources: [ { - resources: ["rpc.js"], + resources: ["rpc.js", "credential-sandbox/index.html"], matches: rpcMatches, }, ], diff --git a/apps/extension/package.json b/apps/extension/package.json index cf39e4ff..5c3889f3 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,7 +23,7 @@ "@palladxyz/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.1.0", + "mina-credentials": "^0.1.1", "mitt": "3.0.1", "next-themes": "0.3.0", "p-debounce": "4.0.0", diff --git a/apps/extension/src/credential-sandbox/index.tsx b/apps/extension/src/credential-sandbox/index.tsx new file mode 100644 index 00000000..37e28651 --- /dev/null +++ b/apps/extension/src/credential-sandbox/index.tsx @@ -0,0 +1,5 @@ +import { createRoot } from "react-dom/client" +import Sandbox from "./sandbox" + +const root = createRoot(document.getElementById("root")!) +root.render() diff --git a/apps/extension/src/credential-sandbox/sandbox.tsx b/apps/extension/src/credential-sandbox/sandbox.tsx new file mode 100644 index 00000000..9866bb66 --- /dev/null +++ b/apps/extension/src/credential-sandbox/sandbox.tsx @@ -0,0 +1,61 @@ +import { Credential } from "mina-credentials" +import { useEffect } from "react" + +interface ValidationRequest { + type: "validate-credential" + credential: unknown +} + +// interface ValidationResponse { +// type: 'credential-validation-result' +// success: boolean +// credential?: string +// error?: string +// } + +const Sandbox = () => { + useEffect(() => { + const handleMessage = async (event: MessageEvent) => { + if (event.data.type !== "validate-credential") return + + try { + // Parse and validate the credential + const credential = Credential.fromJSON( + JSON.stringify(event.data.credential), + ) + await Credential.validate(credential) + + // If validation succeeds, serialize the validated credential + const serializedCredential = Credential.toJSON(credential) + + window.parent.postMessage( + { + type: "credential-validation-result", + success: true, + credential: serializedCredential, + }, + "*", + ) + } catch (error) { + window.parent.postMessage( + { + type: "credential-validation-result", + success: false, + error: + error instanceof Error + ? error.message + : "Unknown validation error", + }, + "*", + ) + } + } + + window.addEventListener("message", handleMessage) + return () => window.removeEventListener("message", handleMessage) + }, []) + + return null +} + +export default Sandbox diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index 0aefa25e..3f239cae 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -10,7 +10,7 @@ export default defineConfig(() => { plugins: [ react(), webExtension({ - additionalInputs: ["prompt.html"], + additionalInputs: ["prompt.html", "src/credential-sandbox/index.tsx"], manifest: () => manifest, }), svgr(), diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index a3ce69b8..4a8567f2 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -27,7 +27,6 @@ "@palladxyz/vault": "workspace:*", "dayjs": "1.11.12", "eventemitter3": "^5.0.1", - "mina-credentials": "^0.1.1", "mina-signer": "3.0.7", "mitt": "3.0.1", "superjson": "2.2.1", diff --git a/packages/web-provider/src/mina-network/credential-validator.ts b/packages/web-provider/src/mina-network/credential-validator.ts new file mode 100644 index 00000000..d363b5cf --- /dev/null +++ b/packages/web-provider/src/mina-network/credential-validator.ts @@ -0,0 +1,95 @@ +import type { ValidationResult } from "./types" + +export class CredentialValidator { + private static instance: CredentialValidator + private sandboxFrame: HTMLIFrameElement | null = null + private readonly sandboxUrl: string + private readonly validationTimeout = 10000 // 10 second timeout + + private constructor(sandboxUrl: string) { + this.sandboxUrl = sandboxUrl + } + + static initialize(sandboxUrl: string) { + if (!CredentialValidator.instance) { + CredentialValidator.instance = new CredentialValidator(sandboxUrl) + } + return CredentialValidator.instance + } + + async validateCredential(credential: unknown): Promise { + try { + this.createSandboxIfNeeded() + const result = await this.validateInSandbox(credential) + return result + } catch (error) { + this.cleanup() // Cleanup on error + throw error + } + } + + private createSandboxIfNeeded() { + if (!this.sandboxFrame) { + this.sandboxFrame = document.createElement("iframe") + this.sandboxFrame.sandbox.add("allow-scripts") + this.sandboxFrame.style.display = "none" + this.sandboxFrame.src = this.sandboxUrl + document.body.appendChild(this.sandboxFrame) + } + } + + private validateInSandbox(credential: unknown): Promise { + return new Promise((resolve, reject) => { + if (!this.sandboxFrame) { + reject(new Error("Sandbox not initialized")) + return + } + + // Setup timeout + const timeoutId = setTimeout(() => { + cleanup() + reject(new Error("Validation timeout")) + }, this.validationTimeout) + + // Message handler + const handleMessage = (event: MessageEvent) => { + if (event.data.type === "credential-validation-result") { + cleanup() + + if (event.data.success && event.data.credential) { + resolve(event.data.credential) + } else { + reject(new Error(event.data.error || "Validation failed")) + } + } + } + + // Cleanup function + const cleanup = () => { + clearTimeout(timeoutId) + window.removeEventListener("message", handleMessage) + } + + // Setup message listener + window.addEventListener("message", handleMessage) + + // Send credential to sandbox when it's loaded + this.sandboxFrame.onload = () => { + this.sandboxFrame?.contentWindow?.postMessage( + { + type: "validate-credential", + credential, + }, + "*", + ) + } + }) + } + + cleanup() { + if (this.sandboxFrame) { + document.body.removeChild(this.sandboxFrame) + this.sandboxFrame = null + } + } +} diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 5bd834ea..25ff94c1 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -14,12 +14,12 @@ import type { ChainSignablePayload, } from "@palladxyz/key-management" import type { SearchQuery } from "@palladxyz/vault" -import { Credential } from "mina-credentials" import mitt from "mitt" import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" +import { CredentialValidator } from "./credential-validator" import { serializeField, serializeGroup } from "./utils" export function getMinaChainId(chains: string[]) { @@ -347,31 +347,20 @@ export const createMinaProvider = async (): Promise< if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } - let credentialSerialized + try { - // TODO: change serialization - const credentialDeserialized = Credential.fromJSON( - JSON.stringify(credential), + const validator = CredentialValidator.initialize( + chrome.runtime.getURL("credential-sandbox/index.html"), ) - Credential.validate(credentialDeserialized) - - credentialSerialized = Credential.toJSON(credentialDeserialized) - } catch (error: any) { - // TODO: add error - } - // TODO: update error - if (!credentialSerialized) { - throw new Error("Failed to serialize credential") - } - - try { - await _vault.storePrivateCredential(credentialSerialized) + const validatedCredential = + await validator.validateCredential(credential) + await _vault.storePrivateCredential(validatedCredential) return { success: true } } catch (error: any) { throw createProviderRpcError( 4100, - "Failed to store private credential", + `Failed to store private credential: ${error}`, ) } }) diff --git a/packages/web-provider/src/mina-network/types.ts b/packages/web-provider/src/mina-network/types.ts new file mode 100644 index 00000000..bf8801b9 --- /dev/null +++ b/packages/web-provider/src/mina-network/types.ts @@ -0,0 +1,11 @@ +export interface ValidationResult { + type: "credential-validation-result" + success: boolean + credential?: string + error?: string +} + +export interface ValidationRequest { + type: "validate-credential" + credential: unknown +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7aa1a097..fba9941a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,8 +93,8 @@ importers: specifier: 6.0.3 version: 6.0.3 mina-credentials: - specifier: ^0.1.0 - version: 0.1.0(o1js@2.0.0) + specifier: ^0.1.1 + version: 0.1.1(o1js@2.0.0) mitt: specifier: 3.0.1 version: 3.0.1 @@ -748,9 +748,6 @@ importers: eventemitter3: specifier: ^5.0.1 version: 5.0.1 - mina-credentials: - specifier: ^0.1.1 - version: 0.1.1(o1js@2.0.0) mina-signer: specifier: 3.0.7 version: 3.0.7 @@ -5451,12 +5448,6 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - mina-credentials@0.1.0: - resolution: {integrity: sha512-SmKlnwlnAONPaKz+THM6WKNYjzrVsq0wCr9ikWsmr795DjSyOuVafq4PEbPEe3vtmxoZLFk6ySMo18iMWC5Q3Q==} - engines: {node: '>=22.0'} - peerDependencies: - o1js: ^2.0.0 - mina-credentials@0.1.1: resolution: {integrity: sha512-afJh2PTK4AgxD0wodgo7vRwFeUFCOk+67fl+oSUj2+EEwJ8rq41mIy8hbacoq3vlTyhCxihbyXG73CTqWmU5FA==} engines: {node: '>=22.0'} @@ -12913,10 +12904,6 @@ snapshots: mimic-response@4.0.0: {} - mina-credentials@0.1.0(o1js@2.0.0): - dependencies: - o1js: 2.0.0 - mina-credentials@0.1.1(o1js@2.0.0): dependencies: o1js: 2.0.0 From 31bb3acc20ba9a83ae9f8bbc40b873f8f43a88ac Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 7 Nov 2024 16:01:28 +0100 Subject: [PATCH 06/87] chore(private-credential): bun lock --- bun.lockb | Bin 651224 -> 670480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index b652d90a5ac316b58c49064e9350ac24d970ab84..1deb674a51ea0087b69b9edc97ab10d05ac5a774 100755 GIT binary patch delta 137499 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 From 77d1e00855dab7a26596f9b2c43d941348bb1042 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Fri, 8 Nov 2024 23:23:48 +0100 Subject: [PATCH 07/87] feat(extension): add sandbox for running smart contracts --- apps/extension/manifest.ts | 13 ++ apps/extension/package.json | 33 ++-- apps/extension/postcss.config.mjs | 2 +- apps/extension/prompt.html | 1 + apps/extension/sandbox.html | 13 ++ apps/extension/src/app.tsx | 4 +- .../src/background/handlers/wallet.ts | 6 +- .../src/background/handlers/web-provider.ts | 2 +- apps/extension/src/background/index.ts | 2 +- apps/extension/src/prompt.tsx | 4 +- apps/extension/src/sandbox/index.ts | 11 ++ apps/extension/tailwind.config.mjs | 2 +- apps/extension/vite.config.ts | 6 + bun.lockb | Bin 657152 -> 558856 bytes package.json | 9 +- packages/_template/README.md | 2 +- packages/_template/package.json | 4 +- packages/_template/tsconfig.json | 2 +- packages/_template/tsup.config.ts | 2 +- packages/common/README.md | 2 +- packages/common/package.json | 2 +- packages/contracts/package.json | 25 +++ packages/contracts/src/add/add.spec.ts | 26 +++ packages/contracts/src/add/add.ts | 25 +++ packages/contracts/src/index.ts | 1 + packages/contracts/tsconfig.json | 29 ++++ packages/contracts/tsup.config.ts | 12 ++ packages/features/package.json | 33 ++-- packages/features/src/@types/i18next.d.ts | 9 -- packages/features/src/@types/resources.ts | 9 -- .../features/src/common/hooks/use-account.ts | 6 +- .../src/common/hooks/use-transaction.ts | 2 +- .../src/common/hooks/use-transactions.ts | 4 +- packages/features/src/common/lib/tx.ts | 2 +- .../features/src/common/store/address-book.ts | 2 +- packages/features/src/common/store/app.ts | 2 +- .../features/src/common/store/transaction.ts | 2 +- packages/features/src/common/types.ts | 2 +- .../src/components/address-dropdown.tsx | 2 +- .../features/src/components/hash-dropdown.tsx | 2 +- .../features/src/components/menu-drawer.tsx | 2 +- .../src/components/settings-page-layout.tsx | 2 +- .../src/error-renderer/views/error.tsx | 1 - packages/features/src/i18n/index.ts | 26 --- packages/features/src/index.ts | 4 +- packages/features/src/lib/i18n.ts | 23 +++ .../src/{i18n => lib}/locales/en/en.json | 0 .../src/{i18n => lib}/locales/tr/tr.json | 0 .../src/lock/routes/unlock-wallet.tsx | 4 +- .../src/onboarding/routes/create-wallet.tsx | 2 +- .../routes/seed-backup-confirmation.tsx | 8 +- .../src/onboarding/routes/seed-import.tsx | 10 +- .../features/src/onboarding/routes/start.tsx | 2 +- .../src/onboarding/views/seed-import.tsx | 2 +- packages/features/src/router.tsx | 148 +++++++++--------- .../src/send/components/send-form.tsx | 2 +- .../hooks/use-transaction-confirmation.tsx | 8 +- packages/features/src/send/routes/send.tsx | 2 +- .../src/staking/components/delegate-form.tsx | 2 +- .../src/transactions/components/tx-tile.tsx | 2 +- .../src/transactions/index.stories.tsx | 2 +- .../src/transactions/routes/transactions.tsx | 4 +- .../utils/structurize-transactions.ts | 2 +- .../views/transaction-details.tsx | 2 +- .../src/transactions/views/transactions.tsx | 2 +- .../features/src/wallet/routes/networks.tsx | 2 +- .../features/src/wallet/routes/overview.tsx | 2 +- .../features/src/wallet/views/overview.tsx | 2 +- .../src/web-connector/views/web-connector.tsx | 24 +++ packages/features/tsup.config.ts | 2 +- packages/key-management/package.json | 10 +- .../src/chains/Mina/credentialDerivation.ts | 2 +- .../key-management/src/chains/Mina/guards.ts | 2 +- .../src/chains/Mina/keyDerivationUtils.ts | 2 +- .../key-management/src/chains/Mina/types.ts | 4 +- packages/key-management/src/chains/README.md | 4 +- packages/key-management/src/types.ts | 4 +- .../test/mina/in-memory-key-agent.test.ts | 6 +- .../mina/key-agent-base-zkapp-command.test.ts | 6 +- .../test/mina/key-agent-base.test.ts | 6 +- .../key-management/test/util/guards.test.ts | 2 +- packages/key-management/tsconfig.json | 2 +- packages/key-management/tsup.config.ts | 2 +- packages/mina-core/README.md | 14 +- packages/mina-core/package.json | 10 +- packages/mina-core/src/Mina/Block.ts | 2 +- packages/mina-core/src/Mina/Transaction.ts | 2 +- .../Providers/chain-history-provider/types.ts | 2 +- packages/mina-core/tsconfig.json | 2 +- packages/mina-core/tsup.config.ts | 2 +- packages/offchain-data/README.md | 2 +- packages/offchain-data/package.json | 4 +- packages/offchain-data/tsconfig.json | 2 +- packages/offchain-data/tsup.config.ts | 2 +- packages/pallad-core/README.md | 14 +- packages/pallad-core/package.json | 16 +- .../Providers/account-info-provider/types.ts | 2 +- .../Providers/chain-history-provider/types.ts | 4 +- .../Providers/tx-submit-provider/types.ts | 2 +- .../Mina/Providers/unified-mina-provider.ts | 2 +- .../providers/account-info-provider/types.ts | 2 +- .../providers/tx-submit-provider/types.ts | 2 +- .../pallad-core/src/Pallad/providers/types.ts | 2 +- packages/pallad-core/tsconfig.json | 2 +- packages/pallad-core/tsup.config.ts | 2 +- packages/providers/README.md | 4 +- packages/providers/package.json | 23 +-- .../chain-history/chain-history-provider.ts | 4 +- .../account-info/account-info-provider.ts | 2 +- .../src/mina-node/account-info/queries.ts | 2 +- .../block-listener/BlockListenerProvider.ts | 2 +- .../chain-history/chain-history-provider.ts | 2 +- .../node-status/node-status-provider.ts | 2 +- packages/providers/src/mina-node/types.ts | 2 +- .../account-info-provider.ts | 2 +- .../chain-history-provider.ts | 2 +- .../unified-providers/node-status-provider.ts | 2 +- .../src/unified-providers/unified-provider.ts | 2 +- .../chain-history/chain-history-provider.ts | 4 +- .../blockberry/chain-history-provider.test.ts | 2 +- .../account-info-provider.test.ts | 2 +- .../chain-history-provider.test.ts | 2 +- .../submit-tx-provider.test.ts | 6 +- .../account-info-provider.test.ts | 2 +- .../submit-tx-provider.test.ts | 6 +- .../individual-providers/util.ts | 2 +- .../account-info-provider.test.ts | 2 +- .../chain-history-provider.test.ts | 2 +- .../unified-provider.test.ts | 4 +- .../zeko-scan/chain-history-provider.test.ts | 2 +- packages/providers/tsconfig.json | 2 +- packages/providers/tsup.config.ts | 2 +- packages/util/README.md | 2 +- packages/util/package.json | 8 +- packages/util/tsconfig.json | 2 +- packages/util/tsup.config.ts | 2 +- packages/vault/README.md | 10 +- packages/vault/package.json | 21 +-- packages/vault/src/account/accountState.ts | 4 +- .../vault/src/credentials/credentialsState.ts | 2 +- packages/vault/src/keyAgent/README.md | 4 +- packages/vault/src/keyAgent/keyAgentState.ts | 2 +- packages/vault/src/keyAgent/keyAgentStore.ts | 2 +- packages/vault/src/lib/utils.ts | 2 +- packages/vault/src/network-info/default.ts | 2 +- .../src/network-info/network-info-state.ts | 2 +- .../vault/utils/get-wallet-account-info.ts | 4 +- .../vault/utils/get-wallet-transactions.ts | 2 +- .../vault/src/vault/utils/restore-wallet.ts | 4 +- packages/vault/src/vault/utils/sign.ts | 2 +- .../src/vault/utils/sync-account-info.ts | 2 +- .../src/vault/utils/sync-transactions.ts | 4 +- packages/vault/src/vault/utils/sync-wallet.ts | 4 +- packages/vault/src/vault/vaultState.ts | 8 +- packages/vault/src/vault/vaultStore.ts | 4 +- .../vault/test/account/accountStore.test.ts | 2 +- .../test/credentials/credentialsStore.test.ts | 4 +- .../vault/test/keyAgent/keyAgentStore.test.ts | 8 +- .../vault/test/objects/objectsStore.test.ts | 4 +- packages/vault/test/wallet/walletFlow.test.ts | 6 +- packages/vault/tsconfig.json | 2 +- packages/vault/tsup.config.ts | 2 +- packages/web-provider/README.md | 4 +- packages/web-provider/package.json | 20 +-- .../src/mina-network/mina-provider.ts | 4 +- .../web-provider/src/mina-network/utils.ts | 4 +- .../web-provider/src/vault-service/types.ts | 6 +- .../src/vault-service/vault-service.ts | 10 +- packages/web-provider/tsconfig.json | 2 +- packages/web-provider/tsup.config.ts | 2 +- 170 files changed, 564 insertions(+), 463 deletions(-) create mode 100644 apps/extension/sandbox.html create mode 100644 apps/extension/src/sandbox/index.ts create mode 100644 packages/contracts/package.json create mode 100644 packages/contracts/src/add/add.spec.ts create mode 100644 packages/contracts/src/add/add.ts create mode 100644 packages/contracts/src/index.ts create mode 100644 packages/contracts/tsconfig.json create mode 100644 packages/contracts/tsup.config.ts delete mode 100644 packages/features/src/@types/i18next.d.ts delete mode 100644 packages/features/src/@types/resources.ts delete mode 100644 packages/features/src/i18n/index.ts create mode 100644 packages/features/src/lib/i18n.ts rename packages/features/src/{i18n => lib}/locales/en/en.json (100%) rename packages/features/src/{i18n => lib}/locales/tr/tr.json (100%) diff --git a/apps/extension/manifest.ts b/apps/extension/manifest.ts index fe576768..a125a2e8 100644 --- a/apps/extension/manifest.ts +++ b/apps/extension/manifest.ts @@ -17,6 +17,9 @@ export const manifest: chrome.runtime.ManifestV3 = { version: packageJson.version, action: { default_title: "Click to open panel" }, side_panel: { default_path: "index.html" }, + sandbox: { + pages: ["sandbox.html"], + }, permissions: ["storage", "activeTab", "background", "sidePanel"], background: { service_worker: "src/background/index.ts", @@ -48,4 +51,14 @@ export const manifest: chrome.runtime.ManifestV3 = { description: "Open the Pallad extension", }, }, + content_security_policy: { + sandbox: + "sandbox allow-scripts allow-forms allow-popups allow-modals; script-src 'self' 'unsafe-eval' 'wasm-unsafe-eval'; worker-src blob: 'self'; child-src blob: 'self'", + }, + cross_origin_embedder_policy: { + value: "require-corp", + }, + cross_origin_opener_policy: { + value: "same-origin", + }, } diff --git a/apps/extension/package.json b/apps/extension/package.json index 906d9e9d..bc7ff7fa 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/extension", + "name": "@palladco/extension", "version": "0.6.2", "type": "module", "scripts": { @@ -16,29 +16,24 @@ }, "dependencies": { "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4", - "@palladxyz/common": "workspace:*", - "@palladxyz/features": "workspace:*", - "@palladxyz/key-management": "workspace:*", - "@palladxyz/vault": "workspace:*", - "@palladxyz/web-provider": "workspace:*", - "@plasmohq/messaging": "0.6.2", - "buffer": "6.0.3", + "@palladco/common": "workspace:*", + "@palladco/contracts": "workspace:*", + "@palladco/features": "workspace:*", + "@palladco/key-management": "workspace:*", + "@palladco/vault": "workspace:*", + "@palladco/web-provider": "workspace:*", "mitt": "3.0.1", "next-themes": "0.3.0", "p-debounce": "4.0.0", "react": "18.3.1", "react-dom": "18.3.1", "serialize-error": "11.0.3", - "tailwindcss-animate": "1.0.7", - "vite-plugin-node-stdlib-browser": "0.2.1", + "ts-pattern": "^5.5.0", "webext-bridge": "6.0.1", "webextension-polyfill": "0.12.0", "zod": "3.23.8" }, "devDependencies": { - "@esbuild-plugins/node-globals-polyfill": "0.2.3", - "@esbuild-plugins/node-modules-polyfill": "0.2.2", - "@originjs/vite-plugin-commonjs": "1.0.3", "@playwright/test": "1.45.3", "@total-typescript/ts-reset": "0.5.1", "@tsconfig/vite-react": "3.0.2", @@ -47,20 +42,10 @@ "@types/react-dom": "18.3.0", "@types/webextension-polyfill": "0.10.7", "@vitejs/plugin-react-swc": "3.7.0", - "dedent": "1.5.3", - "path": "0.12.7", - "rollup-plugin-node-polyfills": "0.2.1", - "rollup-plugin-polyfill-node": "0.13.0", - "type-fest": "4.23.0", "vite": "5.3.5", - "vite-plugin-commonjs": "0.10.1", "vite-plugin-node-polyfills": "0.17.0", - "vite-plugin-require-transform": "1.0.21", "vite-plugin-svgr": "4.2.0", - "vite-plugin-top-level-await": "1.4.2", - "vite-plugin-wasm": "3.3.0", "vite-plugin-web-extension": "4.1.6", - "web-ext": "8.2.0", - "write-json-file": "6.0.0" + "web-ext": "8.2.0" } } diff --git a/apps/extension/postcss.config.mjs b/apps/extension/postcss.config.mjs index 8e0202ee..917debfd 100644 --- a/apps/extension/postcss.config.mjs +++ b/apps/extension/postcss.config.mjs @@ -1,3 +1,3 @@ -import postcssConfig from "@palladxyz/features/postcss.config.mjs" +import postcssConfig from "@palladco/features/postcss.config.mjs" export default postcssConfig diff --git a/apps/extension/prompt.html b/apps/extension/prompt.html index da43c9b4..046b1d82 100644 --- a/apps/extension/prompt.html +++ b/apps/extension/prompt.html @@ -18,6 +18,7 @@ +
diff --git a/apps/extension/sandbox.html b/apps/extension/sandbox.html new file mode 100644 index 00000000..3896516c --- /dev/null +++ b/apps/extension/sandbox.html @@ -0,0 +1,13 @@ + + + + + + Pallad + + + +
+ + + diff --git a/apps/extension/src/app.tsx b/apps/extension/src/app.tsx index 2f460632..77eeeda4 100644 --- a/apps/extension/src/app.tsx +++ b/apps/extension/src/app.tsx @@ -1,7 +1,7 @@ -import "@palladxyz/features/dist/index.css" +import "@palladco/features/dist/index.css" import "./assets/app.css" -import { Router } from "@palladxyz/features" +import { Router } from "@palladco/features" import { ThemeProvider } from "next-themes" import { useEffect } from "react" diff --git a/apps/extension/src/background/handlers/wallet.ts b/apps/extension/src/background/handlers/wallet.ts index cc4ec202..d76225d6 100644 --- a/apps/extension/src/background/handlers/wallet.ts +++ b/apps/extension/src/background/handlers/wallet.ts @@ -1,6 +1,6 @@ -import { useVault } from "@palladxyz/vault" -import type { NetworkId } from "@palladxyz/vault" -import { createMinaProvider } from "@palladxyz/web-provider" +import { useVault } from "@palladco/vault" +import type { NetworkId } from "@palladco/vault" +import { createMinaProvider } from "@palladco/web-provider" import { serializeError } from "serialize-error" import type { Handler } from "./" diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 74109615..f466f073 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -13,7 +13,7 @@ import { SignTransactionRequestParamsSchema, SwitchChainRequestParamsSchema, } from "@mina-js/providers" -import { createMinaProvider } from "@palladxyz/web-provider" +import { createMinaProvider } from "@palladco/web-provider" import { serializeError } from "serialize-error" import { z } from "zod" import type { Handler } from "." diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index 3d2f7768..5df35834 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -1,4 +1,4 @@ -import { createMinaProvider } from "@palladxyz/web-provider" +import { createMinaProvider } from "@palladco/web-provider" import { onMessage, sendMessage } from "webext-bridge/background" import { runtime, tabs } from "webextension-polyfill" import { diff --git a/apps/extension/src/prompt.tsx b/apps/extension/src/prompt.tsx index 2344de3d..b121a73d 100644 --- a/apps/extension/src/prompt.tsx +++ b/apps/extension/src/prompt.tsx @@ -1,7 +1,7 @@ -import "@palladxyz/features/dist/index.css" +import "@palladco/features/dist/index.css" import "@total-typescript/ts-reset" -import { WebConnectorRoute } from "@palladxyz/features" +import { WebConnectorRoute } from "@palladco/features" import { ThemeProvider } from "next-themes" import React from "react" import ReactDOM from "react-dom/client" diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts new file mode 100644 index 00000000..e578a426 --- /dev/null +++ b/apps/extension/src/sandbox/index.ts @@ -0,0 +1,11 @@ +import { Add } from "@palladco/contracts" +import { match } from "ts-pattern" + +window.addEventListener("message", async (event) => { + return match(event.data.type) + .with("compile", async () => { + await Add.compile() + window.parent.postMessage({ type: "compiled" }, "*") + }) + .run() +}) diff --git a/apps/extension/tailwind.config.mjs b/apps/extension/tailwind.config.mjs index 49263ede..9e11954a 100644 --- a/apps/extension/tailwind.config.mjs +++ b/apps/extension/tailwind.config.mjs @@ -1,4 +1,4 @@ -import tailwindConfig from "@palladxyz/features/tailwind.config.mjs" +import tailwindConfig from "@palladco/features/tailwind.config.mjs" export default { content: [ diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index 0aefa25e..f2513c36 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -24,5 +24,11 @@ export default defineConfig(() => { chunkSizeWarningLimit: 5000, emptyOutDir: true, }, + server: { + headers: { + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }, + }, } }) diff --git a/bun.lockb b/bun.lockb index 1405fd00985fe62d62eddbc77e166184b4df1448..3bc627a35ad386558fb104bbf17055915e8825e6 100755 GIT binary patch delta 108785 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 z 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 { + beforeAll(async () => { + await Add.compile() + }) + + it("works lol", async () => { + const Local = await Mina.LocalBlockchain({ proofsEnabled: true }) + Mina.setActiveInstance(Local) + const [deployerAccount] = Local.testAccounts + const zkAppPrivateKey = PrivateKey.random() + const zkAppAddress = zkAppPrivateKey.toPublicKey() + const zkApp = new Add(zkAppAddress) + const txn = await Mina.transaction(deployerAccount, async () => { + AccountUpdate.fundNewAccount(deployerAccount) + await zkApp.deploy() + }) + await txn.prove() + await txn.sign([deployerAccount.key, zkAppPrivateKey]).send() + const num = zkApp.num.get() + expect(num).toEqual(Field(1)) + }) +}) diff --git a/packages/contracts/src/add/add.ts b/packages/contracts/src/add/add.ts new file mode 100644 index 00000000..3e5f2567 --- /dev/null +++ b/packages/contracts/src/add/add.ts @@ -0,0 +1,25 @@ +import { Field, SmartContract, State, method, state } from "o1js" + +/** + * Basic Example + * See https://docs.minaprotocol.com/zkapps for more info. + * + * The Add contract initializes the state variable 'num' to be a Field(1) value by default when deployed. + * When the 'update' method is called, the Add contract adds Field(2) to its 'num' contract state. + * + * This file is safe to delete and replace with your own contract. + */ +export class Add extends SmartContract { + @state(Field) num = State() + + init() { + super.init() + this.num.set(Field(1)) + } + + @method async update() { + const currentState = this.num.getAndRequireEquals() + const newState = currentState.add(2) + this.num.set(newState) + } +} diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts new file mode 100644 index 00000000..7ab1c15e --- /dev/null +++ b/packages/contracts/src/index.ts @@ -0,0 +1 @@ +export { Add } from "./add/add" diff --git a/packages/contracts/tsconfig.json b/packages/contracts/tsconfig.json new file mode 100644 index 00000000..c27e5d1d --- /dev/null +++ b/packages/contracts/tsconfig.json @@ -0,0 +1,29 @@ +{ + "extends": "@palladco/common/tsconfig.json", + "compilerOptions": { + // "experimentalDecorators": true, + // "noImplicitOverride": false, + // "strictPropertyInitialization": false, + // "skipLibCheck": true, + // "emitDecoratorMetadata": true, + // "useDefineForClassFields": false, + "target": "es2020", + "module": "es2022", + "strictPropertyInitialization": false, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "allowJs": true, + "declaration": true, + "sourceMap": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "useDefineForClassFields": false, + "noImplicitOverride": false, + "outDir": "dist" + }, + "include": ["src"] +} diff --git a/packages/contracts/tsup.config.ts b/packages/contracts/tsup.config.ts new file mode 100644 index 00000000..10fb07d9 --- /dev/null +++ b/packages/contracts/tsup.config.ts @@ -0,0 +1,12 @@ +import { baseTsupConfig } from "@palladco/common" +import { defineConfig } from "tsup" + +import packageJson from "./package.json" + +export default defineConfig([ + { + ...baseTsupConfig, + name: packageJson.name, + splitting: false, + }, +]) diff --git a/packages/features/package.json b/packages/features/package.json index 7330373f..44a8268f 100644 --- a/packages/features/package.json +++ b/packages/features/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/features", + "name": "@palladco/features", "version": "0.6.2", "description": "", "type": "module", @@ -37,35 +37,27 @@ "@headlessui/react": "2.1.2", "@hookform/resolvers": "3.9.0", "@noble/hashes": "1.4.0", - "@palladxyz/key-management": "workspace:*", - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/offchain-data": "workspace:*", - "@palladxyz/pallad-core": "workspace:*", - "@palladxyz/vault": "workspace:*", + "@palladco/key-management": "workspace:*", + "@palladco/mina-core": "workspace:*", + "@palladco/offchain-data": "workspace:*", + "@palladco/pallad-core": "workspace:*", + "@palladco/vault": "workspace:*", "@total-typescript/ts-reset": "0.5.1", "@zxcvbn-ts/core": "3.0.4", "array-shuffle": "3.0.0", - "class-variance-authority": "0.7.0", "clsx": "2.1.1", - "cmdk": "1.0.0", "dayjs": "1.11.12", "easy-mesh-gradient": "0.0.5", "i18next": "^23.16.0", "i18next-browser-languagedetector": "^8.0.0", "immer": "10.1.1", - "js-beautify": "1.15.1", "lucide-react": "0.417.0", "match-sorter": "6.3.4", - "merge-refs": "1.3.0", "next-themes": "0.3.0", "rambda": "9.2.1", - "react": "18.3.1", - "react-day-picker": "9.0.4", - "react-dom": "18.3.1", "react-error-boundary": "4.0.13", "react-hook-form": "7.52.1", "react-i18next": "^15.0.3", - "react-mixpanel-browser": "4.1.0", "react-qr-code": "2.0.15", "react-router": "6.25.1", "react-router-dom": "6.25.1", @@ -73,8 +65,6 @@ "react-twc": "1.4.1", "recharts": "2.12.7", "sonner": "1.5.0", - "superjson": "2.2.1", - "tailwind-merge": "2.4.0", "tailwindcss-animate": "1.0.7", "webext-bridge": "6.0.1", "webextension-polyfill": "0.12.0", @@ -84,13 +74,9 @@ }, "devDependencies": { "@ladle/react": "4.1.0", - "@palladxyz/common": "workspace:*", - "@svgr/rollup": "8.1.0", - "@trpc/server": "10.45.2", - "@tsconfig/recommended": "1.0.7", + "@palladco/common": "workspace:*", "@tsconfig/vite-react": "3.0.2", "@types/chrome": "0.0.269", - "@types/js-beautify": "1.14.3", "@types/react": "18.3.3", "@types/react-dom": "18.3.0", "@types/webextension-polyfill": "0.10.7", @@ -98,7 +84,6 @@ "esbuild-plugin-polyfill-node": "0.3.0", "esbuild-plugin-svgr": "2.1.0", "graphql-request": "7.1.0", - "mina-signer": "3.0.7", "swr": "2.2.5", "vite": "5.3.5", "vite-plugin-node-polyfills": "0.17.0", @@ -107,7 +92,7 @@ "zod": "3.23.8" }, "peerDependencies": { - "react": "18.2.0", - "react-dom": "18.2.0" + "react": "18.3.1", + "react-dom": "18.3.1" } } diff --git a/packages/features/src/@types/i18next.d.ts b/packages/features/src/@types/i18next.d.ts deleted file mode 100644 index 18292a02..00000000 --- a/packages/features/src/@types/i18next.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import "i18next" -import resources from "./resources" -const { ns1, ns2 } = resources - -declare module "i18next" { - interface CustomTypeOptions { - defaultNS: "ns1" - } -} diff --git a/packages/features/src/@types/resources.ts b/packages/features/src/@types/resources.ts deleted file mode 100644 index f2aa9c24..00000000 --- a/packages/features/src/@types/resources.ts +++ /dev/null @@ -1,9 +0,0 @@ -import ns1 from "../i18n/locales/en/en.json" -import ns2 from "../i18n/locales/tr/tr.json" - -const resources = { - ns1, - ns2, -} as const - -export default resources diff --git a/packages/features/src/common/hooks/use-account.ts b/packages/features/src/common/hooks/use-account.ts index 41e3949b..9cc6028f 100644 --- a/packages/features/src/common/hooks/use-account.ts +++ b/packages/features/src/common/hooks/use-account.ts @@ -1,6 +1,6 @@ -import { Network, getAccountProperties } from "@palladxyz/pallad-core" -import { sessionPersistence } from "@palladxyz/vault" -import { getPublicKey, isDelegated, useVault } from "@palladxyz/vault" +import { Network, getAccountProperties } from "@palladco/pallad-core" +import { sessionPersistence } from "@palladco/vault" +import { getPublicKey, isDelegated, useVault } from "@palladco/vault" import easyMeshGradient from "easy-mesh-gradient" import { useMemo } from "react" import { useNavigate } from "react-router-dom" diff --git a/packages/features/src/common/hooks/use-transaction.ts b/packages/features/src/common/hooks/use-transaction.ts index 97357511..99803e65 100644 --- a/packages/features/src/common/hooks/use-transaction.ts +++ b/packages/features/src/common/hooks/use-transaction.ts @@ -1,4 +1,4 @@ -import { getPublicKey, useVault } from "@palladxyz/vault" +import { getPublicKey, useVault } from "@palladco/vault" import useSWR from "swr" export const useTransaction = ({ hash }: { hash: string }) => { diff --git a/packages/features/src/common/hooks/use-transactions.ts b/packages/features/src/common/hooks/use-transactions.ts index 9247255b..6deb7aaf 100644 --- a/packages/features/src/common/hooks/use-transactions.ts +++ b/packages/features/src/common/hooks/use-transactions.ts @@ -1,5 +1,5 @@ -import type { Mina } from "@palladxyz/mina-core" -import { getPublicKey, useVault } from "@palladxyz/vault" +import type { Mina } from "@palladco/mina-core" +import { getPublicKey, useVault } from "@palladco/vault" import useSWR from "swr" export const useTransactions = () => { diff --git a/packages/features/src/common/lib/tx.ts b/packages/features/src/common/lib/tx.ts index 0adabc46..e2237a09 100644 --- a/packages/features/src/common/lib/tx.ts +++ b/packages/features/src/common/lib/tx.ts @@ -1,4 +1,4 @@ -import { Mina } from "@palladxyz/mina-core" +import { Mina } from "@palladco/mina-core" type TxSide = "outgoing" | "incoming" diff --git a/packages/features/src/common/store/address-book.ts b/packages/features/src/common/store/address-book.ts index 058047d4..11ee3aaf 100644 --- a/packages/features/src/common/store/address-book.ts +++ b/packages/features/src/common/store/address-book.ts @@ -1,4 +1,4 @@ -import { localPersistence } from "@palladxyz/vault" +import { localPersistence } from "@palladco/vault" import { create } from "zustand" import { createJSONStorage, persist } from "zustand/middleware" diff --git a/packages/features/src/common/store/app.ts b/packages/features/src/common/store/app.ts index 84874172..fb46e795 100644 --- a/packages/features/src/common/store/app.ts +++ b/packages/features/src/common/store/app.ts @@ -1,4 +1,4 @@ -import { localPersistence } from "@palladxyz/vault" +import { localPersistence } from "@palladco/vault" import { create } from "zustand" import { createJSONStorage, persist } from "zustand/middleware" diff --git a/packages/features/src/common/store/transaction.ts b/packages/features/src/common/store/transaction.ts index 14857466..a2258118 100644 --- a/packages/features/src/common/store/transaction.ts +++ b/packages/features/src/common/store/transaction.ts @@ -1,4 +1,4 @@ -import { Mina } from "@palladxyz/mina-core" +import { Mina } from "@palladco/mina-core" import { create } from "zustand" import type { OutgoingTransaction } from "../types" diff --git a/packages/features/src/common/types.ts b/packages/features/src/common/types.ts index ed077cf9..d70f74f0 100644 --- a/packages/features/src/common/types.ts +++ b/packages/features/src/common/types.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" type TokenId = number type Nonce = number diff --git a/packages/features/src/components/address-dropdown.tsx b/packages/features/src/components/address-dropdown.tsx index ee6ec023..a8da80d2 100644 --- a/packages/features/src/components/address-dropdown.tsx +++ b/packages/features/src/components/address-dropdown.tsx @@ -1,5 +1,5 @@ import { truncateString } from "@/common/lib/string" -import { useVault } from "@palladxyz/vault" +import { useVault } from "@palladco/vault" import clsx from "clsx" import { CopyIcon, ExternalLinkIcon, UserPlusIcon } from "lucide-react" import { Link } from "react-router-dom" diff --git a/packages/features/src/components/hash-dropdown.tsx b/packages/features/src/components/hash-dropdown.tsx index f4754612..8633f454 100644 --- a/packages/features/src/components/hash-dropdown.tsx +++ b/packages/features/src/components/hash-dropdown.tsx @@ -1,4 +1,4 @@ -import { useVault } from "@palladxyz/vault" +import { useVault } from "@palladco/vault" import clsx from "clsx" import { CopyIcon, ExternalLinkIcon } from "lucide-react" import { toast } from "sonner" diff --git a/packages/features/src/components/menu-drawer.tsx b/packages/features/src/components/menu-drawer.tsx index 6044a8e7..cb0a24cf 100644 --- a/packages/features/src/components/menu-drawer.tsx +++ b/packages/features/src/components/menu-drawer.tsx @@ -1,6 +1,6 @@ import Logo from "@/common/assets/logo.svg?react" import MenuIcon from "@/common/assets/menu.svg?react" -import { useVault } from "@palladxyz/vault" +import { useVault } from "@palladco/vault" import { ChevronDownIcon, XIcon } from "lucide-react" import { Link, useNavigate } from "react-router-dom" diff --git a/packages/features/src/components/settings-page-layout.tsx b/packages/features/src/components/settings-page-layout.tsx index adf6370f..b1dbd9d5 100644 --- a/packages/features/src/components/settings-page-layout.tsx +++ b/packages/features/src/components/settings-page-layout.tsx @@ -1,4 +1,4 @@ -import { useVault } from "@palladxyz/vault" +import { useVault } from "@palladco/vault" import type { ReactNode } from "react" import { MenuBar } from "./menu-bar" diff --git a/packages/features/src/error-renderer/views/error.tsx b/packages/features/src/error-renderer/views/error.tsx index 8ddffef4..8699891e 100644 --- a/packages/features/src/error-renderer/views/error.tsx +++ b/packages/features/src/error-renderer/views/error.tsx @@ -1,6 +1,5 @@ import type { FallbackProps } from "react-error-boundary" import { useTranslation } from "react-i18next" -//import { useMixpanel } from "react-mixpanel-browser" export const ErrorView = ({ error, resetErrorBoundary }: FallbackProps) => { const stringifiedError = JSON.stringify( diff --git a/packages/features/src/i18n/index.ts b/packages/features/src/i18n/index.ts deleted file mode 100644 index 73e50353..00000000 --- a/packages/features/src/i18n/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import i18next from "i18next" -import LanguageDetector from "i18next-browser-languagedetector" -import { initReactI18next } from "react-i18next" -import ns1 from "./locales/en/en.json" -import ns2 from "./locales/tr/tr.json" - -const defaultNS = "ns1" - -const resources = { - en: { - ns1, - }, - tr: { - ns2, - }, -} - -i18next - .use(LanguageDetector) - .use(initReactI18next) - .init({ - debug: false, - fallbackLng: ["en", "tr"], - resources: resources, - defaultNS, - }) diff --git a/packages/features/src/index.ts b/packages/features/src/index.ts index 17a3ca55..5fac75db 100644 --- a/packages/features/src/index.ts +++ b/packages/features/src/index.ts @@ -3,9 +3,9 @@ import "@total-typescript/ts-reset" import type {} from "graphql-request" import type {} from "swr" export { useAppStore } from "./common/store/app" -export { usePendingTransactionStore } from "@palladxyz/vault" +export { usePendingTransactionStore } from "@palladco/vault" export { Router } from "./router" export { WebConnectorRoute } from "./web-connector/routes/web-connector" export * as Icons from "lucide-react" -import "./i18n" +export { i18n } from "./lib/i18n" import "./globals.css" diff --git a/packages/features/src/lib/i18n.ts b/packages/features/src/lib/i18n.ts new file mode 100644 index 00000000..9d5ff578 --- /dev/null +++ b/packages/features/src/lib/i18n.ts @@ -0,0 +1,23 @@ +import i18n from "i18next" +import LanguageDetector from "i18next-browser-languagedetector" +import { initReactI18next } from "react-i18next" +import en from "./locales/en/en.json" +import tr from "./locales/tr/tr.json" + +const resources = { + en: { translation: en }, + tr: { translation: tr }, +} + +i18n + .use(LanguageDetector) + .use(initReactI18next) + .init({ + fallbackLng: "en", + resources, + interpolation: { + escapeValue: false, + }, + }) + +export { i18n } diff --git a/packages/features/src/i18n/locales/en/en.json b/packages/features/src/lib/locales/en/en.json similarity index 100% rename from packages/features/src/i18n/locales/en/en.json rename to packages/features/src/lib/locales/en/en.json diff --git a/packages/features/src/i18n/locales/tr/tr.json b/packages/features/src/lib/locales/tr/tr.json similarity index 100% rename from packages/features/src/i18n/locales/tr/tr.json rename to packages/features/src/lib/locales/tr/tr.json diff --git a/packages/features/src/lock/routes/unlock-wallet.tsx b/packages/features/src/lock/routes/unlock-wallet.tsx index 8a317284..d022cd22 100644 --- a/packages/features/src/lock/routes/unlock-wallet.tsx +++ b/packages/features/src/lock/routes/unlock-wallet.tsx @@ -1,6 +1,6 @@ import { zodResolver } from "@hookform/resolvers/zod" -import { securePersistence, sessionPersistence } from "@palladxyz/vault" -import { useVault } from "@palladxyz/vault" +import { securePersistence, sessionPersistence } from "@palladco/vault" +import { useVault } from "@palladco/vault" import { type FormEvent, useEffect, useState } from "react" import { useForm } from "react-hook-form" import { useNavigate } from "react-router-dom" diff --git a/packages/features/src/onboarding/routes/create-wallet.tsx b/packages/features/src/onboarding/routes/create-wallet.tsx index b6190b65..9fee221f 100644 --- a/packages/features/src/onboarding/routes/create-wallet.tsx +++ b/packages/features/src/onboarding/routes/create-wallet.tsx @@ -1,4 +1,4 @@ -import { generateMnemonicWords } from "@palladxyz/key-management" +import { generateMnemonicWords } from "@palladco/key-management" import { useNavigate } from "react-router-dom" import { shallow } from "zustand/shallow" diff --git a/packages/features/src/onboarding/routes/seed-backup-confirmation.tsx b/packages/features/src/onboarding/routes/seed-backup-confirmation.tsx index 8470ba0e..e15e6faa 100644 --- a/packages/features/src/onboarding/routes/seed-backup-confirmation.tsx +++ b/packages/features/src/onboarding/routes/seed-backup-confirmation.tsx @@ -1,8 +1,8 @@ import { utf8ToBytes } from "@noble/hashes/utils" -import type { ChainDerivationArgs } from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" -import { sessionPersistence } from "@palladxyz/vault" -import { DEFAULT_NETWORK, KeyAgents, useVault } from "@palladxyz/vault" +import type { ChainDerivationArgs } from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" +import { sessionPersistence } from "@palladco/vault" +import { DEFAULT_NETWORK, KeyAgents, useVault } from "@palladco/vault" import { useMemo, useState } from "react" import { useForm } from "react-hook-form" import { useNavigate } from "react-router-dom" diff --git a/packages/features/src/onboarding/routes/seed-import.tsx b/packages/features/src/onboarding/routes/seed-import.tsx index f8324ce3..8743214d 100644 --- a/packages/features/src/onboarding/routes/seed-import.tsx +++ b/packages/features/src/onboarding/routes/seed-import.tsx @@ -1,8 +1,8 @@ -import { validateMnemonic, wordlist } from "@palladxyz/key-management" -import type { ChainDerivationArgs } from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" -import { sessionPersistence } from "@palladxyz/vault" -import { DEFAULT_NETWORK, KeyAgents, useVault } from "@palladxyz/vault" +import { validateMnemonic, wordlist } from "@palladco/key-management" +import type { ChainDerivationArgs } from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" +import { sessionPersistence } from "@palladco/vault" +import { DEFAULT_NETWORK, KeyAgents, useVault } from "@palladco/vault" import { useState } from "react" import { type SubmitHandler, useForm } from "react-hook-form" import { useNavigate } from "react-router-dom" diff --git a/packages/features/src/onboarding/routes/start.tsx b/packages/features/src/onboarding/routes/start.tsx index 1afe132f..f824065d 100644 --- a/packages/features/src/onboarding/routes/start.tsx +++ b/packages/features/src/onboarding/routes/start.tsx @@ -1,4 +1,4 @@ -import { securePersistence, sessionPersistence } from "@palladxyz/vault" +import { securePersistence, sessionPersistence } from "@palladco/vault" import { useEffect, useState } from "react" import { useNavigate } from "react-router-dom" diff --git a/packages/features/src/onboarding/views/seed-import.tsx b/packages/features/src/onboarding/views/seed-import.tsx index 9261c5de..b09fdbf8 100644 --- a/packages/features/src/onboarding/views/seed-import.tsx +++ b/packages/features/src/onboarding/views/seed-import.tsx @@ -1,4 +1,4 @@ -import { wordlist } from "@palladxyz/key-management" +import { wordlist } from "@palladco/key-management" import { Loader2Icon } from "lucide-react" import type { UseFormReturn } from "react-hook-form" diff --git a/packages/features/src/router.tsx b/packages/features/src/router.tsx index f98bb0f1..30a3ad4a 100644 --- a/packages/features/src/router.tsx +++ b/packages/features/src/router.tsx @@ -3,10 +3,12 @@ import { MemoryRouter, Outlet, Route, Routes } from "react-router-dom" import dayjs from "dayjs" import relativeTime from "dayjs/plugin/relativeTime" import { ErrorBoundary } from "react-error-boundary" +import { I18nextProvider } from "react-i18next" import { Toaster } from "sonner" import { AddressBookRoute } from "./address-book/routes/address-book" import { NewAddressRoute } from "./address-book/routes/new-address" import { ErrorView } from "./error-renderer/views/error" +import { i18n } from "./lib/i18n" import { UnlockWalletRoute } from "./lock/routes/unlock-wallet" import { NotFoundRoute } from "./not-found/routes/not-found" import { CreateWalletRoute } from "./onboarding/routes/create-wallet" @@ -44,85 +46,87 @@ dayjs.extend(relativeTime) export const Router = () => { return ( - -

- - - - } /> - } /> - } /> - } /> - } /> - } - /> - } - /> - } - /> - } - /> - } /> - } /> - } /> - } - /> - }> - } /> - } /> - - }> - } /> - } /> - } /> + + +
+ + + + } /> + } /> + } /> + } /> + } /> } + path="/transactions/summary" + element={} /> - } /> } + path="/transactions/success" + element={} /> } + path="/transactions/error" + element={} /> - } /> - - } /> - }> - } /> - }> - } /> - } /> - } /> - - }> - } /> - } /> - } /> - } + path="/transactions/:hash" + element={} + /> + } /> + } /> + } /> + } /> - } /> - - } /> - - -
-
+ }> + } /> + } /> + + }> + } /> + } /> + } /> + } + /> + } /> + } + /> + } + /> + } /> + + } /> + }> + } /> + }> + } /> + } /> + } /> + + }> + } /> + } /> + } /> + + } + /> + } /> + + } /> +
+
+
+ + ) } diff --git a/packages/features/src/send/components/send-form.tsx b/packages/features/src/send/components/send-form.tsx index d9f63bda..01fbaba4 100644 --- a/packages/features/src/send/components/send-form.tsx +++ b/packages/features/src/send/components/send-form.tsx @@ -10,7 +10,7 @@ import { FormError } from "@/components/form-error" import MinaIcon from "@/common/assets/mina.svg?react" import { formatCurrency } from "@/common/lib/currency" import { FeePicker, TransactionFeeShort } from "@/components/fee-picker" -import { TransactionType } from "@palladxyz/mina-core" +import { TransactionType } from "@palladco/mina-core" import { ChevronRightIcon, SearchIcon } from "lucide-react" import { SendFormSchema, type SendFormSchemaProps } from "./send-form.schema" diff --git a/packages/features/src/send/hooks/use-transaction-confirmation.tsx b/packages/features/src/send/hooks/use-transaction-confirmation.tsx index 2e5f8ff6..99822740 100644 --- a/packages/features/src/send/hooks/use-transaction-confirmation.tsx +++ b/packages/features/src/send/hooks/use-transaction-confirmation.tsx @@ -1,6 +1,6 @@ -import type { ChainOperationArgs } from "@palladxyz/key-management" -import { TransactionType } from "@palladxyz/mina-core" -import { useVault } from "@palladxyz/vault" +import type { ChainOperationArgs } from "@palladco/key-management" +import { TransactionType } from "@palladco/mina-core" +import { useVault } from "@palladco/vault" import dayjs from "dayjs" import type { SubmitHandler, UseFormReturn } from "react-hook-form" import { useNavigate } from "react-router-dom" @@ -8,7 +8,7 @@ import type { z } from "zod" import { useAccount } from "@/common/hooks/use-account" import { useTransactionStore } from "@/common/store/transaction" -import { usePendingTransactionStore } from "@palladxyz/vault" +import { usePendingTransactionStore } from "@palladco/vault" import type { SignedTransaction, TransactionBody } from "@mina-js/utils" import { utf8ToBytes } from "@noble/hashes/utils" diff --git a/packages/features/src/send/routes/send.tsx b/packages/features/src/send/routes/send.tsx index d49f32eb..bccbada4 100644 --- a/packages/features/src/send/routes/send.tsx +++ b/packages/features/src/send/routes/send.tsx @@ -1,7 +1,7 @@ import { useNavigate } from "react-router-dom" import { useAccount } from "@/common/hooks/use-account" -import { useFiatPrice } from "@palladxyz/offchain-data" +import { useFiatPrice } from "@palladco/offchain-data" import { useState } from "react" import { SendView } from "../views/send" diff --git a/packages/features/src/staking/components/delegate-form.tsx b/packages/features/src/staking/components/delegate-form.tsx index f8eb3cf7..75007be8 100644 --- a/packages/features/src/staking/components/delegate-form.tsx +++ b/packages/features/src/staking/components/delegate-form.tsx @@ -9,7 +9,7 @@ import { FormError } from "@/components/form-error" import { FeePicker, TransactionFeeShort } from "@/components/fee-picker" import type { SendFormSchemaProps } from "@/send/components/send-form.schema" -import { TransactionType } from "@palladxyz/mina-core" +import { TransactionType } from "@palladco/mina-core" import { ExternalLinkIcon } from "lucide-react" import { useTranslation } from "react-i18next" import { DelegateFormSchema } from "./delegate-form.schema" diff --git a/packages/features/src/transactions/components/tx-tile.tsx b/packages/features/src/transactions/components/tx-tile.tsx index aeef294b..01e8fca7 100644 --- a/packages/features/src/transactions/components/tx-tile.tsx +++ b/packages/features/src/transactions/components/tx-tile.tsx @@ -1,6 +1,6 @@ import { getTxKind } from "@/common/lib/tx" import { TxIcon } from "@/components/tx-icon" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { clsx } from "clsx" import { useTranslation } from "react-i18next" import { Link } from "react-router-dom" diff --git a/packages/features/src/transactions/index.stories.tsx b/packages/features/src/transactions/index.stories.tsx index c9070049..e23027d2 100644 --- a/packages/features/src/transactions/index.stories.tsx +++ b/packages/features/src/transactions/index.stories.tsx @@ -1,5 +1,5 @@ import { type StoryDefault, action } from "@ladle/react" -import { Mina } from "@palladxyz/mina-core" +import { Mina } from "@palladco/mina-core" import { TransactionDetailsView } from "./views/transaction-details" import { TransactionsView } from "./views/transactions" diff --git a/packages/features/src/transactions/routes/transactions.tsx b/packages/features/src/transactions/routes/transactions.tsx index 34bbc9fb..7d535b89 100644 --- a/packages/features/src/transactions/routes/transactions.tsx +++ b/packages/features/src/transactions/routes/transactions.tsx @@ -2,9 +2,9 @@ import { useEffect } from "react" import { useAccount } from "@/common/hooks/use-account" import { useTransactions } from "@/common/hooks/use-transactions" -import { usePendingTransactionStore, useVault } from "@palladxyz/vault" +import { usePendingTransactionStore, useVault } from "@palladco/vault" -import { useFiatPrice } from "@palladxyz/offchain-data" +import { useFiatPrice } from "@palladco/offchain-data" import { TransactionsView } from "../views/transactions" export const TransactionsRoute = () => { diff --git a/packages/features/src/transactions/utils/structurize-transactions.ts b/packages/features/src/transactions/utils/structurize-transactions.ts index 7161f635..504a5e6f 100644 --- a/packages/features/src/transactions/utils/structurize-transactions.ts +++ b/packages/features/src/transactions/utils/structurize-transactions.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import dayjs from "dayjs" import { groupBy, map, pipe } from "rambda" diff --git a/packages/features/src/transactions/views/transaction-details.tsx b/packages/features/src/transactions/views/transaction-details.tsx index 38c7bd53..15b19f0e 100644 --- a/packages/features/src/transactions/views/transaction-details.tsx +++ b/packages/features/src/transactions/views/transaction-details.tsx @@ -1,4 +1,4 @@ -import { Mina } from "@palladxyz/mina-core" +import { Mina } from "@palladco/mina-core" import { AppLayout } from "@/components/app-layout" import dayjs from "dayjs" diff --git a/packages/features/src/transactions/views/transactions.tsx b/packages/features/src/transactions/views/transactions.tsx index a6ca034b..eb083d8e 100644 --- a/packages/features/src/transactions/views/transactions.tsx +++ b/packages/features/src/transactions/views/transactions.tsx @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { Filter, X } from "lucide-react" import { groupBy } from "rambda" import { Link } from "react-router-dom" diff --git a/packages/features/src/wallet/routes/networks.tsx b/packages/features/src/wallet/routes/networks.tsx index 267ebc28..b4a28889 100644 --- a/packages/features/src/wallet/routes/networks.tsx +++ b/packages/features/src/wallet/routes/networks.tsx @@ -1,5 +1,5 @@ import { useAccount } from "@/common/hooks/use-account" -import { useVault } from "@palladxyz/vault" +import { useVault } from "@palladco/vault" import { useNavigate } from "react-router-dom" import { sendMessage } from "webext-bridge/popup" import { NetworksView } from "../views/networks" diff --git a/packages/features/src/wallet/routes/overview.tsx b/packages/features/src/wallet/routes/overview.tsx index 5df3530b..0520d307 100644 --- a/packages/features/src/wallet/routes/overview.tsx +++ b/packages/features/src/wallet/routes/overview.tsx @@ -1,4 +1,4 @@ -import { useFiatPrice } from "@palladxyz/offchain-data" +import { useFiatPrice } from "@palladco/offchain-data" import { useAccount } from "@/common/hooks/use-account" import { useTransactions } from "@/common/hooks/use-transactions" diff --git a/packages/features/src/wallet/views/overview.tsx b/packages/features/src/wallet/views/overview.tsx index c5c32d9f..2b06031a 100644 --- a/packages/features/src/wallet/views/overview.tsx +++ b/packages/features/src/wallet/views/overview.tsx @@ -2,7 +2,7 @@ import ArrowRightIcon from "@/common/assets/arrow-right.svg?react" import { AppLayout } from "@/components/app-layout" import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" -import type { Tx } from "@palladxyz/pallad-core" +import type { Tx } from "@palladco/pallad-core" import { useTranslation } from "react-i18next" import { Link } from "react-router-dom" import SlotCounter from "react-slot-counter" diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 8e94110c..38dc2bb3 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -1,6 +1,7 @@ import { AppLayout } from "@/components/app-layout" import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" +import { useEffect } from "react" import type { SubmitHandler } from "react-hook-form" import { ConfirmationForm } from "../components/confirmation-form" import { InputForm } from "../components/input-form" @@ -19,6 +20,10 @@ type WebConnectorViewProps = { loading: boolean } +const eventListener = (event: MessageEvent) => { + console.log(">>>P_EVENT", event.data) +} + export const WebConnectorView = ({ title, payload, @@ -35,10 +40,29 @@ export const WebConnectorView = ({ onReject() onDecline() } + const compileAdd = async () => { + const sandbox = document.querySelector( + "#o1sandbox", + ) as HTMLIFrameElement | null + if (!sandbox) return + sandbox.contentWindow?.postMessage( + { type: "compile", payload: payload }, + "*", + ) + } + useEffect(() => { + window.addEventListener("message", eventListener) + return () => { + window.removeEventListener("message", eventListener) + } + }, []) return (
+
diff --git a/packages/features/tsup.config.ts b/packages/features/tsup.config.ts index 76688060..92b3fb56 100644 --- a/packages/features/tsup.config.ts +++ b/packages/features/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { polyfillNode } from "esbuild-plugin-polyfill-node" import svgr from "esbuild-plugin-svgr" import { defineConfig } from "tsup" diff --git a/packages/key-management/package.json b/packages/key-management/package.json index 7f26c57d..8d6daca5 100644 --- a/packages/key-management/package.json +++ b/packages/key-management/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/key-management", + "name": "@palladco/key-management", "description": "An agnostic key management package for Pallad", "version": "0.0.1", "type": "module", @@ -21,17 +21,15 @@ "dependencies": { "@noble/ciphers": "0.5.3", "@noble/hashes": "1.4.0", - "@noble/secp256k1": "2.1.0", - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/pallad-core": "workspace:*", + "@palladco/mina-core": "workspace:*", + "@palladco/pallad-core": "workspace:*", "@scure/base": "1.1.7", "@scure/bip32": "1.4.0", "@scure/bip39": "1.3.0", - "buffer": "6.0.3", "mina-signer": "3.0.7", "ts-custom-error": "3.3.1" }, "devDependencies": { - "@palladxyz/common": "workspace:*" + "@palladco/common": "workspace:*" } } diff --git a/packages/key-management/src/chains/Mina/credentialDerivation.ts b/packages/key-management/src/chains/Mina/credentialDerivation.ts index b46d249b..fbac6ba2 100644 --- a/packages/key-management/src/chains/Mina/credentialDerivation.ts +++ b/packages/key-management/src/chains/Mina/credentialDerivation.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import Client from "mina-signer" import type { diff --git a/packages/key-management/src/chains/Mina/guards.ts b/packages/key-management/src/chains/Mina/guards.ts index baafa76b..929c1d58 100644 --- a/packages/key-management/src/chains/Mina/guards.ts +++ b/packages/key-management/src/chains/Mina/guards.ts @@ -1,5 +1,5 @@ import { TransactionBodySchema } from "@mina-js/utils" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" export function isConstructedTransaction(payload: any) { const transaction = TransactionBodySchema.parse(payload) diff --git a/packages/key-management/src/chains/Mina/keyDerivationUtils.ts b/packages/key-management/src/chains/Mina/keyDerivationUtils.ts index 8325595a..169d8843 100644 --- a/packages/key-management/src/chains/Mina/keyDerivationUtils.ts +++ b/packages/key-management/src/chains/Mina/keyDerivationUtils.ts @@ -1,4 +1,4 @@ -import { Network } from "@palladxyz/pallad-core" +import { Network } from "@palladco/pallad-core" import type { MinaDerivationArgs } from "./types" diff --git a/packages/key-management/src/chains/Mina/types.ts b/packages/key-management/src/chains/Mina/types.ts index 6d5cd67a..3d4e42cf 100644 --- a/packages/key-management/src/chains/Mina/types.ts +++ b/packages/key-management/src/chains/Mina/types.ts @@ -1,5 +1,5 @@ -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import type { Nullifier, diff --git a/packages/key-management/src/chains/README.md b/packages/key-management/src/chains/README.md index 910dda55..c2d92ce0 100644 --- a/packages/key-management/src/chains/README.md +++ b/packages/key-management/src/chains/README.md @@ -1,6 +1,6 @@ -# `@palladxyz/key-management` Package - `chains` Subfolder Documentation +# `@palladco/key-management` Package - `chains` Subfolder Documentation -The `chains` subfolder of the `@palladxyz/key-management` package contains TypeScript modules that provide functionality related to key management, including credential derivation, key derivation, and signing operations specific to the Mina protocol. Each chain's folder follows a specific strucutre, below is an overview of each file for this strucutre within the `mina` subfolder as an example: +The `chains` subfolder of the `@palladco/key-management` package contains TypeScript modules that provide functionality related to key management, including credential derivation, key derivation, and signing operations specific to the Mina protocol. Each chain's folder follows a specific strucutre, below is an overview of each file for this strucutre within the `mina` subfolder as an example: ## `credentialDerivation.ts` diff --git a/packages/key-management/src/types.ts b/packages/key-management/src/types.ts index dc34d7cd..c3a04733 100644 --- a/packages/key-management/src/types.ts +++ b/packages/key-management/src/types.ts @@ -1,5 +1,5 @@ -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import { deriveMinaCredentials, diff --git a/packages/key-management/test/mina/in-memory-key-agent.test.ts b/packages/key-management/test/mina/in-memory-key-agent.test.ts index 3c36bf30..daef60b0 100644 --- a/packages/key-management/test/mina/in-memory-key-agent.test.ts +++ b/packages/key-management/test/mina/in-memory-key-agent.test.ts @@ -1,6 +1,6 @@ -import { mnemonic } from "@palladxyz/common" -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +import { mnemonic } from "@palladco/common" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import * as bip32 from "@scure/bip32" import Client from "mina-signer" diff --git a/packages/key-management/test/mina/key-agent-base-zkapp-command.test.ts b/packages/key-management/test/mina/key-agent-base-zkapp-command.test.ts index 02343890..f4bd7e7f 100644 --- a/packages/key-management/test/mina/key-agent-base-zkapp-command.test.ts +++ b/packages/key-management/test/mina/key-agent-base-zkapp-command.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from "bun:test" -import { mnemonic } from "@palladxyz/common" -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +import { mnemonic } from "@palladco/common" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import Client from "mina-signer" import { utf8ToBytes } from "@noble/hashes/utils" diff --git a/packages/key-management/test/mina/key-agent-base.test.ts b/packages/key-management/test/mina/key-agent-base.test.ts index c1a955f4..d042a81f 100644 --- a/packages/key-management/test/mina/key-agent-base.test.ts +++ b/packages/key-management/test/mina/key-agent-base.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it } from "bun:test" -import { mnemonic } from "@palladxyz/common" -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +import { mnemonic } from "@palladco/common" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import * as bip32 from "@scure/bip32" import Client from "mina-signer" diff --git a/packages/key-management/test/util/guards.test.ts b/packages/key-management/test/util/guards.test.ts index ac37dd66..e11bc8db 100644 --- a/packages/key-management/test/util/guards.test.ts +++ b/packages/key-management/test/util/guards.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { isConstructedTransaction, diff --git a/packages/key-management/tsconfig.json b/packages/key-management/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/key-management/tsconfig.json +++ b/packages/key-management/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/key-management/tsup.config.ts b/packages/key-management/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/key-management/tsup.config.ts +++ b/packages/key-management/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/mina-core/README.md b/packages/mina-core/README.md index 9e45f402..08d7471a 100644 --- a/packages/mina-core/README.md +++ b/packages/mina-core/README.md @@ -1,13 +1,13 @@ -# @palladxyz/mina-core +# @palladco/mina-core -@palladxyz/mina-core is a TypeScript package designed for helping other libraries to interact with Mina. It provides interfaces & types for many the main data strcutures of Mina that are relevant for wallets and applications. This includes providers that retrieve account information, process transaction history, submit transactions, and fetch health checks. +@palladco/mina-core is a TypeScript package designed for helping other libraries to interact with Mina. It provides interfaces & types for many the main data strcutures of Mina that are relevant for wallets and applications. This includes providers that retrieve account information, process transaction history, submit transactions, and fetch health checks. ## Installation Install the package via npm: ```bash -npm install @palladxyz/mina-core +npm install @palladco/mina-core ``` ## Usage @@ -17,7 +17,7 @@ npm install @palladxyz/mina-core The `AccountInfoProvider` interface is used to fetch account information based on a public key. ```ts -import { AccountInfoProvider } from "@palladxyz/mina-core"; +import { AccountInfoProvider } from "@palladco/mina-core"; async function getAccountInfo(provider: AccountInfoProvider) { const accountInfo = await provider.getAccountInfo({ publicKey: "..." }); @@ -29,7 +29,7 @@ async function getAccountInfo(provider: AccountInfoProvider) { The `ChainHistoryProvider` interface provides methods to fetch transactions either by addresses or by hashes. ```ts -import { ChainHistoryProvider } from "@palladxyz/mina-core"; +import { ChainHistoryProvider } from "@palladco/mina-core"; async function getTransactionsByAddresses(provider: ChainHistoryProvider) { const transactions = await provider.transactionsByAddresses({ @@ -47,7 +47,7 @@ async function getTransactionsByHashes(provider: ChainHistoryProvider) { The `TxSubmitProvider` interface allows you to submit signed transactions to the network. ```ts -import { TxSubmitProvider } from "@palladxyz/mina-core"; +import { TxSubmitProvider } from "@palladco/mina-core"; async function submitTx(provider: TxSubmitProvider) { const signedTx = // Prepare your signed transaction here @@ -60,7 +60,7 @@ async function submitTx(provider: TxSubmitProvider) { All provider types extend the base Provider interface, which provides a health check method to verify if the provider is operational. ```ts -import { Provider } from "@palladxyz/mina-core"; +import { Provider } from "@palladco/mina-core"; async function checkHealth(provider: Provider) { const healthCheckResponse = await provider.healthCheck(); diff --git a/packages/mina-core/package.json b/packages/mina-core/package.json index 7920b221..4271ec77 100644 --- a/packages/mina-core/package.json +++ b/packages/mina-core/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/mina-core", + "name": "@palladco/mina-core", "version": "0.0.1", "type": "module", "description": "Core Mina Package SDK for Pallad", @@ -17,13 +17,9 @@ "cleanup": "bunx --bun rimraf node_modules dist .turbo" }, "dependencies": { - "@palladxyz/util": "workspace:*", - "bs58check": "4.0.0", - "buffer": "6.0.3", - "mina-signer": "3.0.7" + "@palladco/util": "workspace:*" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/secp256k1": "4.0.6" + "@palladco/common": "workspace:*" } } diff --git a/packages/mina-core/src/Mina/Block.ts b/packages/mina-core/src/Mina/Block.ts index fba12961..323467ac 100644 --- a/packages/mina-core/src/Mina/Block.ts +++ b/packages/mina-core/src/Mina/Block.ts @@ -1,4 +1,4 @@ -import type { OpaqueNumber } from "@palladxyz/util" +import type { OpaqueNumber } from "@palladco/util" /** * The block number. diff --git a/packages/mina-core/src/Mina/Transaction.ts b/packages/mina-core/src/Mina/Transaction.ts index f32e5f88..e646a50a 100644 --- a/packages/mina-core/src/Mina/Transaction.ts +++ b/packages/mina-core/src/Mina/Transaction.ts @@ -1,4 +1,4 @@ -import { InvalidStringError, type OpaqueString } from "@palladxyz/util" +import { InvalidStringError, type OpaqueString } from "@palladco/util" import type { BorrowedTypes } from ".." diff --git a/packages/mina-core/src/Providers/chain-history-provider/types.ts b/packages/mina-core/src/Providers/chain-history-provider/types.ts index c48a2cb4..b3865816 100644 --- a/packages/mina-core/src/Providers/chain-history-provider/types.ts +++ b/packages/mina-core/src/Providers/chain-history-provider/types.ts @@ -1,4 +1,4 @@ -import type { Range } from "@palladxyz/util" +import type { Range } from "@palladco/util" import type { Mina, Provider } from "../.." diff --git a/packages/mina-core/tsconfig.json b/packages/mina-core/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/mina-core/tsconfig.json +++ b/packages/mina-core/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/mina-core/tsup.config.ts b/packages/mina-core/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/mina-core/tsup.config.ts +++ b/packages/mina-core/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/offchain-data/README.md b/packages/offchain-data/README.md index af2c116a..ad431d20 100644 --- a/packages/offchain-data/README.md +++ b/packages/offchain-data/README.md @@ -1,3 +1,3 @@ -# @palladxyz/offchain-data +# @palladco/offchain-data Package for fetching off-chain data like fiat prices. diff --git a/packages/offchain-data/package.json b/packages/offchain-data/package.json index 40970057..5b081f1e 100644 --- a/packages/offchain-data/package.json +++ b/packages/offchain-data/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/offchain-data", + "name": "@palladco/offchain-data", "description": "Off-chain data fetching services.", "type": "module", "version": "1.0.0", @@ -21,6 +21,6 @@ "swr": "2.2.5" }, "devDependencies": { - "@palladxyz/common": "workspace:*" + "@palladco/common": "workspace:*" } } diff --git a/packages/offchain-data/tsconfig.json b/packages/offchain-data/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/offchain-data/tsconfig.json +++ b/packages/offchain-data/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/offchain-data/tsup.config.ts b/packages/offchain-data/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/offchain-data/tsup.config.ts +++ b/packages/offchain-data/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/pallad-core/README.md b/packages/pallad-core/README.md index 09d88d82..82cd6bcd 100644 --- a/packages/pallad-core/README.md +++ b/packages/pallad-core/README.md @@ -1,13 +1,13 @@ -# @palladxyz/mina-core +# @palladco/mina-core -@palladxyz/mina-core is a TypeScript package designed for interacting with the Mina Protocol. It provides interfaces for retrieving account information, processing transaction history, submitting transactions, and provider health checks. The package also includes the core types that represent the main data structures of the Mina Protocol. +@palladco/mina-core is a TypeScript package designed for interacting with the Mina Protocol. It provides interfaces for retrieving account information, processing transaction history, submitting transactions, and provider health checks. The package also includes the core types that represent the main data structures of the Mina Protocol. ## Installation Install the package via npm: ```bash -npm install @palladxyz/mina-core +npm install @palladco/mina-core ``` ## Usage @@ -17,7 +17,7 @@ npm install @palladxyz/mina-core The `AccountInfoProvider` interface is used to fetch account information based on a public key. ```ts -import { AccountInfoProvider } from "@palladxyz/mina-core"; +import { AccountInfoProvider } from "@palladco/mina-core"; async function getAccountInfo(provider: AccountInfoProvider) { const accountInfo = await provider.getAccountInfo({ publicKey: "..." }); @@ -29,7 +29,7 @@ async function getAccountInfo(provider: AccountInfoProvider) { The `ChainHistoryProvider` interface provides methods to fetch transactions either by addresses or by hashes. ```ts -import { ChainHistoryProvider } from "@palladxyz/mina-core"; +import { ChainHistoryProvider } from "@palladco/mina-core"; async function getTransactionsByAddresses(provider: ChainHistoryProvider) { const transactions = await provider.transactionsByAddresses({ @@ -47,7 +47,7 @@ async function getTransactionsByHashes(provider: ChainHistoryProvider) { The `TxSubmitProvider` interface allows you to submit signed transactions to the network. ```ts -import { TxSubmitProvider } from "@palladxyz/mina-core"; +import { TxSubmitProvider } from "@palladco/mina-core"; async function submitTx(provider: TxSubmitProvider) { const signedTx = // Prepare your signed transaction here @@ -60,7 +60,7 @@ async function submitTx(provider: TxSubmitProvider) { All provider types extend the base Provider interface, which provides a health check method to verify if the provider is operational. ```ts -import { Provider } from "@palladxyz/mina-core"; +import { Provider } from "@palladco/mina-core"; async function checkHealth(provider: Provider) { const healthCheckResponse = await provider.healthCheck(); diff --git a/packages/pallad-core/package.json b/packages/pallad-core/package.json index 7a8bfc4b..35007f82 100644 --- a/packages/pallad-core/package.json +++ b/packages/pallad-core/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/pallad-core", + "name": "@palladco/pallad-core", "version": "0.0.1", "type": "module", "description": "Core Pallad Package", @@ -18,17 +18,11 @@ "cleanup": "bunx --bun rimraf node_modules dist .turbo" }, "dependencies": { - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/util": "workspace:*", - "bs58check": "4.0.0", - "buffer": "6.0.3", - "mina-signer": "3.0.7", - "viem": "2.18.4", - "vite-plugin-top-level-await": "1.4.2", - "vite-plugin-wasm": "3.3.0" + "@palladco/mina-core": "workspace:*", + "@palladco/util": "workspace:*", + "viem": "2.18.4" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/secp256k1": "4.0.6" + "@palladco/common": "workspace:*" } } diff --git a/packages/pallad-core/src/Mina/Providers/account-info-provider/types.ts b/packages/pallad-core/src/Mina/Providers/account-info-provider/types.ts index d8471c6a..e130a22a 100644 --- a/packages/pallad-core/src/Mina/Providers/account-info-provider/types.ts +++ b/packages/pallad-core/src/Mina/Providers/account-info-provider/types.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { Provider } from "../.." diff --git a/packages/pallad-core/src/Mina/Providers/chain-history-provider/types.ts b/packages/pallad-core/src/Mina/Providers/chain-history-provider/types.ts index 01691b13..b14532d5 100644 --- a/packages/pallad-core/src/Mina/Providers/chain-history-provider/types.ts +++ b/packages/pallad-core/src/Mina/Providers/chain-history-provider/types.ts @@ -1,5 +1,5 @@ -import type { Mina } from "@palladxyz/mina-core" -import type { Range } from "@palladxyz/util" +import type { Mina } from "@palladco/mina-core" +import type { Range } from "@palladco/util" import type { Provider } from "../.." diff --git a/packages/pallad-core/src/Mina/Providers/tx-submit-provider/types.ts b/packages/pallad-core/src/Mina/Providers/tx-submit-provider/types.ts index dee20380..c049ef92 100644 --- a/packages/pallad-core/src/Mina/Providers/tx-submit-provider/types.ts +++ b/packages/pallad-core/src/Mina/Providers/tx-submit-provider/types.ts @@ -1,4 +1,4 @@ -import type { BorrowedTypes, Mina } from "@palladxyz/mina-core" +import type { BorrowedTypes, Mina } from "@palladco/mina-core" import type { Provider } from "../provider" diff --git a/packages/pallad-core/src/Mina/Providers/unified-mina-provider.ts b/packages/pallad-core/src/Mina/Providers/unified-mina-provider.ts index 6a02c6a2..2f3f8a2d 100644 --- a/packages/pallad-core/src/Mina/Providers/unified-mina-provider.ts +++ b/packages/pallad-core/src/Mina/Providers/unified-mina-provider.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { AccountInfo, AccountInfoArgs } from "./account-info-provider" import type { diff --git a/packages/pallad-core/src/Pallad/providers/account-info-provider/types.ts b/packages/pallad-core/src/Pallad/providers/account-info-provider/types.ts index df725e52..4ef41fec 100644 --- a/packages/pallad-core/src/Pallad/providers/account-info-provider/types.ts +++ b/packages/pallad-core/src/Pallad/providers/account-info-provider/types.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { Address, Chain } from "viem" import type { Provider } from "../" diff --git a/packages/pallad-core/src/Pallad/providers/tx-submit-provider/types.ts b/packages/pallad-core/src/Pallad/providers/tx-submit-provider/types.ts index cb9fea6e..9d177463 100644 --- a/packages/pallad-core/src/Pallad/providers/tx-submit-provider/types.ts +++ b/packages/pallad-core/src/Pallad/providers/tx-submit-provider/types.ts @@ -1,4 +1,4 @@ -import type { BorrowedTypes, Mina } from "@palladxyz/mina-core" +import type { BorrowedTypes, Mina } from "@palladco/mina-core" import type { Provider } from "../provider" diff --git a/packages/pallad-core/src/Pallad/providers/types.ts b/packages/pallad-core/src/Pallad/providers/types.ts index 188dcc4e..011df823 100644 --- a/packages/pallad-core/src/Pallad/providers/types.ts +++ b/packages/pallad-core/src/Pallad/providers/types.ts @@ -1,4 +1,4 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { Address, GetTransactionReturnType, Hash } from "viem" export type TransactionHash = Mina.TxId[] | Hash[] diff --git a/packages/pallad-core/tsconfig.json b/packages/pallad-core/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/pallad-core/tsconfig.json +++ b/packages/pallad-core/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/pallad-core/tsup.config.ts b/packages/pallad-core/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/pallad-core/tsup.config.ts +++ b/packages/pallad-core/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/providers/README.md b/packages/providers/README.md index 1af83fcc..c44946ff 100644 --- a/packages/providers/README.md +++ b/packages/providers/README.md @@ -1,4 +1,4 @@ -# @palladxyz/providers +# @palladco/providers This TypeScript library creates Providers that can read and write (mutate) data to Mina via a set of API providers such as Minascan. @@ -6,7 +6,7 @@ A Provider is an abstraction that encapsulates the functionality for interacting ## Implementation Detail -While these providers can be used individually, they are more functional in nature than the founding `@palladxyz/mina-graphql` providers, removing the object oriented design in many of them (full set to be determined). Each provider is scoped to specifically either read, write, or listen; not focusing on specifically storing data themselves they are an abstraction for an application. In Pallad's case, the `vault` requires this abstraction as it stores the arguments for each provider. +While these providers can be used individually, they are more functional in nature than the founding `@palladco/mina-graphql` providers, removing the object oriented design in many of them (full set to be determined). Each provider is scoped to specifically either read, write, or listen; not focusing on specifically storing data themselves they are an abstraction for an application. In Pallad's case, the `vault` requires this abstraction as it stores the arguments for each provider. ### Provider Sources diff --git a/packages/providers/package.json b/packages/providers/package.json index 8dde595b..3b687fa0 100644 --- a/packages/providers/package.json +++ b/packages/providers/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/providers", + "name": "@palladco/providers", "version": "0.0.1", "description": "Proivder Package SDK for Pallad.", "type": "module", @@ -19,26 +19,19 @@ }, "dependencies": { "@noble/hashes": "1.4.0", - "@palladxyz/key-management": "workspace:*", - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/pallad-core": "workspace:*", - "@palladxyz/util": "workspace:*", - "bs58check": "4.0.0", - "buffer": "6.0.3", - "events": "3.3.0", + "@palladco/key-management": "workspace:*", + "@palladco/mina-core": "workspace:*", + "@palladco/pallad-core": "workspace:*", + "@palladco/util": "workspace:*", "graphql": "16.9.0", "graphql-request": "7.1.0", "json-bigint": "1.0.0", "mina-signer": "3.0.7", - "subscriptions-transport-ws": "0.11.0", - "viem": "2.18.4", - "ws": "8.18.0" + "subscriptions-transport-ws": "0.11.0" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/events": "3.0.3", + "@palladco/common": "workspace:*", "@types/json-bigint": "1.0.4", - "esbuild-plugin-polyfill-node": "0.3.0", - "msw": "2.3.4" + "esbuild-plugin-polyfill-node": "0.3.0" } } diff --git a/packages/providers/src/blockberry-provider/chain-history/chain-history-provider.ts b/packages/providers/src/blockberry-provider/chain-history/chain-history-provider.ts index 0dc1ebce..438a6420 100644 --- a/packages/providers/src/blockberry-provider/chain-history/chain-history-provider.ts +++ b/packages/providers/src/blockberry-provider/chain-history/chain-history-provider.ts @@ -1,9 +1,9 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { ChainHistoryProvider, TransactionsByAddressesArgs, Tx, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" //import { healthCheck } from "../utils/health-check-utils"; diff --git a/packages/providers/src/mina-node/account-info/account-info-provider.ts b/packages/providers/src/mina-node/account-info/account-info-provider.ts index 719096b1..4318503c 100644 --- a/packages/providers/src/mina-node/account-info/account-info-provider.ts +++ b/packages/providers/src/mina-node/account-info/account-info-provider.ts @@ -2,7 +2,7 @@ import type { AccountInfo, AccountInfoArgs, AccountInfoProvider, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createGraphQLRequest } from "../utils/fetch-utils" import { healthCheck } from "../utils/health-check-utils" diff --git a/packages/providers/src/mina-node/account-info/queries.ts b/packages/providers/src/mina-node/account-info/queries.ts index e533c374..347f9867 100644 --- a/packages/providers/src/mina-node/account-info/queries.ts +++ b/packages/providers/src/mina-node/account-info/queries.ts @@ -17,7 +17,7 @@ export const getAccountBalance = ` } } ` -import type { TokenIdMap } from "@palladxyz/mina-core" +import type { TokenIdMap } from "@palladco/mina-core" export function getTokenAccountInfoQuery(tokenIds: TokenIdMap): string { // Start with the base part of the query diff --git a/packages/providers/src/mina-node/block-listener/BlockListenerProvider.ts b/packages/providers/src/mina-node/block-listener/BlockListenerProvider.ts index 21409358..160bb4b9 100644 --- a/packages/providers/src/mina-node/block-listener/BlockListenerProvider.ts +++ b/packages/providers/src/mina-node/block-listener/BlockListenerProvider.ts @@ -1,4 +1,4 @@ -import type { AccountInfo, AccountInfoArgs } from "@palladxyz/mina-core" +import type { AccountInfo, AccountInfoArgs } from "@palladco/mina-core" import type { ExecutionResult } from "graphql" import { GraphQLClient, gql } from "graphql-request" import { SubscriptionClient } from "subscriptions-transport-ws" diff --git a/packages/providers/src/mina-node/chain-history/chain-history-provider.ts b/packages/providers/src/mina-node/chain-history/chain-history-provider.ts index 222a16b0..f0e03a8a 100644 --- a/packages/providers/src/mina-node/chain-history/chain-history-provider.ts +++ b/packages/providers/src/mina-node/chain-history/chain-history-provider.ts @@ -3,7 +3,7 @@ import type { TransactionsByAddressesArgs, TransactionsByHashesArgs, Tx, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createGraphQLRequest } from "../utils/fetch-utils" import { diff --git a/packages/providers/src/mina-node/node-status/node-status-provider.ts b/packages/providers/src/mina-node/node-status/node-status-provider.ts index f6756643..9d364c83 100644 --- a/packages/providers/src/mina-node/node-status/node-status-provider.ts +++ b/packages/providers/src/mina-node/node-status/node-status-provider.ts @@ -1,4 +1,4 @@ -import type { NodeStatus, NodeStatusProvider } from "@palladxyz/pallad-core" +import type { NodeStatus, NodeStatusProvider } from "@palladco/pallad-core" import { createGraphQLRequest } from "../utils/fetch-utils" import { healthCheck } from "../utils/health-check-utils" diff --git a/packages/providers/src/mina-node/types.ts b/packages/providers/src/mina-node/types.ts index 10aaee8a..1a80d91f 100644 --- a/packages/providers/src/mina-node/types.ts +++ b/packages/providers/src/mina-node/types.ts @@ -8,7 +8,7 @@ import type { TransactionsByIdsArgs, TxStatus, TxStatusArgs, -} from "@palladxyz/mina-core" +} from "@palladco/mina-core" /** * An interface that abstracts over Mina node queries. */ diff --git a/packages/providers/src/unified-providers/account-info-provider.ts b/packages/providers/src/unified-providers/account-info-provider.ts index c3247843..47620fad 100644 --- a/packages/providers/src/unified-providers/account-info-provider.ts +++ b/packages/providers/src/unified-providers/account-info-provider.ts @@ -3,7 +3,7 @@ import type { AccountInfoArgs, AccountInfoProvider, HealthCheckResponse, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createAccountInfoProvider as mn } from "../mina-node" import type { ProviderConfig } from "./types" diff --git a/packages/providers/src/unified-providers/chain-history-provider.ts b/packages/providers/src/unified-providers/chain-history-provider.ts index 961759cc..193675d3 100644 --- a/packages/providers/src/unified-providers/chain-history-provider.ts +++ b/packages/providers/src/unified-providers/chain-history-provider.ts @@ -4,7 +4,7 @@ import type { TransactionsByAddressesArgs, TransactionsByHashesArgs, Tx, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createChainHistoryProvider as ms } from "../blockberry-provider" import { createChainHistoryProvider as zs } from "../zeko-scan" diff --git a/packages/providers/src/unified-providers/node-status-provider.ts b/packages/providers/src/unified-providers/node-status-provider.ts index 1e2f9ba8..9adac7a7 100644 --- a/packages/providers/src/unified-providers/node-status-provider.ts +++ b/packages/providers/src/unified-providers/node-status-provider.ts @@ -2,7 +2,7 @@ import type { HealthCheckResponse, NodeStatus, NodeStatusProvider, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createNodeStatusProvider as mn } from "../mina-node" import type { ProviderConfig } from "./types" diff --git a/packages/providers/src/unified-providers/unified-provider.ts b/packages/providers/src/unified-providers/unified-provider.ts index 771e7a3c..25fa9db9 100644 --- a/packages/providers/src/unified-providers/unified-provider.ts +++ b/packages/providers/src/unified-providers/unified-provider.ts @@ -5,7 +5,7 @@ import type { TransactionsByAddressesArgs, Tx, UnifiedChainProviderType, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" import { createAccountInfoProvider } from "./account-info-provider" import { createChainHistoryProvider } from "./chain-history-provider" diff --git a/packages/providers/src/zeko-scan/chain-history/chain-history-provider.ts b/packages/providers/src/zeko-scan/chain-history/chain-history-provider.ts index 514ddd9a..9ded1260 100644 --- a/packages/providers/src/zeko-scan/chain-history/chain-history-provider.ts +++ b/packages/providers/src/zeko-scan/chain-history/chain-history-provider.ts @@ -1,9 +1,9 @@ -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import type { ChainHistoryProvider, TransactionsByAddressesArgs, Tx, -} from "@palladxyz/pallad-core" +} from "@palladco/pallad-core" const convertToTransactionBody = ( data: any[], diff --git a/packages/providers/test/blockberry/chain-history-provider.test.ts b/packages/providers/test/blockberry/chain-history-provider.test.ts index f1f75248..db02d0db 100644 --- a/packages/providers/test/blockberry/chain-history-provider.test.ts +++ b/packages/providers/test/blockberry/chain-history-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { Blockberry } from "../../src" diff --git a/packages/providers/test/mina-node/l1-mina-node/individual-providers/account-info-provider.test.ts b/packages/providers/test/mina-node/l1-mina-node/individual-providers/account-info-provider.test.ts index 0df31a0e..576c1289 100644 --- a/packages/providers/test/mina-node/l1-mina-node/individual-providers/account-info-provider.test.ts +++ b/packages/providers/test/mina-node/l1-mina-node/individual-providers/account-info-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { TokenIdMap } from "@palladxyz/mina-core" +import type { TokenIdMap } from "@palladco/mina-core" import { MinaNode } from "../../../../src" diff --git a/packages/providers/test/mina-node/l1-mina-node/individual-providers/chain-history-provider.test.ts b/packages/providers/test/mina-node/l1-mina-node/individual-providers/chain-history-provider.test.ts index 73ee1667..0867a6ca 100644 --- a/packages/providers/test/mina-node/l1-mina-node/individual-providers/chain-history-provider.test.ts +++ b/packages/providers/test/mina-node/l1-mina-node/individual-providers/chain-history-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { MinaNode } from "../../../../src" const nodeUrl = diff --git a/packages/providers/test/mina-node/l1-mina-node/individual-providers/submit-tx-provider.test.ts b/packages/providers/test/mina-node/l1-mina-node/individual-providers/submit-tx-provider.test.ts index c6e6080b..3cde1675 100644 --- a/packages/providers/test/mina-node/l1-mina-node/individual-providers/submit-tx-provider.test.ts +++ b/packages/providers/test/mina-node/l1-mina-node/individual-providers/submit-tx-provider.test.ts @@ -6,9 +6,9 @@ import { type FromBip39MnemonicWordsProps, InMemoryKeyAgent, type MinaSpecificArgs, -} from "@palladxyz/key-management" -import { Mina, type TokenIdMap } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +} from "@palladco/key-management" +import { Mina, type TokenIdMap } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import type { Payment, SignedLegacy, diff --git a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/account-info-provider.test.ts b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/account-info-provider.test.ts index 50cc6afc..c867ce46 100644 --- a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/account-info-provider.test.ts +++ b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/account-info-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { TokenIdMap } from "@palladxyz/mina-core" +import type { TokenIdMap } from "@palladco/mina-core" import { MinaNode } from "../../../../src" const nodeUrl = process.env.NODE_URL || "https://devnet.zeko.io/graphql" diff --git a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/submit-tx-provider.test.ts b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/submit-tx-provider.test.ts index 75d32ff3..b37a2258 100644 --- a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/submit-tx-provider.test.ts +++ b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/submit-tx-provider.test.ts @@ -6,9 +6,9 @@ import { type GroupedCredentials, InMemoryKeyAgent, type MinaSpecificArgs, -} from "@palladxyz/key-management" -import { type AccountInfo, Mina, type TokenIdMap } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +} from "@palladco/key-management" +import { type AccountInfo, Mina, type TokenIdMap } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import type { Payment, SignedLegacy, diff --git a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/util.ts b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/util.ts index c7c1f2e6..9aac9106 100644 --- a/packages/providers/test/mina-node/zeko-sequencer/individual-providers/util.ts +++ b/packages/providers/test/mina-node/zeko-sequencer/individual-providers/util.ts @@ -1,4 +1,4 @@ -import { Mina } from "@palladxyz/mina-core" +import { Mina } from "@palladco/mina-core" import Client from "mina-signer" import type { Payment, diff --git a/packages/providers/test/unified-providers/individual-providers/account-info-provider.test.ts b/packages/providers/test/unified-providers/individual-providers/account-info-provider.test.ts index 369dc544..5266fd8b 100644 --- a/packages/providers/test/unified-providers/individual-providers/account-info-provider.test.ts +++ b/packages/providers/test/unified-providers/individual-providers/account-info-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { TokenIdMap } from "@palladxyz/mina-core" +import type { TokenIdMap } from "@palladco/mina-core" import { type ProviderConfig, createAccountInfoProvider } from "../../../src" diff --git a/packages/providers/test/unified-providers/individual-providers/chain-history-provider.test.ts b/packages/providers/test/unified-providers/individual-providers/chain-history-provider.test.ts index dc7c0da9..fc59ab80 100644 --- a/packages/providers/test/unified-providers/individual-providers/chain-history-provider.test.ts +++ b/packages/providers/test/unified-providers/individual-providers/chain-history-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { type ProviderConfig, createChainHistoryProvider } from "../../../src" diff --git a/packages/providers/test/unified-providers/unified-provider.test.ts b/packages/providers/test/unified-providers/unified-provider.test.ts index 78f8a7c1..0ba46bc2 100644 --- a/packages/providers/test/unified-providers/unified-provider.test.ts +++ b/packages/providers/test/unified-providers/unified-provider.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { TokenIdMap } from "@palladxyz/mina-core" -import type { Tx } from "@palladxyz/pallad-core" +import type { TokenIdMap } from "@palladco/mina-core" +import type { Tx } from "@palladco/pallad-core" import { type ProviderConfig, createChainProvider } from "../../src" diff --git a/packages/providers/test/zeko-scan/chain-history-provider.test.ts b/packages/providers/test/zeko-scan/chain-history-provider.test.ts index 6128936f..2f0181d7 100644 --- a/packages/providers/test/zeko-scan/chain-history-provider.test.ts +++ b/packages/providers/test/zeko-scan/chain-history-provider.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { Mina } from "@palladxyz/mina-core" +import type { Mina } from "@palladco/mina-core" import { ZekoScan } from "../../src" diff --git a/packages/providers/tsconfig.json b/packages/providers/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/providers/tsconfig.json +++ b/packages/providers/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/providers/tsup.config.ts b/packages/providers/tsup.config.ts index 3d31da11..0673190e 100644 --- a/packages/providers/tsup.config.ts +++ b/packages/providers/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { polyfillNode } from "esbuild-plugin-polyfill-node" import { defineConfig } from "tsup" diff --git a/packages/util/README.md b/packages/util/README.md index d3381be1..f54b84ff 100644 --- a/packages/util/README.md +++ b/packages/util/README.md @@ -1,3 +1,3 @@ -# @palladxyz/util +# @palladco/util This TypeScript library provides util functions for other Pallad SDK packages. diff --git a/packages/util/package.json b/packages/util/package.json index 9647b9a0..f88dfd3d 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/util", + "name": "@palladco/util", "version": "0.0.1", "type": "module", "description": "Util Package SDK for Pallad", @@ -18,13 +18,9 @@ "cleanup": "bunx --bun rimraf node_modules dist .turbo" }, "dependencies": { - "bs58check": "4.0.0", - "buffer": "6.0.3", - "mina-signer": "3.0.7", "ts-custom-error": "3.3.1" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/secp256k1": "4.0.6" + "@palladco/common": "workspace:*" } } diff --git a/packages/util/tsconfig.json b/packages/util/tsconfig.json index f4e2e06e..ffab31d1 100644 --- a/packages/util/tsconfig.json +++ b/packages/util/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@palladxyz/common/tsconfig.json" + "extends": "@palladco/common/tsconfig.json" } diff --git a/packages/util/tsup.config.ts b/packages/util/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/util/tsup.config.ts +++ b/packages/util/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/vault/README.md b/packages/vault/README.md index 87da0c59..1e8c014f 100644 --- a/packages/vault/README.md +++ b/packages/vault/README.md @@ -1,12 +1,12 @@ -# @palladxyz/vault +# @palladco/vault ## Introduction -The `@palladxyz/vault` package offers a robust solution for managing key agents, credentials, and accounts within the wallet. +The `@palladco/vault` package offers a robust solution for managing key agents, credentials, and accounts within the wallet. ## `useVault`: Central Interface for Wallet Management -The `useVault` hook is the core interface of the `@palladxyz/vault` package, encapsulating the functionalities of account, credential, and key agent management in an integrated manner. It utilizes `zustand` for state management and `immer` for immutable state updates. +The `useVault` hook is the core interface of the `@palladco/vault` package, encapsulating the functionalities of account, credential, and key agent management in an integrated manner. It utilizes `zustand` for state management and `immer` for immutable state updates. ## Features @@ -17,8 +17,8 @@ The `useVault` hook is the core interface of the `@palladxyz/vault` package, enc ## Example Usage ```ts -import { useVault } from '@palladxyz/vault'; -import { Network } from '@palladxyz/key-management'; +import { useVault } from '@palladco/vault'; +import { Network } from '@palladco/key-management'; // Example usage within a component or function const MyComponent = () => { diff --git a/packages/vault/package.json b/packages/vault/package.json index 01904957..a8a8da49 100644 --- a/packages/vault/package.json +++ b/packages/vault/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/vault", + "name": "@palladco/vault", "version": "0.0.1", "type": "module", "description": "A Vault for the Mina Wallet Package for Pallad", @@ -20,27 +20,20 @@ "dependencies": { "@mina-js/klesia-sdk": "https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@a51d3b4", "@noble/hashes": "1.4.0", - "@palladxyz/key-management": "workspace:*", - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/pallad-core": "workspace:*", - "@palladxyz/providers": "workspace:*", - "@palladxyz/util": "workspace:*", + "@palladco/key-management": "workspace:*", + "@palladco/mina-core": "workspace:*", + "@palladco/pallad-core": "workspace:*", + "@palladco/providers": "workspace:*", + "@palladco/util": "workspace:*", "@plasmohq/storage": "1.11.0", - "bs58check": "4.0.0", - "buffer": "6.0.3", "dayjs": "1.11.12", "immer": "10.1.1", - "rambda": "9.2.1", - "redux-logger": "3.0.6", "superjson": "2.2.1", "unique-names-generator": "4.7.1", "zustand": "4.5.4" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/secp256k1": "4.0.6", - "mina-signer": "3.0.7", - "msw": "2.3.4", + "@palladco/common": "workspace:*", "vite": "5.3.5" } } diff --git a/packages/vault/src/account/accountState.ts b/packages/vault/src/account/accountState.ts index e2c55920..685ea003 100644 --- a/packages/vault/src/account/accountState.ts +++ b/packages/vault/src/account/accountState.ts @@ -1,5 +1,5 @@ -import type { ChainAddress } from "@palladxyz/key-management" -import type { AccountInfo, Tx } from "@palladxyz/pallad-core" +import type { ChainAddress } from "@palladco/key-management" +import type { AccountInfo, Tx } from "@palladco/pallad-core" export type SingleAccountState = { accountInfo: Record diff --git a/packages/vault/src/credentials/credentialsState.ts b/packages/vault/src/credentials/credentialsState.ts index 922cba78..64f29614 100644 --- a/packages/vault/src/credentials/credentialsState.ts +++ b/packages/vault/src/credentials/credentialsState.ts @@ -2,7 +2,7 @@ * @file Represents the state definitions related to credentials specific to keyAgents & accounts. */ -import type { GroupedCredentials } from "@palladxyz/key-management" +import type { GroupedCredentials } from "@palladco/key-management" import type { KeyAgentName } from "../keyAgent" import type { SearchQuery } from "../utils/utils" diff --git a/packages/vault/src/keyAgent/README.md b/packages/vault/src/keyAgent/README.md index a64e396d..183a7b40 100644 --- a/packages/vault/src/keyAgent/README.md +++ b/packages/vault/src/keyAgent/README.md @@ -1,6 +1,6 @@ # Key Agent Store -This TypeScript module provides a state management store for cryptographic key agents using Zustand, Immer, and the `@palladxyz/key-management` package. It is the key agent store for Pallad and it offers a robust set of functionalities to manage key agents securely in memory. +This TypeScript module provides a state management store for cryptographic key agents using Zustand, Immer, and the `@palladco/key-management` package. It is the key agent store for Pallad and it offers a robust set of functionalities to manage key agents securely in memory. ## Key Files - `key-agent-store.ts`: Contains the core logic for the Zustand store slice managing the state of key agents. @@ -35,4 +35,4 @@ useStore.getState().initialiseKeyAgent("myKeyAgent", KeyAgents.InMemory, { mnemonicWords, getPassphrase: async () => "yourSecurePassphrase" }); -``` \ No newline at end of file +``` diff --git a/packages/vault/src/keyAgent/keyAgentState.ts b/packages/vault/src/keyAgent/keyAgentState.ts index 19a06062..bdaa50be 100644 --- a/packages/vault/src/keyAgent/keyAgentState.ts +++ b/packages/vault/src/keyAgent/keyAgentState.ts @@ -12,7 +12,7 @@ import type { GroupedCredentials, InMemoryKeyAgent, SerializableInMemoryKeyAgentData, -} from "@palladxyz/key-management" +} from "@palladco/key-management" export type KeyAgentName = string export enum KeyAgents { diff --git a/packages/vault/src/keyAgent/keyAgentStore.ts b/packages/vault/src/keyAgent/keyAgentStore.ts index cf9f9020..04e17f3f 100644 --- a/packages/vault/src/keyAgent/keyAgentStore.ts +++ b/packages/vault/src/keyAgent/keyAgentStore.ts @@ -1,7 +1,7 @@ import { type FromBip39MnemonicWordsProps, InMemoryKeyAgent, -} from "@palladxyz/key-management" +} from "@palladco/key-management" import { produce } from "immer" import type { StateCreator } from "zustand" diff --git a/packages/vault/src/lib/utils.ts b/packages/vault/src/lib/utils.ts index 8d56f53d..9c0ac276 100644 --- a/packages/vault/src/lib/utils.ts +++ b/packages/vault/src/lib/utils.ts @@ -1,4 +1,4 @@ -import type { CredentialName } from "@palladxyz/vault" +import type { CredentialName } from "@palladco/vault" import { type Config, adjectives, diff --git a/packages/vault/src/network-info/default.ts b/packages/vault/src/network-info/default.ts index 184097fc..8a47acf8 100644 --- a/packages/vault/src/network-info/default.ts +++ b/packages/vault/src/network-info/default.ts @@ -1,4 +1,4 @@ -import type { ProviderConfig } from "@palladxyz/providers" +import type { ProviderConfig } from "@palladco/providers" import type { NetworkId } from "./network-info-state" diff --git a/packages/vault/src/network-info/network-info-state.ts b/packages/vault/src/network-info/network-info-state.ts index 7271190d..91428807 100644 --- a/packages/vault/src/network-info/network-info-state.ts +++ b/packages/vault/src/network-info/network-info-state.ts @@ -3,7 +3,7 @@ * @typedef {Object} NetworkInfoStore */ -import type { ProviderConfig } from "@palladxyz/providers" +import type { ProviderConfig } from "@palladco/providers" export type NetworkId = string diff --git a/packages/vault/src/vault/utils/get-wallet-account-info.ts b/packages/vault/src/vault/utils/get-wallet-account-info.ts index d767edf9..684c8fc7 100644 --- a/packages/vault/src/vault/utils/get-wallet-account-info.ts +++ b/packages/vault/src/vault/utils/get-wallet-account-info.ts @@ -1,5 +1,5 @@ -import type { GroupedCredentials } from "@palladxyz/key-management" -import type { Network } from "@palladxyz/pallad-core" +import type { GroupedCredentials } from "@palladco/key-management" +import type { Network } from "@palladco/pallad-core" import type { SingleCredentialState } from "../../credentials" import { NetworkError, WalletError } from "../../lib/Errors" diff --git a/packages/vault/src/vault/utils/get-wallet-transactions.ts b/packages/vault/src/vault/utils/get-wallet-transactions.ts index 6b2c737c..de25fc9f 100644 --- a/packages/vault/src/vault/utils/get-wallet-transactions.ts +++ b/packages/vault/src/vault/utils/get-wallet-transactions.ts @@ -1,4 +1,4 @@ -import type { GroupedCredentials } from "@palladxyz/key-management" +import type { GroupedCredentials } from "@palladco/key-management" import { AddressError, NetworkError, WalletError } from "../../lib/Errors" diff --git a/packages/vault/src/vault/utils/restore-wallet.ts b/packages/vault/src/vault/utils/restore-wallet.ts index adbf0f9a..0b973a90 100644 --- a/packages/vault/src/vault/utils/restore-wallet.ts +++ b/packages/vault/src/vault/utils/restore-wallet.ts @@ -1,8 +1,8 @@ import type { ChainDerivationArgs, FromBip39MnemonicWordsProps, -} from "@palladxyz/key-management" -import { createChainProvider } from "@palladxyz/providers" +} from "@palladco/key-management" +import { createChainProvider } from "@palladco/providers" import type { CredentialName, SingleCredentialState } from "../../credentials" import type { KeyAgentName, KeyAgents } from "../../keyAgent" diff --git a/packages/vault/src/vault/utils/sign.ts b/packages/vault/src/vault/utils/sign.ts index 18614f30..87d92437 100644 --- a/packages/vault/src/vault/utils/sign.ts +++ b/packages/vault/src/vault/utils/sign.ts @@ -4,7 +4,7 @@ import type { GetPassphrase, GroupedCredentials, InMemoryKeyAgent, -} from "@palladxyz/key-management" +} from "@palladco/key-management" import { WalletError } from "../../lib/Errors" diff --git a/packages/vault/src/vault/utils/sync-account-info.ts b/packages/vault/src/vault/utils/sync-account-info.ts index ce566353..6a5c358c 100644 --- a/packages/vault/src/vault/utils/sync-account-info.ts +++ b/packages/vault/src/vault/utils/sync-account-info.ts @@ -1,4 +1,4 @@ -import { type ProviderConfig, createChainProvider } from "@palladxyz/providers" +import { type ProviderConfig, createChainProvider } from "@palladco/providers" export async function syncAccountHelper( get: any, diff --git a/packages/vault/src/vault/utils/sync-transactions.ts b/packages/vault/src/vault/utils/sync-transactions.ts index bb83d040..b36ebdee 100644 --- a/packages/vault/src/vault/utils/sync-transactions.ts +++ b/packages/vault/src/vault/utils/sync-transactions.ts @@ -1,5 +1,5 @@ -import type { Tx } from "@palladxyz/pallad-core" -import { type ProviderConfig, createChainProvider } from "@palladxyz/providers" +import type { Tx } from "@palladco/pallad-core" +import { type ProviderConfig, createChainProvider } from "@palladco/providers" export async function syncTransactionHelper( get: any, diff --git a/packages/vault/src/vault/utils/sync-wallet.ts b/packages/vault/src/vault/utils/sync-wallet.ts index 2e2cf83f..ce279d6d 100644 --- a/packages/vault/src/vault/utils/sync-wallet.ts +++ b/packages/vault/src/vault/utils/sync-wallet.ts @@ -1,5 +1,5 @@ -import { createChainProvider } from "@palladxyz/providers" -import type { ProviderConfig } from "@palladxyz/providers" +import { createChainProvider } from "@palladco/providers" +import type { ProviderConfig } from "@palladco/providers" import { AddressError } from "../../lib/Errors" diff --git a/packages/vault/src/vault/vaultState.ts b/packages/vault/src/vault/vaultState.ts index fb9c4fb6..8002dbe0 100644 --- a/packages/vault/src/vault/vaultState.ts +++ b/packages/vault/src/vault/vaultState.ts @@ -4,15 +4,15 @@ import type { ChainOperationArgs, ChainSignablePayload, FromBip39MnemonicWordsProps, -} from "@palladxyz/key-management" -import type { GetPassphrase } from "@palladxyz/key-management" +} from "@palladco/key-management" +import type { GetPassphrase } from "@palladco/key-management" import type { AccountInfo, Network, SubmitTxArgs, Tx, -} from "@palladxyz/pallad-core" -import type { ProviderConfig } from "@palladxyz/providers" +} from "@palladco/pallad-core" +import type { ProviderConfig } from "@palladco/providers" import type { TransactionBody } from "@mina-js/utils" import type { diff --git a/packages/vault/src/vault/vaultStore.ts b/packages/vault/src/vault/vaultStore.ts index b244de2a..b37a1a06 100644 --- a/packages/vault/src/vault/vaultStore.ts +++ b/packages/vault/src/vault/vaultStore.ts @@ -1,5 +1,5 @@ -import { generateMnemonicWords } from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" +import { generateMnemonicWords } from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" import { produce } from "immer" import { create } from "zustand" import { createJSONStorage, persist } from "zustand/middleware" diff --git a/packages/vault/test/account/accountStore.test.ts b/packages/vault/test/account/accountStore.test.ts index ba373509..cbba9b43 100644 --- a/packages/vault/test/account/accountStore.test.ts +++ b/packages/vault/test/account/accountStore.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from "bun:test" -import { type AccountInfo, Mina } from "@palladxyz/mina-core" +import { type AccountInfo, Mina } from "@palladco/mina-core" import { act, renderHook } from "@testing-library/react" import { initialSingleAccountState } from "../../src" diff --git a/packages/vault/test/credentials/credentialsStore.test.ts b/packages/vault/test/credentials/credentialsStore.test.ts index f52b5068..74edbdba 100644 --- a/packages/vault/test/credentials/credentialsStore.test.ts +++ b/packages/vault/test/credentials/credentialsStore.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { GroupedCredentials } from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" +import type { GroupedCredentials } from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" import { act, renderHook } from "@testing-library/react" import { diff --git a/packages/vault/test/keyAgent/keyAgentStore.test.ts b/packages/vault/test/keyAgent/keyAgentStore.test.ts index 63aea268..8b4350d0 100644 --- a/packages/vault/test/keyAgent/keyAgentStore.test.ts +++ b/packages/vault/test/keyAgent/keyAgentStore.test.ts @@ -1,15 +1,15 @@ import { afterEach, beforeEach, describe, expect, it } from "bun:test" import { utf8ToBytes } from "@noble/hashes/utils" -import { mnemonic } from "@palladxyz/common" +import { mnemonic } from "@palladco/common" import { type ChainOperationArgs, type FromBip39MnemonicWordsProps, type GroupedCredentials, type MinaDerivationArgs, generateMnemonicWords, -} from "@palladxyz/key-management" -import type { Mina } from "@palladxyz/mina-core" -import { Network } from "@palladxyz/pallad-core" +} from "@palladco/key-management" +import type { Mina } from "@palladco/mina-core" +import { Network } from "@palladco/pallad-core" import { act, renderHook } from "@testing-library/react" import { KeyAgents } from "../../src" diff --git a/packages/vault/test/objects/objectsStore.test.ts b/packages/vault/test/objects/objectsStore.test.ts index 3972cc41..f3ca8f2f 100644 --- a/packages/vault/test/objects/objectsStore.test.ts +++ b/packages/vault/test/objects/objectsStore.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it } from "bun:test" -import type { GroupedCredentials } from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" +import type { GroupedCredentials } from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" import { act, renderHook } from "@testing-library/react" import type { Json } from "@mina-js/utils" diff --git a/packages/vault/test/wallet/walletFlow.test.ts b/packages/vault/test/wallet/walletFlow.test.ts index 08556692..9290f9f3 100644 --- a/packages/vault/test/wallet/walletFlow.test.ts +++ b/packages/vault/test/wallet/walletFlow.test.ts @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, it } from "bun:test" import { utf8ToBytes } from "@noble/hashes/utils" -import { mnemonic } from "@palladxyz/common" +import { mnemonic } from "@palladco/common" import type { ChainDerivationArgs, FromBip39MnemonicWordsProps, -} from "@palladxyz/key-management" -import { Network } from "@palladxyz/pallad-core" +} from "@palladco/key-management" +import { Network } from "@palladco/pallad-core" import { act, renderHook } from "@testing-library/react" import { type CredentialName, KeyAgents } from "../../src" diff --git a/packages/vault/tsconfig.json b/packages/vault/tsconfig.json index 83805819..e0cdff40 100644 --- a/packages/vault/tsconfig.json +++ b/packages/vault/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@palladxyz/common/tsconfig.json", + "extends": "@palladco/common/tsconfig.json", "compilerOptions": { "target": "esnext", "module": "esnext", diff --git a/packages/vault/tsup.config.ts b/packages/vault/tsup.config.ts index 639c8868..6a7ed6fa 100644 --- a/packages/vault/tsup.config.ts +++ b/packages/vault/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" diff --git a/packages/web-provider/README.md b/packages/web-provider/README.md index 6ae83cf2..d4763389 100644 --- a/packages/web-provider/README.md +++ b/packages/web-provider/README.md @@ -1,4 +1,4 @@ -# @palladxyz/web-extension +# @palladco/web-extension 🚧 This package is a WIP & implementation of RFC-0008/-0009 🚧 @@ -8,7 +8,7 @@ This is a typescript package that allows applications to interact with the walle ## Implementation & Testing -For implementation of this package, you should investigate the `apps/extension` folder. In there you can view the background script, the injected script, and the content script together allow Pallad to interact with applications. See the e2e tests for a good test suite of this provider's implementation. +For implementation of this package, you should investigate the `apps/extension` folder. In there you can view the background script, the injected script, and the content script together allow Pallad to interact with applications. See the e2e tests for a good test suite of this provider's implementation. ## Current Design diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index 0cd9d7e6..eafa765b 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -1,5 +1,5 @@ { - "name": "@palladxyz/web-provider", + "name": "@palladco/web-provider", "version": "0.0.1", "type": "module", "description": "A web-provider for Mina wallets", @@ -20,24 +20,18 @@ "@mina-js/klesia-sdk": "https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@a51d3b4", "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@a51d3b4", "@noble/hashes": "1.4.0", - "@palladxyz/key-management": "workspace:*", - "@palladxyz/mina-core": "workspace:*", - "@palladxyz/providers": "workspace:*", - "@palladxyz/vault": "workspace:*", + "@palladco/key-management": "workspace:*", + "@palladco/mina-core": "workspace:*", + "@palladco/providers": "workspace:*", + "@palladco/vault": "workspace:*", "dayjs": "1.11.12", - "eventemitter3": "5.0.1", "mina-signer": "3.0.7", "mitt": "3.0.1", - "superjson": "2.2.1", "ts-pattern": "5.5.0", - "webext-bridge": "6.0.1", - "webextension-polyfill": "0.12.0", "zod": "3.23.8" }, "devDependencies": { - "@palladxyz/common": "workspace:*", - "@types/chrome": "0.0.269", - "@types/webextension-polyfill": "0.10.7", - "type-fest": "4.23.0" + "@palladco/common": "workspace:*", + "@types/chrome": "0.0.269" } } diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 9a72729d..e5d25a2c 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -12,8 +12,8 @@ import { utf8ToBytes } from "@noble/hashes/utils" import type { ChainOperationArgs, ChainSignablePayload, -} from "@palladxyz/key-management" -import type { SearchQuery } from "@palladxyz/vault" +} from "@palladco/key-management" +import type { SearchQuery } from "@palladco/vault" import mitt from "mitt" import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" diff --git a/packages/web-provider/src/mina-network/utils.ts b/packages/web-provider/src/mina-network/utils.ts index 28c725b6..45878487 100644 --- a/packages/web-provider/src/mina-network/utils.ts +++ b/packages/web-provider/src/mina-network/utils.ts @@ -1,5 +1,5 @@ -import type { MinaSignablePayload } from "@palladxyz/key-management" -import type { BorrowedTypes } from "@palladxyz/mina-core" +import type { MinaSignablePayload } from "@palladco/key-management" +import type { BorrowedTypes } from "@palladco/mina-core" export const serializeField = (field: BorrowedTypes.Field) => { if (typeof field === "bigint" || typeof field === "number") { diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index e7c45d24..e5918bff 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -2,11 +2,11 @@ import type { ChainOperationArgs, ChainSignablePayload, GetPassphrase, -} from "@palladxyz/key-management" +} from "@palladco/key-management" import type { Json, Sendable } from "@mina-js/utils" -import type { ProviderConfig } from "@palladxyz/providers" -import type { SearchQuery, StoredObject } from "@palladxyz/vault" +import type { ProviderConfig } from "@palladco/providers" +import type { SearchQuery, StoredObject } from "@palladco/vault" export interface IVaultService { getAccounts(): Promise diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index 7607c58e..3072334d 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -1,9 +1,9 @@ import { createClient } from "@mina-js/klesia-sdk" -import type { ChainOperationArgs } from "@palladxyz/key-management" -import type { ProviderConfig } from "@palladxyz/providers" -import { securePersistence, sessionPersistence } from "@palladxyz/vault" -import { usePendingTransactionStore } from "@palladxyz/vault" -import { useVault } from "@palladxyz/vault" +import type { ChainOperationArgs } from "@palladco/key-management" +import type { ProviderConfig } from "@palladco/providers" +import { securePersistence, sessionPersistence } from "@palladco/vault" +import { usePendingTransactionStore } from "@palladco/vault" +import { useVault } from "@palladco/vault" import dayjs from "dayjs" import Client from "mina-signer" diff --git a/packages/web-provider/tsconfig.json b/packages/web-provider/tsconfig.json index 7d1358d6..6fc060ac 100644 --- a/packages/web-provider/tsconfig.json +++ b/packages/web-provider/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@palladxyz/common/tsconfig.json", + "extends": "@palladco/common/tsconfig.json", "compilerOptions": { "types": ["@types/chrome"] } diff --git a/packages/web-provider/tsup.config.ts b/packages/web-provider/tsup.config.ts index 8449a56d..3325517c 100644 --- a/packages/web-provider/tsup.config.ts +++ b/packages/web-provider/tsup.config.ts @@ -1,4 +1,4 @@ -import { baseTsupConfig } from "@palladxyz/common" +import { baseTsupConfig } from "@palladco/common" import { defineConfig } from "tsup" import packageJson from "./package.json" From ab88eb017f51b73d8e87091df1723384de70002c Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Sat, 9 Nov 2024 11:00:57 +0100 Subject: [PATCH 08/87] feat(extension): add contract to showUserPrompt --- apps/extension/src/sandbox/index.ts | 24 ++++-- bun.lockb | Bin 558856 -> 559168 bytes packages/features/package.json | 2 +- .../web-connector/routes/web-connector.tsx | 75 ++++++++++++++++-- .../src/web-connector/views/web-connector.tsx | 24 ------ .../src/mina-network/mina-provider.ts | 2 + packages/web-provider/src/utils/prompts.ts | 3 + 7 files changed, 92 insertions(+), 38 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index e578a426..e62a6518 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,11 +1,25 @@ import { Add } from "@palladco/contracts" import { match } from "ts-pattern" +import { z } from "zod" + +const EventTypeSchema = z.enum(["run"]) +const ContractTypeSchema = z.enum(["add"]) window.addEventListener("message", async (event) => { - return match(event.data.type) - .with("compile", async () => { - await Add.compile() - window.parent.postMessage({ type: "compiled" }, "*") + // Can also read: payload, form + console.log(event.data) + console.log(event.data.userInput) + const type = EventTypeSchema.parse(event.data.type) + const contract = ContractTypeSchema.parse(event.data.contract) + return match(type) + .with("run", async () => { + return match(contract).with("add", async () => { + await Add.compile() + window.parent.postMessage( + { type: "compiled", result: "test", userInput: event.data.userInput }, + "*", + ) + }) }) - .run() + .exhaustive() }) diff --git a/bun.lockb b/bun.lockb index 3bc627a35ad386558fb104bbf17055915e8825e6..8b66a88b2854b2efc69f21c155203c0489262da1 100755 GIT binary patch delta 47158 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
tYlI;c!M$3rGJ4-r=*TkS`|D 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 delta 46962 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 diff --git a/packages/features/package.json b/packages/features/package.json index 44a8268f..29641716 100644 --- a/packages/features/package.json +++ b/packages/features/package.json @@ -69,7 +69,7 @@ "webext-bridge": "6.0.1", "webextension-polyfill": "0.12.0", "xss": "1.0.15", - "yaml": "2.5.0", + "yaml": "2.6.0", "zustand": "4.5.4" }, "devDependencies": { diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 6d1dc230..0d6ff927 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -1,3 +1,4 @@ +import type { Json } from "@mina-js/utils" import { useEffect, useState } from "react" import type { SubmitHandler } from "react-hook-form" import { MemoryRouter } from "react-router-dom" @@ -14,36 +15,78 @@ const sanitizePayload = async (payload: string) => { return xss(yamlPayload) } +const sendSandboxMessage = (payload: Json) => { + const sandbox = document.querySelector( + "#o1sandbox", + ) as HTMLIFrameElement | null + if (!sandbox) return + return sandbox.contentWindow?.postMessage(payload, "*") +} + type ActionRequest = { title: string submitButtonLabel?: string rejectButtonLabel?: string payload: string inputType: "text" | "password" | "confirmation" - loading: boolean + contract: string | undefined emitConnected: boolean } export const WebConnectorRoute = () => { + const [loading, setLoading] = useState(true) const [request, setRequest] = useState({ title: "", payload: "", inputType: "confirmation", - loading: true, + contract: undefined, emitConnected: false, }) - const onSubmit: SubmitHandler = async ({ userInput }) => { + const startSubmitting: SubmitHandler = async ({ + userInput, + }) => { + if (!request.contract) return onSubmit({ userInput }) + setLoading(true) + try { + return sendSandboxMessage({ + type: "run", + contract: request.contract, + payload: request.payload, + userInput, + }) + } finally { + setLoading(false) + } + } + const onSubmit: SubmitHandler< + UserInputForm & { contractResult?: Json } + > = async ({ userInput, contractResult }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ userInput, + contractResult, windowId: id, }) window.close() } - const confirm = async () => { + const startConfirming = async () => { + if (!request.contract) return confirm({}) + setLoading(true) + try { + return sendSandboxMessage({ + type: "run", + contract: request.contract, + payload: request.payload, + }) + } finally { + setLoading(false) + } + } + const confirm = async ({ contractResult }: { contractResult?: Json }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ userConfirmed: true, + contractResult, windowId: id, }) if (request.emitConnected) { @@ -67,6 +110,21 @@ export const WebConnectorRoute = () => { }) window.close() } + const eventListener = (event: MessageEvent) => { + if (request.inputType === "confirmation") + return confirm({ contractResult: event.data.result }) + return onSubmit({ + userInput: event.data.userInput, + contractResult: event.data.result, + }) + } + // biome-ignore lint/correctness/useExhaustiveDependencies: wontdo + useEffect(() => { + window.addEventListener("message", eventListener) + return () => { + window.removeEventListener("message", eventListener) + } + }, []) useEffect(() => { runtime.onMessage.addListener(async (message) => { if (message.type === "action_request") { @@ -75,10 +133,11 @@ export const WebConnectorRoute = () => { submitButtonLabel: message.params.submitButtonLabel, rejectButtonLabel: message.params.rejectButtonLabel, payload: await sanitizePayload(message.params.payload), + contract: message.params.contract, inputType: message.params.inputType, - loading: false, emitConnected: message.params.emitConnected, }) + setLoading(false) } }) }, []) @@ -86,15 +145,15 @@ export const WebConnectorRoute = () => { ) diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 38dc2bb3..8e94110c 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -1,7 +1,6 @@ import { AppLayout } from "@/components/app-layout" import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" -import { useEffect } from "react" import type { SubmitHandler } from "react-hook-form" import { ConfirmationForm } from "../components/confirmation-form" import { InputForm } from "../components/input-form" @@ -20,10 +19,6 @@ type WebConnectorViewProps = { loading: boolean } -const eventListener = (event: MessageEvent) => { - console.log(">>>P_EVENT", event.data) -} - export const WebConnectorView = ({ title, payload, @@ -40,29 +35,10 @@ export const WebConnectorView = ({ onReject() onDecline() } - const compileAdd = async () => { - const sandbox = document.querySelector( - "#o1sandbox", - ) as HTMLIFrameElement | null - if (!sandbox) return - sandbox.contentWindow?.postMessage( - { type: "compile", payload: payload }, - "*", - ) - } - useEffect(() => { - window.addEventListener("message", eventListener) - return () => { - window.removeEventListener("message", eventListener) - } - }, []) return (
-
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index e5d25a2c..9e3c82f9 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -183,6 +183,8 @@ export const createMinaProvider = async (): Promise< async (signatureRequest) => { const passphrase = await showUserPrompt({ inputType: "password", + // TODO: Testing only + contract: "add", metadata: { title: "Signature request", payload: JSON.stringify(signatureRequest.params), diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 107f30ea..428b5d98 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -9,10 +9,12 @@ type Metadata = { export const showUserPrompt = async ({ inputType, metadata, + contract, emitConnected = false, }: { inputType: InputType metadata: Metadata + contract?: string emitConnected?: boolean }): Promise => { return new Promise((resolve, reject) => { @@ -53,6 +55,7 @@ export const showUserPrompt = async ({ rejectButtonLabel: metadata.rejectButtonLabel, payload: metadata.payload ?? "{}", inputType, + contract, emitConnected, }, }) From 60be17481d3a5704022d85b615f8063562b92fb5 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Sat, 9 Nov 2024 17:28:01 +0100 Subject: [PATCH 09/87] chore(private-credential)(wip): sandbox --- apps/extension/manifest.ts | 15 ++- apps/extension/sandbox.html | 20 ++++ .../handlers/credential-validator.ts | 16 ++++ .../src/background/handlers/index.ts | 1 + apps/extension/src/background/index.ts | 23 ++++- .../src/credential-sandbox/index.tsx | 5 - .../src/credential-sandbox/sandbox.tsx | 61 ------------ apps/extension/src/sandbox.tsx | 40 ++++++++ apps/extension/vite.config.ts | 2 +- .../src/mina-network/credential-validator.ts | 95 ------------------- .../src/mina-network/mina-provider.ts | 42 ++++++-- .../web-provider/src/mina-network/types.ts | 11 --- 12 files changed, 148 insertions(+), 183 deletions(-) create mode 100644 apps/extension/sandbox.html create mode 100644 apps/extension/src/background/handlers/credential-validator.ts delete mode 100644 apps/extension/src/credential-sandbox/index.tsx delete mode 100644 apps/extension/src/credential-sandbox/sandbox.tsx create mode 100644 apps/extension/src/sandbox.tsx delete mode 100644 packages/web-provider/src/mina-network/credential-validator.ts delete mode 100644 packages/web-provider/src/mina-network/types.ts diff --git a/apps/extension/manifest.ts b/apps/extension/manifest.ts index fc96bb18..1d86b243 100644 --- a/apps/extension/manifest.ts +++ b/apps/extension/manifest.ts @@ -30,12 +30,25 @@ export const manifest: chrome.runtime.ManifestV3 = { all_frames: true, }, ], + content_security_policy: { + sandbox: + "sandbox allow-scripts allow-forms allow-popups allow-modals; script-src 'self' 'unsafe-eval' 'wasm-unsafe-eval'; worker-src blob: 'self'; child-src blob: 'self'", + }, + cross_origin_embedder_policy: { + value: "require-corp", + }, + cross_origin_opener_policy: { + value: "same-origin", + }, web_accessible_resources: [ { - resources: ["rpc.js", "credential-sandbox/index.html"], + resources: ["rpc.js", "sandbox.html", "sandbox.js"], matches: rpcMatches, }, ], + sandbox: { + pages: ["sandbox.html"], + }, host_permissions: ["https://*/*"], commands: { _execute_action: { diff --git a/apps/extension/sandbox.html b/apps/extension/sandbox.html new file mode 100644 index 00000000..0aa28eb5 --- /dev/null +++ b/apps/extension/sandbox.html @@ -0,0 +1,20 @@ + + + + Credential Validator Sandbox + + +
+ + + \ No newline at end of file diff --git a/apps/extension/src/background/handlers/credential-validator.ts b/apps/extension/src/background/handlers/credential-validator.ts new file mode 100644 index 00000000..e1263112 --- /dev/null +++ b/apps/extension/src/background/handlers/credential-validator.ts @@ -0,0 +1,16 @@ +export const validateCredential = async (message: any) => { + try { + // Forward the validation request to sandbox + const response = await chrome.runtime.sendMessage({ + type: "validate-credential", + credential: message.data.credential, + }) + + return response + } catch (error) { + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error", + } + } +} diff --git a/apps/extension/src/background/handlers/index.ts b/apps/extension/src/background/handlers/index.ts index 93918b67..52c82a0d 100644 --- a/apps/extension/src/background/handlers/index.ts +++ b/apps/extension/src/background/handlers/index.ts @@ -3,6 +3,7 @@ import type { OnMessageCallback } from "webext-bridge" export type Handler = OnMessageCallback export * from "./web-provider" export * from "./wallet" +export * from "./credential-validator" export const opts = { projectId: "test", diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index 426ad078..4daf2bc8 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -1,5 +1,5 @@ import { createMinaProvider } from "@palladxyz/web-provider" -import { onMessage, sendMessage } from "webext-bridge/background" +import { onMessage, sendMessage } from "webext-bridge/window" import { runtime, tabs } from "webextension-polyfill" import { minaAccounts, @@ -50,6 +50,27 @@ onMessage("pallad_switchNetwork", palladSwitchNetwork) onMessage("pallad_connected", palladConnected) onMessage("pallad_sidePanel", palladSidePanel) +/** + * Private Credential Validation handler + */ +onMessage("validate-credential-request", async (message) => { + try { + // Use proper window@namespace format + const response = await sendMessage( + "validate-credential", + message.data, + "window@credential-sandbox", + ) + return response + } catch (error) { + console.error("Error in credential validation:", error) + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error", + } + } +}) + /** * Runtime */ diff --git a/apps/extension/src/credential-sandbox/index.tsx b/apps/extension/src/credential-sandbox/index.tsx deleted file mode 100644 index 37e28651..00000000 --- a/apps/extension/src/credential-sandbox/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createRoot } from "react-dom/client" -import Sandbox from "./sandbox" - -const root = createRoot(document.getElementById("root")!) -root.render() diff --git a/apps/extension/src/credential-sandbox/sandbox.tsx b/apps/extension/src/credential-sandbox/sandbox.tsx deleted file mode 100644 index 9866bb66..00000000 --- a/apps/extension/src/credential-sandbox/sandbox.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Credential } from "mina-credentials" -import { useEffect } from "react" - -interface ValidationRequest { - type: "validate-credential" - credential: unknown -} - -// interface ValidationResponse { -// type: 'credential-validation-result' -// success: boolean -// credential?: string -// error?: string -// } - -const Sandbox = () => { - useEffect(() => { - const handleMessage = async (event: MessageEvent) => { - if (event.data.type !== "validate-credential") return - - try { - // Parse and validate the credential - const credential = Credential.fromJSON( - JSON.stringify(event.data.credential), - ) - await Credential.validate(credential) - - // If validation succeeds, serialize the validated credential - const serializedCredential = Credential.toJSON(credential) - - window.parent.postMessage( - { - type: "credential-validation-result", - success: true, - credential: serializedCredential, - }, - "*", - ) - } catch (error) { - window.parent.postMessage( - { - type: "credential-validation-result", - success: false, - error: - error instanceof Error - ? error.message - : "Unknown validation error", - }, - "*", - ) - } - } - - window.addEventListener("message", handleMessage) - return () => window.removeEventListener("message", handleMessage) - }, []) - - return null -} - -export default Sandbox diff --git a/apps/extension/src/sandbox.tsx b/apps/extension/src/sandbox.tsx new file mode 100644 index 00000000..03107501 --- /dev/null +++ b/apps/extension/src/sandbox.tsx @@ -0,0 +1,40 @@ +import { Credential } from "mina-credentials" +import { useEffect } from "react" +import { onMessage } from "webext-bridge/window" + +const CredentialValidator = () => { + useEffect(() => { + // Listen for validation requests from background + const unsubscribe = onMessage("validate-credential", async (message) => { + try { + console.log("Validating credential in sandbox...") + const credential = message.data + + // Parse and validate the credential + const credentialDeserialized = Credential.fromJSON( + JSON.stringify(credential), + ) + await Credential.validate(credentialDeserialized) + const credentialSerialized = Credential.toJSON(credentialDeserialized) + + // Send result back to background + return { + success: true, + credential: credentialSerialized, + } + } catch (error) { + console.error("Validation error:", error) + return { + success: false, + error: error instanceof Error ? error.message : "Unknown error", + } + } + }) + + return () => unsubscribe() + }, []) + + return null +} + +export default CredentialValidator diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index 3f239cae..c47a1561 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -10,7 +10,7 @@ export default defineConfig(() => { plugins: [ react(), webExtension({ - additionalInputs: ["prompt.html", "src/credential-sandbox/index.tsx"], + additionalInputs: ["prompt.html", "sandbox.html"], manifest: () => manifest, }), svgr(), diff --git a/packages/web-provider/src/mina-network/credential-validator.ts b/packages/web-provider/src/mina-network/credential-validator.ts deleted file mode 100644 index d363b5cf..00000000 --- a/packages/web-provider/src/mina-network/credential-validator.ts +++ /dev/null @@ -1,95 +0,0 @@ -import type { ValidationResult } from "./types" - -export class CredentialValidator { - private static instance: CredentialValidator - private sandboxFrame: HTMLIFrameElement | null = null - private readonly sandboxUrl: string - private readonly validationTimeout = 10000 // 10 second timeout - - private constructor(sandboxUrl: string) { - this.sandboxUrl = sandboxUrl - } - - static initialize(sandboxUrl: string) { - if (!CredentialValidator.instance) { - CredentialValidator.instance = new CredentialValidator(sandboxUrl) - } - return CredentialValidator.instance - } - - async validateCredential(credential: unknown): Promise { - try { - this.createSandboxIfNeeded() - const result = await this.validateInSandbox(credential) - return result - } catch (error) { - this.cleanup() // Cleanup on error - throw error - } - } - - private createSandboxIfNeeded() { - if (!this.sandboxFrame) { - this.sandboxFrame = document.createElement("iframe") - this.sandboxFrame.sandbox.add("allow-scripts") - this.sandboxFrame.style.display = "none" - this.sandboxFrame.src = this.sandboxUrl - document.body.appendChild(this.sandboxFrame) - } - } - - private validateInSandbox(credential: unknown): Promise { - return new Promise((resolve, reject) => { - if (!this.sandboxFrame) { - reject(new Error("Sandbox not initialized")) - return - } - - // Setup timeout - const timeoutId = setTimeout(() => { - cleanup() - reject(new Error("Validation timeout")) - }, this.validationTimeout) - - // Message handler - const handleMessage = (event: MessageEvent) => { - if (event.data.type === "credential-validation-result") { - cleanup() - - if (event.data.success && event.data.credential) { - resolve(event.data.credential) - } else { - reject(new Error(event.data.error || "Validation failed")) - } - } - } - - // Cleanup function - const cleanup = () => { - clearTimeout(timeoutId) - window.removeEventListener("message", handleMessage) - } - - // Setup message listener - window.addEventListener("message", handleMessage) - - // Send credential to sandbox when it's loaded - this.sandboxFrame.onload = () => { - this.sandboxFrame?.contentWindow?.postMessage( - { - type: "validate-credential", - credential, - }, - "*", - ) - } - }) - } - - cleanup() { - if (this.sandboxFrame) { - document.body.removeChild(this.sandboxFrame) - this.sandboxFrame = null - } - } -} diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 25ff94c1..117f5faa 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -19,9 +19,16 @@ import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" -import { CredentialValidator } from "./credential-validator" import { serializeField, serializeGroup } from "./utils" +import { sendMessage } from "webext-bridge/window" + +type ValidationResponse = { + success: boolean + credential?: string + error?: string +} + export function getMinaChainId(chains: string[]) { return Number(chains[0]?.split(":")[1]) } @@ -109,6 +116,28 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4100, "Unauthorized") } } + const validateInSandbox = async (credential: any): Promise => { + try { + // Send message to sandbox and wait for response + const response = await sendMessage( + "validate-credential-request", + { + credential, + }, + "background", + ) + + if (!response.success) { + throw new Error(response.error || "Validation failed") + } + + return response.credential! + } catch (error) { + throw new Error( + `Sandbox validation failed: ${error instanceof Error ? error.message : "Unknown error"}`, + ) + } + } return { on: _emitter.on, removeListener: _emitter.off, @@ -347,14 +376,11 @@ export const createMinaProvider = async (): Promise< if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } - + console.log("plswork") try { - const validator = CredentialValidator.initialize( - chrome.runtime.getURL("credential-sandbox/index.html"), - ) - - const validatedCredential = - await validator.validateCredential(credential) + // Send validation request via background script + const validatedCredential = await validateInSandbox(credential) + console.log("validatedCredential:", validatedCredential) await _vault.storePrivateCredential(validatedCredential) return { success: true } } catch (error: any) { diff --git a/packages/web-provider/src/mina-network/types.ts b/packages/web-provider/src/mina-network/types.ts deleted file mode 100644 index bf8801b9..00000000 --- a/packages/web-provider/src/mina-network/types.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface ValidationResult { - type: "credential-validation-result" - success: boolean - credential?: string - error?: string -} - -export interface ValidationRequest { - type: "validate-credential" - credential: unknown -} From ba56a0f3389afbe2eb38bbd3690e167c8754fafe Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 10:16:07 +0100 Subject: [PATCH 10/87] chore(private-credential)(wip): modify sandbox --- apps/extension/index.html | 1 + apps/extension/sandbox.html | 31 ++++------ apps/extension/src/sandbox/index.ts | 48 +++++++++++++++ apps/extension/vite.config.ts | 6 ++ .../src/mina-network/mina-provider.ts | 60 ++++++++++--------- 5 files changed, 99 insertions(+), 47 deletions(-) create mode 100644 apps/extension/src/sandbox/index.ts diff --git a/apps/extension/index.html b/apps/extension/index.html index 2209e775..fa6e8467 100644 --- a/apps/extension/index.html +++ b/apps/extension/index.html @@ -22,6 +22,7 @@ +
diff --git a/apps/extension/sandbox.html b/apps/extension/sandbox.html index 0aa28eb5..110fc85d 100644 --- a/apps/extension/sandbox.html +++ b/apps/extension/sandbox.html @@ -1,20 +1,13 @@ - - - - Credential Validator Sandbox - - -
- - + + + + + + Pallad + + + +
+ + \ No newline at end of file diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts new file mode 100644 index 00000000..9cb1cdcd --- /dev/null +++ b/apps/extension/src/sandbox/index.ts @@ -0,0 +1,48 @@ +import { Credential } from "mina-credentials" +import { match } from "ts-pattern" +import { z } from "zod" + +// TODO: for now leave it hear but later move to separate package +async function validateCredential(credential: string): Promise { + const credentialDeserialized = Credential.fromJSON(credential) + await Credential.validate(credentialDeserialized) + return Credential.toJSON(credentialDeserialized) +} + +const EventTypeSchema = z.enum(["validate-credential"]) + +type ValidationResult = { + type: "validate-credential-result" + success: boolean + credential?: string + error?: string +} + +window.addEventListener("message", async (event) => { + console.log(event.data) + const type = EventTypeSchema.parse(event.data.type) + return match(type) + .with("validate-credential", async () => { + try { + const credentialInput = event.data.credential + + const validatedCredential = await validateCredential(credentialInput) + + const result: ValidationResult = { + type: "validate-credential-result", + success: true, + credential: validatedCredential, + } + + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: ValidationResult = { + type: "validate-credential-result", + success: false, + error: error instanceof Error ? error.message : "Validation Error", + } + window.parent.postMessage(result, "*") + } + }) + .exhaustive() +}) diff --git a/apps/extension/vite.config.ts b/apps/extension/vite.config.ts index c47a1561..c5e5c26e 100644 --- a/apps/extension/vite.config.ts +++ b/apps/extension/vite.config.ts @@ -24,5 +24,11 @@ export default defineConfig(() => { chunkSizeWarningLimit: 5000, emptyOutDir: true, }, + server: { + headers: { + "Cross-Origin-Embedder-Policy": "require-corp", + "Cross-Origin-Opener-Policy": "same-origin", + }, + }, } }) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 117f5faa..65d4050b 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -21,14 +21,6 @@ import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" import { serializeField, serializeGroup } from "./utils" -import { sendMessage } from "webext-bridge/window" - -type ValidationResponse = { - success: boolean - credential?: string - error?: string -} - export function getMinaChainId(chains: string[]) { return Number(chains[0]?.split(":")[1]) } @@ -116,28 +108,39 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4100, "Unauthorized") } } - const validateInSandbox = async (credential: any): Promise => { - try { - // Send message to sandbox and wait for response - const response = await sendMessage( - "validate-credential-request", - { - credential, - }, - "background", - ) + // const validateInSandbox = async (credential: any): Promise => { + // try { + // const sandbox = document.getElementById("o1sandbox") as HTMLIFrameElement + // if (!sandbox) throw new Error("Sandbox iframe not found") - if (!response.success) { - throw new Error(response.error || "Validation failed") - } + // return new Promise((resolve, reject) => { + // const messageHandler = (event: MessageEvent) => { + // window.removeEventListener("message", messageHandler) + // const response = event.data - return response.credential! - } catch (error) { - throw new Error( - `Sandbox validation failed: ${error instanceof Error ? error.message : "Unknown error"}`, - ) - } - } + // if (response.success) { + // resolve(JSON.stringify(response.credential)) + // } else { + // reject(new Error(response.error || "Validation failed")) + // } + // } + + // window.addEventListener("message", messageHandler) + + // sandbox.contentWindow?.postMessage( + // { + // type: "validate-credential", + // credential, + // }, + // "*", + // ) + // }) + // } catch (error) { + // throw new Error( + // `Sandbox validation failed: ${error instanceof Error ? error.message : "Unknown error"}`, + // ) + // } + // } return { on: _emitter.on, removeListener: _emitter.off, @@ -379,6 +382,7 @@ export const createMinaProvider = async (): Promise< console.log("plswork") try { // Send validation request via background script + // TODO: modify const validatedCredential = await validateInSandbox(credential) console.log("validatedCredential:", validatedCredential) await _vault.storePrivateCredential(validatedCredential) From 07597846aaa984541a0a9be72d91305f2ceb50a3 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 11:46:34 +0100 Subject: [PATCH 11/87] chore(private-credential)(wip): use prompt in mina-provider for credential --- apps/extension/src/sandbox.tsx | 40 ----------- apps/extension/src/sandbox/index.ts | 67 +++++++++++-------- .../src/mina-network/mina-provider.ts | 44 ++---------- 3 files changed, 45 insertions(+), 106 deletions(-) delete mode 100644 apps/extension/src/sandbox.tsx diff --git a/apps/extension/src/sandbox.tsx b/apps/extension/src/sandbox.tsx deleted file mode 100644 index 03107501..00000000 --- a/apps/extension/src/sandbox.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Credential } from "mina-credentials" -import { useEffect } from "react" -import { onMessage } from "webext-bridge/window" - -const CredentialValidator = () => { - useEffect(() => { - // Listen for validation requests from background - const unsubscribe = onMessage("validate-credential", async (message) => { - try { - console.log("Validating credential in sandbox...") - const credential = message.data - - // Parse and validate the credential - const credentialDeserialized = Credential.fromJSON( - JSON.stringify(credential), - ) - await Credential.validate(credentialDeserialized) - const credentialSerialized = Credential.toJSON(credentialDeserialized) - - // Send result back to background - return { - success: true, - credential: credentialSerialized, - } - } catch (error) { - console.error("Validation error:", error) - return { - success: false, - error: error instanceof Error ? error.message : "Unknown error", - } - } - }) - - return () => unsubscribe() - }, []) - - return null -} - -export default CredentialValidator diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 9cb1cdcd..0c4bc4ec 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,15 +1,10 @@ +import { Add } from "@palladco/contracts" import { Credential } from "mina-credentials" import { match } from "ts-pattern" import { z } from "zod" -// TODO: for now leave it hear but later move to separate package -async function validateCredential(credential: string): Promise { - const credentialDeserialized = Credential.fromJSON(credential) - await Credential.validate(credentialDeserialized) - return Credential.toJSON(credentialDeserialized) -} - -const EventTypeSchema = z.enum(["validate-credential"]) +const EventTypeSchema = z.enum(["run"]) +const ContractTypeSchema = z.enum(["add", "validate-credential"]) type ValidationResult = { type: "validate-credential-result" @@ -21,28 +16,46 @@ type ValidationResult = { window.addEventListener("message", async (event) => { console.log(event.data) const type = EventTypeSchema.parse(event.data.type) - return match(type) - .with("validate-credential", async () => { - try { - const credentialInput = event.data.credential + const contract = ContractTypeSchema.parse(event.data.contract) - const validatedCredential = await validateCredential(credentialInput) + return match(type) + .with("run", async () => { + return match(contract) + .with("add", async () => { + await Add.compile() + window.parent.postMessage( + { + type: "compiled", + result: "test", + userInput: event.data.userInput, + }, + "*", + ) + }) + .with("validate-credential", async () => { + try { + const credentialInput = event.data.payload + const credentialDeserialized = Credential.fromJSON(credentialInput) + await Credential.validate(credentialDeserialized) - const result: ValidationResult = { - type: "validate-credential-result", - success: true, - credential: validatedCredential, - } + // Use the existing ValidationResult type structure + const result: ValidationResult = { + type: "validate-credential-result", + success: true, + credential: Credential.toJSON(credentialDeserialized), + } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: ValidationResult = { - type: "validate-credential-result", - success: false, - error: error instanceof Error ? error.message : "Validation Error", - } - window.parent.postMessage(result, "*") - } + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: ValidationResult = { + type: "validate-credential-result", + success: false, + error: + error instanceof Error ? error.message : "Validation Error", + } + window.parent.postMessage(result, "*") + } + }) }) .exhaustive() }) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index f37245c7..07d388ab 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -108,39 +108,6 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4100, "Unauthorized") } } - // const validateInSandbox = async (credential: any): Promise => { - // try { - // const sandbox = document.getElementById("o1sandbox") as HTMLIFrameElement - // if (!sandbox) throw new Error("Sandbox iframe not found") - - // return new Promise((resolve, reject) => { - // const messageHandler = (event: MessageEvent) => { - // window.removeEventListener("message", messageHandler) - // const response = event.data - - // if (response.success) { - // resolve(JSON.stringify(response.credential)) - // } else { - // reject(new Error(response.error || "Validation failed")) - // } - // } - - // window.addEventListener("message", messageHandler) - - // sandbox.contentWindow?.postMessage( - // { - // type: "validate-credential", - // credential, - // }, - // "*", - // ) - // }) - // } catch (error) { - // throw new Error( - // `Sandbox validation failed: ${error instanceof Error ? error.message : "Unknown error"}`, - // ) - // } - // } return { on: _emitter.on, removeListener: _emitter.off, @@ -370,11 +337,14 @@ export const createMinaProvider = async (): Promise< const [credential] = params if (!credential) throw createProviderRpcError(4000, "Invalid Request") + const stringifiedCredential = JSON.stringify(credential) + const confirmation = await showUserPrompt({ inputType: "confirmation", + contract: "validate-credential", metadata: { title: "Store private credential request", - payload: JSON.stringify(credential), + payload: stringifiedCredential, }, }) @@ -382,11 +352,7 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4001, "User Rejected Request") } try { - // Send validation request via background script - // TODO: modify - // const validatedCredential = await validateInSandbox(credential) - // console.log("validatedCredential:", validatedCredential) - // await _vault.storePrivateCredential(validatedCredential) + await _vault.storePrivateCredential(stringifiedCredential) return { success: true } } catch (error: any) { throw createProviderRpcError( From 636ec20e53f8e2591cb4b16af10d662615f658fa Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 12:29:41 +0100 Subject: [PATCH 12/87] chore(private-credential): update bun lock --- bun.lockb | Bin 577624 -> 575048 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index a7626f958331c192192af738234e9bb96bf8a04c..989b7880810a8c97041fb8f682d8c28992072e4c 100755 GIT binary patch delta 96647 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≧SX4SG}Q6k>nr3NaGv$5(vP49y@$U+yHGvJ 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 From 755c1204b64f9640b0080832048ef559fccc3bd1 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 16:47:49 +0100 Subject: [PATCH 13/87] chore(private-credential): add contract result handling --- apps/extension/src/sandbox/index.ts | 23 +- .../web-connector/routes/web-connector.tsx | 21 +- .../src/mina-network/mina-provider.ts | 206 +++++++++++------- packages/web-provider/src/utils/prompts.ts | 30 ++- 4 files changed, 182 insertions(+), 98 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 0c4bc4ec..2367d723 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,6 +1,8 @@ import { Add } from "@palladco/contracts" import { Credential } from "mina-credentials" +import { serializeError } from "serialize-error" import { match } from "ts-pattern" +import yaml from "yaml" import { z } from "zod" const EventTypeSchema = z.enum(["run"]) @@ -8,11 +10,15 @@ const ContractTypeSchema = z.enum(["add", "validate-credential"]) type ValidationResult = { type: "validate-credential-result" - success: boolean - credential?: string + result?: string error?: string } +const recoverOriginalPayload = (sanitizedPayload: string) => { + const parsedYaml = yaml.parse(sanitizedPayload) + return JSON.stringify(parsedYaml) +} + window.addEventListener("message", async (event) => { console.log(event.data) const type = EventTypeSchema.parse(event.data.type) @@ -34,24 +40,21 @@ window.addEventListener("message", async (event) => { }) .with("validate-credential", async () => { try { - const credentialInput = event.data.payload - const credentialDeserialized = Credential.fromJSON(credentialInput) + const sanitizedPayload = event.data.payload + const originalPayload = recoverOriginalPayload(sanitizedPayload) + const credentialDeserialized = Credential.fromJSON(originalPayload) await Credential.validate(credentialDeserialized) - // Use the existing ValidationResult type structure const result: ValidationResult = { type: "validate-credential-result", - success: true, - credential: Credential.toJSON(credentialDeserialized), + result: Credential.toJSON(credentialDeserialized), } window.parent.postMessage(result, "*") } catch (error: any) { const result: ValidationResult = { type: "validate-credential-result", - success: false, - error: - error instanceof Error ? error.message : "Validation Error", + error: serializeError(error), } window.parent.postMessage(result, "*") } diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 0d6ff927..c8275e75 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -9,6 +9,12 @@ import yaml from "yaml" import type { UserInputForm } from "../types" import { WebConnectorView } from "../views/web-connector" +type ContractResult = { + type?: string + result?: string + error?: string +} + const sanitizePayload = async (payload: string) => { const parsedPayload = JSON.parse(payload) as Record const yamlPayload = yaml.stringify(parsedPayload) @@ -59,7 +65,7 @@ export const WebConnectorRoute = () => { } } const onSubmit: SubmitHandler< - UserInputForm & { contractResult?: Json } + UserInputForm & { contractResult?: ContractResult } > = async ({ userInput, contractResult }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ @@ -82,7 +88,9 @@ export const WebConnectorRoute = () => { setLoading(false) } } - const confirm = async ({ contractResult }: { contractResult?: Json }) => { + const confirm = async ({ + contractResult, + }: { contractResult?: ContractResult }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ userConfirmed: true, @@ -111,6 +119,15 @@ export const WebConnectorRoute = () => { window.close() } const eventListener = (event: MessageEvent) => { + if (event.data.type === "validate-credential-result") { + return confirm({ + contractResult: { + type: event.data.type, + result: event.data.result, + error: event.data.error, + }, + }) + } if (request.inputType === "confirmation") return confirm({ contractResult: event.data.result }) return onSubmit({ diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 07d388ab..ccf141b5 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -37,20 +37,29 @@ const verifyInitialized = async () => { return !PalladApp.includes("UNINITIALIZED") } +const getPromptValue = async ( + promptPromise: Promise<{ value: T; contractResult?: any }>, +): Promise => { + const { value } = await promptPromise + return value +} + export const createMinaProvider = async (): Promise< MinaProviderClient & { emit: (type: any, event: any) => void } > => { const _emitter = mitt() const _vault = createVaultService() const unlockWallet = async () => { - const passphrase = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Unlock your wallet", - submitButtonLabel: "Unlock", - rejectButtonLabel: "Cancel", - }, - }) + const passphrase = await getPromptValue( + showUserPrompt({ + inputType: "password", + metadata: { + title: "Unlock your wallet", + submitButtonLabel: "Unlock", + rejectButtonLabel: "Cancel", + }, + }), + ) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized") await _vault.unlockWallet(passphrase) } @@ -77,14 +86,16 @@ export const createMinaProvider = async (): Promise< } const enableOrigin = async ({ origin }: { origin: string }) => { await checkAndUnlockWallet() - const userConfirmed = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Connection request.", - payload: JSON.stringify({ origin }), - }, - emitConnected: true, - }) + const userConfirmed = await getPromptValue( + showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Connection request.", + payload: JSON.stringify({ origin }), + }, + emitConnected: true, + }), + ) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -152,13 +163,15 @@ export const createMinaProvider = async (): Promise< if (!networkIds.includes(networkId)) { throw createProviderRpcError(4100, "Unauthorized.") } - const userConfirmed = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Switch to different chain.", - payload: JSON.stringify({ networkId }), - }, - }) + const userConfirmed = await getPromptValue( + showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Switch to different chain.", + payload: JSON.stringify({ networkId }), + }, + }), + ) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -166,12 +179,14 @@ export const createMinaProvider = async (): Promise< return networkId }) .with({ method: "mina_requestNetwork" }, async () => { - const userConfirmed = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Request to current Mina network information.", - }, - }) + const userConfirmed = await getPromptValue( + showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Request to current Mina network information.", + }, + }), + ) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -181,15 +196,16 @@ export const createMinaProvider = async (): Promise< .with( { method: P.union("mina_sign", "mina_signTransaction") }, async (signatureRequest) => { - const passphrase = await showUserPrompt({ - inputType: "password", - // TODO: Testing only - contract: "add", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }) + const passphrase = await getPromptValue( + showUserPrompt({ + inputType: "password", + contract: "add", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }), + ) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") const operationArgs: ChainOperationArgs = { @@ -229,13 +245,15 @@ export const createMinaProvider = async (): Promise< .with( { method: P.union("mina_createNullifier", "mina_signFields") }, async (signatureRequest) => { - const passphrase = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }) + const passphrase = await getPromptValue( + showUserPrompt({ + inputType: "password", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }), + ) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") const operationArgs: ChainOperationArgs = { @@ -305,13 +323,15 @@ export const createMinaProvider = async (): Promise< query as SearchQuery, props as string[], ) - const confirmation = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential read request", - payload: JSON.stringify({ ...params, credentials }), - }, - }) + const confirmation = await getPromptValue( + showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential read request", + payload: JSON.stringify({ ...params, credentials }), + }, + }), + ) if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -320,13 +340,15 @@ export const createMinaProvider = async (): Promise< .with({ method: "mina_setState" }, async ({ params }) => { const payload = params?.[0] if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const confirmation = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential write request", - payload: JSON.stringify(payload), - }, - }) + const confirmation = await getPromptValue( + showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential write request", + payload: JSON.stringify(payload), + }, + }), + ) if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -339,38 +361,60 @@ export const createMinaProvider = async (): Promise< const stringifiedCredential = JSON.stringify(credential) - const confirmation = await showUserPrompt({ - inputType: "confirmation", - contract: "validate-credential", - metadata: { - title: "Store private credential request", - payload: stringifiedCredential, - }, - }) - - if (!confirmation) { - throw createProviderRpcError(4001, "User Rejected Request") - } try { - await _vault.storePrivateCredential(stringifiedCredential) - return { success: true } + const { value: userConfirmed, contractResult } = + await showUserPrompt({ + inputType: "confirmation", + contract: "validate-credential", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + if (contractResult?.error) { + throw createProviderRpcError( + 4100, + `Credential validation failed: ${contractResult.error}`, + ) + } + + if (!contractResult?.result) { + throw createProviderRpcError(4100, "Missing validation result") + } + + try { + await _vault.storePrivateCredential(contractResult.result) + return { success: contractResult.result } + } catch (error: any) { + throw createProviderRpcError( + 4100, + `Failed to store private credential: ${error}`, + ) + } } catch (error: any) { throw createProviderRpcError( 4100, - `Failed to store private credential: ${error}`, + error.message || "Failed to validate credential", ) } }) .with({ method: "mina_sendTransaction" }, async ({ params }) => { const [payload] = params if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const passphrase = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Send transaction request", - payload: JSON.stringify(payload), - }, - }) + const passphrase = await getPromptValue( + showUserPrompt({ + inputType: "password", + metadata: { + title: "Send transaction request", + payload: JSON.stringify(payload), + }, + }), + ) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") try { diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 428b5d98..e03e06cf 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -6,6 +6,17 @@ type Metadata = { payload?: string } +type ContractResult = { + type?: string + result?: string + error?: string +} + +type PromptResult = { + value: T + contractResult?: ContractResult +} + export const showUserPrompt = async ({ inputType, metadata, @@ -16,8 +27,8 @@ export const showUserPrompt = async ({ metadata: Metadata contract?: string emitConnected?: boolean -}): Promise => { - return new Promise((resolve, reject) => { +}): Promise> => { + return new Promise>((resolve, reject) => { chrome.windows .create({ url: "prompt.html", @@ -34,11 +45,20 @@ export const showUserPrompt = async ({ return reject(new Error("4001 - User Rejected Request")) } if (inputType === "confirmation") { - if (response.userConfirmed) return resolve(true as any) + if (response.userConfirmed) { + return resolve({ + value: true as T, + contractResult: response.contractResult, + }) + } return reject(new Error("4001 - User Rejected Request")) } - if (response.userInput.length > 0) - return resolve(response.userInput) + if (response.userInput.length > 0) { + return resolve({ + value: response.userInput, + contractResult: response.contractResult, + }) + } return reject(new Error("4100 - Unauthorized")) } return reject(new Error("Wrong window context")) From dd9ee5772194b8de341d320ead6989dd73c087ea Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 21:18:22 +0100 Subject: [PATCH 14/87] chore(private-credential): remove dummy add and getPromptValue --- apps/extension/src/sandbox/index.ts | 51 +++--- .../src/mina-network/mina-provider.ts | 156 ++++++++---------- 2 files changed, 85 insertions(+), 122 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 2367d723..a1e2ac02 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,4 +1,3 @@ -import { Add } from "@palladco/contracts" import { Credential } from "mina-credentials" import { serializeError } from "serialize-error" import { match } from "ts-pattern" @@ -6,7 +5,7 @@ import yaml from "yaml" import { z } from "zod" const EventTypeSchema = z.enum(["run"]) -const ContractTypeSchema = z.enum(["add", "validate-credential"]) +const ContractTypeSchema = z.enum(["validate-credential"]) type ValidationResult = { type: "validate-credential-result" @@ -26,39 +25,27 @@ window.addEventListener("message", async (event) => { return match(type) .with("run", async () => { - return match(contract) - .with("add", async () => { - await Add.compile() - window.parent.postMessage( - { - type: "compiled", - result: "test", - userInput: event.data.userInput, - }, - "*", - ) - }) - .with("validate-credential", async () => { - try { - const sanitizedPayload = event.data.payload - const originalPayload = recoverOriginalPayload(sanitizedPayload) - const credentialDeserialized = Credential.fromJSON(originalPayload) - await Credential.validate(credentialDeserialized) + return match(contract).with("validate-credential", async () => { + try { + const sanitizedPayload = event.data.payload + const originalPayload = recoverOriginalPayload(sanitizedPayload) + const credentialDeserialized = Credential.fromJSON(originalPayload) + await Credential.validate(credentialDeserialized) - const result: ValidationResult = { - type: "validate-credential-result", - result: Credential.toJSON(credentialDeserialized), - } + const result: ValidationResult = { + type: "validate-credential-result", + result: Credential.toJSON(credentialDeserialized), + } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: ValidationResult = { - type: "validate-credential-result", - error: serializeError(error), - } - window.parent.postMessage(result, "*") + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: ValidationResult = { + type: "validate-credential-result", + error: serializeError(error), } - }) + window.parent.postMessage(result, "*") + } + }) }) .exhaustive() }) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index ccf141b5..b7be18e2 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -37,29 +37,21 @@ const verifyInitialized = async () => { return !PalladApp.includes("UNINITIALIZED") } -const getPromptValue = async ( - promptPromise: Promise<{ value: T; contractResult?: any }>, -): Promise => { - const { value } = await promptPromise - return value -} - export const createMinaProvider = async (): Promise< MinaProviderClient & { emit: (type: any, event: any) => void } > => { const _emitter = mitt() const _vault = createVaultService() const unlockWallet = async () => { - const passphrase = await getPromptValue( - showUserPrompt({ - inputType: "password", - metadata: { - title: "Unlock your wallet", - submitButtonLabel: "Unlock", - rejectButtonLabel: "Cancel", - }, - }), - ) + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Unlock your wallet", + submitButtonLabel: "Unlock", + rejectButtonLabel: "Cancel", + }, + }) + if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized") await _vault.unlockWallet(passphrase) } @@ -86,16 +78,14 @@ export const createMinaProvider = async (): Promise< } const enableOrigin = async ({ origin }: { origin: string }) => { await checkAndUnlockWallet() - const userConfirmed = await getPromptValue( - showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Connection request.", - payload: JSON.stringify({ origin }), - }, - emitConnected: true, - }), - ) + const userConfirmed = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Connection request.", + payload: JSON.stringify({ origin }), + }, + emitConnected: true, + }) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -163,15 +153,13 @@ export const createMinaProvider = async (): Promise< if (!networkIds.includes(networkId)) { throw createProviderRpcError(4100, "Unauthorized.") } - const userConfirmed = await getPromptValue( - showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Switch to different chain.", - payload: JSON.stringify({ networkId }), - }, - }), - ) + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Switch to different chain.", + payload: JSON.stringify({ networkId }), + }, + }) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -179,14 +167,12 @@ export const createMinaProvider = async (): Promise< return networkId }) .with({ method: "mina_requestNetwork" }, async () => { - const userConfirmed = await getPromptValue( - showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Request to current Mina network information.", - }, - }), - ) + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Request to current Mina network information.", + }, + }) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -196,16 +182,14 @@ export const createMinaProvider = async (): Promise< .with( { method: P.union("mina_sign", "mina_signTransaction") }, async (signatureRequest) => { - const passphrase = await getPromptValue( - showUserPrompt({ - inputType: "password", - contract: "add", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }), - ) + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + contract: "add", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") const operationArgs: ChainOperationArgs = { @@ -245,15 +229,13 @@ export const createMinaProvider = async (): Promise< .with( { method: P.union("mina_createNullifier", "mina_signFields") }, async (signatureRequest) => { - const passphrase = await getPromptValue( - showUserPrompt({ - inputType: "password", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }), - ) + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") const operationArgs: ChainOperationArgs = { @@ -323,15 +305,13 @@ export const createMinaProvider = async (): Promise< query as SearchQuery, props as string[], ) - const confirmation = await getPromptValue( - showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential read request", - payload: JSON.stringify({ ...params, credentials }), - }, - }), - ) + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential read request", + payload: JSON.stringify({ ...params, credentials }), + }, + }) if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -340,15 +320,13 @@ export const createMinaProvider = async (): Promise< .with({ method: "mina_setState" }, async ({ params }) => { const payload = params?.[0] if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const confirmation = await getPromptValue( - showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential write request", - payload: JSON.stringify(payload), - }, - }), - ) + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential write request", + payload: JSON.stringify(payload), + }, + }) if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } @@ -406,15 +384,13 @@ export const createMinaProvider = async (): Promise< .with({ method: "mina_sendTransaction" }, async ({ params }) => { const [payload] = params if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const passphrase = await getPromptValue( - showUserPrompt({ - inputType: "password", - metadata: { - title: "Send transaction request", - payload: JSON.stringify(payload), - }, - }), - ) + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Send transaction request", + payload: JSON.stringify(payload), + }, + }) if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") try { From f7d94fad30f21746c182304e56470b2363c75f63 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 21:28:09 +0100 Subject: [PATCH 15/87] chore(private-credential): rename contractResult to result --- .../src/web-connector/routes/web-connector.tsx | 18 ++++++++---------- .../src/mina-network/mina-provider.ts | 12 ++++++------ packages/web-provider/src/utils/prompts.ts | 6 +++--- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index c8275e75..68ab5741 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -65,12 +65,12 @@ export const WebConnectorRoute = () => { } } const onSubmit: SubmitHandler< - UserInputForm & { contractResult?: ContractResult } - > = async ({ userInput, contractResult }) => { + UserInputForm & { result?: ContractResult } + > = async ({ userInput, result }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ userInput, - contractResult, + result, windowId: id, }) window.close() @@ -88,13 +88,11 @@ export const WebConnectorRoute = () => { setLoading(false) } } - const confirm = async ({ - contractResult, - }: { contractResult?: ContractResult }) => { + const confirm = async ({ result }: { result?: ContractResult }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ userConfirmed: true, - contractResult, + result, windowId: id, }) if (request.emitConnected) { @@ -121,7 +119,7 @@ export const WebConnectorRoute = () => { const eventListener = (event: MessageEvent) => { if (event.data.type === "validate-credential-result") { return confirm({ - contractResult: { + result: { type: event.data.type, result: event.data.result, error: event.data.error, @@ -129,10 +127,10 @@ export const WebConnectorRoute = () => { }) } if (request.inputType === "confirmation") - return confirm({ contractResult: event.data.result }) + return confirm({ result: event.data.result }) return onSubmit({ userInput: event.data.userInput, - contractResult: event.data.result, + result: event.data.result, }) } // biome-ignore lint/correctness/useExhaustiveDependencies: wontdo diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index b7be18e2..876dc8ae 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -340,7 +340,7 @@ export const createMinaProvider = async (): Promise< const stringifiedCredential = JSON.stringify(credential) try { - const { value: userConfirmed, contractResult } = + const { value: userConfirmed, result } = await showUserPrompt({ inputType: "confirmation", contract: "validate-credential", @@ -354,20 +354,20 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4001, "User Rejected Request") } - if (contractResult?.error) { + if (result?.error) { throw createProviderRpcError( 4100, - `Credential validation failed: ${contractResult.error}`, + `Credential validation failed: ${result.error}`, ) } - if (!contractResult?.result) { + if (!result?.result) { throw createProviderRpcError(4100, "Missing validation result") } try { - await _vault.storePrivateCredential(contractResult.result) - return { success: contractResult.result } + await _vault.storePrivateCredential(result.result) + return { success: result.result } } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index e03e06cf..38c08761 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -14,7 +14,7 @@ type ContractResult = { type PromptResult = { value: T - contractResult?: ContractResult + result?: ContractResult } export const showUserPrompt = async ({ @@ -48,7 +48,7 @@ export const showUserPrompt = async ({ if (response.userConfirmed) { return resolve({ value: true as T, - contractResult: response.contractResult, + result: response.result, }) } return reject(new Error("4001 - User Rejected Request")) @@ -56,7 +56,7 @@ export const showUserPrompt = async ({ if (response.userInput.length > 0) { return resolve({ value: response.userInput, - contractResult: response.contractResult, + result: response.result, }) } return reject(new Error("4100 - Unauthorized")) From 0d93188f5ce5a1a758d9b6526e59785362e7ab9a Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 21:31:50 +0100 Subject: [PATCH 16/87] chore(private-credential): stringify validation error --- packages/web-provider/src/mina-network/mina-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 876dc8ae..3ff1ab67 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -357,7 +357,7 @@ export const createMinaProvider = async (): Promise< if (result?.error) { throw createProviderRpcError( 4100, - `Credential validation failed: ${result.error}`, + `Credential validation failed: ${JSON.stringify(result.error)}`, ) } From 90d49b4fdf7226e7c985c562b088dd1f638e9751 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 11 Nov 2024 21:54:48 +0100 Subject: [PATCH 17/87] feat(private-credential): store json instead of string --- packages/web-provider/src/mina-network/mina-provider.ts | 4 ++-- packages/web-provider/src/vault-service/types.ts | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 3ff1ab67..874a861c 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -366,8 +366,8 @@ export const createMinaProvider = async (): Promise< } try { - await _vault.storePrivateCredential(result.result) - return { success: result.result } + await _vault.storePrivateCredential(JSON.parse(result.result)) + return { success: JSON.parse(result.result) } } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index ec7a787a..59edce09 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -19,8 +19,7 @@ export interface IVaultService { getNetworkId(): Promise getNetworkIds(): Promise setState(state: Json): Promise - // TODO: change from any to type from minajs - storePrivateCredential(state: string): Promise + storePrivateCredential(state: Json): Promise getPrivateCredential(query?: SearchQuery): Promise getEnabled({ origin }: { origin: string }): Promise setEnabled({ origin }: { origin: string }): Promise From 262928291d433e8f9b555498f13949d33c9f3b82 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 12 Nov 2024 14:27:12 +0100 Subject: [PATCH 18/87] feat(private-credential): add skeleton for mina_requestPresentation and modify minajs version --- apps/extension/package.json | 2 +- .../handlers/credential-validator.ts | 16 ---------------- .../src/background/handlers/index.ts | 1 - .../src/background/handlers/web-provider.ts | 16 +++++++++++++++- apps/extension/src/background/index.ts | 2 ++ bun.lockb | Bin 575048 -> 575072 bytes package.json | 2 +- packages/web-provider/package.json | 2 +- .../src/mina-network/mina-provider.ts | 3 +++ 9 files changed, 23 insertions(+), 21 deletions(-) delete mode 100644 apps/extension/src/background/handlers/credential-validator.ts diff --git a/apps/extension/package.json b/apps/extension/package.json index 47e3019a..f0a59a78 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -15,7 +15,7 @@ "test:e2e:ui": "playwright test --ui" }, "dependencies": { - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@ce61607", "@palladco/common": "workspace:*", "@palladco/features": "workspace:*", "@palladco/key-management": "workspace:*", diff --git a/apps/extension/src/background/handlers/credential-validator.ts b/apps/extension/src/background/handlers/credential-validator.ts deleted file mode 100644 index e1263112..00000000 --- a/apps/extension/src/background/handlers/credential-validator.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const validateCredential = async (message: any) => { - try { - // Forward the validation request to sandbox - const response = await chrome.runtime.sendMessage({ - type: "validate-credential", - credential: message.data.credential, - }) - - return response - } catch (error) { - return { - success: false, - error: error instanceof Error ? error.message : "Unknown error", - } - } -} diff --git a/apps/extension/src/background/handlers/index.ts b/apps/extension/src/background/handlers/index.ts index 52c82a0d..93918b67 100644 --- a/apps/extension/src/background/handlers/index.ts +++ b/apps/extension/src/background/handlers/index.ts @@ -3,7 +3,6 @@ import type { OnMessageCallback } from "webext-bridge" export type Handler = OnMessageCallback export * from "./web-provider" export * from "./wallet" -export * from "./credential-validator" export const opts = { projectId: "test", diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 32f691fa..370844de 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -5,6 +5,7 @@ import { GetBalanceRequestParamsSchema, GetStateRequestParamsSchema, NetworkIdRequestParamsSchema, + PresentationRequestParamsSchema, RequestAccountsRequestParamsSchema, SendTransactionRequestParamsSchema, SetStateRequestParamsSchema, @@ -207,7 +208,20 @@ export const minaStorePrivateCredential: Handler = async ({ data }) => { const provider = await createMinaProvider() const payload = StorePrivateCredentialRequestParamsSchema.parse({ method: "mina_storePrivateCredential", - // TODO: might have to add parsing + params: data.params, + context: data.context, + }) + return await provider.request(payload) + } catch (error: unknown) { + return { error: serializeError(error) } + } +} + +export const minaRequestPresentation: Handler = async ({ data }) => { + try { + const provider = await createMinaProvider() + const payload = PresentationRequestParamsSchema.parse({ + method: "mina_requestPresentation", params: data.params, context: data.context, }) diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index b5ee578e..6ffba8fa 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -10,6 +10,7 @@ import { minaNetworkId, minaRequestAccounts, minaRequestNetwork, + minaRequestPresentation, minaSendTransaction, minaSetState, minaSign, @@ -42,6 +43,7 @@ onMessage("mina_getBalance", minaGetBalance) onMessage("mina_createNullifier", minaCreateNullifier) onMessage("mina_sendTransaction", minaSendTransaction) onMessage("mina_storePrivateCredential", minaStorePrivateCredential) +onMessage("mina_requestPresentation", minaRequestPresentation) /** * Wallet handlers diff --git a/bun.lockb b/bun.lockb index 989b7880810a8c97041fb8f682d8c28992072e4c..2b126ff4085795d465c928103aaad74eb051adaf 100755 GIT binary patch delta 64046 zcmeFad7Mu5|Nnnom${g0B*rdTCXIa?OEX1-M2w{-k+Kd3!wj=pV+JXdYMgkXD2gb` zk|=E|Sqe>3v{EVUd6%N~dw-nsx^%t!dH4PNzQ51+_x0|PIKI|Cmp9m+OGRfy2&4NB(dF@w{L#7N3r3Ch^~GP| zdX#mh_-o%Zxtv$)JX@H06xnTs+_d58G{RDB73wIg+O#5V`Ddl)j!JLk^Sw`ewO&SE zvr(Djhxuw%@WQ|Dob*>~yb`MtzQd`9GJOJ8;hrTHUPU7^a@}ZCD>|(LT?=og+N$v+ zSiv%3MH_1Q`6@nNHSEo>GF=O+aI30%oSrv4Ei-LI`tZz*f(+{1m%u9QVp!pi!Q@=j zvbq<3azfHL_30WaPkx0(28RkT#}kUC)v&FTo;4vo*XPR}pOy>x`d;Ly{M__(-=5J+Fphl1KDYLd85ccEi)p0SivX~%%ZDwoFSYN96mZNb1e4j&Yn_rD&Ak$i+z{n zF>%f>rD_+xc!}3LkHZ>Z%V5=hKCIrE4yzloVfB4}UO_f#`WnW2@g9Yh*+sDY)ANQE zWMq!;b#Lf(Q)`%>DXL|;jOCLJT)nX9JmOOQr5l@R)S54sICbQpuKIprhNuhSKZ#$i+_vdiK8=yk0#vm!&5Ol#li!yG6iO~6;*9V z<>241@cEcbMQ>tDKXHZ6aY|Py{4?3-V~iJl0#l}T`@|Ncs!uO9Y(nBiLV1Y8Hc$8s*L`2Aqzlj!M%MK!J9gH_NU+ItN!W;{L0>Yx@M zHreM(>FTv`US?XJT9&nScpBW|8gGnU0;}Pw!WuF$mcu>c!`2Y`nRL|Phx%2Y2jDPFro_3+wtcwQc>*18`EZQS^b5kB8o z>z|vRH$HPhy6@{=UORjY#}Mx=Sn)@v<&B?6_3B^i#_wD-#|FsO@Z-qG)?6G)f?CSL z3w=LqCG^F0UdBDG{b;;1FS>r=-&eNqLKYrpqYLuJD*XciuNlHK>9s!IKusT)&sv$D z_cH!!#`=9d{UTVl-*Q4fZvtEjmqV`rQ`|t&PfkLpTH$Z~y%puz8@Q_wz&=<#lEtp88T*0nXnC!4AHnL831hsTIB0t$z-diucvjk| zjNxf{`Ae|XQ@_BP_#eTV$9KZ&snrZ5jn}j+xAhCp?!#7jLec#;zk4|Z9??Iv6$A19s3xt5W z?7B;OEj*^+p@EoVd1S_@0@e%P*on?d7u3J#nMvNvUk7Wx%!RQamp%> z>7VL(XN()2o|}=+xqswH?U6Fl)6)~%w(-3%)w#Z0^NUiadHon(2*Nv>#?zgpG{nHax;A4-F*J-N~fu>=+rE4g%0lp2U0#|kTsUs zzzC=@*GstET<6ORYZsQX=IiskU=zpZj+mI6mi@A|!{@7)@9@eUywl5nM0%#`?YkRW z^}Q8Vy|SBSrD>d{&iCrS5iW-h zO!xhQF8dqHM=h_j;Sa&e;4W+Lwf0liUTJwYtoFFYW#-R_@%e5JUr;jjSc&7+=pc4g z?1}e!6L2hi0d{^~vvKUrd=nRWTaEBmWH@$Z{QJP_q0W|DTdrrh3Vb2{W#O104*w!& zUWLmF_bm0|54q1<$$G!cbPdrF={W^y zbW$yBRrp2XiQRDY(2V6?eI~)^{-Vu8WBdC9(`syfreZ(8|BMq`xj|q~)aENHKOP9Q zi+8@PI{k|9<+?xAiHc(Er-@{8cr(FD*KM)naxmE4UN(ER>#>5S#TzldY16<(+F8L!Syf)?J zIWhHW`+wTpsNMtqis38azqZ%TyO;L9D7-KZ%PdGAmXSLmd?`CP$GIxLtADpMH@-pa zS2Tr&(bwbr?s?_C%{$`Ds8yW3^+)>I4K!$>k_>BbSzyspXK8~)6~ha(W=a|}mj=A5 z;c|aWcn9aZ#`&_*^1!+&&b-Ep8i!Za@DBXh_q|aRF7wgRezzr4x;iOM?xMCwn!FIW z+_z*0Wn6%^fPQbYcv zXspYy{7&q=ME_x@`+yFC#!=3^0m=TCojn-sgHFuANutOkJ+S!ZN ztF#j{C^>LfX(we+a_F_vKHue}RLV&mm>7sE_6em9o!+% zI@;Nbc5k#3GbB0mX*9cBw*aXN5(CXc&b%SXfhi$pFMgY7WhGhGDH)s?3NUm!Vg;Py zA&G&jVw`zHlLIqioV`PnLwoS^szJy=*|JVbT5>3x9%A2HB1S*tsQidl7t}f@ygJza< z_6|?>f9`}vbO<$Nim5RJPAd71ywI69B02Ezh0fj)bV_ytW#4h_wsp^#-9)w7_y zGcP?kv=)&|iK3uWl9m|y97~mma*9VJh8i%sRhocPG9ocJ9IJz~Z%DhqmI}_^k;$PG z2yTr{aZ`ViKh{YZl^h(;O3=~FZ{u$tjZ1a+J0%0?jfzgp=;TmmwlGPErPP9!6bf&e;$@c>-7rYsYwl;N`o#ceZbO>pEYewvP zZdIFAcIJ&q4lPDhKU19tlArNbit1hley4a~VrT+ZOZA7suEkQ_+#Evl zu~cswkJ`MArNQCVv~lgTWuXq^u#^gI!Yq5bwiA<|90=5LQlK_Uk%Nr}o_FXIu`ZDg6tz9>qn0m0EwMwZXp+~J1aAFyZA7d$=*VpyqJPW@+lA$t9VwF=F{t{cv}7N2#!A9jW6 zw(uqmgL7bF^f0WB;WjZvUHu_{3nykqa_BoeG+oP>*bEwy7Ve3~%EO3Tgrz3;o7k3~ zpZb>-^=OjQeP)MH$As`q)Dm$EmO6oXIXuz-ffJh5A#hzQCuLT0U_~ou-mK)%JB&tZ zsT5`=hU&Kt&jSWsFdOSKcjm4>t84Cmilw>Fs2`CSsNcqknVlRcYU8BLP7WPq_TJ#- z$Utq=me$2$5D;$xmR&)Z3U64ej1xOLG1QDntBJuZdnu_5hNhgmYMPFN{Gn(RW$BIh zAF;e)T{0pmI?=0R$cY_$)*xJNV&J(%CuUA^=uaDh`AiEwOiXWfYeIgA<+in^XYe9U zpzWP~L)(S=;Zo1E@9e{_A~YF`>dB84@cH&m%$>=>i#zyy z1DtYqwhKL{n& z{Ps~e(p}GboqfI`u50F5*D+jPgk+|%R{(>{3-{Am?b@OpZuwdjTsiP2YazUYmgJ1!OtXILOmZZB%^ zO{|X2{2}e4D>CTRdu~8&P6F3=bN6%i;Gym=?VkHy$5O|6OMB_=Udy{(9%_%}O)W|l z$nWmVyEi%X5TXh|Z#s#g3+Y1@oYgfyG4wcAKR0PD?G<}?3mzdEb3?Jb>T7Ag7fY!y zqvs?=W6&FHeBARdGo8kyeA=3g>gnuVlpJ~tQMGipouOZ`Y+B^nqLcGFysrBtF!$&I9m<@S_G?SqvX&VgwZ%E$7$K?C4% ztmedH;84H!traw>^@+z+QmMV}OU6pTDyw}#^mr_l|LH5Y};2S ziG6A90#o}sDGwz3UvlO?&>?gUqk`a6NXzBJ{hXKwwIlBSV25DRjg;BxmESHn0hhbU z3l8Z|9o_9-ubaGOg5k+N#9*m@Bty#|!eVaNUa5JrH=?{g%EeN9`kdmtq%s&l} zK-zTH^#?9?5@_Ah+}!}Kd(OHJpLNw87WN%|*0tfR>-1Sy$Kl~{b8ykCl*Dx?i^?M; z$#wHt*Mqn?y`X)1*3~dQtYw~cZ3w$UKjQKlp@gB)oXM`XW6H1%9XZn3yFNK|KcYG) z+8yuvv6%ASvKoEyC~r2}?bz?3D1?sAzKnLE<+$v~W=g+})&6WE6-RrydUK#Bmim|J zPRN;9f5m$St3Q5RW6WYP%p(a^gC0HD1B?iW1IWbQr2OiIIQl50Lz@O|8Y%q?KmAlvBA z)K zZWFLy?1&{l&IW9UiVB>V?a86-h_;AK-ZNM#iknZU^8~MhJ?nNXjbis~7usPhs-2z~ z`qf(QSPQnDNVdAp3l-wxTtd~@Hu?`Z-Jk0a2u^b5J(nD6JINdIB=B5fXcU&(jowO6 zjNXr>XlHL%glbRrib6kek73wkXYcdLp_Pa#I~C$obQJ3{90;MmmA^!P4Ml7;~z*W2zIgBRRAi(ap&1y+5$7P|_wg zoosLM?(4+3MJmKnNUwlfuxw(PZooEft_;Iq+%#53XWxK!p)_3Gl$=w%Cn*|3Y108| ziT+QVxi5DJwVCd95wnLGnT@413C`4AgQY~NCRY&eJ9A&@5W1kyYgx)b2Va4uCi51B zNmyzYR_E`NqA@g`x!}*{mI0O$_5#)~3P)qW21XP)DX%7nRwHV#kT>)AV=SfRMW{T( zi@>@6mBi3vSZuhwYjpo9XYQ^Jp(|&e9gUnJr(r2At_!%nc-dNB%70?Dbo0@!sl_b! z7Sz~TXZwl1e*#N=$mPkRr083{lrc`bhPuF8h*sdG>U)bq?b#ZqY(YbXxYW?@u2#1P z_jU;VDPLDB=Eg|d+bE#c+(6E4&b-%>L+cP!C+~{rCoFXvE8M}P=-a)RRGucEhNYc} zx6#^zrJR`hqZ0$A<~T9?k^_V0I4RKLInF$&*<5GuzT{BaT(3#kwd_m`F2m~N%x6x0 zh)X>~#+*N@&U5zePY!gQ=foUH4%|M^NjZ@0KjzFm&>?j39pSN|CI1F2uZkMxcVV?9 zkr;QkwI3_dO;Wp+DtCIDTqXp4(GSa;nOgUjVR1WwEyXchYD$`nICbVn_Wn>Tb%(cb zJdbr178Ri!zPlphC0ol2+2-!>;McDF7OcO<*S5d>HYP>ibJmO5-5yIBcpH%ESYE%e z%!Qt`e(o+Q^wU|3Asd}k96qsfzfTt)p(!ZJ(j5n(r?9*#YO4Kc{k#F*a)IaPH?j9H z?Xhe;di>FUvp&O8!+RyD>)38EsjG;GD&-3tNtII?ngR=t}@fIb& zfTdb_YvCJbEsfO+7kedO;&J-w^>5alSXv*5_YQYM-(zW6;?Jn$(d&!|& z5nB?B-d6KtY4mX8S8D`TQ!IM>-K40c8cN!GUN0AN1$RmN086JSPJpj)Eq9-j@J;9#&yS5uox@Z*+)Yiz@_jto#GvAX_k3aX1mH*y$iKZyEJlt(s4zI*&hhIhA4G+!7Y8|$MFJf^e`%1e&g$JCy zM=#Sz+8q7yZyy)N`FuVh0P0zehjpBb%cD~Q{S{87cMq}RcL9FDymI*(SjV|o;aH7W z!aau`z4Y|}^5_YaU~iz~pIGry-BAC|ir)t)y&FIoFu>XaVI2dNzXA+$O^;;{w)VL= zh~ID^W>@MKl+B}ih!uaVgmBFUNS-+hdhH$LhIO7fa8#I-4N(h-9TR z!RqH?`A@X|Vb<=)JtA36HQnmxVm0{;>mSL=V5Ze0S>a~`@f@IVoFT+!>n?wMp#;`< z_lRUgVD)v6NLKi}t^Q9OMHrSSx8+!Z+~XWv=$438$z@{$MzRXRoOk`1=I#;6>Kdk| z>%ZLd_KBmxYHLTbD)5NaAJJ%$um&ihM?q<@0qFRD!<7mD3ee!(19XU$?rWgB`CyN~ zf%$rmzxx0DS9B*8>rtS^HcpuR{Lf?-pQ;4ftPS6*!adYT{fQKi|d|%UNJ~g4M;U;ACrCF8nt^>vNF} z5XowRTWtcjTmN%$Il|qGe+_s&te}tE@M0BwgXK-G-ooee93HELTkw$IQF0pvvWuV z(BwL8YZl3p&RG3iEU#azzgYe7yS2r#)q9fs>P5?PmMXMDDOdqZTU#tU1WPJw^+;BN z7odyF*>L5pUBPlJtggEl)*-$CZU{>%Y-}A(WpPBZq~`om1}$I>oz^zoxmaFpt^c{W zJpNbXuZmp*lWw7}n~fk=M%}F)$8uRU{?Z<{9%3c@h_%HUbdOp4T&#rG;jbW%TiyUG-jfpl zk!gQTj~582gkH1}B3TRbKI^~V`ir$P9<=tkST%ePe+Bu#h7(IaZtdee!wy&l_zaeG z!s?M+5&ah%?pNzCR=nS2n=9X9MVF~o6#HTMl(Ke|wM$#pvu^U&|K5o&fEBNtwaZ(( zg5_ANSF(0xYgdJJz}|`~Ar_&54cO2IY-|JmudoW%#K!;6?B(wU)TBuuf?E7?8!?h4 zwYR!h8C(fV>S*;ymVYO!N3x`=`6d4@+Lg-D)$%o#yTSbUdhkmH(!V+C`2WHe5$qckwGDPIR{b8e{*f&Gar78?oAno~c+Xf{tn9X1 ze%AUwZ~fsyw+DAvkC$!0SFHW2<=wC{dK1eZOhv2XH!)*8wmPf+;_{K!}#z3yaO)wKx5ys2cvYh%? zUDYh#a)I?1OP>HM!%0>b%bsHS7U^dGyR_ev@A~Vy3s;d1D^?maU{&sRSe3ui>hrDc zz)EwW)fZWNF|0D*2kQ_k{)1M32v)pR)*tq6xU9BmSLg;p^z)5?D1nX!(%kcVMM|7*@CsV19hZ3iVqKSOGq^ zwpa;$YHhLnk6SyEwSW8;UF+@durdhf*WXz2OIbb4edSP^Wng6(g0&9nAK3ZvRnafY z>f7qpj%3BV$m%YeDj)bexbx`}D~lEEQdm+WtBY%5Uu|u%oZT(=hE?usC0dq!o%Qc) z^+=X~zo6X{;BXTh0BdNa!3r?U@^D!78fooOunw`pjkcTts{&&!XIXt5toF-=b^OJ4 zXh~2)c{YGp5hhwYl9j<^tBVzH3M~B=tBa*ivpn5$q4ht@XB~g{IESsPvpdk0(R^4L z+y$$}?zOxW=EwH{zZ7nT<%cY*x^27aq)H^Yjs#qw5I0iT0)h!yTdYe%y5 zm#r?A{VJ^Vc3WL6doQe^TjJ>>U56sPWdpno>l|{_2K*dWO;5l&{)v^&SACT=G_8zXR(K%RUV2 zI_e8p34CMqZ!LcZE8~-ve}F4smr|cvR)I@nD}IdS3k$8IBCG&aU}abp)*+T%4ORv< zU|qJv!D^Yt)^26}+rSFn*79YR6JcFpUj-{(4_HT`9PV`xtcW+jYWkaC1snz|;}Nh9 zF_rU;fz^Z)tp6nIAIVC$$m)@-^k#Z`Vc2m_Rz`COsFt|{R+HWbtDyIL3AikK8Mc~s z1+4H7TYs@CwAT8sx4hA1`hN=!Mc8INo`rRYHK$&KmBH&)7pn&Qtu0nT--4Bn-e04d ze*`PzPhrJBZtX8&h5sJbLp#3HI8^fAV19h1h%LJetOPDlYL=Bjd8=2pTmx44S~i?m z;p)QL8#c4LSOsZrZL!9muPqK~SMp0W>i{d`t6@dxBG3N`D_mE?sb)QG_)HAv9`DpcCNMm;_#N_|KUOCb4K_}S4}4o zPZ>{v)#TG)Wjr0$?71D*@gMn80w{sGuxdKrMi5KCTejKvxxYo6(p_M^#rhM#T3Gs{ zaKJP>Vb8nkZ7{LCAGfwxscx`#B&)->SpA<^@weJ==U}fvBRv%1X&WJurEf=90iU)0 zku3k`t^QA3mvA52a35+yDZ!5r)IrCshgb=IZf&vbFD!p$^>eYpePjK_b+OCQyP7(c z)yt8rx5)gP5MireRje&m!qu!T)_tUSt2clZzM=IO%Wec~pfs~~b66uU0akj=TI0|m zR)jXzj%4X=(aV}aU;3*h$h^u1i)2->yVd`V&8jc$)}e>>J{PMvy{!L#g;k8+HoRCP zvJb54-U!RTzx9W;Z}kMf>Gc&?@A+T(E3mC8_{!fPO;h}Z0!j4 zHo33Z0K04ev7B#MTdV?>SX-Tm&uu)hdi$ic#Y+DNv*H_nrC3EdWxd1!bNm~B19#ti+RBlv;AgBJ z$x888bou{g`FB`NrR+c*XLoHk?=q@3OX71%3@y_YZX6Jg z2Rg(7jlUcqkN@4zaZV%;9g&=-Wp}zOpPSWJGpv6ktH3j@9?1$n8;IuszgfS_-@?7) zdk3bDNLH}Or#9s;Tgl%ogX5oAbK(5cn|o*l4b9iU`KLF1QH&m)9%En)u=7uEMn1Jk zgSby~>I8bZ=9$a(L?}VpKRvan2=Z6B$fq`?%a(rr>CN*`Z)!aJ`_r5{jh=sc^IT7D zs->iB?wo&mvo$9(ozKqo)TUZWdU^Q#)0?B!OdKw24VOdbyz@_Qo_~7t{L`D78r&t) zg!mh4q5aQKZMwnnx4R+*)Q0l>)0=vVQ!DTJr#HP@vFD%OtfNbCj&t$(r#H_(y{WNr z{^`y0Pj7lRQO`fUdH(6m7r70f9ohM(H@&Oeb3C=FMN?06o_~5%1Eq+)x2|)~KfUSR zA3Fc^=J}^L&p*9+{^`y0PjBih`R`A0>Msoc^wg%p%U`FH$cHnfN7&wdp9sN?5c$-m zBFI)k=bzp@|MaHDgZq@HZY-XEdeeQHQ*%R4ZR!xan|^Dbe|q!$)0>U$!)jtJ+~=R( zbock?dTLWsNV=xf`KLG48b06u`KLFB+5!B(?deT3xlSO@-2HP@Cv)WofwCs4ZlIiL zb~w-@P|9bf91ip|C!~CU;t!f*bpkh<#c>E->LQde#dQ(7U4n2*LdbNALpUvARUATD zb5g>ZdI)_lK`3WdT!PU5QiNbVgz_e}9zt|H!WId!#(ycoHVNsMB2+RPC5*0*P$eFr zib;z{sNMi!r-W)Iwm!mc2?g~LYM31oCN)HeZ-7wKWx&CH5s2>n|i1e+tYFsaQEqFW+tk&s~gEfBUzNN<7A z+H90CIsu_dON6#2ttCSBRtP&KB%0U+gxwMf5)dvoJ0whMjS$}op`FQTh0w4K!XXJ) znz+^ohb7EzjnKiANSMg5R0?GUy| zNHzW|5VlE3zXG9;*(hOjdxR?O5c(QERzZ7QiLg_`jV87|!fpu#?GbJ=J0wg>Mu@)> zVSvfG5}{!SghLVrnYd(x!xH!oP!InQQzBtbM})Q=5Yo(y4hTt|5ROY2ZW1~ooRF}v zBSN}4CSmba2wgfMj55WY5W00nI3*#&bh--Rw1ibxA&fOA5&W5^duJ%itbk1aE_es8 z#(TU;y&65+tQF-Le;2&Bb;Ucq3*LEVBZ5EQgt|fnCQUTKJT01NVy}TFnGDfnvqLn+ z)aV9HH94YN%pTD+6W1M@ZYGNgO^K+;G)jSHm>Hs(=7?yPN$3IHYUYY&n`5He%;i0y z+fA`(j`>0~*L3Oy%`;0xcbJo+J5BfA(0sE(beB0Jy4$2)3*BSZii(Z@I%t8pN#vM~ zqI*p!6&i%*5S*a9G0Z z8xS5aB@*WJLulIVpw>O4w>*2O;d1P%sGLX|qGZq#+3LgAulyoWTeU zhaw!3@SKSof^c|f;6iiTkU)z61ydqnP8uQF4kg46Gh--1(lCVM5?(e5X$U7IEKEb# zX^tWIUp1ExgLau>(QfmFXpiYM9NKG^h+Z=%MX#IgBcOd|g=oJyBRXJG)1f!aT2YDd zkA&VdH;E3KjiR?qXcTnFq>0`(PmA6$v7@2GCPQ?@>=37G@$GH^(F_9*58+3*mE9 zoQ2SBJi;jnUzkqg5Kc>2H4fn`b5g>ZY=pk!5xy}i#v}C4K?r6ed}mU#5u$Suwn#W> z{5c5QB&6pc{9rap7@dbuB^Tk8Ny|m3o{z9o!p|l)4`H{2f;@yXW`~4H1qku^2)~+~ ze1wJ*5DrQB-NY3j9F{P<0O3zlB4N%%gtimd5BU9N<^=WwNs~~HODW|yttM)RAZ6i1 zA_dK{i9}jF8KKK0gfgah5<<5r2&W{3OsB~RrzNbKj8N8`l(1$hLfowC z2u?*PZ&IfsL{CH5A|clJZ$a25A^jGFN@k;k(bEyCOhc$*(xxF)FGScWp_+-Ej<8!o z!E}TgW`~4HMF{bQ2sKSkAwt6$2!|xpGI2!+hb7D|La1X(B+QwK&~^qwoS88LA!!!E zaS8QI!c2q{5*E%xh&RV1EWQj6 zI~$>ySuq=-|Lq9D+Ynlq)Y}lE=OAp6kYN0`Gsat)n?$Y6Mo}9Rngg{pX`;)_)1pKZ zI~Pha8KTS04$&2+#yqH<$q}_Tdqh{7xI3U^Gg;KZl!!W-Mt4G;%nZ?0=7^}XNth2^ zZRU!)m}8=@=JLCsYfQ1IoB2Z2-E_JeN-;}BJkRImW*XVVi{XWe9m@qlD29AXHh7P+-!QBUFD7VW)(NCiVe@ z-4Y5OK$vWHNSL$&A^t&xsV3(^goY~-4oR41;#MFWmN0t-LZK;DY( zk{(7lE@75QcnINygoO_w%r?g)EMA4sAZ(M6z6QZD8zqc>6rsvmgoP$; zEkgCj5Ozv1CiYQ;-4Y5OMOb2XNSL$^A^tIh`%KPb2o2XG9Fnli#H~X(EMfLKga=HC zggK8Rv|W#|!pvBYkn{w?aS0EZgvSw1NLctd!YXr2!r~1GU7kRA#1ub)&}}2aDG6&$ zrws_FC9K+j@R&I%Va+Clz8ewNn-v=o`fo-EZbEp%q;5ipeiC7egpJ0(8DX1*^vwvH z%|;2Mw;)t`5@Cx;dlI4gQwTdHY&Ef45Ozx_*n;r1*&$)lR)qMc5Vo6~rw|%$LpUVi zITN=P;jo0+TM=F`B@*U5jnH-*!VWWI8$!}E2*)M7Y!aSEI3Z!-(+E4wF$s&eBXoHN zVV5a>2BF)t2&W|MF`c#}oR+X^JHl(`q=YrkA@qF~VV_y?EJFY15rWSl95AWRAw<7` zuth?N@js8SO+xzf2nWqZ38P;`sPY2BA(Qq3LiHU8J0-khVqZkqEur8=gd=8$gh?+U z#P2|O&*bbtX!tV1AqgLtxR($POPKutl!Px#r&ke9OIY`gf+Vn`tCyb#;n+d z(0>m?a5uttCUrML^j?H55>6Wb9)xWY()S?zU^Yq^{Tf1*y$GjF+Fpd}uOsY~@Uw}1 z4Pm#0g4Ynvm>m)(?L&xv9pP7#^EyJq{RoF7{BGj*Asm)4dmqA|rbNP=0|;&RYhMvC zGxuv>@dnCqDWw9Y)dB4*q%1r@q@X!=fJlo=5W2j9P{tI$fza(ugi{hirc(*RX$h-J z5Xzd964o3<==&x@IkVzTg#K?K1P>yVH>n2^q7NZ#kq~SAZy{`xkp31zC9_e&=(iE7 z973pK(heb1e+OZwglZ=CZG_$L1THZ7ZwGp6Um;=AVM4^eLx`Ft=bgZfw>LZz*xK+& zsisNh!Ddm{nW6QfqD=qTsEcb<=IKV>LSLl&Zc`??x1D@j(Jt7!qHdJq=NlP3HW2QOGJ zCvmF8xa^D(Zd#A=>N{S8;pRIgBR@kqe}`7q#MOw}>SjAi#URM)+FNVah^p!jw!MV^ ziguIoDzNRMsQ$s^`b1J;OhB<1y&G#q9SCH%QCa&*I$OS4m+@vH1%1S;SMK=C%z|v6 z?}_$Xm)DJoDHZJ3gNi7FQHp1>Gozvz$#IuPH3%-~WwYt*#x?gRL`7H4=AVaoRgqhX zQJLe1sS*(xn+xhkWdpnbCYqo_Du1p&vb9{OzI!C`inNjQsSx zeE#RYziHkes%!9z{=Cvg-p0K6L)7~U)AoKe{>)Icoqy@2FWmeUPx%LiP*AI-=M5{! z$Q#&WgzfQV{xh7X6hE$MYQk1L{5RN1Zfw~IPa;jdxTN1{2}GpZ;Ul|rPg zRI5qQ4SDbNQElpYsygv*R~(ufwV{lSu9|LbIVGx%Kj?PdUj^B^;g+b_(rTQftu%9H z;Q!{|8fag-Z6VilXIo{HU(STHzapCIW!K9Ux&;0Tp!naq@tq0-8oQ3ONxJDInK#Bp z-RXL4{lB)|>$oiz(VG9Khaa8Q$lPv%N4S@gwm4Yn$~`;?pyPX%Wc~e@DeK#7wUcN% zd$17rO04#S4aY*{d(UiC5})ahqZ~iu#gF^KvTv;Rs}0Tx!FQ27IexR6{u$$9<6lA& z>uvBqte0NYce~a8L{lj$0)2!*ho8T>skEGySYcC@#6{LCh?ksIzy(&*dteou)1mK9 zIXI%Nrgv~TW`&XnfAu8Bdg%iqSJ~iYZL$}kb+%eL8_s>#t2wD8uCrd{tye9AzW^}Z zx6jJEHfR8J#M*Fma5v=IjU-yT9^Ol86)g@Nv#qZe(JF~cK=?fxHLX?;ZNDj267?02 zqqX&l$NhqB{WezPYV^$tfuF&rL_VV zSS`hBYQw6gL`hWR2~52orKe53E$$jeb1#tvq^u~*G>CAh?DgKY3*w9D;?9c;A@Xr0Us zCDGY>4YgjK@Y-Uv@C$&iLVL<;;g8ecUBO+^p0VM= z?+ezOQ7$%VN}@Ji`ufutn?!fq7ouspjkOvlZ(kIerduW&PWPoLhWiL4@u1p^qriHx z|MER#wTU)~-e|L|Hpyz&qK!BHva=uy`?S=o^7?8 zaUZbL>^7V10JJyENhPtKY1R;Pt_`kNyo6sNG|y^m1$}oAPRAWq8-jbH>GS|egkN2x zR~xIP)4(W#H-_)A!H3}+55~t+L_9qy1)PD2e5EO0BiQ^?sTM&@>YtwOTIj@Rw>HvsxZntSM0vKdNFJ z>#bJ-?vKzq!;f2S0`8+$d%|jZHO)cpX_3T>cxf7Kv|f{OFSE&RLX&d}(Ep0-c+zT9 zaZfWjN+J`lZkStb64P-13{t>0t4+tP&n@+UpSD^d?o(!mlF+xebZo~<%`yWh3C)$~ zZSa}6j{_YqSZx;WJ|=c0N$3@e8q_=RQdwsM%?%y;7YOBW8<=6WSFCnB+N~x{NzAcc zuUfCUcw(_DECjUV^LJ2TLR z;(o)1yBl|w@jpZo;n$wMX}yZ^>P_(B@Ik9-@^?hj@s`yb+>1@Bl32k2AAza&ZL8i3 z!D_3$W3@$So6&R}M&rk4z%yorlGtv&KD5D?;HB5orNbYgsfm{Yz0yw8?HHPR?mm!Z zPAZA;yCjd>;LGruW9P`{R$Gpyx0&kr!Y1(m?t!M$!z6J5rPm9ezQIcsSpj&BtNYTY zZ*3AQ(e%MUO}FoDxQB3W<^C#3tSN(=Bm8pkRk-I_O)m;pva7)=O3zie??r+db7kclw+Tt;gZ4y?Igx-}?gsE4NE64SqwAFsM z+T&=^R{O(hPoTYPW+(~u#B5Cci!>SeHUbS|9RV~Yy9wyi2O5#3thO2VYo-Gy`IBs2f;P^%3JMu-1=gbhFArwy?}d`*`Xx*6I_S>r$?#p0D7mb z4!wk3+Dky=Vg+2;YA@sFZq*|sk!#05RqM4Auf=Gq6vS$;;#Nm%EL6AJE@>uBNvu*g za9m`)_TW~bH5O`GZ7=RwR@1gkC3_9rYc?v0+h}REcx~&o5BE+g_bgn;YWs2PBVB5f zx>h@YJDGd^N&+wCe2Mic!L1Rir0QAiP24SPn_X(PgJ>;HDoOAtMf#fH_P_@*rvBRC zW!zUDv^Lnf`3E$pu9tLu^ey-fd=E~7Q{ZQC8k_;Ylrqn+4c7O^nB!}MO=7Du26YKl z6I=}Tn7BuSmEubXsmrHZz$`Eu=+bF87z47vICImZ!8%u5k5lghXbE&BRS{GIl|dCy z6;uP&K@Ffws+!<}fO+ZB;3b{zrlIcv#b5z&z!WeQ+ybV7=|Eq3oCqd?o54V!Ypby) z?y+E{8l7uo~!+YE6tuUKgwyt4paL!71<) z_}Qed3pVkWGR5nHb-L?vMoUc;xSHHMfq4|KE~#Gv^bG{fFz-|01h|`jsbm@=5e6U$ zS++h{GqpL++TaC}cmiwyTfkG`9-vQI%>#FUw}C!|RRG$9R-iS|wNWBS0#!|o$AdK+ z)y7!|)CF-smrC`4UJ;W4#sIxZ=Q1;h;DsGRg8RVz zU>SH2tN<&4E^!_PtHBH~6X+60-%!m0p>sT66od7tw0;l7F-4rK@w;Tnt*1Y1*mFvJP}N+7>~0)XaE|5 zMt&2sA$Wb^M`Upn90MPNPk`1*?NGF*x&zz^<^!F{b@8O#ug>7NfN6j`>%K&AIk*C} z2OU61&kqdjz7`F zZwxjm?2NLHkh=JK1MC5NfnH1cHh2dd26_PYAb1PtU8noO0q_QR8hl4_z6U3PuFU3w zc|ccWdYkM7FbU`~Y$~_~Op9Too{wV$NCzXqXfO=u)wzSg&0qi+2>O8=!DJ@>R4@(b zHRQT5n_+5f3MTU0TI!}?rACWT^qT4dFcxG2y&Zc97z*_7EEj>AX8xvNoko}9tO70s z19WFlcLF(SZ)VkBN>cZOWnejY06Yj*fR*53 z@CaA~)`H*Yj^BYk>ly>};gVvo0L0MsmBC=#L%>boW^gs=0=j~0Kt~V@_$*$E?><`N zey|MaGV($25O{<#t^sSoec*nu4CuRHbAY~CHU#M7YP~^EGyln8Vqr2)eFv~3NCsUg ztFAh405^jE;3jZ0NCAcT7XiH&tP9Y7P~U{C2u@&s0loxZfv>?g;9KxLI0^m*egL|B zJ*BUK{)FRaa2lKe`e5cK;8Sn}8~`QYO|TT`0`);~FVKZ)8=yCFH3G{hjNZ{*8N3W$ z0XxB~U>A4^Yyca9E;~o~nb2d1v>J>Dx(K)ek5A#_U=FwoOaOhr)j$^xx==U;elq^2 zf-P##!>N}JHSo&cH!4Fv@R(1pBPO*Q_u`F2l}rJz4v%0_!n8| zWz6%z-9R6rm<%5!t&hPcpa^?9$OZbBg)A@z^dxRCpbwhqQt~p82$Eua=BuZIv0bjj z=m2#6sP~uu1eSp1-~sS3SOp#dYrvymJ$M{!0=j72VmfUNRx5lCXB(2yi^Z#h8sH-E z2l}5t?>GMvd+B( zDu=-l@Gf`{ybnGAAA(_}YchJ6lIdV1h@v1q;0G_5oNb)!cN1r0=NP606jr3u$tNR2q>mw9|ZkC56}g41D(NDpd;u225Dw>V@6y9 z^y%3wFb?E`4PYgB2rLAPfIjxz7&HN;C{z%X0U?kM#!}WikOSs|zMvnt5%8yA_m+rm zG2aMo0yhU)C<2uH7mQ!Q380JoFM)1N=vKtL-~*t$Te^*<+g7@&)!kCv9nAvWK@XtY z;vZA9R~cgWgC$@o$N^(P0R`^_|IF}t2Yjs4(kI|E@B#P`90Nyyu0me|QAF^80QeX7 z%|MrzeL+9a2&`i`=)X^OiFpT@4sHWUpdHvkC7%Mjz#gy{yaozi=hr^4A5;ngY?n&JX^r5>Ppu6pTfj)t#SH5=! zuh1&5f(vn%0za6X?ZF0x9gv!V`PA<&&KW3MHH(^MdeuwTJ-sDB)&2Xu!(m-BI;J}3ujMKRv9 zNpv%q3+@Efz&1KSf2Md2=u_7%7as+`!o5w zcbdPa)+fOa;1u`?{0z2(XTg(THpm6P648syXvZ$V{tP(aUN9332G;=HXVwki_tcU= zcYN;x*|fr^wDNKNkw)Je&@J8!kVnaS!o9&_0^JXEgLXA|3h1ut8So3xw_ehLzLazi z&=;o$ffx#j-mY*;V`N# zm8TdRXL)Z&|?y1cJw}SELO+ZsHk3!uE zW`LPs78tB=i>Num%_R4BX8l7z_xEJ0=7I_knYe5umVe9)^O8g>t5{0=BD6H@(2#0-+%%rIcZwH--D^{Uf z<8Ecs9=(Hr97nZ|bHubSXl>@K3061ww0A!TP?jh$U@X~=0yRM;pn9r}eju89{A*a3 z@4D>OR+o9I&5U*@E|Y|h>iZa6?%70J<s}JJA#h^N<24X>Za3LrMsIL3TxUw*9?tWzE0=NRG3Mzq$maD*(K~1d$ z7vZR3A$Khh2kL-JK|OE@s0(TX>GBtJv9D#eInWJ&20%-1E6@T+SFIa^MxY633YvkI zAc6edKN7Zv+W&I03rYNncKJZ;F z9`aKrr+^as5&Q{$2g+D}zkoB~H24+#2L1plpe{;&P>Q-DQLhXGT26Ip)OsE6t+Ke~ zXM4t15nJ~JbUCPuFM_LrDnR!MR0w4*y9THZssT+(g;!V&-)rGvT2*UpfzX;!s+S$rEYOH0QEp!pfqcNa4VWKyMpBl z|5TKhNLB;q65Me>$*WkG0{Lq|NmH_ot=0&ZzXq6!7tUT`ngQK?O#m%{;fZ15AQjvI z`UBNUji$yF^k678*Kz~Q5iG2~M z0ajo?1Re#2Yxt$etH5wPABIg$6=#$YxaN*YD-T)p4s?ZZ)BiIB~ zTaA_NxHX1$!@Jb~`*1u5o&{S#IKWf5w}GwT8Spev#Mj|)m_4{{LcZs5EB=e%1@J0( z3G4tn!7JANGOU*N(xCmriM@un7buhJ;56=^z$f5+a0DCzZ-Nr=1~>q;NNVgH#QmSf zO1LZkK2F}!;85hluuAq0cpIpHK0^QdDdk;somSq1HETYy;Z!)y2Cc~I=MQmz0FHu> z!7=a!I0b$LKY;H*;phDN7x)I81joVm;9KxD_zHXpPJqwAr$Av8PYKGFJFF=kx#gz} zP`fPy^Qo3@THU`>RrYc{1JzsU4tZ;0@F68Bc{7!5t@U@+D#gsS=i(5(#J8q!~S!-=Q~!hX`9 zw|>$TM$1ar{gTy`-fr+JcqKyH8R6dL`J0~)25ZDBp?87q8oUnLn7FrsJ%VjWn}6wh zE7;!iEh{UvUl2|t6cpxM=)8r3Jj=U|;V{#G!tiq<#XjnLnBeDH9hj5G;{ zf|Y71^dF!O($DZopkP0Os{Dgluv)67#`lyzgv4G+Hbgj0ZK}?!o5To?Hzta zb8|zJzudo>l0(6o=IEhdbWnChbCQzOR(198Nd_1NbdDPdrvv^8?~=EJ&C4x8Yk}Pq zEH#7PWO3PSF0eDrzO5{b~)k7SMe^`Bi~y0zD<*YUaq>!2z-Nk)RT7hU~gc zmv{KX>3wF}JHcwTCgUSqhi@wA2Cf1f!DO?MAcgXltecqnlwsDrjU%-V6TB|JUz%KlrD= zwAu3k;(O+c4}uM#*bjsCVzv7hULe*-ZpfNK{3HXW#eb5NRww6iqEH9;#|>EvYK1irSZ` zNU7Rl`+v{9_jz5SzyJU5^PAtix#!HxnKNgbGdH)LF3a!e&RdpVmdEOJRmk(I+_O2` z%TQo*G~Ea#1i$N}@GCp)lT4^1P}ocCLJ7z3FcdyfD<^K+c@?h&q>_9MbhjYCYjXW| z?54SN03zRbPr&r?sN17##`88PQ}OJ5w7a5oMCpRE0?+w!trJQjN@spXE3aYW2hq-J z^85H=K!xj=XBoYH9UBx*IoBbL)(z^2?(7MzPA(9?Ct(Qu&u$j}Zwd;SVK*7|9C~J$ecpXKxsjtH<0@9pm%S`@3rL3d4$E9dB*Af?@$ux#~X5h3x{a=Xs$rv_X85B@=dvB$i7R}+PZ&K7v7@?aq z?4}%0floX95{ehCya^(1(6*bhZ-hO_&MlQ8*ergEps0IYs_63SUE4 zq{_Esz2{R*aZ7u|gWtsO8z`Ss^INiO1&)-wltuRdHvVEh>lTta{FDtpzlOn*Q5hHq zF%Z9y#ec-bQ7C(&N_buoWet8iqArKR8_YLptjRh&{|5MWXtOpmJ2->>3gsaRC-r_u zU4n7}WiN2<<1L=HMY89+OaKqemlzLFwxe(e{0Hh%6f1#D5EE&2kKE@Go;^Vkw7y8z zS6%@yUl1Px=n(x-BnQa6oI~`Y2ybGrxOxCu4aF0MDf|rJ3~=2SZ8m~+Q1k0V{7PQ{ z%5C)VM;(X~gkntt)x&RI`3;ooDA!Q<8t4k@VAOovs;|||sYUpY*?)0c4uwwMxGlGq zIk*%Q`YT@b>q0$#m3_zZY408Mh(T$K(i^=jD13fSMzN+}_*Q}`=gY=;6l-L_m&1IK z*b${F@Lf@=pq$6JUGa=BjhSUEM?LU+FiHwaf0TZ*9liQht_7v5bw_Sm>wDnwMIK*L z@~t4RW*rK1h{sq>JsI^Rlqo3FP%dNom8d^PVH@5I zZH{7=)BQVg0~bE9^#q9jBq$N(6N)N^?WstUishcVJi1XV2Uwi%%FW7|`eECga6I3= zamm98?eZ>5<=8MZ#uK&xj;NRWnd{b>)UUU*E-4~7BpA}{SdK0?7e?uWa#Vauc+mA{ zvOD#=C)bn)*wf^Da;%hTPp9w6Mk&Xh%HNk`4g6*g@-gON(c3EBPM_aI(j|q4DuWUJ zdi=iZA+58wOuvs8d-45)eZR||_+r6%R0excUkM${7awWeyqf=TbPQ98aF)sWf$R}c z0~kDXYnPqg`J0^d)}cd{m)IDR9<}^*cI~`f3<)*{Lyex&ya%$Up8u4C5!U-Jk2!K3 zA1BcTfpPp#MUa{cD!?3u=0c^SLR#Z*evQxlQqqly2sWC6!*Ojxmw}=G&Ov2X)3vvs z8*2=GsL&Y-1Y|_tFBP8n?nS*nupYjIbitGvF*{4@o~`$(LX*N&b9w6hhit?bB7P_p zZov%kFbWE=fA9J~#sV z(8qpDtSf)2n3f?b4 zU*6!j`ukUT9zEcOzTs-$WH$Y1i8g;Mzkv-0 z*(`NANNq70`>Hg0*fVziF?C5S{1INXu@o$A1`~!=nM;db4t@0Lz9R}oI5Vu17hNrd z5_dCD$TMK}HK=6Cw-%X(F4TiWsr5@4u7h0h@5PwCY&xt+A68YKr~IfXRfxxCD90dm0W&!7C|JL_IJtyRMF00(`u>RfAlxV~F7!Z~iuQmzQ`bnqe+aMc# zsPRisy4S~&@KQGD^fzj&JPFF(ICu4^)NF-&iWMp$7dPS72r7!m%TL|O>&3gg_Ikhg zLDD@zKel{MfN)*>r1vj9UCW1~zh;KL{OH0fOcm%yk6wW(jr7y@gknR37 z8h!PLH4Ia1;r5mDw~n%5oFiRztV9{-F0kM=&8yarNhvAschZK%p)*6K+7}G$>CzDP z%R0Af0KH`D{DA>oG#_?oPpyiE?6+Yw)F2+ErJ)^;n)=xwaRC%7LGgNP80RPSZxy=u z+&&w|hyXGJ!!%vP=w0=Bg|}+DJ+fisYmfzvihWaNXFejAkT(ZJ&@X$6CM#^8ivs&C*jJj4!vy{ zZ2*ATH|S#wF4YO49p$i@ks(yfwVRQ=?V&zTDau}iNp*}g)Lz6& zjg7P$kEL>9)I>(@6h`;Btq&tdSp+%ug^sgCsc@sTC7d=t0UY{16ZnQSP2VRucTY{7 zsLN9%7VbLKZdW+%1qMD2Im88v9SsxB`r3X>>h23$z9;~qX6vRzkdpv~P9|z0K++l$ z%@ydVngPR#2FjheIe)|aJ5}9JPC`dEr%?3I8qh@`mSrR(VA+7tK2lZ6C#Bf~_a`n~ zBk7{>g!u;JSl0pce~31RG<~}q*q{H_3R%)6;|cFxC)gWcmpY(4}oS!Y>;@Q`h9S6$xuR*#pbV+|&(0lKVWc6VLW(B2 z+8~>vDGz=1$AJNJX`V6XMV`gidcjjDS zi_Gx~7|E|euuKHrzxZ2bwR;voSSA1&9YK3|3@C>Al5m%yf{v}}`F%X9+L|g=!jAf& zGYjRK#regucXD%OSY=1+x29&5L=tSw@=D?-)0>004e%B0e@7YyowzbJ>37=@u`yIo z8Eei&AkGxt8FFx0;;nd&3pm7pBCFoWTcI`~M#a*vAA4!zt!>CmDOiy03zSv_OOzZ# z!A@X*-W$E^U<|=Z7?Sq=(s|W#A}~ZKYjB8NRt$|sU&9n&I0M5FRwdH!MD34(fuNe1 z1&6j77!t+MQ72dt`?mCw>kWQnd<)hD&&{ZHD#;Ft(&fieaxIKHyq&7ZYo@L64T@XE zCk-uzn%a&G<GAG%%R5|D=rgFzaQv>cD``aqxQ;5N6JV&HcU)ih6%1(+uXoSQXR9 z&d?UG2zS3zM_L~wYhU2P4+;&JH0i4!lc1Hx+!jkF6*poy{YEIN_;x{D%dK_bOfWf=!1Z}0w*m%ls~`{F~}>0}KcY~gE0PKf()=tOTD z0~7Q=Fe-a_80WI?I1sbd;M; z4_szba2G162Bt)#%_=!;-hmANx&yM@bU`p`{7+ku7IL`TM<9JdojjlugSygm5A5o< z#5-hoj)gE^e|}l#!EYbNEU+!aIt2VvB~NHGn9_`E>+^)}G}{v<>dhlOpnaYq%c}H!4FAftxOA4Ht_tECOcUImG?*@82x}ZJ%^XZ2>Bzx^ z+btbT8`G3unwv9S8m#2A&3=d0eh{EfK?Dm!h-fa#t`rasw{Er{Rjys9r5uB35FQ0C zGNRWI)u3e;5BP3sl{>KeoHPi77h9u2{&Q?e*7B5-uuo$mgTavyB*dQ8g8hASB23Mg z;Xg4V;&2{`pDA1^q_z--Zdyv9rgSwazNCc1h!L$;|@| zuXcAn`Lm=8yMVj=UpU9JjWzuYataDT* z6(EySR=!9(Moh>gr+UEDaz4_mOmYrDk0qHZ=?(jD$XpPRlmY@d(*-fNW{Fm3Qc?h9 z5qlCK!rB{$tNZ?T-YFI!D?^>5 z*7^EL0ZFxPDXAqT*!()1ii4ox|IE8mY8^42weemZu>H+hu=pI>_)>{cqU%DC)f|_H z6f}l1>WbX|&2l+5fq+?ecm){3+p@aT>J3Yeb?t*?ATnVLl@UgL8BB)=vJ4c`FZDo# z%4-jD4i;X>7S;)def(#(P|&$T!QXeeN)rPpB9})e0Tsn^S*0cbo?^|EQ8Un_v!Hu(1$;vGsyTk*7tqIgNbUYQ- zhbZhEzZi5H9!^k?v{_erALuf`hZDw1vMEGcNvza;9OZ>z(l^kJA>Ag@3C4H>S+JMM z6UjbQ81yy2nrF((+pBvOtzG z*u-REftw=~UwAD-EaUUD*#zx8FhkYBuJwO>>vp*=)0K5_TFEX3Cu+7K$FF~tzGU`8 zTmbNqjO9+ANypKbO&M-%7B>*%HAQt$V)cnLDZc@Ro- zsgr+ds~f&5!mL3s^x9cejK0#AStKGMTcc;I>)COAd+r>c`e$rJOqxwYBOwU0fx+j) z=!$eI$gS`z+gM9x)7*wQ)?+QJX47s)F3^y>waMvyH+J3^w&AwVrhCAU_Rgl~jSwdt z1*T#_+YPdxZ9l0qFtK)C{f`tK1&?zX2z+1*8@6@omM^=xDMKj;cWD?9bfq){mBC?- zidQcp&hs9dkpUvqfDhRS|di%RzkiFMfEqKV~aJk znpp5&ZK0n#IZ2JOw&H-PxKfa>BK;dH)LD)H!r9t$s7fOUwT8*{D6PGb>pyW`Md`2q zVSy?PReC>Kn3&x9v%g>K83r#@?dvC1zTF)6Z6gkz;KJD>ezcH2Z!F9P-C}j8YwdQs z_5RJKD}WIRfy8PnE~dC>NSr$`oWRN7zdcvMl-RDmZPmVjFpuB88hvPY-Zk~wQOP2N zEv7v5HN2x?BxXOp;X3xS-AZ3&KR;MZCwTNez;MGD-&A^VtyKRt^Hh`Pj{vC-h-b8; zWOB%I1SBLFVJ>d<{isG0h}FWy6xl@a{)3x9c>bA6HfgvOAzcw&t=pM7!hv{d*kv{LW|Z-f9uQ{!4asI5qh0J0!`TY zbFt8%u<6~KgKt{H@XyKkZ+%!C ztmt)Hzy(-SImax>?A+B!j^!*VEk#2~TAfR4TZyfF9p1gQFe#9Q?}@1rhk-TPg1{V4 z>d;p7*V-PIlWj#ydxIk`>)D1lZkR|*e~xeOgP>HAIect`Fp`HQroAZ9NqcjtVFyG` zm}hqf2+QVN%b5EiHKb>%Zfx+yIjlZL?LlU%h@g>u^f+(*B3pp zp5r}G<94Bc4`5=;a=BKY$1+Kg}sH4G>XmIB(G<-OzbD@ zb+|RNOz#iY>y+$*r-U@b<$<8v*U3^kP#APl!EEwK!2)1ua#Ik`;l|lC7z=@HrVPe> z>a~jpzR!(~b@H=_R54K}X@@QC5a&j_hKN+|(rmVHqsBu;4GDRh?n6a?Lm8K*dk#_s||O0mLn!{BYzUMJ9i8QLPI$_H8dkF zXc!Akvp#7*_BGi2`XSIxa064gQ`8huog2-@VYjRgr;Ssma2}7X#6zCSa&WxZBN+-t zsiDHLyK-W4|F2C@b$+uU5-&0;c*->1lVP59*{bpX^5o6l>oT_@3Le9uG`8%YClEli z69}QNJ587@mRqT@fW(TDq#i-)QRXyJ(<*ZLo-(AS_-E_ z%AmD4X^&GP%9-G@mgk^`v%n~9WWp>w)I@@I%o3Beoh~XvjhaNO<{SFZat_Nq`oElu zowD|yJ6CitEFG-+g{rPMV*{tYw+}qhuKYCgf5E^&#(Cg66!Z8z(Mr}7vKrMR5y5t$ zFA1}zhV+uecJRWoeFneVW>1@XU-9@O|5AE5fN@GGqs@PHijYTz}~*zQ4y|>Mf+*wzl-wHp6u&aVM2K_yLS@A7C$Jvqn$@P45LU>F6kVPLI zBvE;n0NzMC1yioRXcmj?e$;7f)(skR8t0wJ5X(p^{ z^(XKSNf>8)2M-E9D+Xe%bQT8^^?c%PY4fv~rjzE(q|@hwS${rVW#pM=&HSsS&)I?{ zYL|D1Deb)2hJ%OS1sG3!Sh4Vx@UUcD5FK={TNi&3HFVn9gj_C(AzFgO%)2IChSDN( zOt}n({58=Kbw!K=U3|KsWZA*Bf)@JY0Dtca*74CoOU6}^ENgiPce;H`G+^h?Os0lK z!b|^#Yj{Y2a$7fmS9rEa^jF{MYR9<&4DCT{Z^OcOGg#*T$`)SDbGXas2A;jVgDr%p zcoehxX~$P~A=uJ+*YZCmQGs|8`YM8*%&j@9z-c zs`OuzwOSm9WNparz*O%^J*m&{h-5StS+4&slI*2sUexk2HUa*q;4#>Wj8X6t)c@ai zA1LIh7-;pIwDGBkG}Qs;I7S_HzNT|wpL*(f7_oMlFJr;2a3uV{eSJ{EIXH#iTn=x|b}X{3jxqvWtl2Ys|aAMu{2P3FBciHxPg zvco`WM2f{I9NOzD6gfC3ZZD8#I5@mRCmb9?Ai}!x4mEpCtF6X-M;}o1n0;Bl<)O{y z>2ZU(Yu{e$8MX#(4!XY?GQ7cv`V-D&e%L3YS7txE?T6AUE^FtWu^q0O!{zgxvR8Nh z)Z23(+H6F}RqN#R$}RljcQg*ujJ1zZkAd_utVQbPwpGqbYPXmtM^feA{?qaA@P3); zy)rOOVT&fap0)0__x?ncjKkAEe}15S{94^4b-ZiC#}9Ju+va>lv|Tann!(*>^l#nV z&{2bDeYffP_>s59MkL_@%T)G|Gc7LU4RBuPTRr2e1ukiI za(HIFp=o{l*-cC|^>;aZG0AI@O7NoX)i+n2vf0lMZSLQ(f5+~Q6SwXUMw?HQW0y7j zsc3(@wQV*0tex8f;|s^$JDY$9oV1H;(fN4B{-`W_>?n~%k*K69&%**AFAEVQejO;h%+IlLwG_;R$XqP^i{N&aU&gZ6Gi+a2w~+n4rd z4_I(C(NW#=pnV8=EY%$y#z_u+`k6vaAq{9vC5JV1WSzr)OH5^lvCGJE(7|B&WWB>O zdn?M6HX9u*Z8nzwxk`nBJOKWkpgQ}?&#K_DUu{mc?Aupa$ji8~lj^V1 zvIA+go29UdH#~oQX8NS`oZRu58F>^uZ&XfJ{>V{2$NJ5UaTfV&^;=IG@+n+xYnxWy zvxnxS4NK4U`3_>MRJEvzYBQcc@*kU?GcvuU&sUvz)jA`$>B!8ip}qm^TmCUlY@o_z zhp{SRExXVw+&8ca_bYoPSU5Z*$4&NPtaE*!Yr!^r)f6wla$5zfPD?DGpSd6dK6XNSj?b5qm6ikfoN8Wc%z)Wcm z<)o+kMrY)yJU+LH;HPVN@v)cK)}(94r}fUweZ)pQ0IQjUHNBST53Bh#2F9o5<}POk zYMJ5bL-R+H;n-Yd@AD7~eY5Bqd zmb+MP?r}k3H7i8HYR2yyxI@42L(4lXueJQJv(U<)r1N`=-Qu6&#D64~7eCTAKZ%!Alg>y60a@De| zt;5pbv0c3}Hw0F?8(+ZEnrxdSU zhvnw7n*BA`wh^!XSr2QjjnB%>!^ihw4{x{Q(#BAuT)dF@aK z*6uHYm3~xOZq`JqH~bnmedogMJw1o<8h&igW3#*#E+IpWtjI!tAGR`Tc%8T7dDcFD zsk17&LBYSSY>|a5GR{Wj=Z;bSZ*x=)kxgVKg?f7fHGNzjYh`-wYs9M=hu`4oePP*2 zmb3bJ6JRK;X1@lexPijfPHL!1!Igcz73J3(z0#-N*d6n*ouv=IqFK;>%Vkm`W>D zr8P#tmEbU}9vPc9CcUZ72e7r$)r8d}Ycsr_h{aZqbR6w1y<^ixW(-Tq%{zcCJ#maT z@oU1G$GgzgQ;*xzx22hG>ld6o5Bt;;3Lml#Z;tg=nvJjua0jzP-F6t(4mxCc1OIYZ z@z3BVz1nz>bC|8#9>P|II8wWI5w<2!X;y4WPSTpYotQ~WV&l#Sc=i86J?8wQ=o7mdnR#^VI`QF%cm-Lzl8;HhJ<^S$Pr*8QMmz`kxs$G&ebSXMx+^F=Nj69D0 zBSz>PDI+~SJ)uo&-|thLobt`8-#yLi$H+nuIindh-Pu^aLBYFZuEL%@VX>zutWQlx zWTuUb99RDJ)GgxwD7~Qc2MfJk$;}!zhW7Dg&GZVL4yzGUW*)w=#xFCokG*tFa+z9rb&L3-}^oQ$z)z6Q5>jTbp3NYBmB%gD_2{fw?1)wJ=e z$WOy$5qu#$GCi+peolrjayI|`?aJqJUtueDpd(e}TyPOJQtyl%!)#y#+%(6_xW^nP z=7L%U$<~aS=ebSH${9W}CvCjn+L7ax{|>L*onh^NczUK!+iq;t_f;D|zUkOBjkCM& z^y>c|T%P#P;IeRA_9q^Cmzz&P;UDw8@?7r;h5N1D1zQQnWi@49ru!1D-NbS&%O|XV zMQmmKmbIg;{gbs1TYe2zdu()>`7=B#&)q{qN~RvW!0~Dni(MIe9d<={C0q{9%WXQ2 zb2Hz%1>Pw|*la)zg8=ci@*d;_pm;XgY{&L8P;bzIW_jgd`mslzDFNelXA)D{y?Wo*R-tFwp4)SW^~*j%C$2tA;1-2 zpza?rk+tjD94Dq;Er07Zjq5G-Ulh4i{_FJHdH>RDsz(;ip_%#VLo;%QM=o_A8t-(f z-_>8*nOnbMY-3tP!|dyEe)qUjZOzvDWz;Ipt_CCgt)2LW%~g`24ci9Zd%#)L@cxS; z3%F)d8Z(;)?9^z9KPGa97w+nuXuKqFVzM*uvimQKth$ji^p`&LMp>lHhe!F{mYmbY zNojHywLR2ib6`kUXVK*^1lDFa*EgN8=6KT$7dktd)>-p#_~A>O!U56#%1-y2lLDhk zIrDA~`~A*Nj44r0%)oHq#V99bVAvn+%pI5%x|-3LNZl$s#RC!ocLbf7LE*q#K__KU zI20=F^Ibt)DJOMcLZDM=XBTnPN;@%w!-1DeJ1K+1{szw6!AXJaGR`ivcgi?1L&DK@ zqkX;!b_| z2ktBD%o`St-bY+};>?ksRUDco)(H(y3S3jpNf{mv+)~b&2W=_m>>3{S*LOncNuklq zu`5Xua8lXvW96NB>EX~(MCDV)Nu84z&7`>sBdB7BCS%FJj1#*$A+V-`GjBvV^aWzr zbtxX25US5Iqq;;nMd=BlbS&i+FvWTP#3-yJXZMhHfgdk$c8v^&8Zg$~iksri{zU(U zPRgio=xIc?l-nAiGgxW{tefeZSSKbU9Gc16q0TI2iu#f*)|F2A)$KxO2(?BJI>o~i zf-Nqhv0QzULh@HFqE}hVocu80HdNrli=17f!~P0RXiQQl%!1ey=X!1>$5eFYjR}YL zBdV_hPBGQ0!&<09(U~+6MlwbvH|hy2l|D-44OL{ZyAi9D@(N{OsimS_>j^BiO=-7j zzp<9v(80!)si3oaaJx_%Ar(E^N&Pc18slvHhmK$=J9afXA#`~apRW^^JHSGdu#~yq zDH@m%T8q^JE9k_gCj>vk>gx0&^UFB9RIP$e>hOe69@f=ZWz}_o*Q+`yJXt2w*IhohGvYE;;fKOj1AteTUO9cIeT%}xsDSEpN5`oNRbotT_(=w}J|`<&P@ z3I0T9Zcb7lqlU99hsjdIiOCK7t2^CulR|wi@%pul!%&KzkEQyZ-Am|A6xE-`pjH=i zf@XVxu{jD$W%4_zk0wTAXn@c(%#)vMIx+d-K*w563Y1gJnU^09Eve<@#aKy82pz;y zGn0TpT$Pgy^t)l#dz_d7L-lT9awyw{2jWd5zyWn6#J>Afggi_qlDMH=cP=|WzM)}=J z=qiOmKN3<$N4ukM(WT^s<&ChDSZcgdZsRto?-kjcywF=M0<-HoDO1D2CEQ@T#_2V+ zUGQr{J>5`Zqe$qsv!T6bLzgs;#Ev4A;-+|>P&a4y)b>$sK-qP=Op-$L&W7GO8>-$U z5Uy|GKTbiZFngyu({LF}H^Uue5SfZVv}*u_oSNb{G2F>t0wl@?s2( zPL!dHNkXM6wDBy~_Kbwk7%cKv5r!v3FUHbLJG)|rzDH5Jc_Y3hliQmbs^DlWRWRh{ z^q93cxaKAVerxN*%ngS+BzP{YgeEcitf6vTLPlyV<{nmGYn3*|m6=Oe>L2DTv-BvI zW~t9Tz&7AmtJ;K|qScAf)+p`7vI;+fr2@Ha6Z#NK6Ov>(385?^uE%28$W91sz0!%f zGaPEz&U106N-!I%t5g2wcA@ozw2q;(7@le8#LN!|`?J>pPWk!mg6jzNb3+x9e7-(z zXc(aZ&iuREM-k}lO0iU7pc@)TD8mgMAe82Y5;>N5u?q-|bhR^t(%n!RjXu~7Z8;mN z-8qtC8X>O$`v`e{t!W}pn@{K_r44;Xh^lA^-j)!m-NjqtsTIA~8;j1>QQ+RhXbd$f zhdnx@7)yh~>-18L2w8MSdO~y|me!iThR7Zi4G}kO@IsC(9i90@+C^WdP{i~8Vg8W+ zYG>YnaA*&@I-WjzAu*a!sxI@6W>;aU-MxOFf<@PBZ2p$$@8--~5Dpzd)9$I!fP_%b z?q0DeXnsQIYpffIEA5V&>*#x`uMX#!w*-r6V5{^FmU3ZY?@EmB;T_l6Dd%r#SV~sf z#5UzrrH8Z2go9rqc5+9?6|4tdKB??+EEa9WP&5QNJ3f;b%?y+g<1V3TSl)D14?T#bVaB}X ziT*xL%rc!CcVCtioWO_)JH7JT1=kW{`e(EYF20ExDipe- zueU%jJUJ2Bho#ziXRHL*JeawH+Gqn{hU@oe(Dzq%Air61x6uXyMt=$AmbUz_0Fbh03pN zALRxltvVa}HWCW8O!o#ZJwC zmZss^vyb3IC>@>MquYf(B&5uuOwr982S<8S)XU{MEX@~hp3lQl_p*#~jkaZ^d+vG~ zkwHo?YQev5ly}VIa)=S|2$ow2Q`C!d^U&&~P@@cQvEvZQ;WHD9Wc_< zb<3q;{WX?KNsgluLRV)+mNZVG0=H&4DeJ?5?OD#e_2E$c@t!9WCM_YDj&->%QA5uX zQnPqRpx?2YdHD@X2sO#}=7D=X6U@N6#@Ri*UFcP-bDc%I`EnwA)w0?is~tJGYg}L= zH*GeCLnjecXm{s<k&Wkj=PJOyzsgt=mz!~BU8^^Lg zJR$H(o)hy@IP?pm<|<`mt|sJrWhrH1S2BLEuF`HzQ5(T9J8AWShy@GYQ zn?{GLU$DI9jpbCY*A#C@l$T>=5mq9e9A`PM?407nyc!Oap6bMK8>ziB_tm7(gsI*Q zoEZ1y=VdIF!8=?25z9-hzHKrsa`Z2nofw7D!r9H~;!;AII9{>8z*57yE3-e&nfrQD zC}+CYEk1YtJcFf7@xLu0^f^{**J40(fjoCxQYdAH*OpPHxE>vVr3P{*e&B@}PRjOh z=s2R9lY??LcLfT(EWNd1IF?Po`RgMEPRbkM&}WG4wI5U5hdc`-#}D1HxE@OhN}JRf zUL0pg-sQKyl{0roQfTT-Z(Mq(9GkF|mv`##zs2V4o-K61YN7qOCq-j#advUDX(ggc z>x!Xou+(4NY+w!#y4A~?gZ%4>(HLre@3iO>ES1Y!1a7{KIGtODUMA!XUboKnY)3CHp&S;oIo3J>q!&2eO z%=Y%gRL@8VB+qtY_Jjiu&UR9u{j;5U(3m;Su07$<(m7r$FpRe+1V6w^cII>Q<&wEx z*HAr<4>!zpcD)@A+&0&V*&7aQo9m?P4f|_5bN41i_n+rEo}D0}dr`bQeKv~8I|Zu~ zyP_Dh_e)q_j~8dSj*4QOkYnq6JVz!j>fb(I^J`Vj~F4_Q+ddJV!&wV?@tyB9k1 zJ`9ImMQni^gOdoT67bXTkDjyoTsq zSXYowtcn+W1IwM$p;C*zHIuHU9g?v$O*k~L6i&rzhjo!|c8A`?YUNt7wV8K^>p_Kn;IAz5s3x#FWw9!~xI| z_yLp9Wd^akor~p1>$sb^6kzJP>8^&AUw3|ph1|fuWhLzC#{M%agKL0x!~pbhil!@L z*S-nXCRTi38Ej(N{baE9v->Y0_>fy8fdT z$tG5QnLzPlO~!VA*#b#fRvHg$E6H-rcGYvU;&W{L-?7?gvh^#$UMEOUV^6aVC0RR| zZuOEZ|3Vh%-u?|vS(Rx<5_&%tt6{MSSQ^02fSz>T;PkwSZ0NitQ|gLb+PP6fihYS zN`ohXw*MWz82`;62wsnj*4HtV@pe!Zd&YA zw$;U|VVgO+Uz7P?u>5x5R~CL3CRg7Ho9@5C-sJdi zWI!?gI|cFf|4%j1Z2QsHtRzeN$?E4~MV+$oV)e{vYl~(721`0)^)nhH>f%4FAeN(F zqGj1p*pf9^^37~S+DL`j#8YU@OUz8uLdxxD3`% zYG(b;#foZSr+XQ0SS6RCxOYdU!k}SO|x}v)AM=jRF`juq) z^|ZRj^uGd%=w&0s8Ur_4`&_K3zWh1v(p>hAFq{u(B_-_DootSn;=5zSZht z1!wU``OJrv{vNB}t4KDng7;aw1Q)m&FR&3}WwaQUwAAWiW&DV>#TsIdTl-wB0zW~# zTvl3s5>~orCAw^9_g_LJ!kY{maa2Z|Y=V-kb$N%4-)ZB;S_k)7`&_IF?k8R@2i@xy z1+Wxx*d{E=D!>t&;8Po4k}o3u6uSKMU+%PtW&dn#v4X!?{a4Gu-xM$%-eV{z-aRRT zOVQl2gOsQbE)h}hw%n7*L{|>8Q4Q#sq zgf&Gj$6pQJ+NNt=$_@ny(h_WhSUX6xdONF^WW~3)dP$a)#2>|Xw47|Y6RZ}#%5v8N z0@}KkU?sd7TT%*tRO0Jx{C|flkk1gCPlO91fs(9+I15M3np{`~%CiZ@vhyuZuzE>W z4JTP$EPINz#hOI3VY;NiH{V8x<#@NX|Bh9Fd#s;Wr&|V=z7W}le zrtJZL1=Ie3Kia)UUTK|6vRdJ3^cZ-(jTfu1FIroyOgCEIWaD49@nQwHSp8L4{;yek zn`VMCd;>u{Du%U*6@1Uy=VC=2u<>GLd=OTC?^|6g{R3-@Wq$}u`b0B9fulC!QyFaH zE8t6L24z@F&GBzoi(ow)Uy`+>ORZj#m0tsNRk(#BG(y9$5+vCKCE0II9rV{WvA7(in=ASP^e=N&i|NUA1`wR z|1`_fEzhv=f3aEgzQ1mPDtkL|YPvhD@13ypdtvS4KC3UVwt-cNMX)xp(l538Be2pv zX5+;w({gKzmH(5GMj+rFlda=(uvUeaVQv4Dtb)8^^L-`CO!>ecWd>^aB1#X7@5j2Q~z;Z~l zJQP;F(ycuL)+UzUNXw&ORbaH`OskKD)qdHqw*M>l_A<(`4q_#kVC|Bu9Za&iSOu62 zOP^|WvEMBIn6ocb-wZ4N@35}X=GkoTRCd_&VYQEA`2m=Jz9sz8?jN@Nh~>xBuu8BB zfq%Yd`J;w>-a4$c`~ob$mtbvT`E9m#NtXVq)y1;6!79KTRu{|O8KnLise5gNSP9;> z4*Oso8$N;M_c^SZegSLyJ61j?@KZ;93u}kp+jM6+3c+uh9;PQ0^)r9u|C{v_E1y4L zrB^G61D2y;`A5U@D{JiwYnN5!1Xd4>gq1ME@)%hDnXtCM zWBHA>eqt?c)2u!1QUa=>4o}*_OjrqSu?{YqkB<1Om@`NG(Wcx{e^qz(%(f2aVr4Yf zW_X9q@J?7ey4$7`%f8pz{|W22gH`G?mGDWMP^><94%X`ZBCPn0HeRe9y=?80tb%T~ zdP!FLE$Hfk*I`Zjy|DD+NT2Pq!hTqrSPlnZU3DFYmBH6m|HksSuy*{tpbTf) z1b@fc(QN$G4)b6&;38NBebA;C%YFz}Lp}`4|4|z+R)toSv9s_g>-e1IwXhPbxArDj zn^?1G7pxt;X?3wGu-n>V74%(L`Rs>P^N(Te_)}QvKT}gk_!3rv?_fFp46Ee7!Tj?D z5M`H!66v(#1{{*Y16Uk3Io(!wWr@`9sbXc?Jc37Ls-6Da1VP!A}N7eLBn?Nl6E^C)$ zzj^r!fAe_#7_fq9?Qf-Zf704d*<}C3ru=bxOX^u0U6R$|YpwowtWv#T{r(e{{|4(1 zdy9YsMQnss{!P}QBrE=9tN$I>!S5sMCsuwR!|I>UtS(l5pGSN9C*TRkEuXNC=VB%N z+Qy6PV3(tJHFYYgm;Xan!7kQ&ZnRwtE91)67V852QmZ$Bm7t-G7t3x0YoJ_i?WV9s zUJF?HwS={a<=@KM5jKrZ_{+uWNRVVbI?BWJI^nMpPr#RqshV}O3IC4$X2A)r{FN-l zx{Fngp4R?PSmo?x{lyxJ*Tbskjj-ZxvhgKZdfyNyu?qB)gX!> zRdpHT8*1|!Ve>c_tIVTpd`VUrGOaF_-#BZFIkbMo@BZ#$VC9MD;Myd+U+%Dh8^AAH zzmlx%H(On-u6@ z4@>{R>S9&=NXX8rBi8X#>-d><{7+aJAG7H`x9P;XMETy@Vin{ESpGj+{YO*ujlW{N zqW)nev0Q$(_Bq+C`^MkUP4=sG|IP9lSWWe(<$#L8Cgz&vTSh%GzVcQUYi|``mEuBc z$J%(Y^orINYm!yB`X#W^*R=6s?Y<7I7H(ke#x@=v?M{KHs!zbH#9xJ<2J4ebDd2q*1m7Bc1hO0`dR&4tTNtg(+{zJ=VFz8 zsEvn5V|s!LGRj7X;emhV=ZNN-IsC^%X1aBv|{J zZ1s|?_~}*`%WsCYOR^earj5S^R-?_feq!ZwM+}o&fxB&lSVM22wZ$snB5RAa!w0P` zmi>_B#a1uLI+0&#^^&Yhv8^#oZtdVT9K_qKqgWYlx3*XX-380R3d=I<+a39V=Z=*Xy5|^acL|Pn3E&_p>_?t1AXs9tNwR=|G!U6&T@i z0(T~?FbdXIlI55I#G`>Walj1RZqGNfFcm!>Xe-Imvt9MvtoXlsdQ?djujO>I47L*N z9hoGkg-bp?Do5GcLCL2_rOTFoq2*g)`Q2uD7Od^>SpMgqB6XYT+)tODe~MH??5J&_ zpaSQgB4tTF{}ib=B-;2{ytImxe0o$-vZbGYiuC+bq#6fofA=(LkofaYk)G@6QMH_O zHRAcFNSkpAsI$OxJw2+HlCJaRB$y-D`KL(FKSjFK8w%&2BK4JgdQ_7|_W7qsX^8*i z=}|S9{B%?2{8OYubXmX_;qy!s#NjkpCY9Z&Ob#; zBbn|Bx-D@2Dbn*#k-ATn zYSk$D^r!}lYz>kvFy|iUpCY}UU*Xgs=bs`y{}k!@r%3;kr%ZL&IsX(XjqvwRm1^}p z{}gFO9{kbrdj2U=8bVvir%Tl^=bs{VpDK0FRcsTTe~R?{Q=~i?r{m1|r$}jp^G}h| z2=3FQS|I-a^Au^KeL7T+mFimUKYohTOs*ZsH9g}3JxyYrKzXw~F3`hY%AAY~++>bR z=u;OVXqMGQSQv*8tcOs>q}D^|Ru^HNgpl!Hif~#&`lSeE&1wlN>LFCBk5JyE)ko-i zDZ(}h7ns-v2+{Qs@*5z;nynHxNT}Zsp`yudh%l-F!afO=Ok5*`stpllHA1LjiY4rj z(55j$H8Zm@!lXtB$0XD+@s}YqYK*YpGK8Auh=hX@x->zkZHk&8%()EVl!Q2wd^tj5 z6NKfLBh)h|B^;N~rzt{xv#cq?!pjkY%@7)z)Mg0Xnj)-|(AfB!Bb=6y-W;KcSuJ5j zGlWVl5Sp5_76^TtBW#n<+{DHsM7Kc5k4K0%TP19eP`@QYE0f(4VN^WAJ_&71Tq}gC zEfHq5LP#*h5_U*v(;DFlGqW|qq*e&WB(yW}Z4er@Mp)1Wp@TUh;h=;rZ4r`8QCoyL zZ4gdLNH)m{2#IYGmM0)|HYX(p^I6Th_EmLA$SGC)h6`{gl>rl>m+nH{wonq zOGv*Gp@&&5VZ{{)mD(ZnGHLA)`d*2^n{<2luQjpl5u)266ngmkm4Gs4172*IlmMw-;C z5W00nSSKOF_`4vSmXO{BVT@Ug;LkLnuFzPM2ARHHh~Czf=qwX^HTrmyA<8yeA+wzzDX0^WnL8BZDOy7?lBpnBC}O=uc_7>a!j`9KC@G_z{K4E-ESs~j42i^ zG>!W}515&dnREk9bF2?d^Pq{p5us5ZgatPuEH+0Z9F)-ICWNJ?=q7|YHzJ&pu*@X) zMM%5}VR>JKN6kqI$0hXXhp^l%>xZzgFG8?C!V@O7KSH;D2DdD(;KEn~VnPtOi{O#r!(HkZ;9ok`5 zigp_R2xyn-CwkMY7QJOcBca_UO|-|nD0R_b$095rhw!O6DdD(;K3NFI%(5(mh2s!{;}O0vspAp4Wg)DS@TKu*Bb=6y zo{jL8SuJ73c!Wwh2;Z2r9E85v2-_rlXJT^^qH_@Pa}iFOtr9j!sGo=Mqsh)g7?q2# zPr@k^myb|24`Eh5!q28y!VU>-CLsJ`W==qul#g&s!fz&iB0{4H2n!|#dIWy=nWGZ} zH=2V|x=cd((`W9TgfeF$$|)4T-y}~aQQ{vSzh}6;lx^O-Cqi(xxNyorbVY!UZOF214|7g!~x@ zv1Y4;4HD`XAXGHj1qh>NAncP+$;1^RR4qW5Rftf<6ie74q0LN$YG&q4gh_=6$0XD+ z@wXr}nu)OB7KEDSh=hX@y4;FT+Z5f3Fy|J8Qxf7#@@)u-w<0XR4WXVnDdD(;KC=+& zn`N^Q7T$&syd9yTNxdDR+bo225*i!-Y=qMi(q|(yF{>r4xE-O=9E7GOZ4N@;*$CSt zG&iwx5u)cHElss~P%D!yYHfCk+L*XIptfeRD8Uqq5>4Yfp)1Tx(UsrOsDS7~5&O(G!64FfaB80>T5SA}O7-mjNI4+^jg9zzn*@FlR7a;^6 zLKtaMA42H%Ai_Ec8OFaD;k1PG#Ry}}Y6&YILa4L^VXR48g3xy{!Zrz6CUz-8^b&;p zr3l$(tAq^_>OYK-YqB3k7_}5(pM-o9w+x}`!w9pMAxt#I5_U*v^9aIZGxHIINy`w9 zNtkNlA4O>N2*QF#5vH3X5)Mk}@)$yaDS8ZH&Z7vYB+N9)%MlVELs-5X;Z}1}!f^?G z9!HpEmOYNJa5+No353}u^$CP-k0Y#;FxU83Ae@$vz5?M6vs%K6ClD&FM3`^VRwDFW zfv`=&-6nPwLi9?6{8b1=W~+n^66!yR;F#-*e79uiF*p6>XQhwoky*XBIK__SZ%gS*dU?)3kYjW_6rE3)*rJtQ9TM7XKzPy2+<-7?J;E^wn@s$R2#q!%EO-&&WphNrK?z+pB5XEA z8xiKbh;T~6R+GF5A#o$Z@=XY@nUfNZOX%|w!Zx$)C4_~W5P~lwykSybM(Fku!a4~% zjsF#d(-P8OL3q=wmayVwgi4zccAK=#2z_5c*e2m^6T1Z=dNV@)7KCE6Rl)`d^|vCt zYqGZ@jM{>*Pr^PE_bNiwtq8MTML1xJCG3#U<~4*vX69=MlU_wQCgB4U|2jgW*AN!G zj_{E=BH^HfF53`3F-6-D=Ddz@O2QG7yd5EN8^ZGK2%nmh5{^sg^9I5(v+NCoh1(H= zI}pAwsXGw5y@9Y!!k5Os6XCRk^qmM_nbi_j>_Dir3*j4+whN)}PK0d|zB93JB1G>( z$bS>zq}eKAgM|8TA^d2v-$EGmCc-`mr%c>#gsN{L%-W6cvniIaLqeN92)~$_dk`k= zMmQ$nHxvIhLZdwh3*Odwh2I=~Tjv#0y6n|?h2Pw}SLYRPqntv~c||da689o3FGeV3 zPD(f~q0c)AL9^@~goVWj!FLhLnACR>y1j$2PD04|-$OVpA^kmsvSzh}74ITc+J{iy zr0qlK`yRqJ2^W~y{Rq+f5c2mU#G0)VHb|&{0HLDEK7cT4Kf*oO4%!=5k zORDK*th^(?P&c!uOyUpQDYSCyPu7WY{Cs~sDrS6c)4ZJYbpDsWnNcz7`Cu~tlexU& z-*)5659JYT?)MaC!sX1&icw9JZ2eW0qqg{ifAZg(%S)UpF>ZXua5t|ntGjRFaQ8bp zBQHbyZOYSAWleUqsP*n{^>$PCRQOrV_2a5VRrUvSb6ZdP6eqH9F;4Nj|1A{E92 zl!`MTf32vu1JATlS#OkdwtNHH@Xi3aKH=3XCo3~EpZ_KMO}q8q)`^NK#bsSuuc$Ff zW5#DjMRO*UeQ8v~;9maAu)B-SZaVXId{lJhXZY$4Z%T42Ffuc1s47rmr{?AcQJI0G zy;X{4%CTC~4PJGIWo9%Ro$EaymDPvVH^u2u1LP7jAtNt6H;>of-DGAojOrR}*q4_X zC^~C>VdbbOckgZ9zsdct>4m=xbYDE=7C;GAfR6lMV_rz$YU#N{^D{Ds`@9B99TD|f zDRbSc(NX@YrbE-HF~R<0)!N1JQ8mhk$9Wy-Ns+!hMPF=qzK5A8|VA>qK z)chk=*tlew>}&npzj`u%WM;;Q$)j^C&eI4w(mU$ifY()r6Qe#0-oB8MtNp!pEI)ux zD{*_YFk!LH*c~^)&6wrfT00jGXrz6uf2dv5@eBVNO1&kT!#$%4gPppQc0ILg5_CQ9 zyFRLQZBJEE?{>u@IZ@A*vB_28^)04Ewe|z|tz6W+PI_!V6G+yJ)Ho-$2?9&zoD|Xlstr^2>Pq@>XQKG$z6b1UtNmu(^}3;Iie%GUP_--l|E?Ow{{UG$W!?X< zQF`0m?N<8}P3yA$hf6sH*z^KbWl<5tnp9;`$wme3Q!-(ElgvqF(ZfdRm8}Za1RDXS??S89 zB3u_}i?v#9!u7bIA&X{i1TWtsO3C8DVcYuEt-F#(epIMowR&hfO_8#wuXJp!Y*c;1 zkr(H-wps(UEw)G6Sgj%2qvnXRcwC*%mOzxe8iSLz6z#10WoW-ztv#Ary9xNi#6L(D z?pVU?Xrr1E_G^5xbwX4BsUe%IS9coT)Mfr)#FEE-yOz1UWD zyaF_`+KtxzO0-s1yUA+p(27j9vS@Ax^8lMg2cl|PZJ>46J3(42f3`tZOCsFfY*iLv z8#Tm6B@^|W)go`u?S!`4YD2AGXSC-{>|(N5LzJdWx{c~Wc&&Ahykxg4+B)ku()wME zR>h<#i)uvaWeTHhRCmH5G)=cLR!brLC*7s#rg!sd4?V!WTwIgIgX&4Pd>hq^@Di&{ zv{_t(Hp6O>x9?tyHrn`?ki{4qHO0E85_Jq{#!j`_UQf86^_y<}dZRTmsmkJGg4*=H zSb1>{;+qdN6ANt?HxkYT+HSFaoOk$InPtjC%|`Vjthc|#!LzK^pYR?#&2G2Z z4nTX`oKzN1G0hrb&b96X2}fSbGtX+A&G_co>3E0L2BS?d$xF#1@;0EmZ0>19jllgf z_#W#%l<;6Q&CVjL4I@0+6e$b${Zg3s5ye0Eoh)BCltjN_djV zRu=j+OgGH+HjC+me*h_9gVkmb)`yiewO+JZ0pah>R%M~DU1{4yl$vEGP!^giuUPk6 z2pP2u*Wkht=*Nyw|K&7CRWYH)HOyQJSUm(KJ`yMB|_PNyI|5A%yo@ zzq<)%8vmnY5qXW+J2t9_s9v}agY}MTHPyW!2~FF3R&xj&ld3EpW`GaJ+;5{65MFMz z16I2q?Rhk92hsTFGvGzDOj&HSQ6F3P2Z++k-_qev(A30>z-cs1wL9fh2V^Jf10qLl1lsCYR?cZWwk%7 z_ADAVkd(zoNV72Y$Pzp9tp*y{+5%{*_wzts4A6)yWwkYgcbQ^kp?9QdLHOA zR@!PWpy}mncfn<>ww`d7iF=$Z^e#mWofsSSBH(%D+dks`Ju}_diwjBdH=Tg)*V9=JsRjjt1usT{}LFZxedqbK@Qx*@a8`!GbsGWpW zXpIG(qRD+1m|?X`toA0FV^%ARS+ulTyq1mHP55;x_Yz#&YI_LlyI5+II#zp|a0hOH zlZB$R=ejnkn6O5yvZ`mbcL+DLZKju=t7Pwj<|dUa_$48IMQ~H;4=K#c(WdUoU|W7k z?YA=6DyZwFuT9a)V8zNm5&Q@E8Jq^c0AG~ZxH8y)8)rvW2Ag!(Ra13P1MDFBEwCHx z0dIr7K$lNb!7bo6pi8HrAOmEAu^`3tSrx2ZUH|pH3DA{Pc~Ajd04@xe8LNWTE9;U; zpE0}@+y-WW+x_O5Rl&L)@(E7>6Tu`f8R#2|IUpDG0XG3%M~wh_XHX)z0$gcgpA1$k z=twXbbOKj_E}$#88gv8QK?=}yR8OGku6eC_taYxU=1n8O+tE3gj=~SDgDgj2_Jzb;BwFuGzTp}JZK48f%>2UXap_;v7jQj7*qn4 zK^61#v%!Rmwv)dW^&Ma**yS_-cs6+b(ANp;NOvc=9n1!EKn}S zL2J+kB!DYHJJ23<0LPdldM&3ujP)FA=X1ek)pRg!#EfhVE(4c?rl7g;uMXDcclWr} z!6pT7F+_E3_BPl7b^<-Jxex3I2Y}uj`VM#(={v^x%@B!!$CS23DSVxR67v#1O34O&zSg#5%4=R8QK`gik zbfj^MXy|)^0~VO#=Yu``gG|je!Fv3Rp1dYl@v>e-TnBW~Hj*9~1-cOK22y}N7ElxH zE@Nh_307{ZdycxFcpCf)bhFSQ%>r;gFkm5g06b{6u3@G=O7L;;1XuxnrrA#eeLgh^ z^bwGIKoJPh;T6F^!h=9x&<}J5SAi~|D@X!5A6iHq7l8-CLqHdkOTi=HafZ@G5v2JPDox zy80Xp(tSzZ>EdV-j{$8EKYEXt(35Uf>N*OiT9%(xeVmHWKLba@?oLzcYP*mozm3+S^BlVDwM>H6v@ z&`W=(1HGGB?{Urq8Q^Ntb_0jWS67g2%%K;8wY!7~>O%1+=EW(n5G)2uz@y+X@Hlt^ ztOQSir@?BVtHZTmz3H$%Sf!v9*;E8oKvhr;{7&>AK(7h^5}W{Efw5o&7zxtB0MH-k z{~=umQh_cHF9rIx!Asypupa0m3#-8z@HEi38u*UG0QZwx_h9Iw5xS1lb>kF}1Ip4< zb>Vv8Qcxc>1ebv(K;IBK1AYg8fIor0?coRe%a~>xg0cqFzCyu?yM=&iNIkn3S@w>;7OoQ*)9S1fFhu;Bi9EFz#kM!XZ-;X z1%`kTNaKJmux|s`fmCok=neV^)LplY`+|PJukZi-Lf}`Ri}>R}7w-FjZZ{kP9|GOM zdJ5>)l&(@I1Kk1DJyzWzPXRrEzE8J}k@O%~2p$0Af! zhyNk?2pk4_5x=e~w}Mh6_!IWSCt-d6K$nX*fIgrR(C0w(i49#c&I8lIERX=M1Z(M@ zbznQ#0d|62;7w5Q7Jqhwi*c+Bs(@(FpD{213ON9vxfSN^AT_qBWEV!KDoz!nW=m<7Z_kBQL zdO8Mv0;j;w;50Y`CR2|oU>cYXW&nK==^3C8I9&_cf@u`vYIfJ1eOv(RD;Yh&RiF## zs!upvO&|$01-giB4)paWeK+WNpd02b(7H02@)*}Qg3dtK)w&f?5A4KV!47_=0;TZP z_e^S0|2m*9&|Lssvg`V~KG1E8OVG3Qh0^EAcn-J&Tm;t80s7ft1E>P@JA-~#(C-NM zf(-B(J3R(;(`yL04sA2+fO+5!FdxJNuC&~rbrRt#fbPq`PhsCB&3onfvk&YC2mGeO z%fXa_Ce(O0rF$Lh#Zm93*WLN&z-BN33wixY_yN2C)`Mq3As7q( zL83_FH0<%%N5Ea+ZZIA61D$~G8tZoM`)Wy``?tDZn?);pN-KW`^l1X!uN?)(QLr95 z2J4Qj!RbNpFjx-O0o@}#4SoUoF3NDA&k5ZP^jW5xL6Ab}&Zh2UhTs^WADVv$x(ykP z-Jc!p0B3+&Nv$#lNGo`XKhJe_XV@`;e`X#N|`1j>?5o%s;FtU!@3)&yMMdE z9?lQ z22Z3g`UIPtgyq0>hF@Z5($t5yfR3aUtI#b8$J@+D>9-5E55G1uRs`!B?Dhp!aVi5! z16@+$6f*If;dnW=-1VXpgbrGXh9#9(HWDE*7eaKK9&fVX(ac@ z?Tg?GKn2UO@P(iXs0=DuC|r&GyU!)mz^DUigIeGcP#s9GX`$s)7u}ZuU4YjEx)^T; zngHplbpuczGz5)6V{kdp?KLgO%|Q#Gv@O~H+4cEK!o5H@a5d-zl0iq11iFB$Kxfbu zbO+Mpmtt9V56~0nWa~zt6D>{6o4_zI1Plf@g96PqiKg#sZz?Wr6w@(k6k4U;@Yoc_0^j4wV0g96o%92pj~jgV%tT&xgSnuoNr- z3xNUCz!dQ3zid;_q1}%*-7I@O*t=jR!9t+Mo&g>Ji@}3n5qJo^0$v6y!3yvwcmym1 zkAo+`V_>#18c#HKs~n}bOA2__2^4L zand(f-UM$1uYxULGuUeR0Gw&|Z40(5*g^0OupMjzAAkgK8HkM7_X&RnJ_SdC%6kMH z2A_bB!AC&lKL(Bit?@du?@w6${~h=dJPg!L^#I2Lnir=_F_wTo!0+G;&|vrhd<(t- zUxP2fSKtI_4@&l-;Av69XiM0?>zoev zK-68x>L3p2&SZa}yNox18bBwKeLz)k8PH8erR@pV1KC$j}j>k}IWdgH$N3e?7vLhHY2X_Q}7U^JxB$S zIdqtG*JA6AY%idb+#A3abTyP3Q0NOXuyu?XKv)f|+rTTaH9vCx z>KrqZKpw~f<3TRS0Tpq|wpu=XCzuD6crH8})Fga6JPX_gZUJ4;X2JzP3(I792ABq> zfT>_QC?*5?12(U={3L@D5lC&UF~skFG<>0a&x<1M8>4X*OsP zRzJT__z?IId<;GU$3VeJ{(KL<17Cqp!MET`@C`Tuz6K}2aqtEB9DD|jg2O;QN~a8E zD;&|3kHU&m{)$)FYONxHvm8k*Cqd2lBT()B0iW`lJ-dT-3w|ej2K)wo1*bvebcCSm z{|kYwgtfv30vu96#HSMBi$OF{H&ujVK?NYcvOw3Ty5b)~KILE?icS%}FhGZO#kc_R zBB0v?m4Px9%UO)Cd)q+2##IM3K?P+7%A2A+!5)=#S3$S%8iPhazX7%|C-(%euBP1L zK}*mEsOXBm#-zR-Y_9)La?9JnYxv)p#cu~IR$I@$x)OUeP)1#V?DgjNw}Vf{X+PKC zqN|!AU^-zHZ#ZG?+i!O64K^&VeMWGx`F(G&mA{3FFAh4fU*N2ZcipJcExYz+UvaQr zY$~!6s4aDCa;^!z6RZ(*CDZtwU_n77Rt@q5-V0&1@FF11fQXND-RoCQk-K54w&Eik z@qG;KQ4p~sVdeL@)yc1|ZzaZxzXac^5@98dWT2ft7l|_i-woEb)tLEiu;Rdor;4^2 zYymHUSAgQAiM5tQ!mnCQjk5!62d|gVwnf6`+rhv3iQwzRR@N+b9<_yVjjU%nSih}T-?FU3Sc^1*{iG8FuY zty>VkfM0=<{sC&3)P2E<85iO5Bc^_}IR)f)8fad84=WpK%Kmq2D_dn5$xgQXB4 zK+}))mxKFF+Wue_{y*pB{lQl8rzxR+s@G5VI$PCG_4;{UKiw-%KjrIZ`&tpre6&9} zAl8tfGS!m+ZrF4`5KJJ`nFoSZg89Vco5chR6ubtfo}dTN&C1R|dN=rL(8bzU!OBc= z@>4isr(nxpc1eHf(z?Ual}98k`BXTYfgJKp^1)!mnvp!OLsIx!_&R?xc4c1S#!nv!P@Sksp+OUq&y1n(3GuYvhhlmq{JGIvxvG4+zO;cpg27b zqM;pOO-*H+Zg##O?CrnE)chcrTR)#*4$4CJaci7!!^5I~`V14R%!1OyD?Cd|Ve(~X8 zf!|-j)I1s-oUBzao;3ByE&;S4+#LL`)~-7&s-x?(7j_n~0irCh3RuvfBD=tX1yB<^ zDxyX-iX}D_1u-Tf7VOx&C!!*@#Mq(QEFm{JT&>@H-fV56kjln!dk@d-x&bbPK~p(tEeG z4I8od<`N4;zKfoS;X9*_LD_=mEm5Z8Stqo6qI5;+fwGbo-hyvi32-ko`8slUEZR|}DO}edp-^sc+G4%6otw$Ah!E-?}1H}u!r=y-tuWsXA zfpt{v4lp7y$fsI}JPKc+B%!!d+dJC#U5|jZw*yt2^DM)^v9?0Q%0Qy~S9`4T@F^-YSns}0lKq|tY^b*k|h z<^&)dxg9|LBgzq!A5d=4?z`HWp>~)8_jwV8FPS;Z$$_H>3X}1t|IeXt#+x(WH&Ars zdQa;e`V8aUQy=k2ck%lU3Q{C?F_?2Fl#VD-C>$Aip^l_}AjO|_kH3dR4nG};@(NTe zA{Bsf5WSipW-suJqfYilq# z06jrnjB*v_AaL*(VALsJ>)CQ3fZXvT0Qi-ST__y#K1E%E!f?$EO#xn(V7b);>Ve{k!W{C^CIwqi6K%G8d{x75 z_V9ambx`hrhTp&AH+}+8Zliq*h2Qw$ncqOUj`BN7eLVXObs%a!UNuzfmUy-h|2KC_ zfz}A+EGW>n*0M*GD6~*p51+K?SE#L-z^A+SL1DdVjR)1YD12V-g%rF>nzjv|U+Zge!WNZSWrpDHNQ)&aJirP2d!b9>5ZCo0pOM_NB= zgFQJu)<#P^?CHbDT9dTbo@SwK{sGvSbo$7Mo#hLX7ez{%c%v~eC@@HV56~5m=k<*S zuj~e`0ST1>c6aS9<)7g7Sxp0Sy&$S+jTkVDdjFyIG`GMSBZrahSoBlt<{ti^fGAiY z>Ieu{HvRpp)yv;lXJ3g23N!|q*tF4>KeT%9VZdNkk{hi)n^tS(9vQ>L7-6)dhVb-e zd1i#K{8zX8={CNPp$Wjq{7*rUCTc10sa7945i7%7I3+dxp|Er2UP&_{G|*%Y46%D9 zo9O5{yv=^3Joa5E#_VKuGw2pc;Y)V#%Ee<<^7%$gbw|Nw>wd6TH!Uufd@7Q zB3g~0iO;ly4g8K8{!717nA;{bVR{Gf90UaPyV#ke=h(8<&SZYBJ!P<9YUnN97`49k zxGAn);2<~|2Prfg(lFk+6+lKT5^;cYO(oNq^=Ft=w3~NSRUTA|^3Nl`x%YGGT z9}`>z0S_MW$H5&ZTtbI{APj?JW2@7{7g|p#xgt5g1i?p@DDtINFI}%haWA#eh7$1N z0>aq?mh9Mf`KR9{jS0)iY2Gz1bP$+^2LSV?HSuW^KXy^O_9`#f)!nWXGfe2I{44Dc zLl(?8Z`s>K&GzIPA6y1nNTAH}rpmP7l~!-w1q|-!>x9kcax3qz3Ji6uV}S6U-Ttlf zj|mT|#mf+x`+M%xw*<70p*OtxMFVpB04}cM_Z2KEP;5E{>BpGuOi$Bf+L>1Uu zRVco>&>I%Rq408dJ5y9^Y?4b4V1y~O*52R2J2vDzXnEX@4G*vNJaNPww5qseRi^Es zLN6(ORB-^Z58WuiQjhSUH{jW@SFenF$gRn==kK77jn;l!UzILmzL`3gs0TA8g+aFDG#GbZ?qkx^HnMDjaIL5rq_YO zlccxW$p$Y-6VEzp`rh|9zODF$tbVep=lW3gTa0?yhxWXMIBoQ$VzkZuKq0Sj-=aTD z7W8{A&jhnY^j#Jt2%2n%KAM(d6}I^)hUHSFroSA%uKn3T7Qsdk!F_&|3=H#0V6c$7 z6~unkava6kFs=Z?lH=9(Lyv*dnMF28kss{`tyJn~xmc<-XuNCIQdkVg+_qr-*u*qm z7_1AHvOe{zD5^FBvn_zbYIM73kJmxpx4%jnGoG+mN2_(w%l^Ohsq7d6YSoy=)mj=4 zIT%!H=@?;>Qfn>Uf@*TDrPuK=zt++ckuD|Grg0iP-CvuwYlPmMS6eY+3A>wa3=zZc zI%u#%!Ms{GRmi<%pFCL;^?a`l^0YRUg4SF3E41e5++AxH<&3pq=*cL-Y}KRos0@+7 zgIc9$IBXfx$F(u+m355H{**3(ivhrZ@}wWv#ZasK;fHM)V^oN~q{J9|!aUFhnd48V zm^NF*xH4r>E90`uhin)*DkQ+IZm?$dtu;2taep${Lm#iI7>k<})f_rEGsA}Q$e&_> z5$aG!(Tgnapgm^_KJID5@B{=ZnI0RNSI9y;GvpCczYd0u#{k=M-C!d8f&CTE##rOi4LMRL<0qSksdqq z{I=?G?VLf#W(D2#Fwq>X2yk8t43;~E!en>|qreJw(5trC+o$h!P(WaKsO8>NQJ`-a zg3_0m#Y8y$g`{YQ*SD3|~5NcK)ULQ}6h0p?l2}Os}Q6ZweZ^7_0 zU(N;Ht3_qcDUoSq->4W5!!`IjM#$Q<=zi5Ir>6lywMX~O)K>>KU>DPmVT$t*v@#nn zOVWlMj$5)p(tL&|yjrlB6C8zS0-7984Cry>a8{*kt)$7q6E=rs80>Jxlb!t5BZ_x$CP9W-#5Fe(s&rnC~&hS9+A0Y>M{;^Jo6zn0oC zmNcb2V3@Z9qdG9eC#MG_p87+wVVqKFzpd@iJ1BozWgFx{Q>yL^K`9?0zb27Bd;Z&% zmYS}GHjF^(>gUQHNbp1C)niav;n~%Y{u>0B{n{Y%bJ+nZSV(3MiR*F`g zbS&_1*YQLyARK~V$-B0qpeLe=4^*%(kXXnzEXyj=`u1%uBgs2BycHcTFXHi?Lca>) zg8AKXT)ygS#uyUvZe+wiv2`)4Ed^G@tU1NPQh0y((G_v`I&*Nq76AGudm~S2Nn08R z#4>!bEUr-ethTfr80?E>Kl)W$ML2_!ep$ZIV|*yOG=|DLU};OGz%(BN2J56D*e$$v zUaeKYKv>Pw9|VTkTXcGLWamDI{+TK}SdDXSDY_C&M2mKm&UJn*%BcjChUb!th}PJg z=hgPgy45?kF6Gx@-}K_~mEOOJR+MzZ%`iC}!POOB(indzyUFd3Y>C}C~Uy7fV; zI=oqj4%Gk@Zem;u7y)HR4Iy2Xky{^(r?e{dQsh+#=E+5Mr3IC-KXJfdqaVEJ}p1}o9#&El&Zq(NuDkU@O?kUT<^|Mk*pZ`*6LPj*XXfAc5gYKfMRPrHJ_rSEY z)Ub;140Y|UFum&Qmrtqhm4oP(!)u66H9%P0uIz8W?)JPPED-FoFyRI?9;D_-Ah6W! zN*iC`bG&?>j3ASC1_X9G-EPqSqYoC0yeji5ACU%ir`#%#`n2wJw~EM@e(g?qRk3!~ z&sQBDbA9j0=(nS72bo*wi+9{7d`ic2Bc}S=Ab+2URNS4mc%kdp-6;_hOmK=*6l&L& zi{Vqp`5v_qdH}*Ri(PxdvUphABpXEjv=$%+f3L5{4-0){WBlDyYD^D2L$=coPvK?VeQC)@ zL4cRK`*+_oA9O=m3WC$*74}3wR_l@MJ&d8QFuQnN~VL8hTx@8Om-7&x@JLr}% zA8F|YPMBXDn8(L=MEn_?aXYSzn`15q1aqGJ+wsGb_d#l4Tml=4=qz&mI5Xug` zWrQ*VZy7S94n_LNu6(4A;>zdvVCz*sE+INSh_>P1y!O(LI=$4l6;<>FA^dY)Uw9KG z3Zpr`!eAJrT9OscpY8r>&@oOJspc7$Uz{;3=C8rM`Yp z3TxPXVkjLPF5E>ZjzUiU$9j z;dUSPopWo!AxOKbkaZ_NPhCCqbOO%e;el}LLCBen=cL-Zb7gW;Z7>e{t83vvSVk(L zkrMl44yTSaAzJkj1aM3;YG#|#oDH?cF%z;iwp%w`F-gz*e0y}+NBA@|$ISBCdE0O* zu7w5L0}NNtrhT}x#Np|57;N^ce270eobqalQz{!}2Thz8v3vLM>LAkW5%|ApVC}Du zpr*B&yN8yK^Q?(_!$`jz|+gm z$Q%HkP!A12_l2oc#O>ln%e#zyfeuto1+9DT;350=3kOH$)&`rVst9D}b!&`McTXu1*UnQBuN-P&G! zZRQN!M=j;ijKMI}{&dC&?SCLR6@CWI zEM*40FI-Mq`GF=CT$lo3$2spwCbR4c2b#qS?=laz$ZYXzR^DNd(2SOf>Ylp&ee&n? zp5fL2J;}21{%nc~L*S`g=+NXasOvwkPJqo<0~q)4Z1N4qZvQ-6ku~?(mv45iygi3TfL3}qhcdz;g?r{Iv-|G$uFUy08lJcDbYw0) z0;VAs80_C7%F&qs_uTJoeVw063mPjIVb|wUWFvH2IG5@-0nt;HXv&GG&h7U|=WN}U z&ZP-W;e{OMDT~puLxRIRhiTn`!6qCmR;B}ua6+mMgbElpcw|n-j=dkb%U#F_^;Age z_YE%X?)~DKOe(KqI8|uOQI(2N@@esc*6YXDw~ZbPhzmMB(Vze;iJyMjgfPX;QNO7a;}ojxZ&O4aFpQ?a7dBsB*|P)tVV$htK`I0yzh)^Vg4VDT7}e0bXN0q4)}?X^I4BUgRJ?^#i?V?s zonA_NBIQWoK_p_CCXJO$TI%DS7q3L^n;;>fA1p^$a+1+gQc{l8H4008b~z%`UloEaHT1kX`X|S|7!mu$+qHps+f69EGH$_1nqKod1j&>wkvBWrXU? z)__cE)(l;a$W)}+C2QK^6O&F?0EUUZjmb_OR7%UFdB6;v158&;(P7tV?_PGv{=j65 ziN#+9NEJY4zAj7|@^fz%MfeMzj1m`n&sm`;bNBFt)eZs`I8Q;qCg~I=o%xb4a0wT9hs$Uv=#lE7@*J0qUn#crmCj_6>S20n2pw&r^xmMwuI6x!)yeOTK0z5ou$2gX0g8!7kcXLyK0r}wD~bmV>mxd; z_*Ln2A2F3XJJ?saQ(|8ct2Uyo!b<-A;D*tCuYTA&1+yy6=_kx;Lr+)xi9BFfw)I!n zh37!028bc*Fdo!tpa``#EUN|ztp;~;mi2=~V}wz1MuJlp+h$^jeibb43BsUZTW=bQ zdB70m3`H=gTx^?Ikf#pAl$C27JrxcEgVD7tzKLS0#(H*>loMb&W49QARp{KEJ{=(j zAzk>}2n2UZa?hR0CyD9mv5&SSLBf>NqMoiNiH_EW+L=4WCyQ`HnyNtUcK&(&TCeNf zusLCTMbOAj8MCT`Nj`Jp1o`)jPw+qc^JSuUcc&ghDRZPKROjVx$xIPVHBy(QmW!i= z8Hy&lCX2~TiGlQ%Ym>!(nbWLkSWERO6?@!%;-AEMH3mJcm!xk{Cw61MHt*^!2;p%S0|emKw$wXU4Uu* z4a52n!$mKI@<2WF7m8L|RSBcnDoh}eu4*6YKNq_&ZA;$gY><>`m@Fbw3@ERl1XI=* zBF~DR@ukS~HsUgiBdExDY2Vq0j)*s{2~Q)9+K4*wK380v+Inx9j%9(oD9 zEjb}_G$EF@C&gn{aZA%vaCQIgxUT03U+KT(vWDW@piA&&hBG({oz5b07RkK^)a5L0 zVQSKhvp6_?+R$?TEZcVZRkp#rqGK<>ly6F>Hy5y?NbCe%gz(`!a#5_nHd;Df5?LDQ z=h;+z8P7c_=?cvVV^vKja<~JYV3E`{ zv6Ma$@ea}iPl|tmWrh>_;RT>bC$)Krkm&#IwTMYoD2k`Iv~bW>XQu^42V8kb3EQeG-O|=~-|Xx8C)#{UoaE81;-Bsz*UHgybSJfFOM8IM^<~uk8zNEU0<`0^ zzIk&brt=q3Xmg_A)+dt_Tn4ng(iZK?Xm1$y(dlB1U9R?rb;e&T4b9QaDN!ok|tjDFj6 zmVVnDFS$9z98zMQ@96zQj&q&t4lB)M%cVn(UrSEeN0qiCEj;Qt-znypifwuCm}8jc F{{S{R9yb60 diff --git a/package.json b/package.json index e3df2d02..370260f0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@tsconfig/strictest": "2.0.5", "@turbo/gen": "2.0.9", "@vitest/coverage-v8": "2.0.5", - "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@261950d", + "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@ce61607", "@types/bun": "^1.1.13", "autoprefixer": "10.4.19", "happy-dom": "14.12.3", diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index 969c98b8..dd708bcd 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@mina-js/klesia-sdk": "https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@261950d", - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@261950d", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@ce61607", "@noble/hashes": "1.4.0", "@palladco/key-management": "workspace:*", "@palladco/mina-core": "workspace:*", diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 874a861c..0df2845f 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -381,6 +381,9 @@ export const createMinaProvider = async (): Promise< ) } }) + .with({ method: "mina_requestPresentation" }, async ({ params }) => { + return params + }) .with({ method: "mina_sendTransaction" }, async ({ params }) => { const [payload] = params if (!payload) throw createProviderRpcError(4000, "Invalid Request") From d1c709df3777ae8d44ce3be513323d4cbedcc4ef Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 13 Nov 2024 11:25:15 +0100 Subject: [PATCH 19/87] chore(private-credential): skeleton for mina_requestPresentation and sandbox --- apps/extension/src/sandbox/index.ts | 62 ++++++++++++------- .../src/mina-network/mina-provider.ts | 9 ++- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index a1e2ac02..3a505846 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,14 +1,14 @@ -import { Credential } from "mina-credentials" +import { Credential, PresentationRequest } from "mina-credentials" import { serializeError } from "serialize-error" import { match } from "ts-pattern" import yaml from "yaml" import { z } from "zod" const EventTypeSchema = z.enum(["run"]) -const ContractTypeSchema = z.enum(["validate-credential"]) +const ContractTypeSchema = z.enum(["validate-credential", "presentation"]) -type ValidationResult = { - type: "validate-credential-result" +type Result = { + type: string result?: string error?: string } @@ -25,27 +25,45 @@ window.addEventListener("message", async (event) => { return match(type) .with("run", async () => { - return match(contract).with("validate-credential", async () => { - try { - const sanitizedPayload = event.data.payload - const originalPayload = recoverOriginalPayload(sanitizedPayload) - const credentialDeserialized = Credential.fromJSON(originalPayload) - await Credential.validate(credentialDeserialized) + return match(contract) + .with("validate-credential", async () => { + try { + const sanitizedPayload = event.data.payload + const originalPayload = recoverOriginalPayload(sanitizedPayload) + const credentialDeserialized = Credential.fromJSON(originalPayload) + await Credential.validate(credentialDeserialized) - const result: ValidationResult = { - type: "validate-credential-result", - result: Credential.toJSON(credentialDeserialized), - } + const result: Result = { + type: "validate-credential-result", + result: Credential.toJSON(credentialDeserialized), + } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: ValidationResult = { - type: "validate-credential-result", - error: serializeError(error), + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: Result = { + type: "validate-credential-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") + } + }) + .with("presentation", async () => { + try { + // TODO: create presentation + const result: Result = { + type: "presentation-result", + result: serializedPresentation, + } + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: Result = { + type: "presentation-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") } - window.parent.postMessage(result, "*") - } - }) + }) + .exhaustive() }) .exhaustive() }) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 0df2845f..7fe4509d 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -382,7 +382,14 @@ export const createMinaProvider = async (): Promise< } }) .with({ method: "mina_requestPresentation" }, async ({ params }) => { - return params + try { + const [presentationRequest] = params + } catch (error: any) { + throw createProviderRpcError( + 4100, + error.message || "Failed to create presentation", + ) + } }) .with({ method: "mina_sendTransaction" }, async ({ params }) => { const [payload] = params From 0198cf18042557338cc76d95cb96bce7fdb9fe68 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 13 Nov 2024 16:34:59 +0100 Subject: [PATCH 20/87] feat(private-credential)(wip): credential selection --- apps/extension/src/sandbox/index.ts | 30 +++--- .../components/credential-selection-form.tsx | 96 +++++++++++++++++++ .../src/web-connector/views/web-connector.tsx | 14 +++ .../src/mina-network/mina-provider.ts | 41 +++++++- packages/web-provider/src/utils/prompts.ts | 6 +- 5 files changed, 169 insertions(+), 18 deletions(-) create mode 100644 packages/features/src/web-connector/components/credential-selection-form.tsx diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 3a505846..c3b22b6c 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,4 +1,4 @@ -import { Credential, PresentationRequest } from "mina-credentials" +import { Credential } from "mina-credentials" import { serializeError } from "serialize-error" import { match } from "ts-pattern" import yaml from "yaml" @@ -48,20 +48,20 @@ window.addEventListener("message", async (event) => { } }) .with("presentation", async () => { - try { - // TODO: create presentation - const result: Result = { - type: "presentation-result", - result: serializedPresentation, - } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: Result = { - type: "presentation-result", - error: serializeError(error), - } - window.parent.postMessage(result, "*") - } + // try { + // // TODO: create presentation + // const result: Result = { + // type: "presentation-result", + // result: serializedPresentation, + // } + // window.parent.postMessage(result, "*") + // } catch (error: any) { + // const result: Result = { + // type: "presentation-result", + // error: serializeError(error), + // } + // window.parent.postMessage(result, "*") + // } }) .exhaustive() }) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx new file mode 100644 index 00000000..0fe049ca --- /dev/null +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -0,0 +1,96 @@ +import React, { useState } from "react" +import { useTranslation } from "react-i18next" + +type SelectionFormProps = { + onSubmit: (selectedCredentials: string) => void + onReject: () => void + submitButtonLabel?: string + rejectButtonLabel?: string + payload: string + loading: boolean +} + +export const SelectionForm = ({ + onSubmit, + onReject, + submitButtonLabel, + rejectButtonLabel, + payload, + loading, +}: SelectionFormProps) => { + const { t } = useTranslation() + const [selectedCredentials, setSelectedCredentials] = useState([]) + + const credentials = React.useMemo(() => { + try { + const parsedCredentials = JSON.parse(payload) as any[] + return parsedCredentials.map((credential) => ({ + id: Buffer.from(JSON.stringify(credential)).toString("base64"), + credential, + })) + } catch { + return [] + } + }, [payload]) + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault() + onSubmit(JSON.stringify(selectedCredentials.map((c) => c.credential))) + } + + const handleToggleCredential = (credentialData: any) => { + setSelectedCredentials((prev) => + prev.some((c) => c.id === credentialData.id) + ? prev.filter((c) => c.id !== credentialData.id) + : [...prev, credentialData], + ) + } + + const isSelected = (credentialData: any) => { + return selectedCredentials.some((c) => c.id === credentialData.id) + } + + return ( +
+
+ {credentials.map((credentialData) => ( + + ))} +
+ + + + +
+ ) +} diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 8e94110c..62aad969 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -3,6 +3,7 @@ import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" import type { SubmitHandler } from "react-hook-form" import { ConfirmationForm } from "../components/confirmation-form" +import { SelectionForm } from "../components/credential-selection-form" import { InputForm } from "../components/input-form" import type { UserInputForm } from "../types" @@ -35,6 +36,9 @@ export const WebConnectorView = ({ onReject() onDecline() } + const handleSelectionSubmit = (selectedCredentials: string) => { + onSubmit({ userInput: selectedCredentials }) + } return (
@@ -69,6 +73,16 @@ export const WebConnectorView = ({ loading={loading} /> )} + {inputType === "selection" && ( + + )}
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 7fe4509d..495a6de9 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -13,7 +13,7 @@ import type { ChainOperationArgs, ChainSignablePayload, } from "@palladco/key-management" -import type { SearchQuery } from "@palladco/vault" +import type { SearchQuery, StoredObject } from "@palladco/vault" import mitt from "mitt" import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" @@ -384,6 +384,45 @@ export const createMinaProvider = async (): Promise< .with({ method: "mina_requestPresentation" }, async ({ params }) => { try { const [presentationRequest] = params + if (!presentationRequest) + throw createProviderRpcError(4000, "Invalid Request") + + // First, ask for approval to proceed with the presentation request + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Presentation request", + payload: JSON.stringify(presentationRequest), + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + // Get stored credentials that could be used for the presentation + const storedCredentials: StoredObject[] = + await _vault.getPrivateCredential() + + // Show credential selection prompt + const { value: selectedCredentials } = await showUserPrompt< + string[] + >({ + inputType: "selection", + metadata: { + title: "Select credentials for presentation", + payload: JSON.stringify(storedCredentials), + submitButtonLabel: "Continue", + rejectButtonLabel: "Cancel", + }, + }) + + if (!selectedCredentials) { + throw createProviderRpcError( + 4001, + "User Rejected Credential Selection", + ) + } } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 38c08761..aa45aae6 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -1,4 +1,4 @@ -type InputType = "text" | "password" | "confirmation" +type InputType = "text" | "password" | "confirmation" | "selection" type Metadata = { title: string submitButtonLabel?: string @@ -17,7 +17,9 @@ type PromptResult = { result?: ContractResult } -export const showUserPrompt = async ({ +export const showUserPrompt = async < + T extends boolean | string | string[] = boolean, +>({ inputType, metadata, contract, From 99d08044c2c634f44033d350e4b9f3c406320add Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 13 Nov 2024 17:59:07 +0100 Subject: [PATCH 21/87] chore(private-credential): add credentialId to stored credential --- .../components/credential-selection-form.tsx | 4 +-- packages/vault/src/objects/objectsStore.ts | 2 +- .../src/mina-network/mina-provider.ts | 36 ++++++++++--------- .../src/vault-service/vault-service.ts | 3 +- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 0fe049ca..312625e3 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -25,8 +25,8 @@ export const SelectionForm = ({ try { const parsedCredentials = JSON.parse(payload) as any[] return parsedCredentials.map((credential) => ({ - id: Buffer.from(JSON.stringify(credential)).toString("base64"), - credential, + id: credential.credentialId, + credential: credential.credential, })) } catch { return [] diff --git a/packages/vault/src/objects/objectsStore.ts b/packages/vault/src/objects/objectsStore.ts index e155d289..06cdf812 100644 --- a/packages/vault/src/objects/objectsStore.ts +++ b/packages/vault/src/objects/objectsStore.ts @@ -43,7 +43,7 @@ export const objectSlice: StateCreator = (set, get) => ({ // TODO: improve const { objects } = get() const objectsStatesArray = Object.values(objects) - const objectsArray = objectsStatesArray.map((obj: any) => obj?.object) + const objectsArray = objectsStatesArray.map((obj: any) => obj?.credential) const filteredObjects = objectsArray.filter((object) => { if (!object) { return false diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 495a6de9..8d4d89d8 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -404,25 +404,27 @@ export const createMinaProvider = async (): Promise< const storedCredentials: StoredObject[] = await _vault.getPrivateCredential() + return storedCredentials + // Show credential selection prompt - const { value: selectedCredentials } = await showUserPrompt< - string[] - >({ - inputType: "selection", - metadata: { - title: "Select credentials for presentation", - payload: JSON.stringify(storedCredentials), - submitButtonLabel: "Continue", - rejectButtonLabel: "Cancel", - }, - }) + // const { value: selectedCredentials } = await showUserPrompt< + // string[] + // >({ + // inputType: "selection", + // metadata: { + // title: "Select credentials for presentation", + // payload: JSON.stringify(storedCredentials), + // submitButtonLabel: "Continue", + // rejectButtonLabel: "Cancel", + // }, + // }) - if (!selectedCredentials) { - throw createProviderRpcError( - 4001, - "User Rejected Credential Selection", - ) - } + // if (!selectedCredentials) { + // throw createProviderRpcError( + // 4001, + // "User Rejected Credential Selection", + // ) + // } } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index f9277a7f..359cb122 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -110,7 +110,8 @@ export const createVaultService = (): IVaultService => { const store = useVault.getState() store.setObject({ type: "private-credential", - credential, + credentialId: crypto.randomUUID(), + credential: credential, }) }, getPrivateCredential: async (query?) => { From c3538a412ae0ff2f140f7b9a78dbdb7c27fd4161 Mon Sep 17 00:00:00 2001 From: Tomek Marciniak Date: Wed, 13 Nov 2024 19:02:33 +0100 Subject: [PATCH 22/87] chore(object): refactor private credentials store --- .../vault/src/credentials/credentialsState.ts | 16 --- packages/vault/src/objects/default.ts | 32 ----- packages/vault/src/objects/index.ts | 1 - packages/vault/src/objects/objectsState.ts | 33 ++--- packages/vault/src/objects/objectsStore.ts | 36 +++--- .../vault/test/objects/objectsStore.test.ts | 115 ------------------ packages/vault/test/wallet/walletFlow.test.ts | 13 +- .../src/mina-network/mina-provider.ts | 45 ++++--- .../web-provider/src/vault-service/types.ts | 2 +- .../src/vault-service/vault-service.ts | 25 ++-- 10 files changed, 70 insertions(+), 248 deletions(-) delete mode 100644 packages/vault/src/objects/default.ts delete mode 100644 packages/vault/test/objects/objectsStore.test.ts diff --git a/packages/vault/src/credentials/credentialsState.ts b/packages/vault/src/credentials/credentialsState.ts index 64f29614..367baae8 100644 --- a/packages/vault/src/credentials/credentialsState.ts +++ b/packages/vault/src/credentials/credentialsState.ts @@ -1,7 +1,3 @@ -/** - * @file Represents the state definitions related to credentials specific to keyAgents & accounts. - */ - import type { GroupedCredentials } from "@palladco/key-management" import type { KeyAgentName } from "../keyAgent" @@ -10,30 +6,18 @@ import type { SearchQuery } from "../utils/utils" export type CredentialName = string export type StoredCredential = GroupedCredentials | undefined -/** - * Type representing the basic state of a credential. - * @typedef {Object} SingleCredentialState - */ export type SingleCredentialState = { credentialName: CredentialName keyAgentName: KeyAgentName credential: StoredCredential } -/** - * Constant representing the initial credential state - * @typedef {Object} - */ export const initialCredentialState: SingleCredentialState = { credentialName: "", keyAgentName: "", credential: undefined, } -/** - * Type representing the store's state and actions combined. - * @typedef {Object} CredentialsState - */ export type CredentialStore = { credentials: Record ensureCredential: ( diff --git a/packages/vault/src/objects/default.ts b/packages/vault/src/objects/default.ts deleted file mode 100644 index b1ae1737..00000000 --- a/packages/vault/src/objects/default.ts +++ /dev/null @@ -1,32 +0,0 @@ -export const EXAMPLE_CREDENTIAL_NAME = "Example Pallad Credential" -export const EXAMPLE_CREDENTIAL = { - "@context": ["https://www.w3.org/2018/credentials/v1"], - id: "http://example.edu/credentials/3732", - type: ["VerifiableCredential", "UniversityDegreeCredential"], - issuer: "University of Example", - issuanceDate: "2010-01-01T00:00:00Z", - credentialSubject: { - id: "did:mina:B62qjsV6WQwTeEWrNrRRBP6VaaLvQhwWTnFi4WP4LQjGvpfZEumXzxb", - degree: { - type: "BachelorDegree", - name: "Bachelor of Science and Arts", - }, - }, - proof: { - type: "Kimchi", - created: "2023-09-19T12:40:16Z", - proof: { - publicInput: ["0"], - publicOutput: ["1"], - maxProofsVerified: 0, - proof: "KChzdGF0ZW1...SkpKSkp", - }, - }, -} - -export const DEFAULT_OBJECTS = { - [EXAMPLE_CREDENTIAL_NAME]: { - objectName: EXAMPLE_CREDENTIAL_NAME, - object: EXAMPLE_CREDENTIAL, - }, -} diff --git a/packages/vault/src/objects/index.ts b/packages/vault/src/objects/index.ts index 977ec058..d1208f8c 100644 --- a/packages/vault/src/objects/index.ts +++ b/packages/vault/src/objects/index.ts @@ -1,3 +1,2 @@ -export * from "./default" export * from "./objectsState" export * from "./objectsStore" diff --git a/packages/vault/src/objects/objectsState.ts b/packages/vault/src/objects/objectsState.ts index e07bd906..fde7943f 100644 --- a/packages/vault/src/objects/objectsState.ts +++ b/packages/vault/src/objects/objectsState.ts @@ -1,31 +1,24 @@ -/** - * @file Represents the state definitions related to objects (for example issued credentials). - */ import type { Json } from "@mina-js/utils" import type { SearchQuery } from "../utils/utils" -export type ObjectName = string +export type CredentialId = string export type StoredObject = undefined | object -/** - * Constant representing the initial object state - * @typedef {Object} - */ export const initialObjectState: Json = { - objectName: "", - object: {}, + credentialId: "", + credential: {}, } -export type ObjectsStore = Record -/** - * Type representing the store's state and actions combined. - * @typedef {Object} ObjectStore - */ +export type ObjectsStore = Record + export type ObjectStore = { objects: ObjectsStore - ensureObject: (objectName: ObjectName) => void - setObject: (objectState: Json) => void - getObject: (objectName: ObjectName) => Json | typeof initialObjectState - removeObject: (name: ObjectName) => void - searchObjects(query: SearchQuery, props?: string[]): StoredObject[] + ensureObject: (credentialId: CredentialId) => void + setObject: (props: { credentialId: CredentialId; credential: Json }) => void + getObject: (credentialId: CredentialId) => Json | typeof initialObjectState + removeObject: (credentialId: CredentialId) => void + searchObjects(props: { + query: SearchQuery + props: string[] | undefined + }): StoredObject[] clearObjects: () => void } diff --git a/packages/vault/src/objects/objectsStore.ts b/packages/vault/src/objects/objectsStore.ts index 06cdf812..12c9cdfa 100644 --- a/packages/vault/src/objects/objectsStore.ts +++ b/packages/vault/src/objects/objectsStore.ts @@ -2,56 +2,52 @@ import { produce } from "immer" import { type StateCreator, create } from "zustand" import { matchesQuery } from "../utils/utils" -import { DEFAULT_OBJECTS } from "./default" import { type ObjectStore, initialObjectState } from "./objectsState" export const objectSlice: StateCreator = (set, get) => ({ - objects: DEFAULT_OBJECTS, - ensureObject: (objectName) => { + objects: {}, + ensureObject: (credentialId) => { set( produce((draft) => { - draft.objects[objectName] = draft.objects[objectName] || { + draft.objects[credentialId] = draft.objects[credentialId] || { ...(initialObjectState as object), - objectName, + credentialId, } }), ) }, - setObject: (objectState: any) => { - const { objectName } = objectState + setObject: ({ credentialId, credential }) => { set((current) => produce(current, (draft: any) => { - draft.objects[objectName] = { - ...draft.objects[objectName], - ...objectState, + draft.objects[credentialId] = { + ...draft.objects[credentialId], + ...(credential as object), } }), ) }, - getObject: (objectName) => { + getObject: (credentialId) => { const { objects } = get() - return objects[objectName] || initialObjectState + return objects[credentialId] || initialObjectState }, - removeObject: (objectName) => { + removeObject: (credentialId) => { set( produce((draft) => { - delete draft.objects[objectName] + delete draft.objects[credentialId] }), ) }, - searchObjects: (query, props) => { - // TODO: improve + searchObjects: ({ query, props }) => { const { objects } = get() const objectsStatesArray = Object.values(objects) - const objectsArray = objectsStatesArray.map((obj: any) => obj?.credential) - const filteredObjects = objectsArray.filter((object) => { + const filteredObjects = objectsStatesArray.filter((object) => { if (!object) { return false } return matchesQuery(object, query) }) if (props?.length) { - const arrayOfArrays = filteredObjects.map((objects) => { + const arrayOfArrays = filteredObjects.map((objects: any) => { return props .filter((prop) => objects && prop in objects) .map((prop) => (objects as unknown as Record)[prop]) @@ -63,7 +59,7 @@ export const objectSlice: StateCreator = (set, get) => ({ clearObjects: () => { set( produce((draft) => { - draft.objects = DEFAULT_OBJECTS + draft.objects = {} }), ) }, diff --git a/packages/vault/test/objects/objectsStore.test.ts b/packages/vault/test/objects/objectsStore.test.ts deleted file mode 100644 index f3ca8f2f..00000000 --- a/packages/vault/test/objects/objectsStore.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { beforeEach, describe, expect, it } from "bun:test" -import type { GroupedCredentials } from "@palladco/key-management" -import { Network } from "@palladco/pallad-core" -import { act, renderHook } from "@testing-library/react" - -import type { Json } from "@mina-js/utils" -import { - DEFAULT_OBJECTS, - type ObjectName, - type StoredObject, - useVault, -} from "../../src" - -describe("ObjectStore", () => { - let object: GroupedCredentials - let objectName: ObjectName - let objectState: Json - let objectStateTwo: Json - let objectTwo: object - - beforeEach(() => { - object = { - "@context": ["https://w3id.org/wallet/v1"], - id: "did:mina:B62qjsV6WQwTeEWrNrRRBP6VaaLvQhwWTnFi4WP4LQjGvpfZEumXzxb", - type: "MinaAddress", - controller: - "did:mina:B62qjsV6WQwTeEWrNrRRBP6VaaLvQhwWTnFi4WP4LQjGvpfZEumXzxb", - name: "Mina Account", - description: "My Mina account.", - chain: Network.Mina, - accountIndex: 0, - addressIndex: 0, - address: "B62qjsV6WQwTeEWrNrRRBP6VaaLvQhwWTnFi4WP4LQjGvpfZEumXzxb", - encryptedPrivateKeyBytes: new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]), - } - objectTwo = { - "@context": ["https://www.w3.org/2018/credentials/v1"], - id: "http://example.edu/credentials/3732", - type: ["VerifiableCredential", "UniversityDegreeCredential"], - issuer: "University of Example", - issuanceDate: "2010-01-01T00:00:00Z", - credentialSubject: { - id: "did:mina:B62qjsV6WQwTeEWrNrRRBP6VaaLvQhwWTnFi4WP4LQjGvpfZEumXzxb", - degree: { - type: "BachelorDegree", - name: "Bachelor of Science and Arts", - }, - }, - proof: { - type: "Kimchi", - created: "2023-09-19T12:40:16Z", - proof: { - publicInput: ["0"], - publicOutput: ["1"], - maxProofsVerified: 0, - proof: "KChzdGF0ZW1...SkpKSkp", - }, - }, - } - - objectName = "credentialName" - objectState = { - objectName: objectName, - object: object as StoredObject, - } - - objectStateTwo = { - objectName: "green crocodile credential", - object: objectTwo as StoredObject, - } - const { result } = renderHook(() => useVault()) - act(() => result.current.clearObjects()) - }) - - it("should create an objects store", () => { - const { result } = renderHook(() => useVault()) - expect(result.current.objects).toEqual(DEFAULT_OBJECTS) - }) - - it("should add one object and remove one from store", () => { - let storedObject - const { result } = renderHook(() => useVault()) - act(() => { - result.current.setObject(objectState) - storedObject = result.current.getObject(objectName) - }) - expect(storedObject?.object).toEqual(object) - act(() => { - result.current.removeObject(objectName) - storedObject = result.current.getObject(objectName) - }) - // check that object is removed - expect(storedObject.object).toEqual({}) - }) - it("should add two objects and search for Mina addresses and return them as an array not as a credential object", () => { - let storedObjects: StoredObject[] | undefined - // search for first credential - const searchQuery = { - type: "MinaAddress", - chain: Network.Mina, - } - // return props - const props = ["address"] - const { result } = renderHook(() => useVault()) - act(() => { - // add first credential - result.current.setObject(objectState) - // add second credential - result.current.setObject(objectStateTwo) - storedObjects = result.current.searchObjects(searchQuery, props) - }) - expect(storedObjects).toBeDefined() - expect(storedObjects?.length).toEqual(1) - }) -}) diff --git a/packages/vault/test/wallet/walletFlow.test.ts b/packages/vault/test/wallet/walletFlow.test.ts index 9290f9f3..f53229e2 100644 --- a/packages/vault/test/wallet/walletFlow.test.ts +++ b/packages/vault/test/wallet/walletFlow.test.ts @@ -11,7 +11,6 @@ import { act, renderHook } from "@testing-library/react" import { type CredentialName, KeyAgents } from "../../src" import { useVault } from "../../src" import { DEFAULT_NETWORK } from "../../src/network-info/default" -import { EXAMPLE_CREDENTIAL } from "../../src/objects/default" const PREGENERATED_MNEMONIC = mnemonic @@ -96,15 +95,15 @@ describe.skip("WalletTest", () => { expect(accountInfo).toBeDefined() act(() => { result.current.setObject({ - objectName: "example credential", - object: EXAMPLE_CREDENTIAL, + credentialId: "0", + credential: { test: true }, }) }) - const allObjects = result.current.searchObjects( - { issuer: "University of Example" }, - [], - ) + const allObjects = result.current.searchObjects({ + query: { issuer: "University of Example" }, + props: [], + }) expect(allObjects.length).toEqual(2) // get keyAgentName const currentKeyAgentName = result.current.keyAgentName diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 8d4d89d8..715388c8 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -318,19 +318,20 @@ export const createMinaProvider = async (): Promise< return credentials }) .with({ method: "mina_setState" }, async ({ params }) => { - const payload = params?.[0] - if (!payload) throw createProviderRpcError(4000, "Invalid Request") + const [credential] = params + if (!credential) throw createProviderRpcError(4000, "Invalid Request") const { value: confirmation } = await showUserPrompt({ inputType: "confirmation", metadata: { title: "Credential write request", - payload: JSON.stringify(payload), + payload: JSON.stringify(credential), }, }) if (!confirmation) { throw createProviderRpcError(4001, "User Rejected Request") } - await _vault.setState(payload) + const { id } = credential as { id: string } + await _vault.setState({ credentialId: id, credential }) return { success: true } }) .with({ method: "mina_storePrivateCredential" }, async ({ params }) => { @@ -404,27 +405,25 @@ export const createMinaProvider = async (): Promise< const storedCredentials: StoredObject[] = await _vault.getPrivateCredential() - return storedCredentials - // Show credential selection prompt - // const { value: selectedCredentials } = await showUserPrompt< - // string[] - // >({ - // inputType: "selection", - // metadata: { - // title: "Select credentials for presentation", - // payload: JSON.stringify(storedCredentials), - // submitButtonLabel: "Continue", - // rejectButtonLabel: "Cancel", - // }, - // }) + const { value: selectedCredentials } = await showUserPrompt< + string[] + >({ + inputType: "selection", + metadata: { + title: "Select credentials for presentation", + payload: JSON.stringify(storedCredentials), + submitButtonLabel: "Continue", + rejectButtonLabel: "Cancel", + }, + }) - // if (!selectedCredentials) { - // throw createProviderRpcError( - // 4001, - // "User Rejected Credential Selection", - // ) - // } + if (!selectedCredentials) { + throw createProviderRpcError( + 4001, + "User Rejected Credential Selection", + ) + } } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/vault-service/types.ts b/packages/web-provider/src/vault-service/types.ts index 59edce09..1482d579 100644 --- a/packages/web-provider/src/vault-service/types.ts +++ b/packages/web-provider/src/vault-service/types.ts @@ -18,7 +18,7 @@ export interface IVaultService { getBalance(): Promise getNetworkId(): Promise getNetworkIds(): Promise - setState(state: Json): Promise + setState(props: { credentialId: string; credential: Json }): Promise storePrivateCredential(state: Json): Promise getPrivateCredential(query?: SearchQuery): Promise getEnabled({ origin }: { origin: string }): Promise diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index 359cb122..5a614f06 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -95,31 +95,30 @@ export const createVaultService = (): IVaultService => { getState: async (params, props?) => { await rehydrate() const store = useVault.getState() - if (props === undefined) { - return store.searchObjects(params) - } - return store.searchObjects(params, props) + return store.searchObjects({ query: params, props }) }, - setState: async (state) => { + setState: async ({ credentialId, credential }) => { await rehydrate() const store = useVault.getState() - store.setObject(state) + store.setObject({ credentialId, credential }) }, storePrivateCredential: async (credential) => { await rehydrate() const store = useVault.getState() - store.setObject({ - type: "private-credential", + return store.setObject({ credentialId: crypto.randomUUID(), - credential: credential, + credential: { + ...(credential as object), + type: "private-credential", + }, }) }, - getPrivateCredential: async (query?) => { + getPrivateCredential: async () => { await rehydrate() const store = useVault.getState() - return await store.searchObjects({ - type: "private-credential", - ...query, + return store.searchObjects({ + query: { type: "private-credential" }, + props: [], }) }, getEnabled: async ({ origin }) => { From 9480c9e65de05a20d4be6cd4788256f44f381630 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 14 Nov 2024 14:29:08 +0100 Subject: [PATCH 23/87] feat(private-credential): seemingly working selector --- .../components/credential-selection-form.tsx | 32 +++++-- .../web-connector/routes/web-connector.tsx | 4 +- .../web-provider/src/mina-network/index.ts | 1 + .../src/mina-network/mina-provider.ts | 84 +++++++++++++------ .../web-provider/src/mina-network/utils.ts | 13 +++ packages/web-provider/src/utils/prompts.ts | 4 +- .../src/vault-service/vault-service.ts | 9 +- 7 files changed, 109 insertions(+), 38 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 312625e3..93008ad1 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -1,5 +1,8 @@ +import { createCredentialHash } from "@palladco/web-provider" import React, { useState } from "react" import { useTranslation } from "react-i18next" +import xss from "xss" +import yaml from "yaml" type SelectionFormProps = { onSubmit: (selectedCredentials: string) => void @@ -10,6 +13,21 @@ type SelectionFormProps = { loading: boolean } +const sanitizeCredential = (credential: any) => { + const yamlOptions = { + indent: 2, + lineWidth: 32, + minContentWidth: 0, + } + const yamlPayload = yaml.stringify(credential, yamlOptions) + return xss(yamlPayload) +} + +const recoverOriginalPayload = (sanitizedPayload: string) => { + const parsedYaml = yaml.parse(sanitizedPayload) + return JSON.stringify(parsedYaml) +} + export const SelectionForm = ({ onSubmit, onReject, @@ -23,13 +41,15 @@ export const SelectionForm = ({ const credentials = React.useMemo(() => { try { - const parsedCredentials = JSON.parse(payload) as any[] + const originalPayload = recoverOriginalPayload(payload) + const parsedCredentials = JSON.parse(originalPayload) as any[] return parsedCredentials.map((credential) => ({ - id: credential.credentialId, - credential: credential.credential, + id: createCredentialHash(credential), + credential, + sanitizedDisplay: sanitizeCredential(credential), })) - } catch { - return [] + } catch (error: any) { + throw Error(`Issue with parsing: ${error}: ${payload}`) } }, [payload]) @@ -69,7 +89,7 @@ export const SelectionForm = ({ disabled={loading} /> - {credentialData.credential.witness?.type || "Unknown Credential"} + {credentialData.sanitizedDisplay || "Unknown Credential"} ))} diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 68ab5741..d3c6a4e5 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -15,7 +15,7 @@ type ContractResult = { error?: string } -const sanitizePayload = async (payload: string) => { +export const sanitizePayload = async (payload: string) => { const parsedPayload = JSON.parse(payload) as Record const yamlPayload = yaml.stringify(parsedPayload) return xss(yamlPayload) @@ -34,7 +34,7 @@ type ActionRequest = { submitButtonLabel?: string rejectButtonLabel?: string payload: string - inputType: "text" | "password" | "confirmation" + inputType: "text" | "password" | "confirmation" | "selection" contract: string | undefined emitConnected: boolean } diff --git a/packages/web-provider/src/mina-network/index.ts b/packages/web-provider/src/mina-network/index.ts index 1ec944f0..e21c529b 100644 --- a/packages/web-provider/src/mina-network/index.ts +++ b/packages/web-provider/src/mina-network/index.ts @@ -1,2 +1,3 @@ export * from "./mina-provider" +export * from "./utils" export * as Validation from "./validation" diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 715388c8..97ee3e1d 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -19,7 +19,7 @@ import { P, match } from "ts-pattern" import { showUserPrompt } from "../utils/prompts" import { createVaultService } from "../vault-service" import type { ConnectOps } from "../web-provider-types" -import { serializeField, serializeGroup } from "./utils" +import { createCredentialHash, serializeField, serializeGroup } from "./utils" export function getMinaChainId(chains: string[]) { return Number(chains[0]?.split(":")[1]) @@ -338,37 +338,68 @@ export const createMinaProvider = async (): Promise< const [credential] = params if (!credential) throw createProviderRpcError(4000, "Invalid Request") + const credentialWitnessType = credential.witness.type + const stringifiedCredential = JSON.stringify(credential) try { - const { value: userConfirmed, result } = - await showUserPrompt({ + if (!(credentialWitnessType === "unsigned")) { + const { value: userConfirmed, result } = + await showUserPrompt({ + inputType: "confirmation", + contract: "validate-credential", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + if (result?.error) { + throw createProviderRpcError( + 4100, + `Credential validation failed: ${JSON.stringify(result.error)}`, + ) + } + + if (!result?.result) { + throw createProviderRpcError(4100, "Missing validation result") + } + } else { + const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", - contract: "validate-credential", metadata: { title: "Store private credential request", payload: stringifiedCredential, }, }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } } - if (result?.error) { - throw createProviderRpcError( - 4100, - `Credential validation failed: ${JSON.stringify(result.error)}`, - ) - } + // Generate hash of the new credential + const newCredentialHash = createCredentialHash(credential) + + // Get existing credentials and check for duplicates + const existingCredentials = await _vault.getPrivateCredential() + const isDuplicate = existingCredentials.some((existing) => { + const existingHash = createCredentialHash(existing) + return existingHash === newCredentialHash + }) - if (!result?.result) { - throw createProviderRpcError(4100, "Missing validation result") + if (isDuplicate) { + throw createProviderRpcError(4100, "Credential already stored") } try { - await _vault.storePrivateCredential(JSON.parse(result.result)) - return { success: JSON.parse(result.result) } + const parsedResult = JSON.parse(stringifiedCredential) + await _vault.storePrivateCredential(parsedResult) + return { success: parsedResult } } catch (error: any) { throw createProviderRpcError( 4100, @@ -406,17 +437,17 @@ export const createMinaProvider = async (): Promise< await _vault.getPrivateCredential() // Show credential selection prompt - const { value: selectedCredentials } = await showUserPrompt< - string[] - >({ - inputType: "selection", - metadata: { - title: "Select credentials for presentation", - payload: JSON.stringify(storedCredentials), - submitButtonLabel: "Continue", - rejectButtonLabel: "Cancel", + const { value: selectedCredentials } = await showUserPrompt( + { + inputType: "selection", + metadata: { + title: "Select credentials for presentation", + payload: JSON.stringify(storedCredentials), + submitButtonLabel: "Continue", + rejectButtonLabel: "Cancel", + }, }, - }) + ) if (!selectedCredentials) { throw createProviderRpcError( @@ -424,6 +455,7 @@ export const createMinaProvider = async (): Promise< "User Rejected Credential Selection", ) } + return selectedCredentials } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/mina-network/utils.ts b/packages/web-provider/src/mina-network/utils.ts index 45878487..eb749846 100644 --- a/packages/web-provider/src/mina-network/utils.ts +++ b/packages/web-provider/src/mina-network/utils.ts @@ -1,3 +1,5 @@ +import { sha256 } from "@noble/hashes/sha256" +import { utf8ToBytes } from "@noble/hashes/utils" import type { MinaSignablePayload } from "@palladco/key-management" import type { BorrowedTypes } from "@palladco/mina-core" @@ -46,3 +48,14 @@ export const serializeTransaction = (transaction: MinaSignablePayload) => { const clonedTransaction = JSON.parse(JSON.stringify(transaction)) return serializeObject(clonedTransaction) } + +// Hash credential +export const createCredentialHash = (credential: any): string => { + // Create a stable string representation by sorting keys + const stableString = JSON.stringify(credential) + const bytes = utf8ToBytes(stableString) + const hash = sha256(bytes) + return Array.from(hash) + .map((b) => b.toString(16).padStart(2, "0")) + .join("") +} diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index aa45aae6..082e0fe6 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -17,9 +17,7 @@ type PromptResult = { result?: ContractResult } -export const showUserPrompt = async < - T extends boolean | string | string[] = boolean, ->({ +export const showUserPrompt = async ({ inputType, metadata, contract, diff --git a/packages/web-provider/src/vault-service/vault-service.ts b/packages/web-provider/src/vault-service/vault-service.ts index 5a614f06..2568b6c3 100644 --- a/packages/web-provider/src/vault-service/vault-service.ts +++ b/packages/web-provider/src/vault-service/vault-service.ts @@ -116,10 +116,17 @@ export const createVaultService = (): IVaultService => { getPrivateCredential: async () => { await rehydrate() const store = useVault.getState() - return store.searchObjects({ + const credentials = await store.searchObjects({ query: { type: "private-credential" }, props: [], }) + + // Remove the type field from each credential in the results + return credentials.map((credential) => { + if (!credential) return credential + const { type, ...credentialWithoutType } = credential as any + return credentialWithoutType + }) }, getEnabled: async ({ origin }) => { const { permissions } = await chrome.storage.local.get({ From 1163d89edd108d555cd6edf0aae86e2fddfea3e6 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 14 Nov 2024 14:34:00 +0100 Subject: [PATCH 24/87] chore(private-credential): todo --- .../src/web-connector/components/credential-selection-form.tsx | 1 + packages/web-provider/src/mina-network/mina-provider.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 93008ad1..259348b1 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -44,6 +44,7 @@ export const SelectionForm = ({ const originalPayload = recoverOriginalPayload(payload) const parsedCredentials = JSON.parse(originalPayload) as any[] return parsedCredentials.map((credential) => ({ + // TODO: use stored hash when implemented id: createCredentialHash(credential), credential, sanitizedDisplay: sanitizeCredential(credential), diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 97ee3e1d..58a29147 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -382,6 +382,7 @@ export const createMinaProvider = async (): Promise< } } + // TODO: hash should be stored with the credential // Generate hash of the new credential const newCredentialHash = createCredentialHash(credential) From 9163eaf0a1dd39b6957a8e1fbc2962ed43d9c085 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 09:06:05 +0100 Subject: [PATCH 25/87] chore(private-credential)(wip): signing presentation wip --- apps/extension/src/sandbox/index.ts | 128 ++-- .../web-connector/routes/web-connector.tsx | 46 +- .../src/mina-network/mina-provider.ts | 682 ++++++++++-------- 3 files changed, 514 insertions(+), 342 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index c3b22b6c..7d3d674c 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -4,8 +4,18 @@ import { match } from "ts-pattern" import yaml from "yaml" import { z } from "zod" -const EventTypeSchema = z.enum(["run"]) -const ContractTypeSchema = z.enum(["validate-credential", "presentation"]) +const MessageSchema = z.discriminatedUnion("type", [ + z.object({ + type: z.literal("run"), + contract: z.enum(["validate-credential", "presentation"]), + payload: z.string(), + }), + z.object({ + type: z.literal("presentation-signing-response"), + signature: z.any().optional(), + error: z.string().optional(), + }), +]) type Result = { type: string @@ -18,52 +28,84 @@ const recoverOriginalPayload = (sanitizedPayload: string) => { return JSON.stringify(parsedYaml) } +let presentationSigningPromise: { + resolve: (value: any) => void + reject: (reason: any) => void +} | null = null + window.addEventListener("message", async (event) => { console.log(event.data) - const type = EventTypeSchema.parse(event.data.type) - const contract = ContractTypeSchema.parse(event.data.contract) + try { + const message = MessageSchema.parse(event.data) + + if (message.type === "presentation-signing-response") { + if (presentationSigningPromise) { + if (message.error) { + presentationSigningPromise.reject(new Error(message.error)) + } else { + presentationSigningPromise.resolve(message.signature) + } + presentationSigningPromise = null + return + } + return + } + + return match(message) + .with({ type: "run" }, async (msg) => { + return match(msg.contract) + .with("validate-credential", async () => { + try { + const sanitizedPayload = msg.payload + const originalPayload = recoverOriginalPayload(sanitizedPayload) + const credentialDeserialized = + Credential.fromJSON(originalPayload) + await Credential.validate(credentialDeserialized) - return match(type) - .with("run", async () => { - return match(contract) - .with("validate-credential", async () => { - try { - const sanitizedPayload = event.data.payload - const originalPayload = recoverOriginalPayload(sanitizedPayload) - const credentialDeserialized = Credential.fromJSON(originalPayload) - await Credential.validate(credentialDeserialized) + const result: Result = { + type: "validate-credential-result", + result: Credential.toJSON(credentialDeserialized), + } - const result: Result = { - type: "validate-credential-result", - result: Credential.toJSON(credentialDeserialized), + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: Result = { + type: "validate-credential-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") } + }) + .with("presentation", async () => { + const mockFieldsToSign = [ + "15194438335254979123992673494772742932886141479807135737958843785282001151979", + "13058445919007356413345300070030973942059862825965583483176167800381508277987", + "26067489438851605530938171293652363087823200555042082718868551789908955769071", + ] - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: Result = { - type: "validate-credential-result", - error: serializeError(error), + window.parent.postMessage( + { + type: "presentation-signing-request", + fields: mockFieldsToSign, + }, + "*", + ) + + const signature = await new Promise((resolve, reject) => { + presentationSigningPromise = { resolve, reject } + }) + + const mockResult: Result = { + type: "presentation-result", + result: JSON.stringify(signature), } - window.parent.postMessage(result, "*") - } - }) - .with("presentation", async () => { - // try { - // // TODO: create presentation - // const result: Result = { - // type: "presentation-result", - // result: serializedPresentation, - // } - // window.parent.postMessage(result, "*") - // } catch (error: any) { - // const result: Result = { - // type: "presentation-result", - // error: serializeError(error), - // } - // window.parent.postMessage(result, "*") - // } - }) - .exhaustive() - }) - .exhaustive() + + window.parent.postMessage(mockResult, "*") + }) + .exhaustive() + }) + .exhaustive() + } catch (error: any) { + throw Error(`Sandbox Error: ${error}`) + } }) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index d3c6a4e5..09e1b4a0 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -116,7 +116,49 @@ export const WebConnectorRoute = () => { }) window.close() } - const eventListener = (event: MessageEvent) => { + const eventListener = async (event: MessageEvent) => { + if (event.data.type === "presentation-signing-request") { + // Handle signing request from sandbox + try { + const response = await runtime.sendMessage({ + method: "mina_signFields", + params: [event.data.fields], + context: {}, + }) + + // Send signature back to sandbox + const sandbox = document.querySelector( + "#o1sandbox", + ) as HTMLIFrameElement + sandbox?.contentWindow?.postMessage( + { + type: "presentation-signing-response", + signature: response, + }, + "*", + ) + } catch (error: any) { + const sandbox = document.querySelector( + "#o1sandbox", + ) as HTMLIFrameElement + sandbox?.contentWindow?.postMessage( + { + type: "presentation-signing-response", + error: error.message, + }, + "*", + ) + } + } + if (event.data.type === "presentation-result") { + return confirm({ + result: { + type: event.data.type, + result: event.data.result, + error: event.data.error, + }, + }) + } if (event.data.type === "validate-credential-result") { return confirm({ result: { @@ -139,7 +181,7 @@ export const WebConnectorRoute = () => { return () => { window.removeEventListener("message", eventListener) } - }, []) + }, [request.inputType]) useEffect(() => { runtime.onMessage.addListener(async (message) => { if (message.type === "action_request") { diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 58a29147..c021433b 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -134,358 +134,446 @@ export const createMinaProvider = async (): Promise< } if (locked) await unlockWallet() if (!enabled) await enableOrigin({ origin }) - return match(typedArgs) - .with( - { method: P.union("mina_accounts", "mina_requestAccounts") }, - _vault.getAccounts, - ) - .with({ method: "mina_getBalance" }, _vault.getBalance) - .with({ method: "mina_networkId" }, _vault.getNetworkId) - .with({ method: "mina_addChain" }, () => - createProviderRpcError(4200, "Unsupported Method"), - ) - .with({ method: "mina_switchChain" }, async ({ params }) => { - const [networkId] = params - if (!networkId) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const networkIds = await _vault.getNetworkIds() - if (!networkIds.includes(networkId)) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Switch to different chain.", - payload: JSON.stringify({ networkId }), - }, - }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } - await _vault.switchNetwork(networkId) - return networkId - }) - .with({ method: "mina_requestNetwork" }, async () => { - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Request to current Mina network information.", - }, + return ( + match(typedArgs) + .with( + { method: P.union("mina_accounts", "mina_requestAccounts") }, + _vault.getAccounts, + ) + .with({ method: "mina_getBalance" }, _vault.getBalance) + .with({ method: "mina_networkId" }, _vault.getNetworkId) + .with({ method: "mina_addChain" }, () => + createProviderRpcError(4200, "Unsupported Method"), + ) + .with({ method: "mina_switchChain" }, async ({ params }) => { + const [networkId] = params + if (!networkId) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const networkIds = await _vault.getNetworkIds() + if (!networkIds.includes(networkId)) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Switch to different chain.", + payload: JSON.stringify({ networkId }), + }, + }) + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + await _vault.switchNetwork(networkId) + return networkId }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } - const requestNetworkResponse = await _vault.requestNetwork() - return requestNetworkResponse - }) - .with( - { method: P.union("mina_sign", "mina_signTransaction") }, - async (signatureRequest) => { - const { value: passphrase } = await showUserPrompt({ - inputType: "password", - contract: "add", + .with({ method: "mina_requestNetwork" }, async () => { + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), + title: "Request to current Mina network information.", }, }) - if (passphrase === null) - throw createProviderRpcError(4100, "Unauthorized.") - const operationArgs: ChainOperationArgs = { - operation: args.method, - network: "Mina", + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") } - return match(signatureRequest) - .with({ method: "mina_signTransaction" }, ({ params }) => { - const payload = params?.[0] - if (!payload) { - throw createProviderRpcError(4100, "Unauthorized.") - } - if ("transaction" in payload) { + const requestNetworkResponse = await _vault.requestNetwork() + return requestNetworkResponse + }) + .with( + { method: P.union("mina_sign", "mina_signTransaction") }, + async (signatureRequest) => { + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + contract: "add", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }) + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", + } + return match(signatureRequest) + .with({ method: "mina_signTransaction" }, ({ params }) => { + const payload = params?.[0] + if (!payload) { + throw createProviderRpcError(4100, "Unauthorized.") + } + if ("transaction" in payload) { + return signPayload({ + signable: payload, + operationArgs, + passphrase, + }) + } return signPayload({ signable: payload, operationArgs, passphrase, }) - } - return signPayload({ - signable: payload, - operationArgs, - passphrase, }) - }) - .with({ method: "mina_sign" }, ({ params }) => { - const [message] = params as string[] - return signPayload({ - signable: { message: message as string }, - operationArgs, - passphrase, + .with({ method: "mina_sign" }, ({ params }) => { + const [message] = params as string[] + return signPayload({ + signable: { message: message as string }, + operationArgs, + passphrase, + }) }) + .exhaustive() + }, + ) + .with( + { method: P.union("mina_createNullifier", "mina_signFields") }, + async (signatureRequest) => { + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, }) - .exhaustive() - }, - ) - .with( - { method: P.union("mina_createNullifier", "mina_signFields") }, - async (signatureRequest) => { - const { value: passphrase } = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }) - if (passphrase === null) - throw createProviderRpcError(4100, "Unauthorized.") - const operationArgs: ChainOperationArgs = { - operation: args.method, - network: "Mina", - } - return match(signatureRequest) - .with({ method: "mina_signFields" }, async ({ params }) => { - const [fields] = params - if (!fields || !fields.length) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const signedResponse = await signPayload({ - signable: { - fields: fields.map((item: any) => BigInt(item)), - }, - operationArgs, - passphrase, + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", + } + return match(signatureRequest) + .with({ method: "mina_signFields" }, async ({ params }) => { + const [fields] = params + if (!fields || !fields.length) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const signedResponse = await signPayload({ + signable: { + fields: fields.map((item: any) => BigInt(item)), + }, + operationArgs, + passphrase, + }) + const serializedResponseData = signedResponse.data.map( + (item) => { + if (typeof item === "bigint") { + return String(item) + } + return item + }, + ) + const seriliasedResponse = { + ...signedResponse, + data: serializedResponseData, + } + return seriliasedResponse }) - const serializedResponseData = signedResponse.data.map( - (item) => { - if (typeof item === "bigint") { - return String(item) + .with( + { method: "mina_createNullifier" }, + async ({ params }) => { + const [message] = params + if (!message || !message.length) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const signedResponse = await signPayload({ + signable: { + message: message.map((item: any) => BigInt(item)), + }, + operationArgs, + passphrase, + }) + // serialise the response if mina_createNullifier + const serializedResponseData = { + publicKey: serializeGroup(signedResponse.publicKey), + public: { + nullifier: serializeGroup( + signedResponse.public.nullifier, + ), + s: serializeField(signedResponse.public.s), + }, + private: { + c: serializeField(signedResponse.private.c), + g_r: serializeGroup(signedResponse.private.g_r), + h_m_pk_r: serializeGroup( + signedResponse.private.h_m_pk_r, + ), + }, } - return item + return serializedResponseData }, ) - const seriliasedResponse = { - ...signedResponse, - data: serializedResponseData, - } - return seriliasedResponse - }) - .with({ method: "mina_createNullifier" }, async ({ params }) => { - const [message] = params - if (!message || !message.length) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const signedResponse = await signPayload({ - signable: { - message: message.map((item: any) => BigInt(item)), - }, - operationArgs, - passphrase, - }) - // serialise the response if mina_createNullifier - const serializedResponseData = { - publicKey: serializeGroup(signedResponse.publicKey), - public: { - nullifier: serializeGroup(signedResponse.public.nullifier), - s: serializeField(signedResponse.public.s), - }, - private: { - c: serializeField(signedResponse.private.c), - g_r: serializeGroup(signedResponse.private.g_r), - h_m_pk_r: serializeGroup(signedResponse.private.h_m_pk_r), - }, - } - return serializedResponseData - }) - .exhaustive() - }, - ) - .with({ method: "mina_getState" }, async ({ params }) => { - const [query, props] = params - const credentials = await _vault.getState( - query as SearchQuery, - props as string[], - ) - const { value: confirmation } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential read request", - payload: JSON.stringify({ ...params, credentials }), + .exhaustive() }, + ) + .with({ method: "mina_getState" }, async ({ params }) => { + const [query, props] = params + const credentials = await _vault.getState( + query as SearchQuery, + props as string[], + ) + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential read request", + payload: JSON.stringify({ ...params, credentials }), + }, + }) + if (!confirmation) { + throw createProviderRpcError(4001, "User Rejected Request") + } + return credentials }) - if (!confirmation) { - throw createProviderRpcError(4001, "User Rejected Request") - } - return credentials - }) - .with({ method: "mina_setState" }, async ({ params }) => { - const [credential] = params - if (!credential) throw createProviderRpcError(4000, "Invalid Request") - const { value: confirmation } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential write request", - payload: JSON.stringify(credential), - }, + .with({ method: "mina_setState" }, async ({ params }) => { + const [credential] = params + if (!credential) + throw createProviderRpcError(4000, "Invalid Request") + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential write request", + payload: JSON.stringify(credential), + }, + }) + if (!confirmation) { + throw createProviderRpcError(4001, "User Rejected Request") + } + const { id } = credential as { id: string } + await _vault.setState({ credentialId: id, credential }) + return { success: true } }) - if (!confirmation) { - throw createProviderRpcError(4001, "User Rejected Request") - } - const { id } = credential as { id: string } - await _vault.setState({ credentialId: id, credential }) - return { success: true } - }) - .with({ method: "mina_storePrivateCredential" }, async ({ params }) => { - const [credential] = params - if (!credential) throw createProviderRpcError(4000, "Invalid Request") - - const credentialWitnessType = credential.witness.type - - const stringifiedCredential = JSON.stringify(credential) - - try { - if (!(credentialWitnessType === "unsigned")) { - const { value: userConfirmed, result } = - await showUserPrompt({ - inputType: "confirmation", - contract: "validate-credential", - metadata: { - title: "Store private credential request", - payload: stringifiedCredential, - }, + .with( + { method: "mina_storePrivateCredential" }, + async ({ params }) => { + const [credential] = params + if (!credential) + throw createProviderRpcError(4000, "Invalid Request") + + const credentialWitnessType = credential.witness.type + + const stringifiedCredential = JSON.stringify(credential) + + try { + if (!(credentialWitnessType === "unsigned")) { + const { value: userConfirmed, result } = + await showUserPrompt({ + inputType: "confirmation", + contract: "validate-credential", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + if (result?.error) { + throw createProviderRpcError( + 4100, + `Credential validation failed: ${JSON.stringify(result.error)}`, + ) + } + + if (!result?.result) { + throw createProviderRpcError( + 4100, + "Missing validation result", + ) + } + } else { + const { value: userConfirmed } = + await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + } + + // TODO: hash should be stored with the credential + // Generate hash of the new credential + const newCredentialHash = createCredentialHash(credential) + + // Get existing credentials and check for duplicates + const existingCredentials = await _vault.getPrivateCredential() + const isDuplicate = existingCredentials.some((existing) => { + const existingHash = createCredentialHash(existing) + return existingHash === newCredentialHash }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } + if (isDuplicate) { + throw createProviderRpcError( + 4100, + "Credential already stored", + ) + } - if (result?.error) { + try { + const parsedResult = JSON.parse(stringifiedCredential) + await _vault.storePrivateCredential(parsedResult) + return { success: parsedResult } + } catch (error: any) { + throw createProviderRpcError( + 4100, + `Failed to store private credential: ${error}`, + ) + } + } catch (error: any) { throw createProviderRpcError( 4100, - `Credential validation failed: ${JSON.stringify(result.error)}`, + error.message || "Failed to validate credential", ) } + }, + ) + .with({ method: "mina_requestPresentation" }, async ({ params }) => { + try { + const [presentationRequest] = params + if (!presentationRequest) + throw createProviderRpcError(4000, "Invalid Request") - if (!result?.result) { - throw createProviderRpcError(4100, "Missing validation result") - } - } else { + // First, ask for approval to proceed with the presentation request const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", metadata: { - title: "Store private credential request", - payload: stringifiedCredential, + title: "Presentation request", + payload: JSON.stringify(presentationRequest), }, }) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } - } - // TODO: hash should be stored with the credential - // Generate hash of the new credential - const newCredentialHash = createCredentialHash(credential) + // Get stored credentials that could be used for the presentation + const storedCredentials: StoredObject[] = + await _vault.getPrivateCredential() - // Get existing credentials and check for duplicates - const existingCredentials = await _vault.getPrivateCredential() - const isDuplicate = existingCredentials.some((existing) => { - const existingHash = createCredentialHash(existing) - return existingHash === newCredentialHash - }) + // Show credential selection prompt + const { value: selectedCredentials } = + await showUserPrompt({ + inputType: "selection", + metadata: { + title: "Select credentials for presentation", + payload: JSON.stringify(storedCredentials), + submitButtonLabel: "Continue", + rejectButtonLabel: "Cancel", + }, + }) - if (isDuplicate) { - throw createProviderRpcError(4100, "Credential already stored") - } + if (!selectedCredentials) { + throw createProviderRpcError( + 4001, + "User Rejected Credential Selection", + ) + } - try { - const parsedResult = JSON.parse(stringifiedCredential) - await _vault.storePrivateCredential(parsedResult) - return { success: parsedResult } + const { value: userConfirmedPrepare, result } = + await showUserPrompt({ + inputType: "confirmation", + contract: "presentation", + metadata: { + title: "Prepare presentation", + payload: JSON.stringify({ + presentationRequest, + selectedCredentials: JSON.parse(selectedCredentials), + }), + }, + }) + + if (!userConfirmedPrepare) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + if (result?.error) { + throw createProviderRpcError( + 4100, + `Presentation creation failed: ${JSON.stringify(result.error)}`, + ) + } + + if (!result?.result) { + throw createProviderRpcError( + 4100, + "Missing presentation result", + ) + } + + // TODO: return presentation } catch (error: any) { throw createProviderRpcError( 4100, - `Failed to store private credential: ${error}`, + error.message || "Failed to create presentation", ) } - } catch (error: any) { - throw createProviderRpcError( - 4100, - error.message || "Failed to validate credential", - ) - } - }) - .with({ method: "mina_requestPresentation" }, async ({ params }) => { - try { - const [presentationRequest] = params - if (!presentationRequest) - throw createProviderRpcError(4000, "Invalid Request") + }) + // .with({ method: "mina_finalizePresentation" }, async ({ params }) => { + // const [fields] = params + // if (!fields || !fields.length) { + // throw createProviderRpcError(4100, "Unauthorized.") + // } - // First, ask for approval to proceed with the presentation request - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Presentation request", - payload: JSON.stringify(presentationRequest), - }, - }) + // const { value: passphrase } = await showUserPrompt({ + // inputType: "password", + // metadata: { + // title: "Sign presentation fields", + // payload: JSON.stringify(fields), + // submitButtonLabel: "Sign", + // rejectButtonLabel: "Cancel", + // }, + // }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } + // if (passphrase === null) { + // throw createProviderRpcError(4100, "Unauthorized.") + // } - // Get stored credentials that could be used for the presentation - const storedCredentials: StoredObject[] = - await _vault.getPrivateCredential() + // const operationArgs: ChainOperationArgs = { + // operation: "mina_signFields", + // network: "Mina", + // } - // Show credential selection prompt - const { value: selectedCredentials } = await showUserPrompt( - { - inputType: "selection", - metadata: { - title: "Select credentials for presentation", - payload: JSON.stringify(storedCredentials), - submitButtonLabel: "Continue", - rejectButtonLabel: "Cancel", - }, - }, - ) + // const signedResponse = await signPayload({ + // signable: { + // fields: fields.map((item: any) => BigInt(item)), + // }, + // operationArgs, + // () => utf8ToBytes(passphrase), + // }) + + // return signedResponse.signature + // }) - if (!selectedCredentials) { + .with({ method: "mina_sendTransaction" }, async ({ params }) => { + const [payload] = params + if (!payload) throw createProviderRpcError(4000, "Invalid Request") + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Send transaction request", + payload: JSON.stringify(payload), + }, + }) + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + try { + return _vault.submitTransaction(payload) + } catch (error: any) { throw createProviderRpcError( - 4001, - "User Rejected Credential Selection", + 4100, + "Unauthorized. Coudldn't broadscast transaction. Make sure nonce is correct.", ) } - return selectedCredentials - } catch (error: any) { - throw createProviderRpcError( - 4100, - error.message || "Failed to create presentation", - ) - } - }) - .with({ method: "mina_sendTransaction" }, async ({ params }) => { - const [payload] = params - if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const { value: passphrase } = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Send transaction request", - payload: JSON.stringify(payload), - }, }) - if (passphrase === null) - throw createProviderRpcError(4100, "Unauthorized.") - try { - return _vault.submitTransaction(payload) - } catch (error: any) { - throw createProviderRpcError( - 4100, - "Unauthorized. Coudldn't broadscast transaction. Make sure nonce is correct.", - ) - } - }) - .exhaustive() as any + .exhaustive() as any + ) }, } } From 108bda172cce4dae298253f851b8cec768ea2291 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 09:18:38 +0100 Subject: [PATCH 26/87] chore(private-credential): add web-provider to features deps --- packages/features/package.json | 1 + packages/web-provider/src/mina-network/utils.ts | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/features/package.json b/packages/features/package.json index 29641716..d76b4b77 100644 --- a/packages/features/package.json +++ b/packages/features/package.json @@ -42,6 +42,7 @@ "@palladco/offchain-data": "workspace:*", "@palladco/pallad-core": "workspace:*", "@palladco/vault": "workspace:*", + "@palladco/web-provider": "workspace:*", "@total-typescript/ts-reset": "0.5.1", "@zxcvbn-ts/core": "3.0.4", "array-shuffle": "3.0.0", diff --git a/packages/web-provider/src/mina-network/utils.ts b/packages/web-provider/src/mina-network/utils.ts index eb749846..7ce7bffc 100644 --- a/packages/web-provider/src/mina-network/utils.ts +++ b/packages/web-provider/src/mina-network/utils.ts @@ -49,9 +49,7 @@ export const serializeTransaction = (transaction: MinaSignablePayload) => { return serializeObject(clonedTransaction) } -// Hash credential export const createCredentialHash = (credential: any): string => { - // Create a stable string representation by sorting keys const stableString = JSON.stringify(credential) const bytes = utf8ToBytes(stableString) const hash = sha256(bytes) From 2cc6ad1efd44861b6fd4d6c498cd71ad0be64f17 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 14:03:28 +0100 Subject: [PATCH 27/87] chore(private-credential): add windowid to signing request handler --- packages/features/src/web-connector/routes/web-connector.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 09e1b4a0..de19eb19 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -120,10 +120,12 @@ export const WebConnectorRoute = () => { if (event.data.type === "presentation-signing-request") { // Handle signing request from sandbox try { + const { id } = await windows.getCurrent() const response = await runtime.sendMessage({ method: "mina_signFields", params: [event.data.fields], context: {}, + windowId: id, }) // Send signature back to sandbox From d9cf0fdc752ddb8907ef6d78deb0d15157dbd867 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 15:55:57 +0100 Subject: [PATCH 28/87] chore(private-credential): use sendMessage instead of runtime.sendMessage --- .../src/web-connector/routes/web-connector.tsx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index de19eb19..3b55cda7 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -120,13 +120,14 @@ export const WebConnectorRoute = () => { if (event.data.type === "presentation-signing-request") { // Handle signing request from sandbox try { - const { id } = await windows.getCurrent() - const response = await runtime.sendMessage({ - method: "mina_signFields", - params: [event.data.fields], - context: {}, - windowId: id, - }) + const response = await sendMessage( + "mina_signFields", + { + params: [event.data.fields], + context: {}, + }, + "background", + ) // Send signature back to sandbox const sandbox = document.querySelector( From 62fc8d077ace1fcea3d15cf74abaf4cec1d73434 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 21:00:04 +0100 Subject: [PATCH 29/87] feat(private-credential): mina_signFieldsWithPassphrase --- apps/extension/package.json | 2 +- .../src/background/handlers/web-provider.ts | 15 +++++++ apps/extension/src/background/index.ts | 2 + bun.lockb | Bin 575072 -> 575064 bytes package.json | 2 +- packages/web-provider/package.json | 2 +- .../src/mina-network/mina-provider.ts | 39 ++++++++++++++++++ 7 files changed, 59 insertions(+), 3 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index f0a59a78..37abd925 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -15,7 +15,7 @@ "test:e2e:ui": "playwright test --ui" }, "dependencies": { - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@ce61607", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@3", "@palladco/common": "workspace:*", "@palladco/features": "workspace:*", "@palladco/key-management": "workspace:*", diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 370844de..40d3e45f 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -14,6 +14,7 @@ import { SignTransactionRequestParamsSchema, StorePrivateCredentialRequestParamsSchema, SwitchChainRequestParamsSchema, + signFieldsWithPassphraseParamsSchema, } from "@mina-js/providers" import { createMinaProvider } from "@palladco/web-provider" import { serializeError } from "serialize-error" @@ -148,6 +149,20 @@ export const minaSignFields: Handler = async ({ data }) => { } } +export const minaSignFieldsWithPassphrase: Handler = async ({ data }) => { + try { + const provider = await createMinaProvider() + const payload = signFieldsWithPassphraseParamsSchema.parse({ + method: "mina_signFieldsWithPassphrase", + params: data.params, + context: data.context, + }) + return await provider.request(payload) + } catch (error: unknown) { + return { error: serializeError(error) } + } +} + export const minaSignTransaction: Handler = async ({ data }) => { try { const provider = await createMinaProvider() diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index 6ffba8fa..da7d7fe1 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -15,6 +15,7 @@ import { minaSetState, minaSign, minaSignFields, + minaSignFieldsWithPassphrase, minaSignTransaction, minaStorePrivateCredential, minaSwitchChain, @@ -44,6 +45,7 @@ onMessage("mina_createNullifier", minaCreateNullifier) onMessage("mina_sendTransaction", minaSendTransaction) onMessage("mina_storePrivateCredential", minaStorePrivateCredential) onMessage("mina_requestPresentation", minaRequestPresentation) +onMessage("mina_signFieldsWithPassphrase", minaSignFieldsWithPassphrase) /** * Wallet handlers diff --git a/bun.lockb b/bun.lockb index 2b126ff4085795d465c928103aaad74eb051adaf..7be3aeb33028c617da56393a80bb9ab21b77df5f 100755 GIT binary patch delta 80440 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 MRMU3Nqa5ap07aT#8~^|S delta 80443 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
JX+& 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 bp|c(k@9s3}fYpSo9S_Pl$sPx-O6dPTPoQeD diff --git a/package.json b/package.json index 370260f0..616a5d77 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@tsconfig/strictest": "2.0.5", "@turbo/gen": "2.0.9", "@vitest/coverage-v8": "2.0.5", - "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@ce61607", + "@mina-js/utils": "https://pkg.pr.new/palladians/mina-js/@mina-js/utils@3", "@types/bun": "^1.1.13", "autoprefixer": "10.4.19", "happy-dom": "14.12.3", diff --git a/packages/web-provider/package.json b/packages/web-provider/package.json index dd708bcd..435de646 100644 --- a/packages/web-provider/package.json +++ b/packages/web-provider/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@mina-js/klesia-sdk": "https://pkg.pr.new/palladians/mina-js/@mina-js/klesia-sdk@261950d", - "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@ce61607", + "@mina-js/providers": "https://pkg.pr.new/palladians/mina-js/@mina-js/providers@3", "@noble/hashes": "1.4.0", "@palladco/key-management": "workspace:*", "@palladco/mina-core": "workspace:*", diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index c021433b..675b6ba9 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -307,6 +307,45 @@ export const createMinaProvider = async (): Promise< .exhaustive() }, ) + .with( + { method: "mina_signFieldsWithPassphrase" }, + async ({ params }) => { + const [fieldsAndPassphrase] = params + if ( + !fieldsAndPassphrase || + !fieldsAndPassphrase.fields || + !fieldsAndPassphrase.fields.length || + !fieldsAndPassphrase.passphrase + ) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const { fields, passphrase } = fieldsAndPassphrase + + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", + } + + const signedResponse = await signPayload({ + signable: { + fields: fields.map((item: any) => BigInt(item)), + }, + operationArgs, + passphrase, + }) + const serializedResponseData = signedResponse.data.map((item) => { + if (typeof item === "bigint") { + return String(item) + } + return item + }) + const seriliasedResponse = { + ...signedResponse, + data: serializedResponseData, + } + return seriliasedResponse + }, + ) .with({ method: "mina_getState" }, async ({ params }) => { const [query, props] = params const credentials = await _vault.getState( From b8733943ca4d7102d0c3d25720bedcd891a913db Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 22:24:23 +0100 Subject: [PATCH 30/87] chore(private-credential)(wip): move field signing to startSubmitting --- .../web-connector/routes/web-connector.tsx | 83 +- .../src/chains/Mina/signingOperations.ts | 1 + .../src/mina-network/mina-provider.ts | 772 ++++++++---------- 3 files changed, 405 insertions(+), 451 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 3b55cda7..fd6f2260 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -15,6 +15,12 @@ type ContractResult = { error?: string } +type SignedFieldsResponse = { + data: string[] + publicKey: string + signature: string +} + export const sanitizePayload = async (payload: string) => { const parsedPayload = JSON.parse(payload) as Record const yamlPayload = yaml.stringify(parsedPayload) @@ -54,6 +60,47 @@ export const WebConnectorRoute = () => { if (!request.contract) return onSubmit({ userInput }) setLoading(true) try { + // For presentation contract, set up message handler for signing request + if (request.contract === "presentation") { + const messageHandler = async (event: MessageEvent) => { + if (event.data.type === "presentation-signing-request") { + try { + // Use the passphrase we already have to sign fields + const response = (await sendMessage( + "mina_signFieldsWithPassphrase", + { + params: [ + { + fields: event.data.fields, + passphrase: userInput, + }, + ], + context: { + origin: `chrome-extension://${chrome.runtime.id}`, + }, + }, + "background", + )) as SignedFieldsResponse + + if (!response || !response.signature) { + throw new Error( + `Failed to sign fields; response: ${JSON.stringify(response)}`, + ) + } + + // Send signature back to sandbox + sendSandboxMessage({ + type: "presentation-signature", + signature: response.signature, + }) + } catch (error) { + console.error("Error signing fields:", error) + } + } + } + + window.addEventListener("message", messageHandler) + } return sendSandboxMessage({ type: "run", contract: request.contract, @@ -117,42 +164,6 @@ export const WebConnectorRoute = () => { window.close() } const eventListener = async (event: MessageEvent) => { - if (event.data.type === "presentation-signing-request") { - // Handle signing request from sandbox - try { - const response = await sendMessage( - "mina_signFields", - { - params: [event.data.fields], - context: {}, - }, - "background", - ) - - // Send signature back to sandbox - const sandbox = document.querySelector( - "#o1sandbox", - ) as HTMLIFrameElement - sandbox?.contentWindow?.postMessage( - { - type: "presentation-signing-response", - signature: response, - }, - "*", - ) - } catch (error: any) { - const sandbox = document.querySelector( - "#o1sandbox", - ) as HTMLIFrameElement - sandbox?.contentWindow?.postMessage( - { - type: "presentation-signing-response", - error: error.message, - }, - "*", - ) - } - } if (event.data.type === "presentation-result") { return confirm({ result: { diff --git a/packages/key-management/src/chains/Mina/signingOperations.ts b/packages/key-management/src/chains/Mina/signingOperations.ts index 0e04f468..a362fd28 100644 --- a/packages/key-management/src/chains/Mina/signingOperations.ts +++ b/packages/key-management/src/chains/Mina/signingOperations.ts @@ -33,6 +33,7 @@ export function MinaSigningOperations( throw new Error("Invalid transaction payload") } + case "mina_signFieldsWithPassphrase": case "mina_signFields": { if (util.isFields(payload)) { return minaClient.signFields(payload.fields, privateKey) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 675b6ba9..beedbf06 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -106,7 +106,7 @@ export const createMinaProvider = async (): Promise< utf8ToBytes(passphrase), )) as T } catch (error) { - throw createProviderRpcError(4100, "Unauthorized") + throw createProviderRpcError(4100, "Unauthorized: signPayload") } } return { @@ -118,14 +118,14 @@ export const createMinaProvider = async (): Promise< const { context } = typedArgs const { origin } = context as Record if (!origin) { - throw createProviderRpcError(4100, "Unauthorized") + throw createProviderRpcError(4100, "Unauthorized: origin") } if (await _vault.isBlocked({ origin })) { - throw createProviderRpcError(4100, "Unauthorized") + throw createProviderRpcError(4100, "Unauthorized: isBlocked") } const initialized = await verifyInitialized() if (!initialized) { - throw createProviderRpcError(4100, "Unauthorized") + throw createProviderRpcError(4100, "Unauthorized: initialized") } const locked = await _vault.isLocked() const enabled = await _vault.getEnabled({ origin }) @@ -134,485 +134,427 @@ export const createMinaProvider = async (): Promise< } if (locked) await unlockWallet() if (!enabled) await enableOrigin({ origin }) - return ( - match(typedArgs) - .with( - { method: P.union("mina_accounts", "mina_requestAccounts") }, - _vault.getAccounts, - ) - .with({ method: "mina_getBalance" }, _vault.getBalance) - .with({ method: "mina_networkId" }, _vault.getNetworkId) - .with({ method: "mina_addChain" }, () => - createProviderRpcError(4200, "Unsupported Method"), - ) - .with({ method: "mina_switchChain" }, async ({ params }) => { - const [networkId] = params - if (!networkId) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const networkIds = await _vault.getNetworkIds() - if (!networkIds.includes(networkId)) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Switch to different chain.", - payload: JSON.stringify({ networkId }), - }, - }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } - await _vault.switchNetwork(networkId) - return networkId + return match(typedArgs) + .with( + { method: P.union("mina_accounts", "mina_requestAccounts") }, + _vault.getAccounts, + ) + .with({ method: "mina_getBalance" }, _vault.getBalance) + .with({ method: "mina_networkId" }, _vault.getNetworkId) + .with({ method: "mina_addChain" }, () => + createProviderRpcError(4200, "Unsupported Method"), + ) + .with({ method: "mina_switchChain" }, async ({ params }) => { + const [networkId] = params + if (!networkId) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const networkIds = await _vault.getNetworkIds() + if (!networkIds.includes(networkId)) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Switch to different chain.", + payload: JSON.stringify({ networkId }), + }, }) - .with({ method: "mina_requestNetwork" }, async () => { - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + await _vault.switchNetwork(networkId) + return networkId + }) + .with({ method: "mina_requestNetwork" }, async () => { + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Request to current Mina network information.", + }, + }) + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + const requestNetworkResponse = await _vault.requestNetwork() + return requestNetworkResponse + }) + .with( + { method: P.union("mina_sign", "mina_signTransaction") }, + async (signatureRequest) => { + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + contract: "add", metadata: { - title: "Request to current Mina network information.", + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), }, }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", } - const requestNetworkResponse = await _vault.requestNetwork() - return requestNetworkResponse - }) - .with( - { method: P.union("mina_sign", "mina_signTransaction") }, - async (signatureRequest) => { - const { value: passphrase } = await showUserPrompt({ - inputType: "password", - contract: "add", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, - }) - if (passphrase === null) - throw createProviderRpcError(4100, "Unauthorized.") - const operationArgs: ChainOperationArgs = { - operation: args.method, - network: "Mina", - } - return match(signatureRequest) - .with({ method: "mina_signTransaction" }, ({ params }) => { - const payload = params?.[0] - if (!payload) { - throw createProviderRpcError(4100, "Unauthorized.") - } - if ("transaction" in payload) { - return signPayload({ - signable: payload, - operationArgs, - passphrase, - }) - } + return match(signatureRequest) + .with({ method: "mina_signTransaction" }, ({ params }) => { + const payload = params?.[0] + if (!payload) { + throw createProviderRpcError(4100, "Unauthorized.") + } + if ("transaction" in payload) { return signPayload({ signable: payload, operationArgs, passphrase, }) + } + return signPayload({ + signable: payload, + operationArgs, + passphrase, }) - .with({ method: "mina_sign" }, ({ params }) => { - const [message] = params as string[] - return signPayload({ - signable: { message: message as string }, - operationArgs, - passphrase, - }) + }) + .with({ method: "mina_sign" }, ({ params }) => { + const [message] = params as string[] + return signPayload({ + signable: { message: message as string }, + operationArgs, + passphrase, }) - .exhaustive() - }, - ) - .with( - { method: P.union("mina_createNullifier", "mina_signFields") }, - async (signatureRequest) => { - const { value: passphrase } = await showUserPrompt({ - inputType: "password", - metadata: { - title: "Signature request", - payload: JSON.stringify(signatureRequest.params), - }, }) - if (passphrase === null) - throw createProviderRpcError(4100, "Unauthorized.") - const operationArgs: ChainOperationArgs = { - operation: args.method, - network: "Mina", - } - return match(signatureRequest) - .with({ method: "mina_signFields" }, async ({ params }) => { - const [fields] = params - if (!fields || !fields.length) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const signedResponse = await signPayload({ - signable: { - fields: fields.map((item: any) => BigInt(item)), - }, - operationArgs, - passphrase, - }) - const serializedResponseData = signedResponse.data.map( - (item) => { - if (typeof item === "bigint") { - return String(item) - } - return item - }, - ) - const seriliasedResponse = { - ...signedResponse, - data: serializedResponseData, - } - return seriliasedResponse + .exhaustive() + }, + ) + .with( + { method: P.union("mina_createNullifier", "mina_signFields") }, + async (signatureRequest) => { + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Signature request", + payload: JSON.stringify(signatureRequest.params), + }, + }) + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", + } + return match(signatureRequest) + .with({ method: "mina_signFields" }, async ({ params }) => { + const [fields] = params + if (!fields || !fields.length) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const signedResponse = await signPayload({ + signable: { + fields: fields.map((item: any) => BigInt(item)), + }, + operationArgs, + passphrase, }) - .with( - { method: "mina_createNullifier" }, - async ({ params }) => { - const [message] = params - if (!message || !message.length) { - throw createProviderRpcError(4100, "Unauthorized.") + const serializedResponseData = signedResponse.data.map( + (item) => { + if (typeof item === "bigint") { + return String(item) } - const signedResponse = await signPayload({ - signable: { - message: message.map((item: any) => BigInt(item)), - }, - operationArgs, - passphrase, - }) - // serialise the response if mina_createNullifier - const serializedResponseData = { - publicKey: serializeGroup(signedResponse.publicKey), - public: { - nullifier: serializeGroup( - signedResponse.public.nullifier, - ), - s: serializeField(signedResponse.public.s), - }, - private: { - c: serializeField(signedResponse.private.c), - g_r: serializeGroup(signedResponse.private.g_r), - h_m_pk_r: serializeGroup( - signedResponse.private.h_m_pk_r, - ), - }, - } - return serializedResponseData + return item }, ) - .exhaustive() - }, - ) - .with( - { method: "mina_signFieldsWithPassphrase" }, - async ({ params }) => { - const [fieldsAndPassphrase] = params - if ( - !fieldsAndPassphrase || - !fieldsAndPassphrase.fields || - !fieldsAndPassphrase.fields.length || - !fieldsAndPassphrase.passphrase - ) { - throw createProviderRpcError(4100, "Unauthorized.") - } - const { fields, passphrase } = fieldsAndPassphrase - - const operationArgs: ChainOperationArgs = { - operation: args.method, - network: "Mina", - } - - const signedResponse = await signPayload({ - signable: { - fields: fields.map((item: any) => BigInt(item)), - }, - operationArgs, - passphrase, + const seriliasedResponse = { + ...signedResponse, + data: serializedResponseData, + } + return seriliasedResponse }) - const serializedResponseData = signedResponse.data.map((item) => { - if (typeof item === "bigint") { - return String(item) + .with({ method: "mina_createNullifier" }, async ({ params }) => { + const [message] = params + if (!message || !message.length) { + throw createProviderRpcError(4100, "Unauthorized.") + } + const signedResponse = await signPayload({ + signable: { + message: message.map((item: any) => BigInt(item)), + }, + operationArgs, + passphrase, + }) + // serialise the response if mina_createNullifier + const serializedResponseData = { + publicKey: serializeGroup(signedResponse.publicKey), + public: { + nullifier: serializeGroup(signedResponse.public.nullifier), + s: serializeField(signedResponse.public.s), + }, + private: { + c: serializeField(signedResponse.private.c), + g_r: serializeGroup(signedResponse.private.g_r), + h_m_pk_r: serializeGroup(signedResponse.private.h_m_pk_r), + }, } - return item + return serializedResponseData }) - const seriliasedResponse = { - ...signedResponse, - data: serializedResponseData, - } - return seriliasedResponse - }, - ) - .with({ method: "mina_getState" }, async ({ params }) => { - const [query, props] = params - const credentials = await _vault.getState( - query as SearchQuery, - props as string[], - ) - const { value: confirmation } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential read request", - payload: JSON.stringify({ ...params, credentials }), - }, - }) - if (!confirmation) { - throw createProviderRpcError(4001, "User Rejected Request") + .exhaustive() + }, + ) + .with( + { method: "mina_signFieldsWithPassphrase" }, + async ({ params }) => { + const [fieldsAndPassphrase] = params + if ( + !fieldsAndPassphrase || + !fieldsAndPassphrase.fields || + !fieldsAndPassphrase.fields.length || + !fieldsAndPassphrase.passphrase + ) { + throw createProviderRpcError( + 4100, + `Unauthorized. fieldsAndPassphrase: ${JSON.stringify(fieldsAndPassphrase)}`, + ) } - return credentials - }) - .with({ method: "mina_setState" }, async ({ params }) => { - const [credential] = params - if (!credential) - throw createProviderRpcError(4000, "Invalid Request") - const { value: confirmation } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Credential write request", - payload: JSON.stringify(credential), + const { fields, passphrase } = fieldsAndPassphrase + + const operationArgs: ChainOperationArgs = { + operation: args.method, + network: "Mina", + } + + const signedResponse = await signPayload({ + signable: { + fields: fields.map((item: any) => BigInt(item)), }, + operationArgs, + passphrase, }) - if (!confirmation) { - throw createProviderRpcError(4001, "User Rejected Request") + const serializedResponseData = signedResponse.data.map((item) => { + if (typeof item === "bigint") { + return String(item) + } + return item + }) + const seriliasedResponse = { + ...signedResponse, + data: serializedResponseData, } - const { id } = credential as { id: string } - await _vault.setState({ credentialId: id, credential }) - return { success: true } + return seriliasedResponse + }, + ) + .with({ method: "mina_getState" }, async ({ params }) => { + const [query, props] = params + const credentials = await _vault.getState( + query as SearchQuery, + props as string[], + ) + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential read request", + payload: JSON.stringify({ ...params, credentials }), + }, }) - .with( - { method: "mina_storePrivateCredential" }, - async ({ params }) => { - const [credential] = params - if (!credential) - throw createProviderRpcError(4000, "Invalid Request") - - const credentialWitnessType = credential.witness.type - - const stringifiedCredential = JSON.stringify(credential) - - try { - if (!(credentialWitnessType === "unsigned")) { - const { value: userConfirmed, result } = - await showUserPrompt({ - inputType: "confirmation", - contract: "validate-credential", - metadata: { - title: "Store private credential request", - payload: stringifiedCredential, - }, - }) - - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } - - if (result?.error) { - throw createProviderRpcError( - 4100, - `Credential validation failed: ${JSON.stringify(result.error)}`, - ) - } - - if (!result?.result) { - throw createProviderRpcError( - 4100, - "Missing validation result", - ) - } - } else { - const { value: userConfirmed } = - await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Store private credential request", - payload: stringifiedCredential, - }, - }) - - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } - } - - // TODO: hash should be stored with the credential - // Generate hash of the new credential - const newCredentialHash = createCredentialHash(credential) - - // Get existing credentials and check for duplicates - const existingCredentials = await _vault.getPrivateCredential() - const isDuplicate = existingCredentials.some((existing) => { - const existingHash = createCredentialHash(existing) - return existingHash === newCredentialHash + if (!confirmation) { + throw createProviderRpcError(4001, "User Rejected Request") + } + return credentials + }) + .with({ method: "mina_setState" }, async ({ params }) => { + const [credential] = params + if (!credential) throw createProviderRpcError(4000, "Invalid Request") + const { value: confirmation } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Credential write request", + payload: JSON.stringify(credential), + }, + }) + if (!confirmation) { + throw createProviderRpcError(4001, "User Rejected Request") + } + const { id } = credential as { id: string } + await _vault.setState({ credentialId: id, credential }) + return { success: true } + }) + .with({ method: "mina_storePrivateCredential" }, async ({ params }) => { + const [credential] = params + if (!credential) throw createProviderRpcError(4000, "Invalid Request") + + const credentialWitnessType = credential.witness.type + + const stringifiedCredential = JSON.stringify(credential) + + try { + if (!(credentialWitnessType === "unsigned")) { + const { value: userConfirmed, result } = + await showUserPrompt({ + inputType: "confirmation", + contract: "validate-credential", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, }) - if (isDuplicate) { - throw createProviderRpcError( - 4100, - "Credential already stored", - ) - } + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } - try { - const parsedResult = JSON.parse(stringifiedCredential) - await _vault.storePrivateCredential(parsedResult) - return { success: parsedResult } - } catch (error: any) { - throw createProviderRpcError( - 4100, - `Failed to store private credential: ${error}`, - ) - } - } catch (error: any) { + if (result?.error) { throw createProviderRpcError( 4100, - error.message || "Failed to validate credential", + `Credential validation failed: ${JSON.stringify(result.error)}`, ) } - }, - ) - .with({ method: "mina_requestPresentation" }, async ({ params }) => { - try { - const [presentationRequest] = params - if (!presentationRequest) - throw createProviderRpcError(4000, "Invalid Request") - // First, ask for approval to proceed with the presentation request + if (!result?.result) { + throw createProviderRpcError(4100, "Missing validation result") + } + } else { const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", metadata: { - title: "Presentation request", - payload: JSON.stringify(presentationRequest), + title: "Store private credential request", + payload: stringifiedCredential, }, }) if (!userConfirmed) { throw createProviderRpcError(4001, "User Rejected Request") } + } - // Get stored credentials that could be used for the presentation - const storedCredentials: StoredObject[] = - await _vault.getPrivateCredential() - - // Show credential selection prompt - const { value: selectedCredentials } = - await showUserPrompt({ - inputType: "selection", - metadata: { - title: "Select credentials for presentation", - payload: JSON.stringify(storedCredentials), - submitButtonLabel: "Continue", - rejectButtonLabel: "Cancel", - }, - }) - - if (!selectedCredentials) { - throw createProviderRpcError( - 4001, - "User Rejected Credential Selection", - ) - } - - const { value: userConfirmedPrepare, result } = - await showUserPrompt({ - inputType: "confirmation", - contract: "presentation", - metadata: { - title: "Prepare presentation", - payload: JSON.stringify({ - presentationRequest, - selectedCredentials: JSON.parse(selectedCredentials), - }), - }, - }) - - if (!userConfirmedPrepare) { - throw createProviderRpcError(4001, "User Rejected Request") - } + // TODO: hash should be stored with the credential + // Generate hash of the new credential + const newCredentialHash = createCredentialHash(credential) - if (result?.error) { - throw createProviderRpcError( - 4100, - `Presentation creation failed: ${JSON.stringify(result.error)}`, - ) - } + // Get existing credentials and check for duplicates + const existingCredentials = await _vault.getPrivateCredential() + const isDuplicate = existingCredentials.some((existing) => { + const existingHash = createCredentialHash(existing) + return existingHash === newCredentialHash + }) - if (!result?.result) { - throw createProviderRpcError( - 4100, - "Missing presentation result", - ) - } + if (isDuplicate) { + throw createProviderRpcError(4100, "Credential already stored") + } - // TODO: return presentation + try { + const parsedResult = JSON.parse(stringifiedCredential) + await _vault.storePrivateCredential(parsedResult) + return { success: parsedResult } } catch (error: any) { throw createProviderRpcError( 4100, - error.message || "Failed to create presentation", + `Failed to store private credential: ${error}`, ) } - }) - // .with({ method: "mina_finalizePresentation" }, async ({ params }) => { - // const [fields] = params - // if (!fields || !fields.length) { - // throw createProviderRpcError(4100, "Unauthorized.") - // } + } catch (error: any) { + throw createProviderRpcError( + 4100, + error.message || "Failed to validate credential", + ) + } + }) + .with({ method: "mina_requestPresentation" }, async ({ params }) => { + try { + const [presentationRequest] = params + if (!presentationRequest) + throw createProviderRpcError(4000, "Invalid Request") - // const { value: passphrase } = await showUserPrompt({ - // inputType: "password", - // metadata: { - // title: "Sign presentation fields", - // payload: JSON.stringify(fields), - // submitButtonLabel: "Sign", - // rejectButtonLabel: "Cancel", - // }, - // }) + // First, ask for approval to proceed with the presentation request + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Presentation request", + payload: JSON.stringify(presentationRequest), + }, + }) - // if (passphrase === null) { - // throw createProviderRpcError(4100, "Unauthorized.") - // } + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } - // const operationArgs: ChainOperationArgs = { - // operation: "mina_signFields", - // network: "Mina", - // } + // Get stored credentials that could be used for the presentation + const storedCredentials: StoredObject[] = + await _vault.getPrivateCredential() - // const signedResponse = await signPayload({ - // signable: { - // fields: fields.map((item: any) => BigInt(item)), - // }, - // operationArgs, - // () => utf8ToBytes(passphrase), - // }) + // Show credential selection prompt + const { value: selectedCredentials } = await showUserPrompt( + { + inputType: "selection", + metadata: { + title: "Select credentials for presentation", + payload: JSON.stringify(storedCredentials), + submitButtonLabel: "Continue", + rejectButtonLabel: "Cancel", + }, + }, + ) - // return signedResponse.signature - // }) + if (!selectedCredentials) { + throw createProviderRpcError( + 4001, + "User Rejected Credential Selection", + ) + } - .with({ method: "mina_sendTransaction" }, async ({ params }) => { - const [payload] = params - if (!payload) throw createProviderRpcError(4000, "Invalid Request") - const { value: passphrase } = await showUserPrompt({ + const { value: passphrase, result } = await showUserPrompt({ inputType: "password", + contract: "presentation", metadata: { - title: "Send transaction request", - payload: JSON.stringify(payload), + title: "Prepare presentation", + payload: JSON.stringify({ + presentationRequest, + selectedCredentials: JSON.parse(selectedCredentials), + }), }, }) + if (passphrase === null) throw createProviderRpcError(4100, "Unauthorized.") - try { - return _vault.submitTransaction(payload) - } catch (error: any) { + + if (result?.error) { throw createProviderRpcError( 4100, - "Unauthorized. Coudldn't broadscast transaction. Make sure nonce is correct.", + `Presentation creation failed: ${JSON.stringify(result.error)}`, ) } + + if (!result?.result) { + throw createProviderRpcError(4100, "Missing presentation result") + } + + // TODO: return presentation + } catch (error: any) { + throw createProviderRpcError( + 4100, + error.message || "Failed to create presentation", + ) + } + }) + .with({ method: "mina_sendTransaction" }, async ({ params }) => { + const [payload] = params + if (!payload) throw createProviderRpcError(4000, "Invalid Request") + const { value: passphrase } = await showUserPrompt({ + inputType: "password", + metadata: { + title: "Send transaction request", + payload: JSON.stringify(payload), + }, }) - .exhaustive() as any - ) + if (passphrase === null) + throw createProviderRpcError(4100, "Unauthorized.") + try { + return _vault.submitTransaction(payload) + } catch (error: any) { + throw createProviderRpcError( + 4100, + "Unauthorized. Coudldn't broadscast transaction. Make sure nonce is correct.", + ) + } + }) + .exhaustive() as any }, } } From b981a6560dc5742cbd4cb9f1ccd88f36090e034e Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 18 Nov 2024 22:42:32 +0100 Subject: [PATCH 31/87] chore(private-credential): change to onSubmit in presentation-result listener --- .../features/src/web-connector/routes/web-connector.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index fd6f2260..03e87741 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -95,6 +95,10 @@ export const WebConnectorRoute = () => { }) } catch (error) { console.error("Error signing fields:", error) + sendSandboxMessage({ + type: "presentation-signature-error", + error: error instanceof Error ? error.message : "Unknown error", + }) } } } @@ -165,7 +169,8 @@ export const WebConnectorRoute = () => { } const eventListener = async (event: MessageEvent) => { if (event.data.type === "presentation-result") { - return confirm({ + return onSubmit({ + userInput, // TODO: userInput out of scope result: { type: event.data.type, result: event.data.result, From 60c0b06ae8882a23acd6eac525068ac0e485a25f Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 19 Nov 2024 10:01:22 +0100 Subject: [PATCH 32/87] chore(private-credential)(wip): update messages in sandbox --- apps/extension/src/sandbox/index.ts | 34 +++++++++++-------- .../web-connector/routes/web-connector.tsx | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 7d3d674c..01107dba 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -11,9 +11,12 @@ const MessageSchema = z.discriminatedUnion("type", [ payload: z.string(), }), z.object({ - type: z.literal("presentation-signing-response"), - signature: z.any().optional(), - error: z.string().optional(), + type: z.literal("presentation-signature"), + signature: z.string(), + }), + z.object({ + type: z.literal("presentation-signature-error"), + error: z.string(), }), ]) @@ -28,7 +31,7 @@ const recoverOriginalPayload = (sanitizedPayload: string) => { return JSON.stringify(parsedYaml) } -let presentationSigningPromise: { +let presentationSignaturePromise: { resolve: (value: any) => void reject: (reason: any) => void } | null = null @@ -38,15 +41,18 @@ window.addEventListener("message", async (event) => { try { const message = MessageSchema.parse(event.data) - if (message.type === "presentation-signing-response") { - if (presentationSigningPromise) { - if (message.error) { - presentationSigningPromise.reject(new Error(message.error)) - } else { - presentationSigningPromise.resolve(message.signature) - } - presentationSigningPromise = null - return + if (message.type === "presentation-signature") { + if (presentationSignaturePromise) { + presentationSignaturePromise.resolve(message.signature) + presentationSignaturePromise = null + } + return + } + + if (message.type === "presentation-signature-error") { + if (presentationSignaturePromise) { + presentationSignaturePromise.reject(new Error(message.error)) + presentationSignaturePromise = null } return } @@ -92,7 +98,7 @@ window.addEventListener("message", async (event) => { ) const signature = await new Promise((resolve, reject) => { - presentationSigningPromise = { resolve, reject } + presentationSignaturePromise = { resolve, reject } }) const mockResult: Result = { diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 03e87741..bd596c2f 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -170,7 +170,7 @@ export const WebConnectorRoute = () => { const eventListener = async (event: MessageEvent) => { if (event.data.type === "presentation-result") { return onSubmit({ - userInput, // TODO: userInput out of scope + userInput: "passphrase", // TODO: userInput out of scope result: { type: event.data.type, result: event.data.result, From 0846c748176e2d9f45b1ca2bfffae31ddea1e279 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 19 Nov 2024 11:12:00 +0100 Subject: [PATCH 33/87] chore(private-credential): update bunlock --- .../src/background/handlers/web-provider.ts | 4 ++-- bun.lockb | Bin 575064 -> 574456 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 40d3e45f..f13012bb 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -14,7 +14,7 @@ import { SignTransactionRequestParamsSchema, StorePrivateCredentialRequestParamsSchema, SwitchChainRequestParamsSchema, - signFieldsWithPassphraseParamsSchema, + signFieldsWithPassphraseRequestParamsSchema, } from "@mina-js/providers" import { createMinaProvider } from "@palladco/web-provider" import { serializeError } from "serialize-error" @@ -152,7 +152,7 @@ export const minaSignFields: Handler = async ({ data }) => { export const minaSignFieldsWithPassphrase: Handler = async ({ data }) => { try { const provider = await createMinaProvider() - const payload = signFieldsWithPassphraseParamsSchema.parse({ + const payload = signFieldsWithPassphraseRequestParamsSchema.parse({ method: "mina_signFieldsWithPassphrase", params: data.params, context: data.context, diff --git a/bun.lockb b/bun.lockb index 7be3aeb33028c617da56393a80bb9ab21b77df5f..8d7fb408ca6c673d9d498842a586f4a9b13d72d3 100755 GIT binary patch delta 77895 zcmeFad0dU@A3pv(rw-?lkgZ~}Qz1L&q>^1BWG#eLbSTk689CVtAqRI^#x}MY#*jfn zmcb}Ab|YlpX)wk<@w?v7eV;U+*L**}&-eBF)zh?`+ncc^PHx+JiqSS zIdvB`aSaI4-wW&@JKa6HHf?)M%n#44>u%faxoczjsdaO9G(Hd-encnHXH(jsnwojb zcErbPYjtfcN#!LeX$8<0I6gQw+-+=F!lZCxNI1%7Rwz}$O532GB$Y8cDUD3y10<;m z$~7A#NjAVaK;l8rD*+1vB}oCs7)Kk&jf#@|pjQC5)bl|3vc%C(7~1znemU@ZKv}K(f6;fcd@ho2GPt`9zsvrXA?P0qRO&SuBt& ziwqtc<`!y<4gt3V?*}By9vitu-N4DRiDM+GqFR2mF(f!9)^;q{#{uh5Jz#a91SE^s zXy6;*#RzrerljW9+&srf?uuoifILo;98vH&bTZ&DIGJBHigyqLq=rTUDgQ3YkwLx3 zbBqpwKkzvRP6INIgXQ=f2e$$DRQ1wQQsD#$nXSv7l;wQ0T<)}dCi85$(pH%_?b^$l z^52^4RO)ITQORNO;GNv}M>k2*S7@MoCT~~^Btv#WCr|vip6gG9UIb41NFaH@w2K=& zPN2h2<`b0~$Sce*D%qRH?d4u*UV~#pa0(bFAXT>TSmU?^w>V?yAuH~c=~>)}_}$#N zn5c2%!lET9IxHkSI65|F_C9X>(EYr<{Xp`jpTKq;TO=iC^MXx9hBc5Pu9n~x1rKfM z77`T^75&;K%tJ3RR-cl~{E>M$QjUY!u#WK0YiIwiQVxnW#be5_O@hqreGNaeDTPhQ&sq<*4< zBS(e?OVT&sHj+t7T8soWyyOJ;+HAo`0c%0;4n3hCwDImOvl_)&QwN2cSK0`5ErYQs87j-?JP&f#l-H zzzV=N=Xis$!6QcokBkU=mB;y07*G!RXMxp$OV9IqG1%&81M|2jNhY$mHWGw7AT8fN zFYtmFfllE2fuw&6bO5FT$-p?lgMpR72LWkS^#Ia<;t=dK*N0&M8Tvy$_rMUij|{+0 zSWb22H^`s@OU%>kolQfp@=#&dcyk3nG9xTHIx5;NEPhD=&z}dKy6KAX5ISAw6SEaa z&G$n)g!is+zg+=R2#&rbNwt9=fmpIhPl4oL8-yRqo1Go(Og_+RLOXhgN2NVD%}oO! zSvn>rEG7g)(+PcaMAXROh#092IJNcuCing5uyHX7<3gk{Slq2qejfCO$R7rD1GWXi z{G_S^AKs9pCYY9_pLrt540J|;C?FNAgh7#y-(WDXH)#`mOLI3qIw~YACPr%fg!}l~ zQ|^qoSYw2Q&%8n&6s7*)0~rEToe?!&oudojn3kl*&&UZ_7IoExlr)Nb9vl*W3!Ewx zp&|0>#OJ)DCqN2{P#}%`cOV7B1C*-@?C~czFcG{QcsQ^Ma43*wEiPKMPnr-zW=hhl zm(Y76qr+dk!uYsx2_aFTVZS})JR4|-{2{M+13SUVu=v=paWs^B(8++cqTFJ$T+LpY z{)U&DWUgJ!K5)`o&SsztP3uIUEpRB1yx9|20T?zhY+Ni1YX?roy8)^1+8_8VR0UGs zIw0l0F{f3tH>Li~UG(Wa$NNAkbyZ+wXlr%vN-W}f50t0cUIGt&y*_bQ zj~vIhyhoxp3x9!jss21kCYPF$Mq;4^!x?8phhY&B#__Snkd?BmE@U&1<}f@sCY+i) zjB@0Ly9pfKC-Vl?V-~u-m8`nd7!w>F9h@N9fTN?NA5o9ok!>xj284#ipt&B{E#N1b zgVI0>inmXA!{dX;M$sfc5Y{WGfM3gSq-txKpIX+91b_5Bv}sBhZ%epuK~&2S7mssp=gJ!3jmUySyom< zcr}ppv9^3T^EmIGG`t))&ksn$XvXgJh- z_A7h$zF^c!+&JSXV_2v(ag;HFE`lp6@m?MSosjPjB=cgUqvA$~OHz=zwo^@08K@MR zlP4Kt>Hhj{RnEQa`5>ABDU=sLC)*|iX;2e@eKNxA4rBpp<%*|dc2&uzAV)Rp9G{WRsq%mK5c-0O-OWw&>ZLmB$uvm;nUq6 zNUobE_y}Na@RmU8uo}=27}AJ0+!09m4FoR_q;hW?a=Z$pKq!ZLWZ(-oSu#dCelNXsa*2FI1))X+4Ps|FkeB#*hb;3K?@a&#hghE5Lx z9zg2vXS7cnOn58Vq>k`rEAIMpK+5P3B!fBvDYTom;kW@vBTfa<6x0S%`Nw*WH-R*O z(?Bxx7Xy!>UEpMxWeJ3YM8%DZl_b|zCf;D6n6t#T+>m!b3cg+*oL>j02D+mh>HR!; z2YA|vHjW!Db%3sV(u)UMG>{BG1EeWzA?hWyKQW0>o66N!o@4dEm17aP6k@JoAg%_O9docxNM{;={&aE4$i@yY(zk4NxGtyPvsv z9eY!~KD>)8AgPssw54f*G+9gixhZpjv?Da{%k{{ZNoZS=e(uLzuoXx{SO=tD%s{F? z14!+~3O*W0JJLWPqRf=k776m1GmyrbG>~^#l@~~=HHbG{QQ$5hHGC|ZAJ|)fWcYgM z6t=HnU@f3aAYWfikV)$-7M#kJ8q5uN3tmp@0jI}As3WNYfeg5U2FRe8*x=YWTrCfQ z(*g~NiW+Og*)TRLSS|nKP+tBUAWc?~Ijyd}X)zdeHwQ@m3JY@^WsHuAog(-Ifgw?9 zBho0r4-e<{EWK_5Cx3>9@jKxVQSQwM?%zIwcLUO}+Ho{H*Rzv{nceH@7QsjA4^9(f9m#`rERZ~4d2#R>&qqsgBND)*INI_p0 z!=rY}f+N;V#cwD^M`0JjXUzm&@NXauDHTW)xh|SFJO!L0W30gMWB9NbkXEmy++1)9 z&3Y(DQ|JXG!|;9z>lQDv;%GoP^oAgVI_e>?8IUSwPvjMM0clPgpi@H+#mEbUr_KpH zE^xoVQ}NtT?*wjG3m~=Y3?vU6M82&x5@F`U4Z78inZo6c!tpHyj*7v9S!{IhG_$L7 z&Dvj2a{8TD$|KsT+=5in+LGqZ`HbIKle?$@AIs_)PeMQ%rdaTsoik z77;da964nkIOWF+oDQTJ3=In#j~6LYYhG_mQe!04jHnPgyu!j_Cd7qBCrCaRA8o{~ zfMnSEg?w?Cfi$cUi?~0HF>Z0OqYTm<=w#sD>3j|og5xGfz>thIt}iloaJ4tp7GAS> z?{Ac*CHE9atrh@j_@{w1Ye#_8>JLB~4s45~+w2B#vN|#>l13{fEam0K0IB|Xx6rUr zc-<8d!e0_hSf-XY|L$7bcM0Q`uM};V1;$3jM8!pi;Qd%wShO)p`a7MUbti$;cXkH1 z=?`$S?WVayLwkiS=eZZn!3}Ggwyfmmq~%#>=qf(0T|io~G2hN z#{nsSIFRh`3#4f63Z(J371$I=3#UGiY#M`rqEGM`bwQgXOB_{L%fr+1n&T(TB{?jl zIe)0Ky!LR$>Z67vgg@c*E_`nqx}JCZI-Ki;K&n6VTR!-^f?pLl$v7@LZ1h-3vb^}- zy@6Z$NuV(%ES_d=Qn-4COKqW3hYvRLk+#{yc~p#BOt>*pYAWg#zxUkCJ#3NWT6S zNWT5gi@}&Eys^Y5HgY_HbTX9R5-o3D2mi?H_XeVV_oTKvc*FC7GgG+dr&HK zhnq=Tt9_Ll>1_|{63aXq#3ZIT<~Un??1a{_GwwcN*9yj^KsXP zdQ&n-w5ec~8SlPEn_0^{SvId}-$(bt?{Vw~+Xbe~=k1?s9P&%2J{UA7b+hBFfKE=@ zVHbk^udcj(WvX}P+fIhcnT7zJCevqdPZw6XmfSiscltt&IpA0`bMmY+%wezGyfkin zaCQ=VaZS_A+v{LARi|-h#>{+Drbd zqg2j6m~LTl9kTHsEcqWS=O0YB=pXg|!IDd|%$!A?%WFO171<0QX&eTc%dBZK+2E-| zLNqx+FK3&5H+gISg4WCIx5-1>akwP)R8tFzQ&);p4MtdUqmhEkQDZ++K5EJu+YnOU zdx``ymv9NGYsIO0BP|soic`CaQ-34Xm79Wh#5|Q;ocgUeRXJ3WI-66scv`CovSej( z>Sl4O9`?4*)SN=!C${Cz8LC&-fsx~6X6G#%%(>gVl?tQy+~~~km(mf8qD5WOx8BFvZrq?tusyz%dVk{^kna>Wv2*7;Q3U;XQ8mv8-y2~hS z#&A}e*&UJ%I>97!TC85l0i%(ll?i%{<5=^Fo$cgBW+l^G`x*yafY~tjahuTCXuXmMM&6Rmc4PE%mf3f=xBRy`Ww*C71ji7K1WROuUb_OUu{m$J zhjI@oa*0Nro|Y5Tcl~7ANWBsaMu9I;YueRdz07$b9?DyxV|g4lWajSe?P{((#)a>^ zw<}oEnaQ^eRwQQX?w2i%JyIT`?#`J$g{Q391uMCg>}FQ}JSc~obN}>KHtdun#5_3= zyGor*%S_Rl8xKYv!!&$ARJ}AQub|LC;rydb7vIupkE};zu;!JlTbh&hVekIS8{W^w z&kJVdmAA(ACv*2#2b9R4`1mkdMC(zofoMcFBRF)`cJtA)3C|FWhhF>0-e%>Ew=!w3 zBzf?zhUw*<=9D+ya-lgFIqkD}_#*xg+VjCE)Gz?FeH~0)3ADv1Re$Dlrl?!UP%tvS zlsRpwK?j0OlSXn}ue<>Wf_>4T9P8*Jmr~fLp_v=2ZYYfx*@8;czbqp^~wUU&T1VR z;W;oGlNCD~j*5XjocT*Y#jMS*I0?Yut}wkkouydG z-tsk;3($UbT#`DlR4ds-2|}_HHEp(gqt~thYr#Vwt4%p4GRsq}$sSD6VgNBYlGMl2 zuyO{BMz8u%Q!$sF(8}%PIHr_B(bKs+1Qm63Rwpcb04>Y@VC1M$W`9KWIGn~*v_3{;#t3zY1 zc{mT%>NIIFVALPXM&$1SYX^p7Ian`uW4Q_{NT-Y2oUfNVGT$oQtzynwLs?w>eWHcD}9D+kx55~6#Vpl~;HEx2g4>q)bw~0|=H(L!x^(1yS1+9R!2gAG>_1cEl!OXThJd`m= zk@?te!t}~dU~PFRtm|ijAr7!^TyJnEsH4&TbQ67<^LBb@lW$2ZrDO z45=1s8`!h8Z!9Gg{XIT<8}r#WdR-J4#bWW3n06nOcGSN7jw#hK|84H`hOqc>X$l9M zhzfkoUk97Q*(ZbUfh3J7&N})J*5siiO)bvb`VZFdktB^T&RY)lxfScjVvcF6P}+kH zwv?2YGo=PrV+ivFC@Y@uYXoKpJN2WdmifYtp=nge%G8wGDJu&_d^0;cS+7+2!?Hco zu{H{<9U8|K0Z#uGtQj$uwg6i?SVyz%EDxpiGd@wgR8%qZKWWf`P^@AD9Ilt2GT+)T ztKoA?d4HTfDPX;LAL!BQ1;4*yTL2pZMpJZN6|ry!6=*&>Np@Wm{JcW}=x zmeLSzZS;YMD&`2GIvR{R#Xa_;fqp@Qd}ytPmi#v_h&u(QJrGQ^jI(VSQyQbKlMrb; z;146(BF^}>=M6?J!!T4&E@rgR{R&2nVZJ9|8!67C88Uq2M)1g;Qp~8{2{2E!9%5fp z>JyvWL~f_;^NAhjH2jLx4UF<|1|V+}7{wnP zg{QCw5}TVKd+TIb9RLmnIBEzOts3l}C$O`E(F&KD-5`X$MpoUxC(9R%CY2A|1V$5y zqi2X-dyJUbZ={FP$ch`FhP)C5M$Uq983r8)tttKhR0JlPLo~Lu=9Y5r#DGzx@{Uh} z(U|x;Ew7cik6GG4mQ+3sv!T1^`uigOT5l*Z=e#@k}+Dh6;y>1{FGY*-En}utiCtl53}3A z$VPQ9Ri1(MFK)M!1D_IHJ;v)5Gnl$7F*^rX2Sy7Q6NL4nb+k++u>oM@6TV~32P4O- zk2=Z~FzNveC7VgsraJcxZjfNz!D!v_R+fX&q+sf>iQEUH zwFRr;H{Y*#53mIh2SSS;cg9k(UV8)-@1Wj#>YVrz=gq}{(RQe1{=+d)FzO2D2cqN? znAp-L=oN4L!UaVsU$lu}{Mf-1={D7rrBTQ$Ug8?tT5PTlmV|FDS$(L(9SlSH4$Keb zZ0WA5>sp(;;PZ4XfkM`B_niS7ruIlT(eZU;^-Tod(th~|t6Y~)Gi*aINnkVzUh)i> zczQtC)vRY(l(ZuUfYGxN0vZ#v11vzTN6y?`A8V($m3j?iX+$xb2^J2nL7L=b{WcAqPCGA`-lTPCc0~@N=BX$^UOfhSOUr-uY%%*`2RvFo8 zYE;s)8(^R7`8F<@w*~BTE1&+s2Do9tT6&Q8u#`U7S>Cf;fVN2!_*1=%Oht;%4=v1F zU}Oi6q`ggf3!E96$x^7rMqL&dZOO&)p;$HNae*ZjuGe-2!zMAqLuW#Yyzsf?RVWk% zJSGBLaL;3IZy0nS)CupheoI-3C}wG3I_A@oAY2Yr^ zu(M0iI~X~N=bZ(k)y`77;R0TD+G4qRu?PEb||z#^N48XQ#`YnfdydXiO<{cbttsV zORL+WvoAk2@tPN=?*OB|c}uUrDDF@akD{*KE$f4}(>O5lK7W2b0!H%)_Qas;!5iUM z=Lulc9p26D!2K2sUo2oMoO+6-p}yP<1oJ?tvZ@(N!01RWO-w$;a>KAuY5mlzi_t^z zK&mye%c<{RKstgTtTBKqV03N4#(;$(C{`p z`}5#dA3t=Pz-Sq%mb3N^5r0s)b<}SAzPz+LiMETunxM2sk|es~s9#zrzxCr|#d&{N zuhi(zXNAAr83{(Sf-^2!uY3c>7ZzRc?}CwC>QkOo;{meSCfrLIJAluS`pt^65sa+i z_l3J)w9GZkf1_+DJCN6hF;ac_gj=&1YI~HyJi+tl1k*CRI`I6UV!yzj;b0UC+@D9l z_%?~{T&D!^em@6)Hz?#&T$$jPX<*a~-y#l!kzIJ(i*FNJ1zK)AY1qUP1%o{pb2b?D ziF%Lm`hGBvDL!ihz|=*-?C@=aHCR(~>N5`|2Pt}|ig>{#ulx``W2l2M3<0AEhDY{d zd|>2JzO1f-(Xzt4jL~b#4`nB!ahEzW)UutW?ba)HL83Kg7mYXiDKR*(zh$`qtE)k> zdEQYk#b%ggsAs=5=s@^cGMjfd18ktP%MSH%e;omQezaxFvjQ=BN#P= z=f`Zlk_RT-iDqp_Sem6SpGL z6iqN}qO%o@x=VK5x?blvnzPT_)c`2`PC}kr z3r6iCaL~(HFg3*ReWG5ggkv_$wi7&*!AQ|?`S!aKjQoSwxCrw_MjqHOB1^AS9K$yV zge;!FM-nrq#(F3_krJB&>ihvlGo+}`PA+44uec>4T1J4;2C4?Vb}?8l`XWib$$Y0_ zc!mf|7|>O0A{eb?{y5_p$&U;S<|y*OC@8F$T`l|)1{m#UpXcZ{6bd$eXtfx}!xDo! zYS4ku7K`ytQwg;Lhr;wOQTz!2yW9-Db`cn+3ok!UAw_OgZ}=LA@oer)%<-V{+#>#9 zx&@3vpFdna0&5C}^XY_M`_lxheDxc%ve6}1c7HH3g+GG+2u3#J9Xz7&FED=j!|o%u zW4W{8pkHHT^=lIT3dt#!&j;3Js9qZhh8e|CxdW+=Xb7h(qTnSM8OD!|mT{I&XvItd zqX@y)jZI`HnCeuu-g7XDQSL&+L_VuHZZMD0VAKOPsJVJ27fh^rFlCaZr2k8U4&-y^ zGr(wsm_rzL9E`eC&t9!I9*oS_cCw_DX_P_<)j!$-ub`5^KK`=cvf% z?%O2t`HWo!qi{wZ#$!8$FCEMudhP^9u2pAKI~7bFoxGo=EW}J&CGz0ryQnW1txa5d z(9i;~&jUIGCcKLwRG5l43}(Lq52YJY{8*qpa~7BvTEI;eUrzr5)t1 zsjFe2QKqpIW~_^D)A-XIzAD3DmVl8Tu=cQF9|hyPC2f4tblw_PkWnvpVaif?X37kH zgH^vjli#ou5?jpT_h*=kSJWT_(4@MHDDS}ff+2>{-Kg1oNg*_%_3|#3y9~8!&ym&d z{`f1DXfS&FWzFB}?gOPbR~N38Eq?9q!|$FU6iy>WM}fMMG};Ah?ozxQZ@a*pPSz`@z{J^vICfYB^Juy2B9WqK|Gar`hr&C??t(X(${Kv9T{De!UxVlhN|V)h z@|cQedU*rOMW%8eBEJ=oe`_t~gGE>&Nc({Ch^BCy4n}jQUUjr*h^c#K4YOs7xBJ7O z10mn3`@OOgj8727>{~EeXgKequ*#QM7H1mrmVohtkV>8bqmI?{OQ%`NP5gXVdqQb~ zeC&THJqwJ77!BbV81)I?K&?ZDQ7;l8`QES1}lKj#C4k!;VIu)JLEzYH_e-N0sWbM$)3t8?a_`iAvf1*?$ zz?5lVyyC9m)IR}zs>}skdawhI{o6#b_}cTT5bZb9Ro)3jV<|x zL9-T{S*Vv%1d*Or5G3@?r(vDNOn>ZV)4@inJ@~IPSc7<~zX4ZkJ?|LLe-{lp5c0Kp z&}lb<@m~+PUtGv;he7u(j}xp+EVMCTH0|n+qx(VR6-U4J6)D)-JarrRTuCggK3+}F z1jSJ_%R_q@DV&-3ZM-rYdG~xZ_<&K6V;=F%;bi8!3s3vsLG&`)zVT50LQ0KgH4@ry z;=@2yY=cw4#FiF|Uvy(BKf!^|AyTv>0O1ag&6b0awu@O{d?nBtJt!D|iSZ6hT?s5r z#?4_1Z~Aj!kA^~a!fCiXXMoXniB>GF3FhDwD9t3!5bWSq-|=oR%doN!7{#*cZFvDp z*$XT0L8OUQqgQUplq@{rB`{xt%`63=6nxK*YYYU&DqDFg2)J2ziUOncj+Imi#)47r zpN;)iv=_keyVAHzR@+u`lkW>gL&7@8#xN6%JdLFQ_AA)u{oUmUnqF#QBvMpL zeQ=hyv)uhK^$&<5pzxNf@pisailak`hC=3I3&AX`10!?M1b!9c4A@}aEuPXx|0t`! z<%0=+rnma}N7>wCx|i}dRB;Q$y6m*0cowm7q=V7gQ{Agv2BV!8Zo=%>*jYT>69yd! zWx?gBwi1jlZVHV1VAKJ|K3=b_mr2V8zcwI`V7`YDj>{pmr@N~53Q}!Y>I&IYw~IRu zCkGaGM=%B>lx9s`m?!${(@9e^N-oF_CdxU@nk4JP)J~Atf&f{%=TG`68c? zI=BL)_OA(@kn{q<3#>4H60Soa?Uum1K+^A#C=k1zR1@x?25XaB{tu{y-azD+L~4)z zBP#k7V`b5xE09Lq5?GGe=F3f4&wROpIz64CQROZ``urPGepiuCNJjJ!^?C~Q6W9w# zpZ|u`UT4Gl@(g0Th=|f2MP3wd}NCh?ksew&EYIw8A zC!~&l5S);bJMn|cWddodIYi?Bj-&pk3e>@2(Qrv5=@@DgUnEgjDao;DnU_K=6{NKz|OMw)9UxYTufEaKur@6KVrm zkx>$h2{fq{0z?KOC4=yT;wJ=14TK5|15(_D3vL9` zhmgvR5jYk|1BetDCG_z?a$78rKCxQ9rIZkOLvf-2Ayr5ayd+WwUkja(4448WeX7t2 zNjC{h5;#rdPooU_6bt_YFN^Z2C`TPF1X2f!faI}d0#^d@kF*v)sN8yi8w73wQhC!h zB=C>46Fp~y{t_94)WIttN$>H4 z8u&;=AT=z*9n_$eK&`;iKq_woq;lm1uPE{>1L^Y*r1&F&I<6uL+KYlE(G~gaMSe#h zbMUtnJ#8Qx#uK%g4`l%R|NfrEiGl3_qLLLtiTEaD+4Lt9*F)-k^>U-AtVDFfz&~Dpbl6U zNS5^^K@cNPIPr9JwAyx^(xoF0NFDqpbV3^c8Nmt3&`UsSCm%=-yal9= z?*pm+1Hqq`#$uuhe~NDpv56aQNdWrJ?Cp1w8l^KX1 zRB@2N021*ji8QjIB0osrFj1}~lHntSPDt$r3r<)GJeG5lCGr0WX{3|UAay(iNG>PO zQpZU^S}Q3)`ur2|3Z$e!4a`G98tFn&fsphx;;i5Sp82U=v&beSzC>_Bd+_gtz7NhBTL zgsD4oM^UbmDA!5BLj@J+EQFF+nq@zh?b)fvvQGVBM+JL|f`l?Fcr4fSB|~}(`F}xb zrjIC3Nc+M7pf&S)BIai>sLUdt$j<8g1c}mwRC}1kB}Zo@L&JqCnbQ?!7CtDcrA27;%@{e zq;l^BC#3xMg8wf_CQE{l8ZHtIeiZl#NUqhuTtY3GEsz>2B{(7R(t;DBs#HO6 zLdv%TQa_bAH%XO60Yb{CDmWo+Qcgmz38V&UiF`sbs4kGE%2n{jBA<{JO>-c{L~EfF zQauBZ{`8yF2?^@B3y>;w2U15pfb{vlL8{kN)cZH2d_R#-Xif3&FNBgvh71(?zafnv zkQx96iE{sjG_c_!za)~!!l0|`j}laHG>|L|7Zv^usoWUkQ^(^(xqm}yCraf17v$%~ z1W}NX8jb@}0~3W_5-ESO&XNq!!)J}34jGq$oMFt^7?NY%B zX~ax$Lh3MGa6;l40+$QDB+`w4qtHttJ;fa$%cz4xq5vT^cvx^kGVmCX${iPaNu-gT z68gU(dE&Il|4(d90(Ed+6d)u6E&!>+OF}P+nmt8F>9-t_{pAZM1jm;zoW6YFL~EfJ zEu{ZIT1#KPaQgCv)0Z!t=$OJs3#4`Oo1)4B-GSIv|;tvXnO2vHc*pj#lrry>api- zpr(r4J}YREd&uim5l>H!n!oASw3NLgU**Txr`?>hWKMX^UMbCI=Crz9Z{?12PqQv+ z3vx#lN-^Wc&dSZ}xN>YvrfauJ`aENBm zp1nggUZqSv`!sD6Mpe5pVD0M8=2O!eooqibO`KkcWl)pYdxdB@ZX8vkLvvdV8$Sj6+E7kUp~ zvhD7t$%)r_*vi7T6Z@?d1P|c%X6gpngyl2NB&i;AmAnTLA z+6JDgRR56A#x~(aIm*LlnA3kNgt)hKAWJpxG zC5KzyDc{V2d4+-%cTH0k+nlUnT@}9#B67>y7H2bUZw;o+%%xzmt z`dOc19=zhON4X&(t-Yt84qtHXQ{Ux9KTh8@wW2VOo&|GDns+Sf({C+$E?Lp$$H%{9 zOzLo}pvhdyG!9 zmHx4Q@4ijkR-IYh!hdv1c(Zk}?n?JQ<5lyL)L*{D--s{%SRV}WPXBPR&xT$uGq0RW znzcChOsBsdSKIY5$E)?rh1UY2o1FPsmo@FV<9es^D<*w4wCCUBJ6kpBHOq5ToX+(? zyCJ$BY*iS{bGwprYwlN30}t*R5c*rl%zF{(U1iy$cJ09F!*1JH1sHz(rcIgoS3SI% zEUwo7Na?KQh6(Xz`|UgLbYS5NqP?!(RL#>#NiZz0*f=~{Cmhy4TGX@gj4>%5eOuc` z<&AdV5Phb`pik@8ZYkQeV&2|w;&QIFKCs9!qLyFv?4$b{@3whlnrdq38rkj2#+#r8&Eq}~q&+x!Y z?iJrP@N3+2db5sokN;6yZ=I8UDs1&))jW;rz0)Pln=_)tvrF3H_3FGU)qQ<*#Zb?= z#y%gidi=4d!+G})UoUoQ6)=3%(Na4cM;(c{zVQ0bU9UI1_2z!FsE*&Ae=_K$>vOq? z6_I(BJO^~|*i<*P|D+kUR?PQ*HS0aQPf7+hoW<`sY4T=C?>vwTDLuo}UJ`(0nG zo;+*+igOpE54HH{zdl+!ENN|RH`P3A)x5JM&Fi^!WZUQA+ve`w(Y^hdB_FH$Ol7yS zZJnK~FM51@f1SA-dZtwVHcwyQ(R-?~(xycnl26|p?V01NINtwxd%K3Y;l}H1+h~|q z`MqMjul$fvM_PxU+io?k=PS1xT}DqiUCJ{wym5mvqs%YPJ0#nk9l2>zw}%bato5?{ zW*XagDfPFytp@j9qdmPKP?$$6_k2n79vp79YfiJ#g%ek98<@QRxWQX@wxHg`-QMpP z{8^>n*&6q{hI~D~blK;Qwij}&LnkzeSRY;2f%P%8p1A zYt=Sq-V3=jG-%F%12b1Ys+#BAShmy0FMYs}og)xY}1J@WO!UsJYvxxbrg{&3QNW8+E@*V_mG zeP72e5C3uX^EHkyvaj8(b^7|2r5Sg!^qy7vwW@HuRFuu=MU9xPQRC3Q?cL}dt9tI) z?;5ar`G}482J9U8Q{Wq$CKKo6p4@vOv)8xZ?3mxW;+@HdzDsBw^){j5_3LBeu9TV8 zC1$SQkx5eO$<2GhjG78n*u4SR@2fE5R2%>fCXH>+xZhdB`(D|#6?-lhGlCz>~V=bK(y7p>XJPA&Yt>e}Nw4n>En!~R(Q zBha2Xn$TAZsm>CT(5%Ze z^iz<8ew>)=GzgbTNSy|uCd(%wc{&8I=@4qOl<5!*GhoS|yJe3%jR*VGwXM6oNlN-^ zL(riPS(j4!+-dR7H6gElSVFV>@1y3P54%#h_^XhW-e+=`HthD=G}NPV=EoWfjW5oX zu%s??pMho{qFJ_T2KuSb9+8kf6N2AN2+k~HCIp{Z5Q<1}Wxlf@yd`1VEC`L*I}$d} zh7dFxf*ad18$!Sw2)1(|G-ZKvAn1}IWRuXGDao2aatjtr(2`{VSa=Guol=n9ni*4| zw_%3~^vrQCz`!ODxU*b>wygF%fCoz;@MLERyqN2JKsz>#z?LYJ$=*Xg{_k4IKq6Ca*1q(3=G=hM+T(*GTYZiW$OQ5+cnI z`mrn$!k0jBS^{AJGcJMPuoOZb34@s9QV2ODBrb&z$Z|=DUk1T#8H6D$VHpG$2BCn2 zAm+*-TqYrvK^V^RNk~qI;FS&`n5CpcFl0a|Bq4;kXFzyJ!m11iVeAnJ>B}MbEr&3g zWh{r_vjRd92}b6-0>WDowyl6Lmc1ik^GXOoD3PKbMTm?b*4TNkG zCNSk22zyD0{02e{%OW9sH3X;C5aO6|H3Ww>5b_}G8NWtz%wXyn?D114{Rf};XQl64 zZFL}HQ;!Gn7r&qMx@cbRcRzYZ4{ds*?7J3`>uXeg6tTN+4`;vqo^nin!rrS1-@6Vh z6YxH(!~$}n-@FnZ>&XK?q;&q{!|FXzQK^olTQ!}u?8NqvhSgJ?r)@Eun$Y`An~mjr zT|3at@%pvh{oAv%arx66H+J3dr(t{bt+s2+E||AtPhP%ep*7oeUDK0ozOE_D{=TN^ ziS-nC1EUDIK?A>mVKrsSO$fT1H1L}cnzJkt_LAUq3qng~yagfr77d()*39uX1c%$A zQ8xazW>DCEIh@1l^)T?nanA$YNT5-yYAbq|6!OSuOj`5uHq5;`#V z`w$HGA*{L&p%Z&V!b1}L9zf{AG9Exke*mEff?v0iF1t3P;$W)}Hj5W`+_L$1-K~cE z8)uJqvroL^5$o`-=YjVP_RaqOrq2)Sf_C4$`}&ABuXp~kyb6XI^B?Ekn(H#`?RXpJ z^$-ha+e38Z%icXiM{ggZqo79+dax~zAZ&gF!S*o(KNk2HLcn7P*(CI)Keho!K7m&v zp1{@qEb9q`y-!fW=_yL|W5%Zt!k+5Z=CoC0k!&R{H#<3FT$6 z5dK0|z$=useTA}E2(KXMURweL3*j|{y{}Os@-<3eA&?OM27=QY2v`VjAUM2*kVnEK z=J*yu4he~GAtbO|65`)MaC-;gYnJd1g3Egd1tcUg*Y^-ElaTrzf{Epmko*CH*9QpG zSjqck}!k0{|(_G39J5wFpE7RA-xEKUlD{kETag5&qoMFB&0Ckj}YFHuOZOPNsv!NCeb9tn&&T0zJmA<+s#2L9Jq5aO*NxLHG3!4j+?xM(31kg$rmY9U-E zAyo@uHOnUhVYPtRizk+8W8grG7Iwy`Z`AOzSzu(g4(odw!J(3ORdO~MYQl!dUD zgvhcGGFcW0;kFQ*$bmmGqb&r7auD)J*uxylLC7H?u^fafmPc?fRhA?#xbN=P)NcN=3WuPLkK-{?)LflrrW^u zv<2qcae2)ec(si>*JZ(O?d|UpAA27-7}8N_DwHc zZuIm(qx(Ns!r#~_zFQq*8I{m%dL{Jpsv`P1&N`6bQyD^0B?!69w=#scBy6h;;Us%U z!saRvf~r8sV_T|N4U&Ija#g@-76@QEdt_%y*h4?Zf(g#EEP@O89}xg9G9$qy zc9`II=I98x%q9@zvs?g+uZD))s-dB)ETI|%m+BA-NGM>g)gfFaA+p*zPvPcN8 z3&E)_gjdX17lK1Q2zeyDVUG16TS1B0*uk4I#WGVOv88HtZbP;XgeuI~1cF0T2zeyfGsmV7a!5#Q3c-=(k`Uhvf?G2P)mcI_ z2rkVb6p-M=T$@9<5IV3FF9?Qq5DH1?#N69Kcu2ykb`ZL-MiFvqIl49RJr7?vzU$?MgT3-=&uv?^tb40TSCYTKvuMoK(}y~= z?Y2&{#_5DZ6=(m5lR*=QZ$5SLM$p2Lz#NB$qlcYmt2$WWL81dX@?%>%pre3}=*YGs zgx)N$BLrP12-y(){7d$1K6cao+*L{B4-ucF|hr8D~ z>|A2#)w%r=mz9%RELbpf`=^0}?|o%%Gqqser|Wh>O?sBTe!WES1+rXfHohzRaqEhH zhOmUL5L~)JC?Fw-xpsqanS|7C5QejS5|Vu&c=_z?5DP_L30U3qlObA|bpt1gG8*;+U~F1cyEl@<^D(9Q#1XAtA93 zgarJ5K_JBYLvZtl@HI>Dhv3o|LIDYh%(X9s%Os@sg$_x=zblCY{jgjwtn3F!kM_zi$Chh+?a;4=_H5eX^GcOZnfBy1Z9VIF%&!sbB` zf(AiIWm^V82*7QQ*# z2!uQm7;_u~A%}#-ArLZHE(!5NA-D~Nu!1EFh2Rndp@4){%rywYWfD?@AgpHjBqR@m z;57`wT9z^lf?+s>LK4<9_u&v8lCWwxgbnNw3F#vs_>F+DiDis{;1dj?h=eW7HyFZO z61D|H_@2EZVe?1`K_ek-V_QZ-2nc~-8v|+U|A-IHF*_!^k;j?a( zY2>ZhVHt}O@_LRd8@a4ZlNpsC#tpSP-P~pGpPR3*9eB`nmeXkGa&Fu6f`*&6RLi`& za>!%-$rjyTCB?}l)}`gouhA}Nec-pq=Vb5&eS6yG;gdB*D;io?O}acvsZ?0>zIWG?TTcgv zHLGS-`=e(q`-LUUJ6Lib{NyFb4d><}*{^87#$K}6%dvS6hOEg+J^n5V2L4NoEzu(7> z-!N>GveYi{f@bX4KWC z-j=IZ&epetd52kw5tCvVgIOvxVwR3D_c0J2lCWwFHgfu_b(W8HW~Il=7yQ+Aqo?tMc$|_t;;o_O80=`{~Sw7s+48&1D_yM!ncsGr!jcUpuMr$4woU zF4}kQ6-ylp`&YI$J=+oT=+>(fQyNd0`P+`2`?l5m)Yq$e*!c1FmkbZzp7~CHhx$CgjO zk-erL9u%5huk48fd*i0Oz1;11wN7W2IK11myGr%8`|JL=Ep?*r5BCoRKfO^{ZR)s| zPbb&wwdIdrAHCO3denIzD~v!i#8)avJE3Xw`m1ABNiNFJ$qV|nzLp>OVrrG6KWwm* z^3K$Ly=zpZ$Rb^5DaBJaEo=NYGdxcl-rWB+VYJP;3b!UVDq-%)lGYvF8oa2+?t}7$ zpPzR7`r_j~ZWqFB>f{BbH~gX3ps9v^@m;ig{ysIkk>jix%Vt_ve>20a*}J+upT3;G z`c}#fQ(TQGyxEI{c^x`+sc`40+q>-t|7f0kxy_EMHF~`K`}UGcXPd3@UU}`W!Gk8B zy?l1#haMI2rz=yHykU)cxxapFQ+H_Anm-1_3>q@Cgn4--%^Pr`#nAz?dPf~|NN?6L zIv}zzB(;pKUlY3p%Bb$GE-YJGcI@?TdusYQI^C~&d&dmtHh1X=RfV;dCrfw-P~rrs?^8S ztyk-{Gfs8LKGD4Xefx&-^XlHVKf7qhr&1-%J6+PeJjdn>&P+JEXQFSO)4SIXDn5GJ zt6f{)u$w_S8R?UEEoxJ0Rjzkf?e>{;urSI`RJF8YAmu&8l+x%E-hQ-3`&(Pj+NQ zWM1XXXI%FOUCdb#aHO^O`KdLJK3^uU>E0!y#ppiMyR%Q1_^)+ie=u4Z zFGoIUW%}jFS1%h)y7-~5=ZH5Y%sX4sy!<1bQ<82eBa`2b_3GXE_KDoqH@@A}E$G(F zXDx=T>8f|>WivOu>J+WxrRde=CmfSz9lH0Md)J+%F5Q21A)F=5i95=+MZvsAzNJt7 zwmdQFROG$%fV~f$Y+miuwdr*BtML=8@?4uIe>!U1Yz z+&SQfuy3q0rM(p#N33u3s^S3mk&ipf+qwGt4V%Lj2VJZAaCobwENDE;ySIDlHJ4lR zjbUY~R;rQn=cDF3zP;7Ap=NHqKPPODnv~k+#&);4$Nov0M`36Ct=ILioTE5+S%u zg-}335p$gi;W7!SQz3j}`6MKpAb6P|$SlPK!H@)@kOV8{o&@0`39FJIXxSqY(x*Z2 zn+BmY%a{hiXF7x;5)|e;9l~1@woQj%!`_jwc?N`_84zsQmKhKNW`f#Aq;Nr+E| z;Fb)bI!j3Yf5`jm=&Fvl4;#-(&e=(T;1-hL5-gAecP*M=r9g3ahvFo-yWF@_+$B(; zKymlt?pC0b;^n>WbLKRm&$r*_`Tg-*>s{+Ti;J24nR|Tp?AemN5rRh{Tvs7TvX4Tz zq{6sS2H#JwJ?c{A_)DOU8}mWG!MW>AGJ4t4Z4@6c}S~ zwJvekh&3n6^{<&V_{PH)iw5<~c(_OVU-lFj5b^11s@69f<;e3g#BEmKmI!;6gm+dOFnS>BD2_e6iimmLl8U-L03pY_S6)!o%}s7*_4atz(zk0(PEVvORT`Ss7l&d)o0tP@Ypy^TqGl zF1p+4@*S=;Z8xFa+?maGO!JhG>0YViISK3agX!e-XgWE~osLjm9;+}z5F!Mjg3J_z ziZc*Ct58WQ%|Ljk!kQU$puSw!{j*noRboqy28~Y@DmUv?yd$X&4&C*1^2WcWd)PxW z)a$goPv)jeOC4Ji(mL{w_w#EWtC+uRvya{GWS=&(U)aZ}GllCfnZtcMy?!v0boC{@ z?w>t)^7+6AqvxESamrDDUGUqgr@J1RoO9j0`4y)0e(=}mKZZQ*SYpt#f+0PUr8`1apuNOr4t{WySruOuGP8y$D!y$72mvLcU{>RJ<>Zcjl^qNp-&f0q_>D#dKO+TljKJe8ZY8E|62xjhlbWNwZ_p-pcEwH*-AsPx%KadsH@n}D^1 z_Dr{vO=%MUWBL@GK8`*#(RZou^0sZ-jtY$&^2WFG))sj^w{@zwCSXr8{}J5MDEVps z<%XxTe)FYehOHH<{xT!aw3|OPI+hOyvf#Z)X zT-C8u$(pzOCEmQ`Q?B?)GNkdyJfw5L(Xdjzo;95@rdaOspR#NTyz#Q}wRcqxv>9}- z%J25bI?tv~@LcS%l6#tD6f}p7YD?QWWR!X?8J$p}j`+_-IIO~exd`>-hzh;uA>^Ki zP+$7YLkOOaa9xFll6^kHB^AcaM`$dURT#Mdq4)xXrZQ>)LZO8S&sAtHg%=_`Qeo~w zgqHGHg&B(wA{HUEmYItXDlSI&tU_C4%?3TqZ4w3qiPEMJ1qa0x<3S+NA6?otH5 zr3js+-ckgg9}#w`&{ceYMA)W6#~%^8%XSsoEJFxdhR{>mE<;GY9N~lty~KYx!eJE# zEJx@gM^xy&0wMPbgnrUz1w!yjgzG8{knAfFE~zkXB|?;3R$=5SgyO3Z2Fa*Z2!&RA zC6H&UysCN*vCH06_9{~Rx@UZOv>Lm)tFap@LwI=o`83->*rk%eM zz4Zt_8xVG>FiCtjAZ$~i;|7E&vR#EX8xevwB21IE8xc}(LO7veLhj87v!%~wgy1a**HxG+*|#8EQeoT{g!yt=g^^nkif=_&D5JI_6pBH3uEJs| z9E0#kg}E^ZOXaZ&Gqxc_Y(rQkGq)jB+>Y>Bg%x}@0pXnrYqle-lJ_bs{|TYtPY7#d z#ZL%zcOdxfKv*aBb|CodMA)Um2JzjAuuX-II}tX?b`{#}LI~Q0utnPLLP-6yS3)_t z%d4_p8u=OF@XuHb_!*1sazusRyAg8lM%W>Jb|VDuLAb8MF3G+J;gSmD_8{z*%PNfA zi%@(o!d@A*7opHE2+vj6Cxw4Oc%;JIUl0z+V-;rXLx|Xia7bqEL#VhP;j;=yq|$zb zcPgyek8n)htFZh4Lc;?HCuGF|gt`Y2{0<_Vl6nUbd=4S(QsIpF9zxirLdQc0=VZGI zZ4M&@9Y(kyZ4V=)K7w#Ug^S{U1mUm>1CAhEmLn?kK8le0D8g0ga}*)?7{YZGu1oe~ z2$xhCcMRdCTvlP^afIT>5pK(<;|PULAUs#$t`t6j@JNNZClKz-V-;qcM2I+v@K9!+ zM5uTQ;j;>lrP3*ccPgwoh456~tFZhuLc`Mt&t=7Fgt})C{LUb}ka}kje9j{5QsI^O zo<-QELdUZRuVuRmZO$PCony{_6L-${%w=UhmAcEhSqpdkIQa6dkBcj8douW1!sBC- zH1b<^{CZS_3}s6kDF3L+w8n$Jj31pib-#}34lb_xHq+h)bIxp;|E{Ih|37xGV?M*#VZJ(Rq&NcR}kK*u;vOv ze0i_J@~a39uOj%#imM29uOawdLr5g`t|9nbN7$u867ju`uuX-I*AbG*b`{#(KnS{l zkV4wtKuCQP;e-mQ#Q!G3VHF14MDUj*D)hdEkoy)wfb_YA5PTcqx(Y#({WiiS6~^60 zNGF$77VeVaoEb>@|8TSw(?jdB8nfDMX-beVX zLUyTiAK{$}YwjcDl=mtue}K^N0YYwB@c^OjLj=Ev2zjL5Lj<2k2)k4W72ih)+f?ZI z2q9dytI*~#LeOJ`{L=O@Lh2_7CsZgX{!b7Nt1#dRLSZ?gLhq*txt}5wl|D}qf}bH= zSE0CMe}-^Lg>laiO3GywMm|R<{v4sSjCzhx=r@GtDwLJNzaczQVeW4T<>j#oGhQG> zyg;ZRGhZN7e2MT`g-TNCCBi!u*1SZhBJWjL{tBVtD})GH@d}~t?+AXs^SJ+dd?`z% zE-_%${5N}t`Zf%GIz8OKP0E-qx&F#p{6OBYOVO*N+Yd}ueDB$92ZyhmcdpCEzK>qc zyW1sZc&q(3>0c^GDer-4$M6J%o!d&jc0J5(_qEfWzIK`~9>Nr98xNsPJcJV}OcVe3 z2&v;E42X{)azus0D&$UpFjM*@KBKloWhRcyNNi6K^C_|Ynx8~>wU?4>Y3)9a zjC?*Oam>Q>_V%_ZrRv*brlz-#wWcJlpIoGF z*%NBNrY1p&(Rkfibe=}e_uxkBGgKN)m%%^8_+_`>^s+_D^IT*wQ3mC<2RIY%(aHJp z!sv-HNLRg_S@#IF|B=Ayi!Nc0_M#BM&MkWxdvza2!po$u1x@Fvs`RgF@8H;ZkIW@B znZ32svTlUEzvVlIM=p3_TC~JmuVqi?Wt$Z9`8#_~n^(r9wwU?p?eCoxb>vKGBdXRV z=H+X9M^E!V^&0Oqki1Q4p0&kn9`R#pw6gcIYYr(gSGVaqZljxbXdBY5yX*C4+qsuv zkFpJqiD+f7@9>@0(&oVn&!XqchW7SD*&}$4m-hoZ+oe~_X1QDT?%^>WjhCG|wWcka zwQoxk506>c!Jf{+F1fd>eZJqzfi`{fb+nDgb5m;#`)U3x0-krXmvuFUs`~k3yKlU< zt~~Nd$L{uQjweId)It|^7CJ+>cHKME-X8g<#%8;Au&b0q(2{7g#&Qwg3&bG|k z*B)$(p*c!9o5SxaW!8Rv#HYCYWKgI*z_(YMw$0m+Zl9Rj{p}NM?D$;=+LJkk^6{y7 ze|L(^3AOvkr-AlhM@K#s<*Ruub0zsz9b+>1+vD48gT*$OGzRn4qIlXn>73QJVu}y8 zk8dZZQ`tjfZoRfYu?hc&I{(w{0iIgYCpMSgY4&$mR;O(<-G1W~^}qcwu2^xq{{IVp zS}CpP|6A%_-ZQ@Kw0HO)(ThyBzn2?-5eQlQW zOT#JHEN(;#QPWNdC5+}{BJ0bpOUlBTG@AS2@^~gl-%R}zXw>*dOM^cn=r4iM^b0MS zK;GIlx9eBAH&ErY0?lnde+!?H%pjh4V@ z<&37yoX}|HjmC@7JyPpF!tWcS<;Cxhrlu9pv?8GpVCOX1&aA~!KwX|yfIuBp+=pru07J-r#4Mkx#aMst5&s2rLvn(qBA z^~*e3yYlb_kM91hOyqCy>mR`B?yuh>(y6Wj@L5ymPro;$nN);%M(c{E-b%nq!};rG zw90I?Gg^0}MO8s;Z$$lIk$S7bebDKoCz@sw0s8l3`s-!vBJl?st+&ytq1{j;e)=6F z4XzI3KX&R@~7hZbSSH&~zRdW3)zE|NiWp*>T63$c^z2)*Y7Lcr^ZbG=VWj zn_?n2)o`OtHF2Avbu^kDfwgkY6*Qf2#Aq$>FQx^Z?LWhaEfJd`>TjmeTH)6ZO6Wu~ z3r%a>8fv2HM53R7QmqYqYvRr`aoeKRHg@xkT|2bDOqcN4DAzll+au03bAWzBN=w}V z=Ar3CvczZ|@keNG{FWN66aEC)>3;vC(K_RQVeIr9RGMBFxPqqp{c@vq)%ssG;tC^n z!{8)ZN!*o2W2AcQKr4;A%4n?ZJ!YWkZ#9~FdqRlO)*9^xwBBfCaMzo-z3{h2E356l z!HB)_{|@CrKa{1V?gLNo=v=VLXnpa&G}>mP^+VG?HP+u2G;PfOpy}!Eyv^7Rz<&$$ zw;fIYNYG;-=)SDKpNydvOg|l=yV?#ktyDDVZlu3m#%>V)Ax8VzXoJyo@6g|FqYc5Y zdxHM<7;UJIKmF>R{`MMi82)Q$x?k2Z^4 ztTFB>qfNlS*l4GXHW6*P(axx*%{&RVAnNZdBL6%l!%m}JG?AyE?K0XWqfJHA*YG#N zy^N;aG!68X{Y`PNqUl(e4t(N4zwzvG!^9Q*QSQ%h+%%DAAdWWs@ol5cMAL7y=#>{*5cQ9!H>ZG%V_KH>x=70;(jsO zdi;}(7Ny@u&?ejf`bzv!xccom)iy#0w9&YpXj+&}pr72(L2Ea5oADnrn!{*Y&`uc5 zGTK(OQ%2M8*pWw+M+~C-8y`N#a2wh_40SK?HQILk11N!x?s!J~3I9N&#W&gxwC{KaEXn!2W=MG0^B4<+lybv z$0FRMM*GERI`EPiZ6E#x*y%61ewj@(-Va*4rMUWqKGhC@)=ssQMmvaKkL&u=FZZe4 zAs9?IX&37HU$w)k(+b+Uy8c(~2n-@UZOJr7i#p0iDbrkfQlN&%jG-1P&}hf;>#m~- z2N~@I{!kNF&mA=GNeDAqI-{LJ)0WXR(i^Rm9+!2;+P_-{E_Y;=1yvq>F8yP(hn=$0X?0)2lwFt z=&7uJb@?i2-)Uc!f@8EtR%)3If+0KTnd>j0XRG=lh}kd?^h|XjECM}4T>|<^rkC&v ze)r)-{xu#wQ~eX(!aH~`ZC5+8Md=Bro?v=|5BP$fN5%&|ck}~2U)0@GcgK>HwHOSe z4>D4g%%I~*$BzyJ?PBdd?XHZF8L~iD$Od{^sHcH?+Lz1nkVI=7h3ge%qZsJkqm50Qc4<1GvrbO>CKu#}Jdl?g z-Hrf9A-shp`vzLL9NzM9iWqvHq30FH;5g`ei%!ECI1BovjT3MZ^lKc4;RqasE%1a^ ze+th)zc(@rhJ&7N=E~Uw=Hylj?f7@Ll>wH zwLs4-+R;tzLBEq%1tK6FqzCLj(8*DnLc3 z1Z5zZRgKcnKC@sp%mF8Sti{PbpQ0NSU*b6~S0r_E0nEV@9^1<5;cY<1*}8iRK%^aDN1?+u-x0_att%AlW;egt~K_6g|K zS-l#oS6_bvUA*UFjOB(9$OCyH6n=)?@SJ8Ei8~6$KtuYgXFM)A-64Z}a3A^;&=>S` zLHcPSU7fdr3Pi35`Yr4TxxLj95LE)XB$NhShwEpr-ob2G01M$qSOzO#C9H;ZupTyp zF1KUgC)feH)Yhf-&#)T`kZwvy0|5{SdhOU2kMZ&ugJ-q{BGC@KS2y^hOMw3)`5P0upMnO1$Pwaa$J|+1E8l5D;9msCkq={AsYlk z4#*85pr6A00v`Bn;0az}2mQY06}Sr5;5yuZn{W$SFeqC=YiI)&1@Qzg*h~2SDE>PD z2jLJLh9htkbp5^@bj_}7bbm+#(IhkoK2WA^xIN$p=movuJBWZts0K?J_&>rFdR@N) zUsrn{DnOFT{8t{zK^Z75w(X8yQFSR`JsnX>lOYJwLOMtf zOKFjM%zd}vj=cHFk*?miL~jVqU_0o^*avBqbB*&5flb_<;gjggwX2K%Fx|7SLt7uA(zRFr-84O#F>762^GRqMeRb4!!Vs zLHu?(8b^hY&1uXI!7-B7Pl&C6HLw%(Qe|V%OOf?KFF$?@wV^LX=nq4oH}rw#5CEwm zDRd<(z4%ujBB2`Sg+INhSJlTOjmPg~JeRUAgSXUiCgs$Nb_>M!XUD22y?~_Ga;}43 zztQV8dVQuFX+NOsdXYfC%cj?7T0$pA(o2&09cE!O4;I66*amu~<0E_my_(S)Hj>9= z(2Eg`!9g?YMF=iBBz0b8h{whkGWQ^}B~pGj?e-MAXK)MYC>(%^a38bVpl8+xD36{w zkAulD1*XD4(39dTVYAMW;j(Z$=njWXP?j}5p{~|@!l>VT$uVFA* zxx=-17r<@yjW5VtSc%$3i39I3)~leC)Zso!8Ii>bPLI+q`R zK9kf-HRMY2pU2Ms0M{V(^UbLQDKr zaT`MbWQ2xLAHIjW5D0bPJMf2`5DFSM0yh(A8dab&7l6TiJWWk*&DODz%3;_&eZsf{xG=^tyLf=mFg!88+RF_Jd?O>ey%dA?EQ> zM>Q{=Q7?Sb(JM$tr;g|r&dKyCAioLI^dl*#y3L^p#K|YhxtC}rMW76n0=<=37)nA3C=Pm0v?!>ZJI~Vi zgP|OhjiYP0+9_3`CA-hk0<4b#%=Zmk8a z4h`UY&}Bhg_zr4=)~qJf04>C~MpIp>6UTLiY01@4fA!<|UCNg)nz3f8Ze!3yv>@6& znwT?lS$dj91D)v67O4%i1C63+&vk^(pi`XolAGlC2XGuyyZ*R3So-4jf!@#qw8y&R zYUgM=I$HeLzJ~ueX!{(~g`wU!`U$j*?osBR2ii zBu#XjaaErP(_k*lf*Ig0L`wY2D7+Td4`zdEacxwe16r{Kun=@GX&NrKY;1zsl1spy zf!nVME;G6&xDvF7)K0foN#S$M9UJ0ETkvlK?Wm)$AAW(I;7)!I{=M)s>@vEBX<6N2 zs_!;os%iKbI>_zcXEZvmp~n$64#I(0(c@4Y|6voR;qFY_nY#;im9Ud=0(59=BVEBS zxz0OsMY*?bquhe)#!8P)H}T&9wRwg667&vjd{BG0_5%L{xC3`Vt8>q|_l>LCQ~Yyq zAL14ueUi=eB|aOE;SnrHe1iKNp22Sr&r3d>cchKd%=BR8N#<|y+i>+@qz5Gr{GZW2 zz(>$DzknXG-{Jla8s`n@65# zVhx>{Ya(i|3H~?KE+KTI0$m{yBn0iJ_PFh!4b0H{8?EuQf-eN>W#1A|9Q5*UQ78h1 zAq+H;><|jmu+NK|8>ZvWiJJqmKoUp{f}R;S6J&&>kRAfSA5ui|UouDzDIqoJwX;-4 z)02iY_|wJ-Q@cP&_YW-v+d-hVYU7ThdIr$UH80IvU9Ct|R{qNdDr)8$F&J_|9?%+S zO+(`N!|~^bd{6)iLLq1l4WJHGf{O4hQ~*t<9BvsX4W(Rel*bPQC^Zmjf<`Rs3Uun# z@JB#Z(1bJ*wRdNrr;xf`9#=C_zdJ+sb``?ZUbo}gSMj3%Rjf>)252Jg$eNHl0S(vf zNL+VfS|E407GC|;achCrQ0-N(ZMN0_9jIH^xZi32*N5-Hoj^UKX=3Vk>zc5;g|ulk z5qDv=#TtTU+6-6YG{tQKjiC`dVJxX%TeAgd1){VzEkPr=YpfZ!h1W#TanS|zOuGXl z0o6Kz4%&{O15pQ_`rTn}cNXc+1f2kN;?rfkPJCu!jPlSYE_xABSFwLVPyBlA{|8)M zQs_acA8r%QluAP((ET_ZS0|H+goWVG4Y{B_T29;?kR9}xq?Zc(AO>5VH@4vFDt@!} zzfKmL5Y~ZCKx=T_v)*d_?#XEt{_!vdM#CV`?i&d1Bb6Qyv~baAdf-r9GaSYC2p9r` zL2WeO=DPYCjxY>{f{JdmFeA}40k`YUNNYZhu(6=cslUbeSHet~08?NF2uz1*Fcq}L zG;9(?sb{hgl9G`oqS^{r4$D9j_z{-E5?BNaU_Q))*)R(<-dvay$FJH#aHp%T8{$U& z-E>;BwFGLPtA8Wz23QZyqb9CKRGS3!r55TQ#K*7aem=O~-~b!^Mc8||0{dVaX#Z== zYz3|KZ0&z{b7oT*a1I**4iC+H~ybtmthaC)?Cxu54x>s>bB~K zK-0Ud1L!CmfrD@WG!c!UB~-sAuHov}h=+~;BCd`DcVeg6J_Txj98QA9(}HQbCqOH3 z4BUA{X(`m$Ex29Pv=Ew@y6#MV#eV@bqw{bM+!>z5e+Jx{#mz`<+-bWD$##@8@i>BW zTMHF8LR|kP!n7G5!d38OtUSQI4|m`;Tm!AW7F@@Url+l=>0AeQLAGlD>uzuh)KL3I zjcxaRaobZ$S;*;Viy&^z=d(QzK7#I!v)~hG z8oFCfF#a#Nnx+SHLX6RMym&h22>M?Q;zsZyKqF{#+wp5{bz2Lg<3hVj?KLCI*lL&- zQYRwSwTZPA-Ie&)3PfS#OCnkW%_tszO-vKfK1<1VBG`vNA+FX+b?q|sr$9>%$sj2t zfyCe*{hHP(*bVLht%KLCN5u_LQTKZtJUUspBdD&CblaWSY5Y2w=)SILsNZd`V@97P z34k=9&z9&jCR%7Myr!o%Y)Abq_+wy1rxw>ACxSCWP2{afD2RAk0M+!tmASZcK)WD4 z+uBv`?$BvmZzW^~y{)ia_kVr7Lz~|{pX)sb9ZY%xp%LAEI3K?bICr=^Q7v3H;%K;L zmKDF+X#cx2*EE8Sji#Y-^@KPq3NaIXT@XU?>+>7>9EV_3LCd5Zb>KsrJxZsfNw$X5>^4dNmvQw(;bITlwLI~LUF!9DGz$Se+|$pr{zK4q^39I>+2tx)W-8Y z=(A>ZaKD3kpf@&EYlzzz2Ebq#1bXO;#vKTKp%3%|z2n~rdO{EA4qc%Gw1c+L8d^a! zXliE=WTHcK`P&kqIkbQ_&>l2W7tkegXIxFZBXk2zRPB3%7Oo%k2i3H17dhxFTChLq zx5n*@+Xs5XK+uJtUokw_2-K$yCK0I>{({g28bL0|1``PDitRAm9Bi+Hp|ba$BU$O5 zczZxF3@11McRcP$NP~X_u3jq`jXO&HpglSccPvbl6!#tV!ye@x4ZBV|+&{@G}|u{nbq4myNS;hqG&^nC(%AN&G)VGrzv1uz%p!DZsl z$6W|3LF28!T?C6^Is6DqU@7S3>}5KDy5hNm@z01`U5jm3o)Sa zG|pz&1RG%kX#8!k3wDAQ<``~DTrK=z*bj$v0NqAB$i@Ls_Xr$?<8T_zf(IR;wYvb{%`_bGNIbsNevsPf_NBEfLnFbIV#kO}l@os5tH(nC5(3pyNvaH9hG zFEJ#7Cy1K(N3ht|j9bD7wso3Ih_**FBGY$hxzP0Tl^=QnScpG9uHI@dPnZ|3o~(U_ zL)hEc-b7p-D}S-=p?@XuC!P@euW?_1HkZ!!zvI4y-{3hs0}a;#w!~gDdxifG(6OL@ zC-eqa3$NksLTf>_kZP~j+upMM9$c$W`d<_M0$QTa@CkJ0@}#tTiKO`8j|aZs4ca;m zP+hmx)s|6P?JDgiZTb|D6q11Mv~ho`C5z&}A%wxCyz@uH)vx{gJft8aJvu;v|HOWLN~T02GJ9 zPzdsaY8qY;SJ7=f#xA6ris3IBN7pnop4(1sG+g6o*aEiQVQeRLCgkc1*NBXi;!hmu zD(N3de1m;yC=X?zEa)s+91_BG%1{nXA7-fv?p~~kzXmw3q{`kWj>g$%Q+#d1hD2*a zPzUG+T|pn!Xp634xunulN7<-i+8Uty@koM)!eAH#?i-3a`NVBzy`eaS@JQU@xWixs zjDl;}F2J1wdf+I=wkO%m#yuH z!eX{{`mcpwr+vNWulsl-T%GpE;Oe2E0d9T9R2SUIFbSrBd%~KA|GK?y?2I)VVHRjV z>$sQ+^I;y$1s$jhakag*-50}BSOR(^98P%jQ#SZ@al|}%<|yVb-&L#D@b z7j_gDnX#BWD6rnZAKnDJEf`BC?zcB~FC6j5pfv6fi6pYCu=g+tB63jQYPS3RFGRad zm|8hFq#eL8Z@}YphZCH}F5G1|LTaSKZjO{rZzZ?FLc%!SN%IueV^8n85}DFUUBLZn zj$eA;+HtJv=boOnFrwyX?D#V#PeJsX|x?m0*W>P(q0a0$j4NylkRk-Nr3g~?}}}RX&Gqk^>X!`>A=?cpYUje z4v5}kdhAN}?87)`E9KQz`j;U<$PaQoy%pi<(O&j+w317y43^!~uf62$Vx^P@8LYqp zwYUl#K%!X={8%enKs&p0l!fIFDeTdS5ZxaiRPXB*QF~@gY=|p?d2fx|Rr z{hqZxF*51XjGng8kkF9ud<>zEawmiJ$aY$eWwgS18`qbNjK+J?J~N&6vLi=njrQG^ z5B5KXUvo8oVLHy%DJC+L6=*Y-ype2JW-B~@%FeFZ7fiEqMDEpp9-=s!5o5I(A)3_V zs2o$i^`G_88In)irMo;QuYh7*T;pYZo4_wS>zuvpX$xm`u{U^BlMGoX+99c(h2eEp z7VFk?sS#!Q$Gps9-Ll)B$DGMwjYvVE>Xovd+4!(u^*^i>GC!&1h-p&Bs%Z=S%&{OT z*}sZ-(qpOL_^6Ct`%sFYBw8XjDp*ygm$M=zZ*`{N!Rl*L4WGR{W6KrZDrP}>tC%NS zF_>Wj3K?(Iw{i8e`eb*n1xB|A~w3YU$P)z(RD zHR!G=3Bd78y+sPtu%bDB#MH3L+kTYKHLTjUx>Bnq4c0;?owi!rddrKNwBl60!Cw^o~gw3umr8AtXS^D4=nln8!{sAk0h5WWyVj8-{kq-wu%={2TLDH0W7uP! z_1su2BZo!m!!)o<27E^f$1(83AZqS5ukg~H)@EdQ=Eo%5 z`z- znNx?B?<7HW$)`8%q=%P*cTx?%b-PSgIx%lZAw6;rmKt^0)v;et*V=4rB(>|Y+qB!^ znw6Klh`HZya@TE6`+Qop-X`RzEycelxyE}EK83?B1#=naAN){ zE52=EEGTszNmSqR&tJkAJnH}8*Nn0{snZ}-6OS+iSlr{8{$6#(y4Mov~65E8w#*vsXK2tn|6lQx=b; zB&CP2+`G2~waytG?#Y)sOE$3leM_4tm8EF|+Bn``S>J%eXZc@To%uHUuZq==H+e(Z z!b0+C6QP87|Y!zh~b!<%7F&WXA!R&Ox-D#z5V%79aaag)Fv2r-F zAEuUKt7)ZhggL!kn_2;0VIKSBauX}3quvq5k)WlP3{9<6j)QC)^U_Dz;bcP#D+RA% z>)6!FzzCSolsLi1I1$n~0roHt`*FEJ?0`eZUAt$|Z(5%}ydmi?I{#DA0=j1;X+}}s zNKTwU>!fR%ELSHmYt)QH6={*YAz=luOnp+CG^0iGNS|iT`QuA-qAify8hf2&Xoa&! zHXuq!b1Nxtf-J2D=cImfXW8PKyX<&l>apf56wZ-nZu)boV3U&=Ia|16#0JiiK`pG- zVa3ikFD*p-535@?$kFJ$voD=9P)$N~g1_uN?qQt~}j&Al~vyN?K#()xe6ak zX291u?;6K9^4I9oFwNXz&hl_9%WM*W3jC^4WW$vSN)EBpC54@H={Q1C zX;q$#luVPCpNI`vBIAe}uoDA+3~DEMJgjBCz7=8(F34UCY`@D@oIsxoF1w&K^B=F; zkv?s#U4{#ixDCs}qFCsBym|KSi`O13o)v2`m0r=w_SkpRPnmD6W0cDjU?)*43VU5tz3V%*cG`s zfgON(&Evi_ZA;X*(hnyf*;Q8-X&+|o{?o=u)ttSZSEt3PvQF*(XUtmiSpynKs&>|6 zUU_S4PbZ4xZ*L7^Z5g9mQ{`!UCY+!fVs)^>@~^((nrNOTNbetiaF#GKF*9aot`X>2 zNxdPx)0X_WCN~p}Yby1aA{{$WzMn7%!QkW1Lp#+@er-#v!6R9SfoIBFvaBPLfu*sAjpT))V0b1;IU}A(0ExjB@4n z-&ds0s-)u7*H!+%3nU*pv(9phW)*B{TJDm&OFX%YmDW@^C9_+ccBuK!_~NvUV`29+ zsWED_N&kO#Ob*FqRyQkcfwxaw!}^W97`frkZ)Vc~dhB4O8}!t57=6F~v;E+_E;&4H z2~d*IHMyS3Z{4hNyht;=yOkl}u`!(evfRd*4IX|&61vo*2i{5N?pAo9_cPa=R%7s= z?H^BQ_8SJen#REYnf%zFTB5*%^A&k zSo?tx9Y7IRf(v`Jz51RI7C)Nc5E<8l&Ymo9NGM<-c3R+uzf4RMSz=yE?94u~QOfqj zV3#qNlz40V#8*U}PgXgYUB=PGZiBo0moZl1$yEc;HBm;i{ z20Ch2UZ}hB;F$Hpod!A+c#M&zKTx%Y(odbwQhFq3L#uwU3IV@%n>Dt#y?(Iw_(+g?W+X@TF^}@BA2L*nPnzZua5fdrYL<$eMjX``$ z694ia)9P-GuWL5vITANdBwZhNW|NXDb^m}LUb+scFJnedoau94mpmMZbn$Res`dUK z_Oi7%)8A7$LlA3mP0^%ewlw`BedyCF(oqAQ^-q~LG@r-6)R$g!wTgq9TffP#eXObh zZ(h3^+%M(3?_Z9+rRzU!8xHg?+q4C_N@JQLOGJhR`%7L+=CpB+0%ybdv!EE$mlD*M z(w{ktrnBzL?!MNRfL?E1P4r!jW06f0Z`QLr<`*44gJnWLdcBui??c9+G#3LQQ-Oqoxy{kcQlRMSGBJTj! zFwS$wox(gG$SE}(CmEs<+$s7?U=$Yu zol!KESJ9mD&5LrU;?Mi&_YQJh;cyjAtY`wAsrZ{{nnW67D8r(yf+iC=7i|TZG~Ivj*e4CS)?htg!JqQT+9E<)vyz;Z!3EFQ}#@zVQG42X|z9`t>mh^BpmFH?=NKr zQybnZI)X#lM09OJ?JRfx+9+~^fI#% z&zYpN+2%;-P`98LW7zVScReYB%SMh2wSxY04?D-fS7TA~4I`qn^TO%$A;U;HPSbeC z_mZ>2IImCTCFzGdYr*x0HO>vB%lT1GJh>j>)EW$ncT^KDM%ZymOhDT(Xb0 zI&uJ$(Ug6;92-r2-^BQjvD(`LF2#4f+;&E__3;Kz-BN($!(5jOT<2x!Sa5pWF-Fb1 zMfLf-@4j81;y{XaiJj>>M*-`F zF5@_7On^lKEIPd}{4Szh%>XQjuZNh_CM5p0vxD<@o>-6&u5)O1X5msqGs=vW9%w7y zxLGvU!%su8(gP^%>~q_7@G4WScD0CcQ(VOj(>SiBRdPu`o(p!NB%tTwv*!$&G2`jR zX(XUiEd_9`g~9?#VUZMzj0gSZ&3nJNp0kLwzMi^_8&6-iz(704e!W~9`=KO{oCeM- zYQ1DH1{`6os@;6-l4IvF`sS&RD~5fKonF_ateYg!1lG;%WzqzC#o3Pj`M>ztJhEbb zY*V_*CEHaRf;sEVd?5urvT*w=n2@aLQx;6uzxMUmkO;{=kqjG4g^5mEB36tl{+g()U8l%LA&>D2X4nLC+7MZ9FPZ88V-8nSQ-6Ow%jm;D+_ttqspOX6bP ztIgP(ttXOU*56x_aVpc0NzfSlDP5PANZ5X{!Bw}%nXr;8MI`7vGN6a@duY$^y`D>h2JXBPcN3T2-TsRDoBnC z?UNx$9tiEfN%n4u&Bc|5ZNIdhK~*lvY*GyPlRwQ&LSk1}-(H(2W4zWRrb{PwDCg}2 z|NP$RT$LPm+Ph4m2Ca4KHEo=Z5Z%=#caqER?|;e=8xkf#GfBHN26{E?@tYE**3?LP zKQ`^kQUe3N$kSf!T4JYbm-N5dw$FHdaRhdzFFMP7wd*I_XEJt1N`_@@nbERD_Rfy& z64QiZrSUFIX7KSLB77~rmA#KSUR_vjrSnXfK@#qyrLt#`@v}K#giD6K#QQqU5GlQr z;(f#8?s_g?pu*e57vHCw6I;*va(gkcjMG6DE?}#MIJ?%AWG1imL3D-5yEzO26XF^p zp1xUR&qD6vWX~e~=dza;=WkuL(Y{$VxWkCv2M>^&F7@b;Z)DwEiqi{&Kn%Jc82oVK zy2|$0;!KfrT7a*MV_M6It}5AFNf}F1gw&k$o|yM{e9wfz;yIs!xeJ&kSQh-~Y^pQc zu`(%DmI;g4Y9eRm7&wSGs_Mzw{z8=^)7l>BA=C^i(=kjCN&eZi;Wm@m z-xX}SlKIEk1*Ywdf!Q)ebZxoo5pb11B-ULjvU2Gh(UHey#peA^{Io9Nq7@8Gl+!ia zW_>a|FebefKh`d5PHC`+miW2}%J8Klx~DnOw0o9xZBfQA>Wp5JGgWidJ>cK#{vYc6 zcRT-GXXhAm713RQ|7%$Ie~w_P@l`4TulN&d9fsw*eVgvbxOh!7nf^LLyNxYeb~hS)ZoEkQrV4z~_c<43M*x<{s~BA#jTN~0CdMPS^a zVI~iA;F%-Kmj69@$nZ7nmdmB&mVXQ}!X-Eu3V*{NA}lU9V8Q2E42 zq7{D+BGcgiQY2UMvUVk>319W-zu13O1y{8Hdu}ptm6g=@Sh%ZYUDJ|h_I%Sf(o$vQ z#43jFxA|NLmK7(ir}E-&dSaWsjo295U(a0JldOgqc#Bwi7)bekaPoAe66$_pCM+|h zk-T%y`1gs+99_-C=sLRo+~>;}Z<@nm|y`rsMW@e!DBSAAXS}>&ek&_kU?2 zj)3bK=L00g2Ar?j%dDotY&T@X1`>5G2m=3oVf23;EMKpj-pe3eN4XBL@?;_}-jhN@XP)RGLFxs%(ixa)MlF?mg%#yL{y8Hbr{ zO{zOLTWJDLW2GzVT>aM7-dMA~o-`P%xI4I>h%p2Bn`MR+A*zgJN(hK9;aUKsOm$+& zwsVy)$BqDJF7CAym-!QIrIpR9!yMmTYu2#;|21#Zn7^CXy{wLubur9Ht{o!(+fuIK zl>h1UMSb_*=@MIfM`_m~Zgcb2*R8ZYdd7yh7G9o#rKQz27LsPya_x3f5&jJSH< zv)39tI#co|dMVg6>TBLr#c)qnMgq69pea4L$4rWp^s|x1@tw>h6Q`)lNv1LJq}_%pV~ljOQCIhSLgi->qut2Nag zf6@o6Oq1-FB)Y)8BstZIJ1_rpax^pMGWn>MU(JN>{`?POi0c~8*CD2Au2CRiyRCcy zDJr@S-oHm=pLc!Jxp<(eVS_po<N5hzUoAX-R8d;?$n_p+|vXP|wvF{?e_cL>jk#+l7Vb!|oy1GBYF**2Z z(W_U<-aLkPSU&HkT4$un0n)oFEe}|&Jss8MD z`IlaG*Jp1??R- zR>(7q>_cfa@=sq!CLZA#h)~&c#0r#Oj&KQiG1ht_->&+dQ<={{bKi6-#KZo7TPMzM zrQ%&d)(G2XS#y*uQt(km!|~2SIlHmH%*P=A2xCyFe9J}6yi(P7 z7RK2xlL^r)m;p^*Pa0Z3Wp$GU*ZAkjb4`0a23q0kWlLYXUgN_GPuoC!7K^TT-J0V< zbkUQ{5)GyEN$w1Gm5V3YkCsW6Q&!I6TN=Ak-)r3KV-HS>pTL`2`#XR6J$+8@+PR2j5|gC4I8=)^3d0fjy3%Q1LwnJ`8*oQ-cwfV{QqLWLyLF$Q*ymZ z(#_HS!J|?W-+A&B8N-oWckrc7(*EaTX8Ks0>oK#qPr>PeE7=)lkN@>4xMR`}yJY|2 zAwt=E#u~*#kX6poRBt6p9p}?%{+`|~<>Xl_`XA4TrIx|xtTueY^yxWFUr4(1wCco| zj_0lCHr9dlf2H_mc@3JLaX!7bcHE}o-!qNq{GzRTRVH9Seu?bf{sGU8-KUYuCSN+) zHHAK&>Ad>Ih3@OvdGboFcfWEJ5y^RxG4B4pT!M_pIy5cXf3c@NK<7+2RaSa*j{u^Ez+k%Oz6CEyX`^HLvPr>$GjB1YIG{p$@K{ z<9U~?o}-7{ui_l^&Y9w@)WCq}I6`l7^(yL$ZaptJmZmGxcb&aS)?hMu{%eSf}2SeP+iSYDAh4>HETW)1R8-Bre4 zQ~R#2y(s+clLqT-%e}ETD~G(Y_Zs%a)Y+fFr=F>sCbme=qCk?yh?s{7us8L%-EoOA2NMvPg2@APd1juhM?W z*EO=@swaAZ*^K8^(i8)CHJ9;rH=PwbW>4E}<s6XeqW^`oD)V}C&UcMHeQ1EbVpGkG@bbYJyjkA3`G7OpifXBr0VW2%Y zWOUlfe#MVG^RyKX38f8rR)`S2@Lzm-;+pIKSQzDL%g;=!50*EPhzC3*cP*yR1FN3R zmP^h(WU9^2-^prqQ#$GeMFtJwF^obX`JE3Omy`^TXxmCs`w@GktM5`XBkp>{M3x|d zTzbSr)>ulvq+*>&MemNKNW5W3-wB;&ID6E&*AI}Ak2y$>!$4~u)?w4@qo>-m#z5~! zFoh-@BGJ!ym|*c^Zh|}4)Bb#!_3C3%-AW{#tcpi==@T^UmtsUB3Z0Sfj3j!(-0%W} zv=|f#t@3S}K{xd-huOdVhS@x_5b|A`if7Wj+7##M5_f*xpYVuVmEq(drS)FXvL{wh zpkst<0as#VjYaPpcj!-ox*Vj3yhh5cC)Q@k_opM3OnPbs$;nK_`t+2guk)!keO8O= zoRw71`1^+cc(uTJug{ggX*uVe^1E{48GZj&9zLVJcS*o=#&U0I`<$)8GWR)QV;bL;8!%#mYrv*Y+ahJ9AyZkj zVC&o=r^pL6Uo5^aSbJ{4PIvcQM=v~Eb2?f112gD{iXu(BFpNt=ZhMd-aAS zFG#4xQS6osdd=2vG8-r0(+t8K8dQoZU{M%U*?e1F_1D!vZqE^VHw+yZZ za`P?YW3x1U_jkTFS1F|Odm7cXTiX(g&6{qyD>L5{>$*IAZ*3v++z(8_4aD)0yz(q{ z)hb>{@~DcHYO%+JhB*IZjn~80`e+Rb+-eM3^=?;U%$K$$C=5F>H$`UsJ%L3K8Obq8dTi2;l!pob#)^97{dwGX>y4IMf&0^HOk}M)u zbwO!XlCFiVSx`zDyLTGbQd6I4>Sgzi2pF)z)w=2H9qpdHL;a$ZSZ7R*H)AE4!@D&J z^>cX74iH|{rBzRKF>7GdQ_;sPSjOt0HT(V(sbY~{m(8xWoq4C~ooNM*bFMg0kH0)G z=Ngl8-11HnaCemJ_;-0^*1t;BAL;9CNaqpK4B5dFpd;6k{NCQJa?nuz23*^2&(*-Wg-E74=TxWebZbUc$S9Eop&}9iWmg3Kbl9uvbDQil4H+JFXcVK;l=omiTcKSkSAYx zKeO69qeNBqPA-v^yuGDFCGUVZYC;)Z$vg8`!p%zFIldC+e?z>|mA{HtB#uRLd0Cke z5jU%PRsN9%iCXeg74NKHnWd`go%btYU{&uBw{WVecQLo$S^fqQ-tnYrgm>Dn)P)gW zC7Mv)MR*6tu}CP+ysv#jO!}yG7@YU#UHNwCx~WFENm+UGuIYF;~5p z#LT+pJt%`MG$!yb?=tb^d@Cw7(8s5bO}rja=8laS2zwIx*kdxr^I>5d8uL^9|EH{L z2WcP(qMj1&8UG)GqA~FUYU1hTa!E8;D1u;RK+`ECh!{}8Lah{22#SRy3J%y=C_?Z9 z7Ash2VuFPTYH4XD*xTyd`9XAxg`Iu#W_Zg^G0kAt$*q?DAgUt)TTAd7vOf*(GMTbwbboapL*)U63iR!bR05a-+Ca(IwGnl7lBaD5Pc$ z6&%*5aX042Tt+Ki_L}vg;TO||h9b&&S)1>aN@!O@CAH~jH*GsXfQAFS&1szKx(7v zGK8fY>vaWOjznSvDT$-^hOsU6i2E>Xvc+e-DK(CxTD*^8zkq+ZhYll1GB6lLnBLrQ z(n%DxCdX|Qc8OM3ShlB0_Nkx1OEK$anZsTaoeeRzF9BKHZ9%CK?i8lVOEj~}OwKEd z(U}EGzRM2rdVv8RzF>?i;T5~2jV#LZ)24+&PT3h*=HSj)XN)CenJk46 zhOC3J6ta$eXN*GpuJ?1_C(Y+O-_P&+d%b>tIqkv?o6Ob$m_Zu7N z7!Vq52VNQ63P_f14doV<11HPckCCJ*YWd($f4`X6^Wdbn8Y@ZlfL6eoz@yN~;x!sc zDhpf|rjFc@)Y6=rSHOj&rJ}%Z;gV#7f;)j^z>ElP{#77#ppWDYH3CxpMwBDHY81z4 zfA|BRrQkH6&U0$4VzJi6BuIw*- zgc*62JIb0PYmGIkb~A=lt<>M~SMKbi8ziX~TD${JJ>>yuh`&N7*KA+Q^#d7P9}P~f z=)aR&?ji8WPUD5DjeH_@aeJ1+SgIZ$6QdgLk;!AF<+mJ*_wX5e38dysJT^2U!7(m0 z;E)-2*q|)lZ4YC=YF0iz`?%4~_w(8dfD{#V1XdO}ESs0p2!2J>djq8M_XH1U?dTsF z78!lQm{ZNpV0(zyf*Knd9w-6*qNDv13ZPS*YXm|M^ot3UdWcrs1X>^FQ8sQPA5%-{ z>ZBgwV~7s)^N)25jVVUCZ_wUD=ro!BF)^_TQGo{OH8NBoEGC}3_5jYIjw}8qN!5U% zz*@jd(8;;K0V@Gl9piJ61x_7q0g_Y4MK>Em?q4l$~P6h=6so~(0+(SNsI|J)Lw*!(vS5EPf)&M61$^psWKc416 z^lG;x)d0T%q+mM(r100A#X2@1VMKy5rUEHr;P2d^U~n=Z21pG)IU`9{!0>b2mHFUg zK;844PXUr=DgsGA39Jl^^&36fZ**8-F3J->2m>kre*qe5A`$WjZy*NiiCkad61VuT ziyW^3X<`2c{06uYXbW5*^a((9M*@<8o`SalRs(Mgq~-N3kOmZoSf{C8yjyCdTAZBE zJunRZBLhsERJ7)cRroiQd`TNy?mw=qh$1UdpOfiO1d(M^u~ zfX%>D1O@@^z&nZj`>>cCdJ+iZk|ts%YXGC7BmD!h`FwuN{kiQaA9-ACXqbf0h-Yd9 z7?Sdlppa_zoDV%XGD@A14d9m0KLg1{e+vvE2mASl?0mt?pF@4h_j<`YIsl{y&;!Y3 zn}9U)dr^)e=G)iYz`o!W;Orz9Bhp&s4R)cw|P!MI`t~1_b^D`zxT- zLLfzMv$wq53~-vU_}IV*vO5zxbr&nj1p;Y!QDcMYM3jO;BLW=bqNG9Zc)jidqa4E` z{rzGMfk=dghsH|X3weRTq5&_UB^qiDBnQ_9Rssf&4~&S7fl=UOpadiX|9a0S<`Iw# zyauHFlOMPqHF|77P%BA_3Gq{RsZk%vkJyARpddLkOH|w{Fg&2GTCi_1Z}3}Gpav@m zG=Aa@`^7}Gq=J<`^9dOp!FR#^=$Oiz_)%fd2uW7g#%L@Zzou~FTG3%(SXgLOY^Z;v zEURli2uOy7_{D@!lZ%ahHLVP$6Zo-4RvjN2qaGU44e;_PJq@jqKNgzHYWD$wF{(XJ zpYVyg3ZytW1ym=>Z)_w5=zhWdVqyZLVLo%8IN8;v^u|^N+&`7%E9Uj2^WRe`VEX zlk})XanuAz!L|PNO}iLKAaJPx2nL+s{^Frm{*k54e&WQg?*mDLe#SdpHN9w z!{`EdBk=CLof=7cB*@&@82`wKApfznZA1sgOAU>$YFX8dsLH#^2GWMt07&M=Mn}d4 z<67Io=wMshP*6oyV{_t!&{(?cPWXoNN>+RjWs!FCY!73y@qgIx;eBG>-Td zLO+1^%0agUC)+H5RPR%DUj7M?^h-eKhNKfnkXa{Cks7XwL8)E=(j>nt#|;=T=6If>VLp zz?#5j^<*_TYy`?c+O^#4^A1m<9Gzbyfn-=GG)x%QfR_tuC`V zQXt$$Ju>j9qbwPy!;i3tT;~MKY2?eB@rEOs^9s*^bhJ%s!2^Egw;UtEsiA?$uK{!h zlE=!o;v?LQa#YU>dOctTAoZ7m_G#)|+Q(>D(!wyIWRR>ZmXxed%2hx>d z6p*IiueQ8=ww_}KkOuHGkT#MfPCSNYfsNNgrDqc!N#Fob_$b4LJ>@ z;H&Gx`3`Vuz!v35Z{*55z=Ke9Xhg774Z7+{=oEBa-MGPPfi#6$QExy89!sy`8CnHb z4M@;P{W})q>;J;X^VZ`otJwE#DK~sCH3GQ*lavex4B_NFWy{C7)}ms?HO$CJf=(Cs3>oihcCvORgCPOH0qw zhmYqfkh(h!B=e$Z(D*z;dFn15^{M-qSijgf+%}EIarLbX(}(liXdq2iOJ6>ya6HpF z28@;x!lL7-l_2C(Z^MA(oWMZGpwQ@;*uH{y73d#Hr6sAo;7dmGdZu0{fs=Isf$GJv zz0_P3JT;1U+(7V}K$^}f0@bLBiw>iQKRgynt&AQG^zt5KLIXR8YXQ9ODIm>2WJ~o) zPC63Ed4|9Mjj9N?IJjb<0Su4+T;*6+)+W>SOTa z=v&~}9tEJphcGPbmv$cp8LM7{aH?w0X5LjeK$^PN$fcNziwsALa@~^- zAweDO0Mhu^0x47(kUE+Qr16Z43yh<8qzT~EL3m&|wJ-Hr!pn6q<~Uf%U5)t;c9laI zH#$m`4K`M8Y~^t-m7jU5fz;xnWxS`u;MC(zfdP@>^o$&Xw^EK1Li}RK{>aOx8ABV_ zHYBd#C+MFD9kRE@N^bvbAT7<9sIbu3R+1Eqa&$)+03^qD0#bf!Ak}LGq_C_3q;Xad zXa*$57A@z!((RwdIR+7gk3sSqqb^~|6gbs?;_+yD6S51_Ne=RF$sfB+Z$|8}+-TSr z5$}XkyYkJ*Z!I_Aq|kGKRNwCx?v_l!x2cFdV?t;|bYL*{Sn(cx-#Tuw`Ff6_F@fhLM@X~ZrYIFF2Rj0p)1m)eN>rZ=O_H*!y{7af}p|A4^Jk#WZ2CiUgd z#=1?dlq;L~z;lfrP2CNqBR@7YHY_l7Vjyhr_k$HfyYZ)XaTQ2vu$2$b3P{$Z0m zf&Q_kU8{|O57Ub`kmL>|H(~b~8;BU(YV>lfE&pr`b+oftfX-==?A*o61jX=|4o(?q zjs|U=)8X^qt?l!=TgU1*Q`;ZZC6;|O#MXVyy!RJk4t~1S-&M)*Y+cDLV^q6JX1bU; zo}YHEYcM$@%6W}e_o~<9*maik4H=c(XUoPl9X&H%c6_O^wwdAG*;YH^qF=vjEACvK z;+}7j@?glUl#LmMot>)bf`+6#ui?|XYeoxioknM2?v|GkW}>SDLny zBqx>S1n4v3XU#KbUCPRBj85~)^F+KUk!ea4ni5VarZT2PrYTWqN;u6ol`$nUO^HHN z!fAo2j46?6N)(zBP76(CL?R<|VV8y_WZI#4UdoDq7((uccEW6TNFD+9oK zt0lp-o50!|-TYm2esP;1ysqU1r`~@j;I82kiHOhre*vq!EqJv7) zg#P^WTI*qw4;@r2r`^Yer?2io;PBOv936WhZm6cE;lMt~yGn zg)r~R9m*!RDOHzlB>c&mMdtju}T+Mj`jr>rO%0sG)TC5iKc%B+nlKQ12 z_0W`3nqq5e&%J{{2?8U}$>be*m9Z$@UAYL2CP+t`QYMIp3twRa!D#y7=^ymkrC=S6 z*`Y4F%Scf>tmPInzA`Ido2QA@8FPMc(t%K?W-NJ_tTLM1GSrA}FY^9b^)(c4a6OE zk?K}r*L^Uu5)B6H6^}^nMcF8i(aVX(gx&7)A!F8VccnJY7Al8jG)k`>3D(q@J<>%< zLy8=v#=G(ktQl`@v|edAj;{=fTGRT2^)_bvyD0mGt~JVY^~!rNnmIKlGBPv!Iv91c zTNs`0R3glXzvEz%TT zG3&Lv6920tVO@|*u?M{cBO}e2$6Uli2KONr>?pmQV9a`BP;#M>5txvpdfD8V^_RQs zZ!E&k4Myj;?wXG~jT7GE8 zy%BnOhB50MIkE^jRkL_Vmr(;@Bp5{->_me*z$g&-zV-;L8_Vt{yXy9G>&h5&Qk{tS z@TQOJm7`#7)G8iPdQIV8a_W6lA+(q%th7=vL+p^sHy?kc0uD=1;K zmDS2N<$3t(l~6D@wIogXddf2v`@3lGk*@Bo^$wWI(?t4#b>S^zA+H0Yv8Vx~6oB!z zKlT*&|$(xk#zIFq0jyIg`#38)5i|c*Ev2VM-(zFXhn$lL^MVk!R?Y z`(W+SDWVa3ah)8~HXzqRNiemZ>iC6VWGo_mq+W9|$N2tp2gUv{U%;rI)Wgc9aP z52IfDD_BQkA|l@Q2p>vCV=`X*4Q0-ZO}SG zL-|*F?F%pumTe}xC@qd--K!mVywhuAz*?28A!VJ&tVlpaN(;cK2!{DWubc(rgQlxQ*+1~rC-Sg0BebW0k$Z5a9Y#!n;Vw$^jTLTx zNs@3i6U^`rb{T9?NnVr7lGLY!O$75TVOPMulx%uMk_MFI8Nm9Luyg;&tDndB7u6Oy zf;m^lFxNvA8z6%IIao_nFRRXU?R>t>u%6+9G%z}ka89A*3ou&2Satq-t;1E!yD>Y} zRYwWPINq@WUV^nNVePL8uQ89k@C+E=5NNmC3PvUQ-uI^{i8xr{q`S_8LT8k(>6KV8 zay{;Ru;~ogXfT}JV9g77lNca2$!IVh=CtW;2cw0D^)cSbLXa=l61N-NZp`7YPC5`8 z8{ZNS3x+_z5%m#_yr2$HJNp)TG#3Brq8)Y{ud?X^pnZYV2sPE~4$2y{Gh7rSQq-cB z$(=EDFg{ocAG5oBabf|E&};Qzqtq5NkQ%DCWBDiTY1DQvq~K??n2J;@)kgCFNmB`> z>^<&-a=3)+b)CQ{7}X~u7L_S0=1@9N`|@e#ToVDH+~*C!*SH$FfQ?s&M+^n;@r2(Ea1dZR_dhkw7j_EGr>CraZMlOI`AkGO^QesN{UIpL6($w&;QXA&1MV*Y zdhGuI5N|G8RvFQFJf(B&h|IP9=<{eKHtDD>glB5eHd9U6@o{QUoWDGW?~< zz-07x8O)pdW*!l;lf^63JiIk;!M5Ar(FjUk)wW~|{3IA1OR&_a*EzkGq~Ty}5lXAu z)?z4KdHysf9SC3X$q4$UZ%R%SoDE^jxq<9%xg4S+%9p|BXNgBeJdTB+&yu3JK+E-5 z5sGSq|Dq74vurg|T~G;kD;%|V|6+R^!l&)un%c*9ubl|i0ha(*9TF6O<}9ZtA{vZF z!=DCv|IN2}&Qif>7T`Ke+zqgHVCs{CQte$SrW*y;0eNCszEpHVP@f2t>tHkoqH1Bu zA{wRF4FXfECRZ}A`NOd4s@IGV`TS!*NSOaSwwo=ZG_5K0>; z*aJ}d4H)^~+$f*X(^=ja)Bou`k6la}rm+17ZUNR2)=E4W`O;jy;9LZwD91$_q0#hX zNz*vxLYZ?@G`0#N?GXGaBu_BD9abskO(XPCeVB z#?%T8zdsmFDh{P#dTlB(quXc~S&>Z<`I35>#1efZIx10$;dqtPqUORkS-= zuX8BF^S->ViiARK^Wez>qez9L@T_NL!H2>JHVBMch}EQB4Tje=zAj2WQo=geYN_K4 z4=-?r2N>1CWZ}m4Jy>t*izTPYPO^@@*JJAK6j|MYuu8Y;mFZx70KG_?<$Sp7qrkYpb(TU6TaJ|+Qter92&qWuF zRLOyA+#aOpAm~vI=Pi8eT2)q;MH!Ye0c#VC&tp!ylLg3V6jV1i_HsFn;%ab*`g|6L zl$d@DHw}!gD%?$vL>_mcZS|6A#)|3()&eE@rjZOrZsLl;&>wA%K8Q6Aqr?X6_> za6(C}wj?kzlkc*J!3I*B%%cK^V9h59c~N+A0!EXJFb&Y_)_^&IeOUr|qBLy9?ZMuL zy9Nvvj07Y9^2e2QFzSVulxv7~SxyT21mh*irE|bkd(==a03+Y<2S?kQB_V|V!og^6 z;J1@{B@2u~50+y-Yt`aC@GIRYFxmky#xl4kECr=T6_%_)_qKf1bJMzk(MAc!C97Gq zkKlw1)GHT|#pg-J)>{R?fI+((U&4LCs0Xz_-9-FWM-W)ag4f)t&Gvd?fz+xatB-x< z)LknPtQX2zs#}OnUG4`yXTe}(2!F%17HmZ67ImHL$?6-5l0I}xN-ON;7F+@^r)t~7s58pskoPnF~E>cDtQ@UCu7L#(NPSo03bsM3lu zq>-#XMDoknc`%wQ9=W!5vNTs^bQo^{qbU1wJD+VYs}~}^fBy+a5y3CDE&9ufg#*w3 zGWNw##+b^`WkB}{%HYz9GO#f}b9k%$o0PWrcclHG@TsO_b0^qP7|!GI`{ukg&dRlrr2yoq zZq&^KqkX=_4a#LGouS|cfXkarOLfDU=A!G5)NoTt*1`j!0fhnz;dRML*NV>-pPj{E z)Cuph5G<^O1+?aKg>!bVlMaN=OJ1;F8`Hw2GvpYU*j_QFYHdv=X@uTj{CLhe;-mwi z$bccsopkL?OPWG(5!e?`JONWfka@JhTPQtRRNwoYq7)jy;%PUqx@%z6 zi^P&$vDvh7;h7TiXa^I(xZAN~>TZEi(UPWgde>4@%C_q;QBY`S!5ST|*Bu5^*NW-l zsdLU}@E^S@AyE3G55Cvz1*7472`inuY4y`tISP!d zMv&pMu^x;{<03IbufvO35t8&M^U|p3I+n~eZc+2WDAM^-k19~J=}a!Co*oG$nJu;zgd5uB#~)J$`Vq02z&( zlCkOayAqZ=9q!gVE@?ZbWOkek4-_D3MEMGkIq{&Pt%+e^8=&c=ezt4Fmi~6 zI{x=yoxl|J1fA|B0$V+`bHOMiE!4-Vk6?V&(8=rBozDS(VYd{FW|Mz$BlX~|sCRXx z3mEmMmei$!(USVI^S%`MSQI&Ua_K3nFN?|>lXIPPAWo_QaH+hS6$RqPl?M?wrBD~8 zLN8f;^HqV~gW|qgxYa zR{eOK^JkukVB~Rb?=i3rVEoQjwLdSZ&Z1=?STp2lBuT=J>nPqthAFxMe1N!0z_G8u zD5Us1rnUq5&~Q{n<1q}3FRz^aPC5{N6~@Kh?DIg`_#xO$=`e`T3)UQ-r4qo%7OaCD zCmjeacaRZ!%W{MHl^2#s4U8Ty_)F0ss2x#;zYtz87y<<0sToq*A+BI9C|Op`V_;+% z+Q#><1z^-|$yI?e3{IcJC7>`}P*9U`< zQ#soPMhgowGX}3ghOzh2xTvw=rfn@}w_dpirnaVDSXovKj`Mg{1Tfp?D;p;rbyIHo znubf=*B)V-6S_J2g3;1ZAL(>UM4sw67UhdQUMS`)2ajmFk+Rejr7;l9t{WJ+83W1I zD?fp8r_yBI2IKA0ZQW)RcMQMH`GV220vL|t6foWjmAnK-Yl%CjvY#oBUK@bWf>5t* zx;cVzctlMC6Gs-lWZS_K67b;m;ERaWZ|l#U4hyE~ zb^XA|)-R!y423u0f#Wy_jO<154AX0h{n`78=(Kr2sS(N}S;8dQpt}c=ihkMB>IU-J zhHZF=nFdzUmFj$!H5umB3M#eq(N3e4|IIvkcBVI!1^K&{>gMQ z9|K}cjCE0FBE=`p11se)7|j)q3ry-qFzOT=B*Lc6SiafvDGmaojSn49bz%w07+d); z)2w?eanga%%H|JG&%o#a!C>%g-aVWb#HRSGlLZLvZC_?;HWq%-9$*wKXbF4E zOfd3`dihe0f|1GGo#n^#8O9NWIqe2UJ>XmJxp<`qrfvlcF9Mu&B_&~iYui4lw+x3x0#gE`d7)Lkz|%RWLH{ z%T|#Eg*uX0PCXbX@>PfEdQIeYOS;vrgo5u_kGd#VkfJ~?qh9DOCh;}%CE_|m;ek%h zoFwwgupB@10!DWX?#$a@w8AjQm_Vz^-0fhqoh(4exDo^8g)D0UCjAOBXesdB*EW&& zg(Vi_WC8MzA?kjCLUT|uXzia+^hUP=7p3MD)44*c(+A8ACGp-U+{qlInfea?8B%m; zVQNzKx~_)*@QSho3dJRs$qc>rCRi(D@h}&qauOdWc9~KR+t1`{5z!E>muIu0rKtWEVm}l? zd|!3a&Ei)VoQaL`7_|VD)&04bUYI0RE|1f!kD zjOA>_fM>J!srb^^hB+@oHv{MJ(I~WIATNu=dk}|HedaL;VKkRd1Ya?Wz$hdTRQM+J z3K%&<9f-Ev_sCPjwjWYt0dApi;E!PBa;$M&XfJ}fvcw$OmEpH?-IauSB^%Q;9B*Lc zdfwYBFz$NVeH~Lc!^0Nd|AvC$7wHfHYmuVRMxEh$O@0d7yF~7wtuS9*M7LaZNPJl% zNnrdm#Wo`EW?8FXL)it~+xR7c*?MIS811`!c|HXrZ&mTQ-t_LUI-XJ zOsV8AV6=1aBk(d9naa=lN=x{uhqoRm=>x_?jh2BT)-Wqj=nLOt^9@?Nk`VCtBak6>gQHtBG_i> z5)AP&Mz3p<%EO>!f0F%K(FRP#3uFYLeGB!QnnBA%Z>nEbgLOe3_Kr}!?yg{8_7=Mz zOY$-PI4~Y*@P=9Xk64(a+?0DzRr}TU>n`V;Ep7#{ezVSg^h* zi7f;vN`KHZPCt4&d(9?)RqVSevR0i*d=A5U~=1S@f=V!4Ko4)$Q9?*T?5H)FCa zJ89O)Mwc0GN+wjgH_0p~7~dxrZN-Z~`=7*aU-D=Z4~60${ldayVAPTYe@*=}e=IU% z9`vhBZlK(Jx|_@b8?AOqzl35A=BoZiU&FP$3H9h!!of;z8oJG3G^{Vn>d8M!+x^1h z3Og!p4Uu3J6nu}$5P9nI(7q?8?txzG_+;Y9Zz$`vb3k!kO?S~ALkho!fbZ=puIEOm z>qY4WMr!~Q?WdOw%y}nXDr|%3W^{Y!q7)%T6M<+(sC3=HM}w-<^hz?A*a2hlN4{9X zE(Fe7h_o0GyKqa#ji%F+o|fi<@r6RG_^4p&n-Jv_7)3F5hD;}mG}9tB?R8;L$V`4Y zUj;^Al$x=eW|)fepftC*SA;t0Ht|jn3^P?i(Wu@=WFt$+go%$)LfzcdrOk?<$y1nf z79gD^0F*nM`Eiaxz|aa?ct~s1Ut#M6M!P0v6fdJDfl=3A7H68s$9Efel(Yb&mGfne zYp0u*D+T%xFdCNy%NdVt28_Io<$}d?3hc{?;JB5K>q|?)P^h%JEaaUmYd=hX1CfUq zHQ#a@@1F0X6TrxHtW*Tl1~4)m)$w~Mm%xVduJL*xY`d)f#shZk7kaaU+p&hGx+(Gw zQ{>>lG4tGko#vIB5(ibxDt4ojU=-B+{#W)_-apn8qMks+|SntBC@| zI)irvKSb%ZgTY+svWBl9iw+??PeZ`>-M9gl-)Ra#+HE?4kuza6_JLS18lSq0YBz(a zU)*Z%Q5}|j7!9d~nMXBveizQ;^DBtboIU44XDm(3Q zJ}SS_R+c6Ffo1$p9~Jkwos^rKZP@Z&Hro?+PF|xmP!T^fwSCnP>ea6(J)*}yWu`DS$Q;|aCkLQ(L)AsMhplq0kNPX&^`3|Njm zyDZmM$F*J*`!}TVZ4&vVk@T(5%K|e+J|T@`ui%8#-9CZ)Mg9Si4>U-W&Jh_$fK=hA z;Ku~!0;!`5K>83;@{-{HhLn{j@(IbXtAZ0!KiA9*_^Bqia2**`=BB_qqTpQ;@gc-g zk!&%1YOprB;eSCb^adioG*ZV6h2F4>DFLJg#UBup=&$su0PYT?3LQnc(nz`o>1<`5 z++3Deb{-~_y7dyZx(n+1F$%bu-Enasd$kNw?{TKDnQyyD*>r!b^0NYX3|>l(x_o8ugg{n*;fo+(ua`Bg$N7<(g4N^3>SI?klYpxq|g6Eu~cJ30Ya)ULGaQ@ z9V7^ykPMgzBz>~b2}w^BI7OhkBSQZlI8apl9~q_e@~HSdICYdF8k`R#k1ZDXBM|>d ztMNm_EX!-G43xcD$lHPB$PCH`?h?2MNaeDD^dY2jhXgN;q#qGFA@O5CYA;vlgv3wM z%u;}!7a4?9;i4#T8Azw;Eg+S903^pf1k&ffA+_@a4))WK9Bm7gZ^OC#yig+85JPQnaA zmVFz0Gnh16`I8Rhh0aE`9MLj~|M#29tXpQol%i!69?AanJ5>oK&0Mh2Z z7fAX0L_Q&PbU^UZs9|R+BEqP64zg(?ego1Xb7cguk^lodew5E5Sr zBp3b!r1HOrd_uB3P2{Hw+#zrmkjiHYz8^>*pg~bFT7gCyj|QpZ zi9m9BB9JKh}=OFFAl)Q*0S)U_U1P_ZKE!XxyFQeySr}3_ z)XjcTy)nfpY@|3K!3Y(pJn zTVg6G(5umu{2!5etuD$FQa4tD6VgL@L!sLNsl2_&CnWAbe}gDZtD_L;uN0#&X$hnT zTLbAsNEO-$UK&Yn3!Qf9j-s50C`U;7odhq9G+-|UFIVZ~B?|l-QUl#ZKB3Iq9?P|5 zY{mdK`LSHdnTqrlMF=Sr1^{VnL#PVSTjZBUnORz6LvL!W(a|v}4HIQlWRBJpB~LKr z)Ska+FIbfMH^imziEKshM5J(0jF4OzDL5gS6D2sI%nD$JdYZ%w`QNZMsxeVL71#*; zfGA%Ysk=i$C!`rYB6w*eGmeV<;}iLXPFJI&n zl3~|?q+b_0A+4M{N@x636TIM`qToGI@c)7`v#kL~(o%mVsu5DZZ$xu{37wGacq=#| zm3t>RA>|he{(nI#Uu1G566%ML8vY;}{3x&(NRFgO96~d`L8(X$nF~%xTq`&ss!A0E zC#3v}K=INDHDlkRqV9 z&mqnKx$y3&`TrbPZ2sHl~b40e;|2is>q)PB#+LfdbE*Hf*P79a3N*j zLrBrPOmIRnaJk@w)Zq%j35l;1xJu}yk?!-Ggife#WR##svco{?;Hbc3K>83;!^Z_D zB!f=@sr(tCmqr@l1)={Nl1DC;rLW<5;(s7@kS`h_Bm=Gjsl)3+FTp*xU&+(He&<6@ z#pmmHK3~7{QP)f9?|LXOh||LS`khY_Z7=wgM%rP%e&_S`J0GkN+DJ=(*F&K~{Ofl< zU%&JD`kl|$?|f)K`1+mC*YAAjdj&cxzJBMEgx4frzw@DYMPI-3`TCvD*YAAjeB|H# z&|}rt?|i;~=Yv<7U%&JD$9F)qGU&S=`Vi8q&9C42z!Bt_uiyE6{m$p>cRpXg^ZDPu z^RcO|32VoyPto+)b8e6((X8XsnjgFPHh5zF@YxON<414DU7ExLD~g8tUMotz)}Zr} zr!EZ-_*IUdS}||=_66ieY2Il zK7Kxse!gmjz5ULv{I2GJ^UK$bPI6w^XlDBl%9I&{cYL}v^w5~a^Cxz{Ro(LD=iC-8 zdd!|uP^0nIS$o;Dp&DyuIb732-o}cCYKE|l!!(x6cNl~nENz%($R6+E8n-frtigwu zBrJMT?$tfpp4T75@4f#0fExFma~j=P=-4VX_(hb%=8=6WoPU)3qxpfK{vMrhwQY}W zjYHa1F!#-GyzTw0X#9ye+9`GPn{>b7f78eO_ix{Zrflq7d57%g)!piLn~35L@p;n^ z?LClG|LpRE$NcM8h)yxA4Yc`O^Ml_S!`pf_{%(CDkzV{Pbd zWjDa1Rtx7(c1ej%-4C>vynkE1C9}eviKBJjcZfdyopxI9>H)(GzH!;^mOrptP{rVi ztCNTRcD94YY-@e5mYMa0dGz}{$4#~Y&9^t}`fE_P#mkFgA5`nM&#una2gzqn&dqvN zu(_RYpNPt}Gg3Zos;3`r)6%>3saX}q>cW0KnXyLu_V2VENvmsIncieGDhwr6DhE{A@-x8~^4`D0e+EMce0S08vUD95GQ$x7L^(yCWx z71}qSJ7k92VgHr*qr|HB=!<|8rOgYh@+tXg*vg-)<>-gZij|VDiSV{oQd+Yx4LYEGE zSNJaMUwrzl#}n7=?7&@dxAfBv*T`HEGVeys)g8L#G^r-J>2GZsQg=|%f*%cAr?5?r zl3QDyUzBqde=-#2C8@tAd8)K|+JOtR2k$is^nTddI~@ zKQB9OG3CarAzhB!^f3!B7k2gVA442^9O$ud?T8bjm(1#JUS{QK<`xL^YR(?erAw2# zSC*W6)vnRLjQUTm#MxYJGIZ3F*&|XX?mozFA3U^gXxpI)6WrWWGdnNQ{IS8%{OO?! zV_T1!y6!_6*EOnnIv9wre@mMeSLJTABYR^1SnYWueL=&(ns=KnpIR?y+%H+Hj{TXR z_Pd<8=7IAYKOdW#y{GiM@<(I`uL(1sH~CmTa^1JJyt`fbeSQ`8jLZuhW*E`^$P(?U zq_&%n)Y-#2ua-uZkiC0wC&jByq4+rdv`Th6kqUWD}!L3u6h2(!BLAfH3tl@)}e{T ziIG>jp6z$y{Ma`8MzIOqMxU@f^tbPxzF<|Y>!QL>%bD)6 zx#~T0)x7hi&0BfN=;@UdvgzZia}htwv+^zv{q6bltJ@!H_I*3=TEo3^{`&(?ZQuTE zbJ+FHnSr}jcAmBN(c9onOA4m!-1?LIxBaV3W4(f5UfN!pBDXrVw7Y-kGR<{z#PiKR zR$rgY9L`!!^cWoTs(-o5em}Y1wbt019UawYwde5(L7)2M4(?Z&?WkPVv?$l@oG_18 z?jNPiJGMwS!g|5A9n#5u4(Ycxo}Ksfw}5s%m!5UB-)8gn_JHJFJ*#&aeW{|&_hWho z*u1bA_uBcwp?;oyR;)N)urVR}r`XG^n9OVF?ik%VB&JFDpSWw=&!kIx=Cyly1eUpb} zcz}y^uXozb4?|pMt=Blj_{<(#t>fCkVGS!6-h01)!L*6j7rZ#IM;ofCRGo$6VCq#J zHkv->kAs%wnNM?W5kCKB*O}`pb{qe~p?CPaaGm~Q#;(pw{VkJDpF8u*&)!X!t!vWf z=<4LB#T%Eds68k6;Wt0?HjSF;`yr%WcB7ANW`Ew^M5CQiSkV7myXEz6 z&EK(iQ13aq{x4o{dpC?(CZVImBy?1hok&7Qxk>2AF&Tm_{-PuZ@yQShNT|&mrb4iv z3L#}GOsQLX%$2w4ZX7K?XyV64RpWoZ{dvOamusJRSCEgsd*1DK=##@W+a&*-ofv!a zc$b&=CO4h%_hGj-`E4uNZfN@Ar@M=A({^H>P*V#@$5b)m+xXTNW}=T@)T*w=7 zR$tca`vv}eJ`P^c=0MYm2P_Mg{E|K8@xDYe^C{;2nr!z7bn>XAF0xM*KLL9%uSICq za}hah5ysq$6_HR#g6|Iy`mnSgAZ+}BoMwd3kNFrOcpD*PlQ4iOiy`P1LkM3CVGzqA zA(I5#B@l+N&?OK;mOwZ|f)BG<3c-3Qgv6x~hOrYQq%W-o*AjD$eu{38UXA0e##5kfF~M8ZQ7dM$?#%9bsM zkh&Z~F$rUt*9r)pDtiJvb2Z2w~6yyum6>}l}f zb#z*X!eQ;F?CP9*LF%ucy=n3Bq1|qj>%Y0`E$Ri=;9)!*; zpM=@>A-LU#(3Q=(55egHgl8mt$DAKPcnG0q?(MYHTjicQl%4cBuD)?k(rZnsv4>s1 z%+rIbYmR<5Eu;PI%pX>K=(nJ2N~fC#!foo0dc4+W;_a0^+wQ%7e_;1R<4eti7kfm_ zranYJy&j^U9&Fh|2%e816qC@4c|C$qNJ9D}2z^))2^$~7Ddcmku(Zbzyq}x8?1)cDDv<%iu8JeB3KP?Af&z#hOn1!Gy!bOUnq-Z@E5WQ|3X>cwmmq=MGz*j6C~u4;P@UwB1?D=A^tst0ul_&;R6Kw4-is5KuBi!B;=9c_7TD~Hs>RR z*&iW1BVh(}E{5P#3}Iz4gjwtn2@gr=^$Efpw(Jvx)K3tKN%)?5eTLxq8AAGJ2q~dh2H^||%b1Nh1Z#5$iRKWNvlArblHjO?u#zQcA;fDT6p*l*Ih285Uj{--83;eI zd=m0VaI=80md&w%FxvvcGZNM@XB`A59fXxS2piZV5+0J!OM#HamMIWY6$r&7Y-V0% zA$XRBkX{x-I{v9D2!$m0mV>a3rImxQu^a@;@(^|~pYjmA%R|T}A%iKF5OkIh!Yv`} zVp$|)l3-f_!X6e{0YXRx2xmyhVm1{aSXYFQSP{ZLc7lXl5*#Z*$Yu$ZAjDUKP(Z># z=1>`eePswKl_BJ?d=m0VaI0e0qt}tr8|S=?57%tVZX316e}i#!^Cx5DI{uaMOYixb z!nRe@cZ{lbyJZu{hs$OJ9m+k^cuPmyYj(LivmaJ5b3C%UyU)|MpUd`RiB-(3S=XxQ z=r^{gDmrqiijJP4Bl$RcM8ZQ7dR2pPf-S2CA+;KWViHaOt_X2O*n;H%zGyL02C_czp|6hP2?*09EQW`mi% z9h4M16p>lJ9g5_U;ARiOjLor!Fxwu&GZM7S*#Ux+1B8_h5G>du5+0J!t1$$HEo%%R zwK0TZ63Q{JCJ;QEKuB)_!IBk`P)LGrQwSAVT2lxcn?kU3gix9JI70Atgpf@_Ri-q9 zplb#pycvY*EQ^Fp5^S48uwtRjA%rxCaE1gMX43+KbqffIEg;lnCrHR8!LcO-Tb9rg zLVQaI1tipF4y_>Aw}Oz;3PN3$PeL9EZml8IXLDLZnB5w}GYGvJir;9aTZ{PzL*x1v z=WjbTGI)BU23G@H_8gP4XJ6CJFM_lyt5)j0?B=TE#n0w#pZIj_PTT75_Pss3c~`Z( z>l0VyzUVPx+22oVuV;>Ju<};6K}UA%Q5$shunjuu)fR#STha(g|haIPEjo}}Dc-A>)(pq2h3)Acu^le#T(!PE_)OftrE^^k1hGmK^ zbUo}Z-Z|@+^Stcm>pj+-Ir`J5fKnazV?LeHtaoShlieBp3}8wZ2)Zs1!n;5i#Ii`p zB*C^TVsA+4*c-pX-sAA~&w<}}dL8Ll`DE~e;&04W&Y!sJ^1jWREq<{nzsCB5wP$*^ z(-E`$pmk&NHg&#tteR89o_RZdd6)Yh|3EbJ?TXktgLdh$rW-o4?uL#MyFnPnPLPmG zg5!4(d|ASG5aPdsP(Z>+=HLmz-V;KKCj>v1PeL9EZe9@l*&Htjv%MfZBO#DEcZcBA z9m2})5Q5nw5+0J!s|SQowyXz))E*FuNf^t#dP4B*2_d~Fgm6|wLLmvhy&y!gv|bQ4 z_JUy98^So|(;I?!ZwT2W#4x1~1YI8p;e8;)u`CiYNwDn;VFC;73n8R0gfk>0Fq?i5 ztouPo><3{IJ3&G&36A|CB(jA55aRnoC?LVW90owJ9{?d`0EA?gPeL9EZUZ4qV{-;V zm^~1}GZJPn=Rpvh20>Uk2*ND(h=hkE^coCd4qG-DLh4`$#Uy;syoNyV90DPI2!s?? zL_#46zTOZPurzN78@(Y|`aoF3e0(5y`#{Jh!N`=M5OhN!gb#(Vgk_PCNrLS#2#kde zgAg(d!Wj~lF`MBKtcOEL91dYQJ3&G&366A+T*(rAA;kMaC?H`qa~J`^eguS+5fFZ2 z`6T3#;5HJ%S~h1SgxMn@JR@Npa~=i3X%vK&qabWxk4Sh(LN7lEX>6Gvgj7EW#UyNI zUZWv+j)ssv8bUfNBB783Uw;VOSeieCjs6fU10d{RJ^>KC10ZCRkinEd2)aNB;eil# zu`CiYNw5uqu!n^PK?n(gaE62|W)lp-Iv7G?Fcv2L)nlfQ`Ot5g-}9&ywENKRVRjvE z{bbv*>Au2b*Ly=N53}33-E(~Ea+mLXPaVk^^LNaRdVl{mEGOV`$kK-wmezm&=cb*X zf1T~mvV+a64KJ65|K;U#zo&7EU7T<{;}Fg^%jNQ`Q0<+PEL=ZzgMhTYNyFAZQZ)&i=1CFY4l~?1J{Wba<*Fo zL&UM4{2TAOyt(bm>nR6Po83!@I&;TnO@#C4Gn<@;u1afkH)NyB)wdmd_U}o!(q}sh z4}p1&-z*t&?``h(kr`JyX&XCi{yg*IyE=UmIyUKjzg$wxh-O`$ZH#FlPhRtVTKQHJ zf3(|H|EDR7rK*c|R$8Ll(eST#p{2|_SlYZbc@ujC&a(~h**Z3Ths`w0qSlSCcP-k} zZb+5GZ?8Su(yH<|KJTyX3bU#9X?4@ws@v*LTk2Gpsh{XtuK4C)Bt`fJ%DY~ zS3DlFsvrIh>x~Vrb(_)3ZNtuwc8@o84qCTu^r$iq^O{$0)o{U#bek>ZRyJ#vl{UAA z&857-4fBqS3HWi!xfRJnw=>7FbSD@Kdylh6V`1;Zv9LEH)G}uO$Dvbxnc6OBU<@m0 z+@eOH?~LjDa%=Qlb=S_l#pBOgq6SvjdCO(~@M8m9d?GjZ8dYd9a%}f5`JHC6DsO#D z*?Xe2y=y<%UWlpvm`$K%0_6d!gZ4x$Dwwbas`|u&(@;~g3`r&xX6IOxO zfA?zq*5X*^PwW|)*K^aSrb$<>E|VLM>v49)f|K5FMx~$L9U9oOa|O#bO5N{{)R$JbG@4CCX$+1%A{a)HUrAw>E*&{xG&UbR1cB$8^ zxi>OKmftn@smCa?A7IDn!qGK6KQvNq-iPTQtM) zyWVSl@B~^<;_%$(II(Mu% z%>I~rRZY1A$G6O}xie?Lw>Bx$kKQe}zU`USx4Ru0J7deY8}`@@taACp=t5RZ=5@8b z^KMh!fZ!3IKYio%qM*^~-Xk}^s#kHq+|h@6#AjBi)X}PTmF0`qrwuv(vX4vozZTu} zIjU(lGU8^O)3L!(dA7l&%rpHBlyugZFF1EBU30(KGw|xUjB&r-KDEs1SH+@#=811B z)UIZ+v1KhKm2K{GdArT6es$~a?!U`_vf0FWhaSi6Yx(4Mr;pN{S36mH6m}ZhaoB0D zu+VYXX+p-)5l2Ekvx$aa9Zg4EG=yvH1PQq$IL1IIU*4_d>s^jhZ&W7xU0Kp~6 zCb&be5TrnHC%87aySpX9DXteT#U(fdid(S;_Y^G_oC3w+`ChxT1paq>|DX5$Jp19x z%=yhVK4;Dx$vG-mrDy~~kqCtO5eS|VtHJ{nLWUuD$?RbWvxXsjQX!#K9*$6HI6~xb z1aEn#!dn%Zj6g^tt41KK9D(3H5+Rv18i~+wB*JbLQi#_mg!rQnx{N|dB|B8uu0p_Q zgf!A&G(!8)2+=C|itiW%pD_qS#vs_`mrP~A zeaSmVrw1ONALg2UD7NyrIR&T1G^n+NLE57Q2ZP+dji6&2?(E5$R(90B2=1)5IGScP~NHVR)r>$5c0~ZNeC+^A$U(l z$S;j1BQ%_huv>*7@tT4Ve+ojEDG0%`Lxt@s1WZLJEFGpIw4aI)twK@pord5u4PnSM zgko|`g`+A2PDdyq1EwSNpN?=%g_4qE21523G|`V;6V7g(_W0??1v3wgw>|L2g?)X` zypOiMpV%`&h3o}WhhF|6EbY`|Z#Fl&bhzTnJIhl}h|0Y9^Of847aS~-Zt#2eu3X}D zwR~y0qRCz+St&7-e9Fq$nFwQMB0N!{yc89LB7!hq5GqQn3J+8WnT1eUX3s*HHH)J8 z4m=jIDt(qN2OF+gFknaCtz&FCtCe~ho##$Kl6$|84Vv?;bmd1&H{TxiCgbx#OJ&!H zphqdstr|LT_sC%%!-ln=GVGh)t16XelWe8gtkE82OEh;!vEWiU#_V5MFZ%DJ!((HP zPRiv|q1^G61&d6d7&+xwzRX=umOoPN+V6ggJ47Ye(|>qxx4iy2)>bGQJ)~In;ol_d z`a5aIzS3g+(jmJ_&bWWzS;i$#`>u$#9?gC7(e)E!_GW0~bujmoQ$srWuC4qyjqgvT z(luV2sB5CC&sK(~YBc3Q+kkx+LwX&}^b7YD3oUpYfXpm9E~`{v!1E6+iY0sh>CaUcGOM zS3_3Kq1G$s(7N7pY28}VXf8s-xwP)wJCCOAxwm40@9cFO^OSkoDt3LxUN5FscYBtp z%H|gP$7StbyL{)EgL&_sijC-ar2p6#@5+rH5Oy)?$3G)G{*g6v`bpp9Q%Ah!k!<{V z1Yy<^gik7TlFCaFDlJ8bT#C>|-l_0bg(k}oy2+|#2rHK%crQojA&r(J zG+d6bTZLZYwE`jj3WP2z5cNOxTmLg)NH%3>#CL;L&tWiCxMZA3KU7sqa`+yj2=XiQOG)ku`+ud!mM=& zpHvtpmDeLwT8|L99$|vKQ{k-&O*SA*l2scJR&GG>-iRqxDjEu3e&`E6GHq= z2wgTI%#a-_Y*!&*GlEEm%?Rx`BSfn(TYR@5_-sKKvISwT98=+_3V~Y@=JTZkg#KF* zuBot4a%@A$z71i*HiX4;MTN^Ml!!uDB4eWv#zY}JQDK=B-HuRXJHq_!2rDF3g$F8x z>_Av0vv(lO+JW#%g*8(7SAEn9VT8!T2+{IRg|{j+`3>Qe ztojXMd$Z>=iIi|u<6#`EnT$2GO5c;1$xTeAl$?-cv_TLdE{El!-uBdQXg%Z&S zf6CZsgfYxW%enAS*H*_sqjcDpGK&38X@vD z!V`I?!dn%ZoI!XdtIi;-JcHnU7U6|7I*ZWoEW&OTUW(T_g!t!}?VBCRnQznWL7UbF zmpa?8@Py~}6a2j~@Mf`rk004S2343p;%uU1+qc*BO6hxkV3wi3XDPMU()0c=nSx?G z?>D^AzEa4MZ)W?~vO|;IPO=hko_yX&hw}*S&m%;u@J@U$AoyHB7;*vOgB(-gs0x7> z5kAR)iwONMB3wgo|KcGzFX=M;63T>2m{{b>B}^`>P~tK|JQ;f#Va#QOCn{K_=oN$_ zR}ki3LGYAV6&|P%auvZ#W?w~^brs>03JIlh3__(Cgvb~KZ+WM}TNRr8fsjO2{eiIZ z4+QUP2+5?;HH3!O5O%AOLcFdc#J`Tv&Cc5Zd2Bh*rT@d~YK7 z+(a016TvRWR5+?a;4Opz8E^}s|1E@TDx{Mfw-K`6MwoCLA%k2|;j#)P{zS+mWB)`L z^C!X+6|zXtI|xPYAk4pmkWFG$c%VYaU4$Gm`!2$)y9l3D$R(BUAym4D5P1(FP~NHV zR)r?_5%S8a`v@!VBX~bR$S;i^AT)e{uv>*7@rp%=AB)f>79m)6sIXmyfQJZ$rNcvn z_74%FRVXUHj}UwwAq;thP)v@ga8!lB#|R~4z+;5|j}fk^P*QR{LCF3DVZsxH(sD(G z%PN$3icnU@K1CSw6yb>q<)!E|gd)!n=08KID6uL$P$A?wLS>o#9AVaTgik6|mC7#= zD!o96e1Q-m?^JlJLP#T?uB!Q0Jnz({?v&_L@8~tZQo&zRZ@gQ6+?mngor_P+KKNp) zrz4ghPZC@<-`&b3wyY|#V)68%Z~QV%8?<3~mBA@|o5!TE<=WA&KzA_QVL+R9GxI5+htzVM1brC2|G9vQ+XX z!C59_aimC6k3{k~iAOc}6;{cg!lSC>d+d=WYF<*05#D?b+hb-bkNDPle1R%yRF9z^ zYb;TJr1KbW(+~;IO3;J`yo^sQX*^1*X2}qBCacFFOTc+#{(dX`WfRBiYQy!xiM}0r zx6y_54^bVmd)$a;P2QQeacb01M{;X(lU&^{yarEt4Dhgf73u1D&0l!ksB5`BV&Y8= zO{r#4yYhLwO61zuQo@68*{IySv`5YO)?1g!E-E6sM>=;$nwP73bhb{qLs{g^5RXn# zTdH{sws|+@42Sohg?GeFs@6#yX-Libl%RD&i(6t9?G{H8gBu{e<|{HuRD9zQt)F?E z*Gs&!dUT80*T$oiHL6q!kD5;V@y)U4)8=joqxM(x=;xt{qad>1v^F@8?n7p&oLMDvHhP<0ojY_TtvyjMdU{m#NaZy>E}vnTX|Wna)#~Tb%GqT5 z0zBpkmEYnh_<9o5UVkE%!5-P-4P9o53d`;h;cS=cUo({EE~68cJj-=qaegdH=lwta4bXfwCtMtfnB z&^OziG1^OGr!R<%G1@CMy=+hox^?maG zPSNr03@xYr6;Y&#{Mp#)i(W???F*XLF*zhs4?hcypmFJ1w`4}sZ*XXol#t43Ry240 zl#{lvrx86(G@7@u(+_Qw zG+JV#X@6BUS`woLp#2JLIzIoQ!PlnG|0P)98>zo;~Y9joC9C3L;V-_~dTe;i{Iz;FDZ14vfW?emPP7k3D~_gplncIu8SzIW=0>#Wz~xuU zXo2|MjaCLtTSi+Yp3%x1I|hK8&1e(__CZ^8Z_NOs-bC3IF7mb8aw^SinanD$#e5JcC}61!f4ryT^*+urr#WM z%WlNFCc&a;IgF-XU(o{o00oWKz-W9l!)>ZI2fv1B>Mag=jiw)J(E{=@PPYJ~H8FAd zV4Pb)cgG7lc^kSBOClE682p+UtrY$rjn>>~rO`GR&Gi+SGH4r(=K3N`S+q??)33v* zw;XK7qkDB5{g8^*t~_iphOW=YR6yHm4BHvIifC!jboXy>60C$@-|ekhM`KqRzZaU$ z2%U^p1^*W^(;1<&i5pgxjj4#bd+7IPba$x+d?3^D>thT<*jiw;ekQ@{XdDI|zy3z6 z!B$73xjs8n6Rnfc^b<7dtp#^=|JMm;5F&+je6p>PF?4;CrVe^`qq)9MQy1+z=+D)H z_3%#sokzk=diC-50{sm$88^VM13Ntox6=Qbc0?u4M;h%X{HM&k zFv?^Sigwy)V~ky6v`FTK?6_l%#+uFfQd-=fjn-7h-#9aYj5A_0w0>wgaL1!*%QOeq zn{oAHI;ypRcG%^_oowQ^#NQlECzmNkYlVLxySC0FQ%&5~_`}gOf5%sO(B0a=SVaBJ zHj&%nA8$1MYL8~z4mufap0R6>)&fl@q4`GZfPXP9sJ{h9>xjR((H81wceMFCfxgv7 zCznMglg{{SqUq%Fi_yB^uWcePH3@b_t7Ghz8M|(1dN9`C3Zr$$zrf4^t4!P;TK|QJ zI+3h4Vo&@bT1|dyjHZJq5q70<*BY%i{%6K6(rA6quA-I2U1zku_+yN=-e~>MPNJ35 z_Sdf+X)E-Hort>MZ#3Ef{Ik&Xw+T(X10j#mwis;?T7NX1AGVpegYmaRtArb6v?2Ka zf-0~b&GAi_p=>;)1UeV&Fos&N=SKV0XyIu3^nm_$qG@YJfF`K>^B!Y24F65g-(I5) z$FK8+{`MJdgpR-a^quZ%`w_KLBSH6H{poj`G`~?0VYEX=8;z#Bs{RfeZ47?h1@-rv z(Z=G}52Weuh|zw=e--T~?f;`j9EYeMR@43Yn9;_opWR9K=i^4xNoFFN?$0OC_~$ke zBG8)So;G%q@OMGe-x;G##_xJ1_*vDonWsQ?3|rxzGlo;~mokyh8*LieEOxQhxEG8z z9sgpZ=|`%xwPwI_qg^uEOtj5t`n!zAKR1D}UyXRp7|uf6X|(G`n~kRL3u%LU15LYW z4(R*jb$+;orek3)=tl;0ez;@e&cpBe*uz~DcRtz}x}6{WZ^Q*`>9;}j7i$t+h+jWk zqVvOJli(u!o>WukhbKl`j9fOYlc|@*lq!4vqF-%En3~ z{$&i8q5W($eI27V>vC8|HFY9+WwaIebwAeq{kvC$n-cbE8xTA1yiUw_b1o4`cgf&ZA%5*qDSwBtr|eSd2w z+DW5%8@pX-uFp**Hrj5q{a*CH?gmMWxCj3bN}!`#zn!M7uos3JEt%2wp*18E{pq*W z)NViM$7%GZ-&0fV0O%lGjGNME2l1ydcB%AB8)|q6dYS>JOK#N;!z{FAxVq$4?KjZz zp##syXh)2u15cOXYIhVCVW&SoqaDMqm0OK#H(JUv!xpMdFRECd+sceGJ- zllEa+qebICOe<*frZd_}{1K$5Et%eEr||!1S}TLmPCM<|IbIHt(THadb=T2^Ga2nH z{=6n~W}}@$%V)GKMmvwDEu(2j$Od|5yASkiR=-rR5PktYlU)YOLC;`U!V}Vd z3eVtqd`{C};L%grSMVDChBxpI-iu|8HJjB+H`pX_jny8aQ-n?lB`H>M7)ej0C)aV2o(?M=Mmj{a_qDgRceOY56fwKZSYxdkraQInoBH))eVk2C_NKuNxC#2@ z)^!j8!(cd!fH2VS(hh>|&;|5ExlJKES`_aOvVXlbTUazP_4GndCyv2!;42Pp7vU0I2L0N@IXDmcMTnDd3Qofgcu1>1 zg2$krz8DKXgPvvRH#ho1f6%juK`z84fuf_0wAsA*l4u} zrox*Tl0Y&@4k@4%4L+5|p9a%mCW!RdXsu{%hPOHQ#I5PVI^yjFouLbKh3ZfX^n{{4 z-P8f}vuu^2D(JW2(t>`p?i8GcGjJBpfnHM7%Z2YiF9+%g$8^$|2?DcVHq5bcjGc#P zzO>k6O%t{h?+RE6tKbbC^%gvsysV&Ke4GMPApv6}B{ap~3>v{tP!7sN1*iz6K#xuO zmGZeT59WiO@GOEQu!8cf^x#6zDm-&x9?S>*p7I#bFGDv2eO#wHRD=9bKyqxh23h(> zwb^XVWl5#$AzlCIdPmncVGu6!w^(y!)D!+*&=>RyLwTqOl|Vl(e9uE3Zn64>>3TdT z!zUNyhCs*z`W+wrI?7>qLX+qxTPDCH&=1-Tz`aRYx8Y9+XL~5(F1HIoVJHGc6S&Fnt=42=CE3s=_G?Db-!K~%z(QCG%U}hpgw+rU>tGY;QhFc zs~!Lk?A^c}{$l$l&}C;ms1G?nzgxHybm=(`hQcT)0>xk}mD~nL^b5Ji@EnH|@H<4q zNl1mEu1S5s3qt9d#?TaA!fSX0Pr#j;>Qc2A=m$U7!Y?ox?BEXpkQSEEB8}*RTX0)u z?69V5QJd(Y&>W&b&+GIw`ge$iQ=q5Nx&R#vJ)kYr1N~sRewL{$=;z{ogT(mb!Atyw zps;xVYRwcDh*w_|JP}I6E^2uZ^gFco;5GaWZ{Zz$f`OEH5DbB#5C-~n*7XnqHK8yJ zp(vHevI==5#jT244a!3WsHl5)B|N1d59s<;*Q@$%+HlwmLrEk*S_MXPZ}!OgP!@E7 zt>-nFK<{6yB7?V7zysSyxanwv43G)*tUwp-x~R?ydcG5Y-aTGIG9lryFkS+8TH9Im zQf7?I-f3+XmYb|kVs;qLki34NDiSurKG2Jgtw1j>HiPES5E?;$iZKv|L0{+xdfm?# zQbSVcMpk+`uMt#(5YS6`dYP_@t}FEp-CWAL4Bk=CLKJfj=%u*DGG&)_O_*L5(n~Zk zT1L>TFcYCW>EEIJdMzQ0ZN2K!0rUymYPi*57B=%hFN`dQZSV=+!F$ka6m391**O{X z5W$<6be;Ty>ddjP(xOz%^5>CN>*aM!}CQ9H|#c>9wCv1A< zpc?_XAUFI>p~gc541?j&6yj3{Jq6XesDCG8Zwbtj*L$pa!}O|_t3CCS*#*k4$-ct$ zCFnVyD_qNZ4qW9uj9<&G=X>GMh;9A)s%GPd+n;Rag4!s{z-7CeywGwv&i959P@2f< z>N#8x{sJcP_IhEE-_6I4bGX1Fgs(u-<$gE(O`!>ByqZuHIznLxlz@F!yH`8P(+bi= zmELEa6wg~Pis;3XA7F!AJ81pWvN3A^A!|HKSZd6Y15YNn={uVAxbzHko2L`pQbG!- zh^AMp)V2+--u7$?exNVtY79St-pyzL`X`LKhwF34`qH4BkPkF&HQbCq8o_Q=@KlDp zptn6-31-Hh4KhJG@CQxQ7bL?Gt529(>RIicZtWMQpinazJ(bX)ZrxYfoLtuyG1*aftI zT%^RWSBBJX5UviO0l57^FE{i8?W>-++Ao@p4ivpN6@&i-Xww{rU)|j*xb48BRdkI$ z*DR?cFdJ-#ZLk&QgBDJ2POk*Laa|BLN`})sDY6Fd3eZ`6Df|M9VF3(+fpDL0>W$kA zx&tQ}jzQTIe-9V{{h=T9g+5RV8?C?AU5hZ5`pm+e2{T|COx4x%U_36vDflPAL>LES zVGN9h;V=?LfF4o8L5IT-7z%m_QkzlmGiVxBj74TYWyoG zy_VJ+=74J7+NeGkv}Oxo5$Jf*G+eGLJ#Ez`;M#WiHNEBjCO{Kh1=>SusN1XM*cq!m zY{NIw7W`45y><)^!hYBZuJrff-v_&4m(ev$%jybKeUAxKO~c30LoWXTqtSbf+>WyG z8yt!g-41`_KVrhw#+8XHb63Hx5*7`=gAQ$NB-wY?nmg$ut)C zF+74N?lSS5HEozX8ER&F{IcNx8^0T_9-s6$^@Z(^@DARCruiB4c>V_W1!$aCpbLzb zxPQTG&^T{Fk8hfXrm33d^~t#%=Ey`da3$_KIJ%YxA528mHFHfw?KQ#w4Yf-QJ*Z4~ zNDSVfJ)jq_J3za5N!cS1+Op9GzF6ef^IY^Pf*R)+_;cdsfXt8- zl7OIR!p#U7AQ_|sKk$K+kQ`D#Do6u*JuS7--r)C*$NZsB0J#Fy&<<(;L(|0kL2cE> z6-V{-pqXoCnz_1Kkt~oERMYe|UN*=Dc|a>LL+|tke%;`RjK3fRK``hkP+@2Zp->+x zK}DzodYY&SmBlR$rJ$s7`=Bc|*{%f|ugo`L)$vygL`q9I_ChTe=ZCXvlRa$Mb#-N$Dz}3W><2Hk)&;%YbnABel zT7gzTE7Ka(-c@7GxIMhYUdKhZc=Uf)Je?pZsMrN`)OH3Ph&u4p?+SCdb4YkL=wzpp zoUZ6~E^(yPoGFBLLpDlo^6UQXN^cINT z3ej64ozV35h~6gA+a-Dc(pw{mU>mkNM{L2>Mf_$>m$WwFt^=J@*5bM*xHb579tzWm zW;GiV;Aa>M;V=}2fa|EFlfM>D3#$Fr5CLkV8Eb|k*&YGIK{Xc|HX4oi zg}fnK+F`PE$nCfzWHM>iCW>}o7^BiYt&R{uua4X_>@$3$F> zqc#cYJuTFqkO04)_<7>mzysXi6Jc-R3LJna*rsDw8)GYIt+nK?*3iWF!*);`)m_>? z{F>oT_!V}*w{iEdy&HBJ_Tp;IHNAtN+nVNn9SR!o8)$-;;TRl+!*B>R5sjb)RKF&! z;p*3TM~wd>uJ*huty65D1hqc_(V+3PV4Cjl5T-Ra4z5hJ5Nhn&cDbr)Av7^{U71|K ze;zcWb8r@18J@v^8eExun~&O%c9@3qy7H}9#>*I4s0RT4J}+OJOCY2+7&vUbdc(< zsW$TY$btfACXIxG53w+)G zb--B6B%uc1MsP>h2-@87@Vok73!~#gyG!jgBdf91FfF7`M5=40v=v>I_*wz&e^=iv zz^^rkPa;|a&BzPCCZ>sKpQU0uF&x0}jjOd%UAs*EDbZ3ua!3YAAqlufzovB(_P{O( z+sl8-e+IZT-S2hq=wzW0T)Mit?Mmzvew|BnU)RLd@3Pl1Wv3AO1c@)Cfz&{u|7ZVe zZL}~x7-&STnQGtqHQcqW8EW|7pt?Suq6JV*?-$*#nr?+Ll5W#YTpmEa06iws5TUqSe+NA29bW-x-{hgJpG{`3;|vKCBls%Y&^!3 ziIfX}5$Fa@ArP{`M8djbI|4T++v{Ms)cVt!qI7S(dbKJ$j3n5OI{|kz_~9Rgs}}>t z;*NozL3?z(>M%)`{b>#D@&NB0_!DB_9Gr!@aFFP;ac994(DoPHnJ@#U!!(!*0ff!L z-AkO)xCKB*^-0`l(97SyOOHFON%ye15az*rxI&Z#xQk#FsOd`F#qbNPfMu`*mV#c! zUXI%x_cpe>@o#}&VJqx_?XVu!!CF`iYamj`(-)HBr-i$Rdl&S+P)&wY4X6$!LHBY$T-}>f<37ahM}6$21e9Z3 z1>x={!2-DXL7(o*3>hI6WPtRL4$?vZ=!o#gwS)e#Tw;ht)5PC{m2J(q4ZLGp=Q?k+ zeVPw>hP^?|ji{HX5)qIP7US1vhT=ha!t`Ffo}_&OZE82RHxXIK$|ttJz-!1u&|kPu zL0d~#?k{kk!4r54k3hqIo$sq;kSnv z*>Ay3xB+_8{Tgl_+~p*e*SO`;rm&rX4E0gKU?>hnpfD5!)ik^iuAGNBqpd6HjGNAKlaqtGc zWLFlg3RJbq>VsClRIZ-X=R9hGp7uYGqOsOyUUR5|wqs*i9BWPE)t(d@LoV4LYb{%% zm^J|D9yx}HBVZUrfa}hoPB-5+tll{sPI!overQcoc`@GkpvMNi^sc* zpf~I%fX>!BBlpEW1G+&MI46rqE=(u%I&7X*GhE$eo8sz3J`PtW_r|!Bp*y(7)-?Q6 zK_6k!+UVGtiT~SqXdc^hL3>ZTdk!pug|Gk^f4Llg_oQv8ZMhVd!!pog+(;5m`h*RB z^E{(|dSor`D;qp)1!ekkYYJg1A-CV>d<`tm~Z{^_^$+h$Fq1?3g#(5h%EB7r77$% znP^Nd7TEb^!e0$6E)$Ltgrp_1t@qj1olm}WcZJAPB6o5`zK=;dOo}`oR3mZH(PvyH z?93&YHwhUx>C?QZOv(6|n=@zjGD0#D^0w*hp#|q1{}LBcl@QJFUg<3HUzaU+$Q2^p z#Q>@E|=lZjmS`rgH(Uq$%2LSzq-ou$2lNdS=p2G+3L9eg3& zWx@#KnBYgqu&N6?JzABZT3m>o5N*LEx6kCy{qe-dxRAnxXli46&dqjhOl5CZNK`2= z+W{~4SM?>_$L8byrM{$1Ve_#kY{2}E`TX^7UrF52@mexd7#^l>5oQBL;<4Wv{mn@{j-Vk9QUz2{YL zSI<$eLtKn_4V@v|)?O|$VsQFHaUscM0wuI(z(A|upVe>ukWRtRsX~D~4AZYwC@3+h zY$3dmBu8pnF0VSqysb1zZS(c-!zTA0!h1|P*fVSHb^}scays@7j!MoZmDQ)* zyVSNISM&N8BvvY7UHP2r<+DCjro|P?6>DG`TS2YehBUSUuHLasluv1B(}I%5#}?xM z-&@JFj%@O=`MKY3EGM;#|86V~d~7FOiOOkT+sCi9>JxRr&$d6Fv)fGXwF_RyLl8O| z`j6|qJH_Mo6C6#X`?1@<^gkg#@UahDi2I?A^0cchwMRj>GaaRSH(N?Mp3auGP#UiG z+DS3X;pKI***khT#uxi~QMUqw=&pFL=D>I%^=3!Kg*X%N@t@t9!!j0w9=D4gll)Oe zcT4^}`SS!7WZZO?+Uac%EYqb}23rs>R_T_3=2|H+8R@AlT{tLfwEA1$d%PO;hqKL# z(p!hSMD597^S2mF%Sd^h(H0bZwX3t%h5c5K4qW^95lW&NF+j6+b0!rVmUCKN-#H%~ zAqBNP3QLnrj4AzlEge%E+WUXm)!^(EcS{gMie11hg-ppr(Z81M8F8XiS{t#0#^zc7;GHPom7{Zy7Ab#O@(3H;)2QfeDDr-Ch| zRkt=&wT1g1BmteV3mw?&ALIFcSX|AV7Cy$(M}}5oOd-yxW~-*|gKD-pvMt0`-9K=X zbC1g%Q?zB9hox6%w6Is_38M0trLWG=ySz!BS7#{R-XsZX*s59fNP`--AbV;4rb~M$ zX#3$?_ZCF8cK^CB)t0?AY`*S~w#d~Qws1>V39V@>&x`pM*R<8+MM-aJ(ujp6S1nsR zUK2F`l+9Px*0L4km4dfa8YqvD?9(|jPfGG{h937^vh&QK>^jM7r@1YaA+*m+vyN?x{RIX(4QCwFZ`_My`&K&Z$<)Vd zZ%)-AAwP+&LnmjG!gWc#sB}`Nku0oBVcJAF2iLJ8G3?eu&S7UC zj6q6L_sv&p&RO?O#WPY`CSaOzvSg@7>I5A6C~II_7w{`%$u|o~^C_bCY=E ziYv?hasNe(#&ueJijq?G>59^_zdnVjDlzKRlh^gx=?N^?z_x|=QN3$Gl}kuqLrPk8 zr*m8!wZ-a78;1og<-W@qvTQ@UbEDkvl_5kMk^L~4M3cBZ zy)oE)zUbSGub&o)OFXYwexfXs#E#=1y4zXw;P-k zP93?Zp1UQb2?-Eus4c{P&1~N4oaOSeDg%x?6Qvrw4X8_~%{Tb31I`0x;|Yh>#!LTe zZ|cE{N1OH&A*m_Xh(*mWmdNNi)X@Y5brMShLnz6V`-`bXu_Z221zGZ>rYRVvYI6)*pqV3!t z9Ff$`Y&qRO9+B(KY(BgWF0`2~1Jm7*X0}|`+{aj@NHYTDa5GyPUXgXJna$Ul^0;Gq zY-memNh!&iW8Y4Kn%i=@e>g79o7>XcFP(6~3bvCBEvarVDW=XaS=a(+n%rnj8y;w4OKx3$l5;Re`&gFCmllrV ze;dVVYpE;UTC$9ASd(8ndBG+zPPKHz(50j)Pq#`P7DPX^w%m?UjdPB-7ND(QyX-B!63KHc6`D*jHkwYt+(bZycN#x_m&K z-C+sCAUFmCUkn2L7RIjGnLcft!7D;^F78sjP@-YILdL{}B<71Fq}`6*(Iw1@`ZJ@? zo*&jMZk^_=9}Q!tn)V)7oU>)YsaXouZE$ip)npWCV@61gb~Ms-8PtxRnkco#&>7p> z*>ZnvsYt%;K@!`qItN*YW6`$mXPa+ux0n>%j!QZWg70CVb4A+wS$qAuX-W<9(3NjN zE@G0qhRB_}eXss8ZhX?ON5KD@c2-$T+Po8RXM0<$r70(qthIJ@u%)wfw3p#(fu5-}8s0x`$q$i%T4u)r&#kQ_>qNQ}Bo~hV zPVDkv*DwCT?17VJ%#5>(y&=szF&lf|bf%Pc$B+E5sxz@kD3p!n)_?bBmTCovBdF zO)1r#HO0f5vSB=D9J-c#cT;}vOeMYK3nm<-I3-D$-f_&g-*S%bMgy1bex2(2y14XM zxOTC%v+u<~501b2r}#WSHi?hZKvO*#U2R3a4{GJ!~25yB;|W=RPmD zX?ElL70k$I?>ZqVdfI~guVSFBUTfIjonj}oe2RgtxiNVBNLu!^6|n2ym}<&}>&k~j z7gi6(f;EJiB$M?dVNZuaQVa$@J&-1J)u(cfBphQouYBrBFIC1shgQhd>_y!=#Js~G zpYw#TzU1%4eA`B5_hL`!Ez!LgH6!J|ZcP?@Z?+aoaBq$V>t%Rv^2+m2#3r0av-X}Q&(pW9O07r5)r6#^kQe;-{ZVJjp`|7zYW`gkLH0cu`e67=;#oWTOxRh<6pY$9vou+; ze0LS#I`y%nm1Hys^H?sNe`}I_+^^7vOKl~&D^Fx#e_J*C(U;CX@lO5rr|08u4lx-P zGPbTd`nWPqDR~EwMV{BrXtP#C4yxVP@4AUbg|MfFP(bGX) z3{!@B5;Tx8QAHvKQsm(>7so#Ry|Wi(N9UJ6O^Hp4xt?y&)Jx=)+O3l*LmgK}NMVQU z9gcKJ0tVrnmBNEKzmFk>#I)R8kCyKrlwFt0kpd%?OZM+&(IDp9S6C##!h7$NzPENa z?jKj?SV9sKa(+?Chox_QY)pu`xZ*h1OzlCYP9LA^umxClNwLAMGWoJwcVo-`FNx6m z8|BtWhU>1ujH#p_oy9DfC}zZ)Et9)A3gMVz)5;4?^sFQt!Vcs-$(3#+Y*uI8Q+v>B zj+*P`0sd;bMHtq`Z08VLQRBBc7P4n0$xs^E8JylB)%@hFn4>B#vXgGnn!v-?V-5m+6UY$M`or+K?ycbC2+*j*mFTO2#` ziDDIs$)IH{MuzH0af}ZxM5L4#BOE>9@RuBEv;K33JC-k#r5VG**%FRsuPM_;Iy%kK zxQ>?al{}+3HFxf}GGLS~z`n%heAj4%rO@~+Wva|_^rPcK%UanuigKHsoQ3`e+sx6N zPnd}?kwlCpzts|g^KUZ^H8FP1N!Hz@VG37s!ComFE)f??CQ7IN%< zj&pA3Sr@N^Z!(TV_Da8T#Ez6Tx^+wrv*mxD$hz;ot-B%B;Zz-U=3vUz9x=-YTfsbq z+-@Y4Jma~F`Uq=X*e2Y5c35z?$%V1zDur7A^J+okzDX#9iEGvZDIMuKmoq;89*KBA zF6qsk7cpzrqfIkNPp3I{RaPN)#&f7ifkkpGGXCbhV8Od3jj-T^Qgh5A`6p11!crB- zUIjZnM2zgUyTY07o&2!V;~34`RKnDtr!jE*`NpXat498WfnIsVV3cg0K;!->!4o;b ziM;CE&$qlwdv$X7g6-I`_6w#=XJ!6G5_;=xam!9lS<|O3oNjQvYfgiLc?!Fwmopex z3dp00wpcC=&qNwnQRw@^OfUB*&Rn-fhfUpLu^%N65J_@5@0t{T@PiN$eJ z6ELMp*H(+B^^3DO!%|gyBz1~=)v}MNwBJ!0M~|3%{r}y9mEUtx=OYv)CR1+biun62 z={}jW%>~KywZ&8PWO;$ipKKe;MYLN}9fPR!6sD7F$))iWj-#37%v@%Hl~cF~olo9O zVURi{E}}J4d$YA$hD18H^6$6V<>*w(U=nm1_#aE<9A_;8Uer(Fm;N_LXE|zhA(iBt z#%Ow!N~%obYW3$-GL&t*XKH5~&YPd?{M@Ifb)DtB`{NcM8>f+3J~^RIIcf3AIZKDg ziwy`ZWZ?{)esW_LMW48a3Cxr-oULvi)3_$PnpP$XjrtdHQxJD*SGn@;?#B#RnCaRo`$?QjCo$>- z$Qmt1Zb?EL+KZ%f&PVAlT6WBOd1-W9x@F|qHtecPlUWRnP)WCnEi)J#9T4PdW>ceP z@?r@loutKVB783%mp^B7sJoSZ=1z+GF}*WW-y}1dChGWe-ndL{QgS0{e4oBWN-se4 zmFPJ*dBnoFbvY&F)^Rb>$i+ zrs>(YlhIyrtyg+GqtB#bO6qK*I1_DPmx&28xjVPME2n)Of3&OnNcAeEbB0$xF(+;q zo{)`;NXc0N|J&H-2QaE#C;PmASb_I(6nX(mB4C4XGbg3pX8M;ak!CbTCiU~x-N zIUa^5?*3&(&-!uY_^!kLuglw2YOG{d`u`XCYh^W!|JOy6jH_+Qy%q#HyUsaJ**~(W z*E8oQvVzX{`LD=fZ?f@1qhv%j<7BgV zvlqFhH@<H6{2@6UU*z^zzNM^zwJ+!LNdy zMI8GeyI+%0o)>@$iu zSHpqj%N6mtQvaKI&e;8Di~K{QIggRDU_D2pnzCa(t@>Roce8+!A2x70z3~TU*+cKv zpZu_123>!fZgs96%&O`CdhC3+rn3J|>bko3TGY4emwCgUle(^Bn06e;Zj@60eoXXAYd|PPEI#P9uBMFC%X`hL* zc?&Vj%ETP^zinbO`TRd`NVA4BiyKq^3{qzsGm_cUj>}F~TlUMPoJYkit=e6)rS07( zu8*C|G52SsBtaC5NfXVv_eu9C>byY4MRCdXx6;m;^FoJeVP+xcIwdX@hlx2hm_x~T`MHi}4mqW5#glzSgX0#l^#cD(QAB1@dL>x9iLE$k1fIL{o` zo~s%EeB+0;;>zVrL1yh|ru+*ly*}#mXj9@E-D`wmWtLFRl+B6D%mXyn_ocCfON|5c z*Z1Xd+Q>GwFDqvbZ~>yJ)H%py{;V<1i|eDUQ?thui-{p8^EBLCS$vS)d#OA-NP6qU z>yWLT|K%FaNp@2Fv=0{dTBaw9T&&QO#rrj6{2@*j-_($_pSaP>#SWc&otr-P@im=` z!u}7IOi%auC65TWn!Aa3AErOr^A;QJkD^a+U1nsm`uVTI2Hpv{+%colPC17t#4dH?+MWp%y)}Z90}+ePp@8Z&AAXy z4Dc~3O*;qA#cI@{39mHm<8xT=p_|K7KS;9QC__cb^_wjuxIT7CvHNjYhbQw|NN`YC$+Oo-l9pdtFm#v^1AhJp5M!oKaoF5LL6SHAV>7z`%Jt=~9y zn4;9J?`)3qeG0Z6vTywp?982<95O@``foXLTa)zut6l0Kvc5-VTBz0a!ZWR|n0KU> zngbS%`pSeXs&cVPhWW+yrWJ*ieDOR}O5>xp%$(>(9JQsk7uJUYor!#Jig9?5EsY#I zY8!1CBejm{_27om`4~gxV?!BrjEj?%pz(#_q@2t^BjJ*uKS)rQ=W?DowDnx5Yp&v)G%zoH8ObbxlV?jtjy)Wr`*= zLe{8b?ul)b8^1Gk+2ESpJAwlbRu)H0u-1ofARtv%enkPn4BQ zh(pad{z3AeB+2|zRhZQ`K0Kivm|>^4xXjGT1O>2XM19? zWR)-HX@KQ3Zg~1~S2ECovt2?ipzW71ceaj81Y7Rs+snKQ92+{yDK`CG9}G*B@kHkq z#Re~N*XPe1`Wscxqv? z?7vJJb0r4HzPz(@e4d-!q~5-9y$%t}oIPxmBv-hOwhIH@BU@!1efD|FoB1&?i`nBQ zr19MbkNegiWG6%?Z1&>Iou%m&y1u0JyTX%d@4LuvSGWt3qPz2&?Zr~1vZm=iX(JKL z%{?~>yh>ivyE^lFRWDureS3!{z`)FUHwn=joP|G962`QLVz1%Hr)2k-sT zd)C!*XWhIcYlZ?Q`}}&>J1m9?Jsk!~F=+S0kJZoj`lz$A9&@O1UK0{A_on=n^ZExu zOk0$cXrkI{VxSXx^W>wmteZM;gh`v;X(5(B=#SoF$FZL_3FV77q4$)|EnEvFrk=i1 z;}06sRoJGzoQ36YY}Oum+CZPJFw2U*az+#EB#$(~FzoDPJiMk?#{LWXt-;P5AxxzP z@kf3-Lv_iKw&m*SEx9+P%|eE5WBNMhxLSYK3M=Qe{XJ0`ni@1kx?JP&jg4mTls*^Z z=F_}uq{F}wcbYuA#tyKkzq8ifS@sq$cP4Ke3^Z|Oi4XlH^L6$Vn~b|oVN*yCb<9># zS$3V7rec)$4O=`54?HHj$@r}y8TI2O)h%5-M9D3iSS*bt@1HzY)lNG7 zNu|3FbC$f^#e=i&?Dbji&U2lPdme5BWT6_kzRg#xNlyj0KefGY3K(p_<%6vMHf#!lA^>rbu<*gU=FYfaBN0XcWs z;M*AJ5&!?(s%T|G zyCqm3_2q7EL3we9r=>PT1>ChYvRK@t-#yyNOV-?TH0fd83gCmLTxt10PiQaaO%lIl zx+$BvA<1r>Umu6cCN1tWb(vdTGW|X)vmjZIW-r4Zr0N* zywAMb0t4M43UuE5^7yIt?J&?ins&TBObR?;g8RpHv16C%Az=^Lr+y|09iJttcOMWi z@<4HC!RU*E%LviyXT5gSTeHqR$qPcvv&07_nyCJ_Fvx;IeZNX)(!JRH&Epv4?jCE) z$wy=ZV{OI!uZ(i8)P5XO>z8-UIu9l#y`Im`cWJbYh_!8z+7CJ1T~yGPia(;DdX6W% zxXpYIbreC&xH}&*_7cmdSF{z$XMV)sbu?4zv{W~0tn>Wl%9yO5e+(Vt<*0?@*2M`K z_lRzoB6}Z^KsE7x%vOCV{g^IlCZW33K_=;zBh1&{Y`pWpT4ZM6^b7}+Q>&q7!mY-a zU>zf0M`&>9By*jkw$rmog;O59lMCy`Gm#aQ`3 z3ijzHh0HYqC$t_od`(KnPQZ|G>nC}iQlf%V`6*+k^%S!=O$peYv-qr;js=2aP2EK{ zKBWTA;Ub@(+O}~!aqBar5I!}FQ$8x-xvj8;#~tgv;F;Hj^5O;Qu9Ad*k^h!i&Yi2_ z)!-)8>b=!9l$q`iNJ%v~je-6x(aeS?epuZ#rpSJbU5+CpwY>O? zY?%V%dD4w9`7WZbynV@el}V)RE1ueL+&TL`d0)}^a`Y9Z&LQy+`?u>j z`i{R-(}hxCg9hHAGk(}hC4%x$4gQu>s=lU{iRU>x@=Eb~Gdf)!q^nI`e_`M!VHgBw z#XyfsKjyrh;_=G&dhpZXi$M?}x`ST2wDe$uwTX3gX^v@SB$}vPyt)6HZs57gzu6ih z!GF{J`DFOtTz(oe-#IxaJ(oRQm&^^46WN^FIrB~Wp9Pa$@odYb_8XecOc1FSJ7={} z`;l$^gFox6Vs@-3S^S2qHpsI#wyoT3T=td;y@hzcqcjDj^gBvZQbOM`oOjAKw%k3I z%iDMCQ;#Lrdjc&|{yjsl*a~OkbvrO_L*(4pgJeL(xx4O`S0dlr=Kk9gMLfmuMOuBJ z1V?4#2hzI~b>ah^`A?^fW+MLnw6TDtiPZW;#P(60J~5Q+Y1TPAA+TzzQN8~-tjh;x z5bcD_vimdLxC#TEVPCCDaPYS8t}htq6T$@xx_QWp&$a{yHj*|V_x)S>8iapu6+vx;!YHBU6S zIhM#FGAx9>WxYh}%5{(2clT_^K&TPVbFSG<&8)!reL4@%5X&#p#RE$-wJh@R^s_j| zl&}5Y2i+EVrg4ghm({aff(M@Z=b8Lybu)>Ss^FPWx>O{{-yJXzi| ziCn7WnduvCU3ro(UfDC8hUDzuBa|Nu_ADZxT%+ zW2${;a;uuFs`-54dq(98@qCk1@~(+*mG(_NyYiv+{VhGyN4;t4S<+pm`^8TmRlkMj z8w-CtiQ1)==d1)Ws#W}qQQ5kB{**|vHTCq9YegvVr+xI54D>7zC_yDW(@X3MPk&3k zDBDU;KBiu(Yqyr2+vIKEf&tJ=7OwHkD;d{%21He37xR+l6BsRvwt8;!h#LN@=bf}^ z3hP)Y)wXlD7QH(#TKaUz+oyMj&b{R670=Yt!`steHeB&cBpmjJ%MGp#6 zq6i{xq|zcvkBWHdMbLx)DEg_FDvAh-C?19iP14YycqxK-vq$k@Pg0N7mra{`oHy_L z&3kY54YP;2YViGY38kEbqjv*xrB%9O`TQP{$vJO)@g0+&w$8Q#dFcRi>CzvZELzJP7)8o~0qT^>vL z;(F8Rv0W zS6^ZxE%5PK^z*nc)QRvXX=rH$7;Cbl Date: Tue, 19 Nov 2024 17:10:29 +0100 Subject: [PATCH 34/87] chore(private-credential): change from onSubmit to runtime.sendMessage --- .../features/src/web-connector/routes/web-connector.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index bd596c2f..e64cb166 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -71,7 +71,7 @@ export const WebConnectorRoute = () => { { params: [ { - fields: event.data.fields, + fields: event.data.fields as string[], passphrase: userInput, }, ], @@ -169,14 +169,17 @@ export const WebConnectorRoute = () => { } const eventListener = async (event: MessageEvent) => { if (event.data.type === "presentation-result") { - return onSubmit({ - userInput: "passphrase", // TODO: userInput out of scope + const { id } = await windows.getCurrent() + await runtime.sendMessage({ + userInput: "passphrase", result: { type: event.data.type, result: event.data.result, error: event.data.error, }, + windowId: id, }) + window.close() } if (event.data.type === "validate-credential-result") { return confirm({ From 9b900d3700753fbd0cd5165cfce693ac4fd7928e Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 19 Nov 2024 23:45:40 +0100 Subject: [PATCH 35/87] chore(private-credential): working signing from sandbox (left in logs for later) --- .../src/background/handlers/web-provider.ts | 4 +++- apps/extension/src/background/index.ts | 21 ------------------- .../web-connector/routes/web-connector.tsx | 10 +++++---- .../src/mina-network/mina-provider.ts | 8 +++++++ packages/web-provider/src/utils/prompts.ts | 3 +++ 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index f13012bb..4de84cbc 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -157,7 +157,9 @@ export const minaSignFieldsWithPassphrase: Handler = async ({ data }) => { params: data.params, context: data.context, }) - return await provider.request(payload) + const response = await provider.request(payload) + console.log(`response in handler ${JSON.stringify(response)}`) + return response } catch (error: unknown) { return { error: serializeError(error) } } diff --git a/apps/extension/src/background/index.ts b/apps/extension/src/background/index.ts index da7d7fe1..e1a06748 100644 --- a/apps/extension/src/background/index.ts +++ b/apps/extension/src/background/index.ts @@ -54,27 +54,6 @@ onMessage("pallad_switchNetwork", palladSwitchNetwork) onMessage("pallad_connected", palladConnected) onMessage("pallad_sidePanel", palladSidePanel) -/** - * Private Credential Validation handler - */ -onMessage("validate-credential-request", async (message) => { - try { - // Use proper window@namespace format - const response = await sendMessage( - "validate-credential", - message.data, - "window@credential-sandbox", - ) - return response - } catch (error) { - console.error("Error in credential validation:", error) - return { - success: false, - error: error instanceof Error ? error.message : "Unknown error", - } - } -}) - /** * Runtime */ diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index e64cb166..d7387d7c 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -120,6 +120,7 @@ export const WebConnectorRoute = () => { > = async ({ userInput, result }) => { const { id } = await windows.getCurrent() await runtime.sendMessage({ + type: "onSubmit", userInput, result, windowId: id, @@ -171,6 +172,7 @@ export const WebConnectorRoute = () => { if (event.data.type === "presentation-result") { const { id } = await windows.getCurrent() await runtime.sendMessage({ + type: "presentation-result", userInput: "passphrase", result: { type: event.data.type, @@ -192,10 +194,10 @@ export const WebConnectorRoute = () => { } if (request.inputType === "confirmation") return confirm({ result: event.data.result }) - return onSubmit({ - userInput: event.data.userInput, - result: event.data.result, - }) + // return onSubmit({ + // userInput: JSON.stringify(request), + // result: event.data.result, + // }) } // biome-ignore lint/correctness/useExhaustiveDependencies: wontdo useEffect(() => { diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index beedbf06..a7d87131 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -114,6 +114,7 @@ export const createMinaProvider = async (): Promise< removeListener: _emitter.off, emit: _emitter.emit, request: async (args) => { + console.log(`In request: ${JSON.stringify(args)}`) const typedArgs: ProviderRequestParams = args const { context } = typedArgs const { origin } = context as Record @@ -302,6 +303,9 @@ export const createMinaProvider = async (): Promise< .with( { method: "mina_signFieldsWithPassphrase" }, async ({ params }) => { + console.log( + `In mina_signFieldsWithPassphrase ${JSON.stringify(params)}`, + ) const [fieldsAndPassphrase] = params if ( !fieldsAndPassphrase || @@ -328,16 +332,19 @@ export const createMinaProvider = async (): Promise< operationArgs, passphrase, }) + const serializedResponseData = signedResponse.data.map((item) => { if (typeof item === "bigint") { return String(item) } return item }) + const seriliasedResponse = { ...signedResponse, data: serializedResponseData, } + return seriliasedResponse }, ) @@ -526,6 +533,7 @@ export const createMinaProvider = async (): Promise< } // TODO: return presentation + return result.result } catch (error: any) { throw createProviderRpcError( 4100, diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 082e0fe6..0f5eef6f 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -53,6 +53,9 @@ export const showUserPrompt = async ({ } return reject(new Error("4001 - User Rejected Request")) } + console.log( + `in event handler - response: ${JSON.stringify(response)}`, + ) if (response.userInput.length > 0) { return resolve({ value: response.userInput, From a4b6161a48a179563817fb91a5d1faac44d617c8 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 20 Nov 2024 12:46:42 +0100 Subject: [PATCH 36/87] chore(private-credential): update UI for credential selector --- .../components/credential-selection-form.tsx | 12 ++++++------ .../web-provider/src/mina-network/mina-provider.ts | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 259348b1..56a77ff8 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -16,7 +16,7 @@ type SelectionFormProps = { const sanitizeCredential = (credential: any) => { const yamlOptions = { indent: 2, - lineWidth: 32, + lineWidth: 70, minContentWidth: 0, } const yamlPayload = yaml.stringify(credential, yamlOptions) @@ -76,22 +76,22 @@ export const SelectionForm = ({ onSubmit={handleSubmit} className="flex flex-1 flex-col items-center gap-2 w-full" > -
+
{credentials.map((credentialData) => ( ))}
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index a7d87131..8831a8c1 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -185,7 +185,6 @@ export const createMinaProvider = async (): Promise< async (signatureRequest) => { const { value: passphrase } = await showUserPrompt({ inputType: "password", - contract: "add", metadata: { title: "Signature request", payload: JSON.stringify(signatureRequest.params), From 331d3172d44a3c7db7b3d8c89fb1f7389cdf7abb Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 20 Nov 2024 16:13:55 +0100 Subject: [PATCH 37/87] chore(private-credential): delete cases in listener --- .../features/src/web-connector/routes/web-connector.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index d7387d7c..7e7d3355 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -192,12 +192,6 @@ export const WebConnectorRoute = () => { }, }) } - if (request.inputType === "confirmation") - return confirm({ result: event.data.result }) - // return onSubmit({ - // userInput: JSON.stringify(request), - // result: event.data.result, - // }) } // biome-ignore lint/correctness/useExhaustiveDependencies: wontdo useEffect(() => { From 6df3b92bb2ef39ff07a95d8806b92693cd4ad7e8 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 22 Nov 2024 12:01:03 +0100 Subject: [PATCH 38/87] chore(private-credential): add fromJSONs to sandbox and compile Presentation --- apps/extension/src/sandbox/index.ts | 95 +++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 25 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 01107dba..8fdbd3a6 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,4 +1,4 @@ -import { Credential } from "mina-credentials" +import { Credential, Presentation, PresentationRequest } from "mina-credentials" import { serializeError } from "serialize-error" import { match } from "ts-pattern" import yaml from "yaml" @@ -26,6 +26,11 @@ type Result = { error?: string } +type PresentationRequestPayload = { + presentationRequest: string + selectedCredentials: string[] +} + const recoverOriginalPayload = (sanitizedPayload: string) => { const parsedYaml = yaml.parse(sanitizedPayload) return JSON.stringify(parsedYaml) @@ -37,7 +42,6 @@ let presentationSignaturePromise: { } | null = null window.addEventListener("message", async (event) => { - console.log(event.data) try { const message = MessageSchema.parse(event.data) @@ -83,30 +87,71 @@ window.addEventListener("message", async (event) => { } }) .with("presentation", async () => { - const mockFieldsToSign = [ - "15194438335254979123992673494772742932886141479807135737958843785282001151979", - "13058445919007356413345300070030973942059862825965583483176167800381508277987", - "26067489438851605530938171293652363087823200555042082718868551789908955769071", - ] - - window.parent.postMessage( - { - type: "presentation-signing-request", - fields: mockFieldsToSign, - }, - "*", - ) - - const signature = await new Promise((resolve, reject) => { - presentationSignaturePromise = { resolve, reject } - }) - - const mockResult: Result = { - type: "presentation-result", - result: JSON.stringify(signature), - } + try { + const mockFieldsToSign = [ + "15194438335254979123992673494772742932886141479807135737958843785282001151979", + "13058445919007356413345300070030973942059862825965583483176167800381508277987", + "26067489438851605530938171293652363087823200555042082718868551789908955769071", + ] + + window.parent.postMessage( + { + type: "presentation-signing-request", + fields: mockFieldsToSign, + }, + "*", + ) + + const signature = await new Promise((resolve, reject) => { + presentationSignaturePromise = { resolve, reject } + }) + + const originalPayload = recoverOriginalPayload(msg.payload) + + const parsedPayload = JSON.parse( + originalPayload, + ) as PresentationRequestPayload + + const { presentationRequest, selectedCredentials } = parsedPayload + + const stringifiedPresentationRequest = + JSON.stringify(presentationRequest) + + const storedCredentials = selectedCredentials.map( + (credential) => { + return Credential.fromJSON(JSON.stringify(credential)) + }, + ) - window.parent.postMessage(mockResult, "*") + const parsedPresentationRequest = JSON.parse( + stringifiedPresentationRequest, + ) as PresentationRequest + const requestType = parsedPresentationRequest.type + + const deserialized = PresentationRequest.fromJSON( + requestType, + stringifiedPresentationRequest, + ) + const compiled = await Presentation.compile(deserialized) + + // TODO: delete later, only here to not get unused errors + console.log(compiled) + console.log(signature) + console.log(storedCredentials) + + const mockResult: Result = { + type: "presentation-result", + result: "works so far", + } + + window.parent.postMessage(mockResult, "*") + } catch (error: any) { + const result: Result = { + type: "presentation-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") + } }) .exhaustive() }) From 8710e8b249fb4965b5a05fb280b43e014a38b0a6 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 22 Nov 2024 14:25:45 +0100 Subject: [PATCH 39/87] chore(private-credential): bump mina-credentials --- apps/extension/package.json | 2 +- bun.lockb | Bin 574456 -> 574456 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 37abd925..73894ca4 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,7 +23,7 @@ "@palladco/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.1.1", + "mina-credentials": "^0.2.2", "mitt": "3.0.1", "next-themes": "0.3.0", "p-debounce": "4.0.0", diff --git a/bun.lockb b/bun.lockb index 8d7fb408ca6c673d9d498842a586f4a9b13d72d3..3cfaecceee0c9a75b798c2c18c335eda58859b55 100755 GIT binary patch delta 178 zcmey-uKc52d4it8TIb60`wkyJO3a+6CGM8F_TZMl^~$%8)#ttFaA9M(u&2>)s~_XH z>d7t1ChZk9j6lq^y`qM>)WAWwHb$-ct;X~xlWx9oX?VKRPxslky@7|WT`1YQd9vVJ zakYK3^qJQl{{8Q>X!vX!6%Mb*dQE9&Gg{OHr~LYFbf~>ucP%pzvj8#ccHOmXTq?{) edPdVfII+pJhh1db9(IvEV-84Y`@vie^DqFxxln)r delta 179 zcmey-uKc52d4iroM6CJKNJmE5Cr1`eTwh$g?gNYR+HE#lmhsmqpV+9gFQw6Ms~_XH z>gg;|jHd0CHH<*aw7s&1xx~OB^HbuDFQ*=G81nmQlyO<_m0_)Pbh7f__4a4oLRID4 z4_OY(*IwP5rmU}+yIf;+^;3Thr(+t?CkuDqQF#@WYAMpLyOtSzyY5;xE)`}& eJ;UiAoY-XA!!ELI54*^oF$W~H{a`MKc^Cjv*h&ik From 1300204ee631486749de6192ca353067e665ffbf Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 22 Nov 2024 17:26:01 +0100 Subject: [PATCH 40/87] chore(private-credential)(wip): prepare works, finalize fails with invalid owner sig --- apps/extension/package.json | 1 + apps/extension/src/sandbox/index.ts | 64 ++++++++++++++++++---------- bun.lockb | Bin 574456 -> 574488 bytes 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 73894ca4..9334f229 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -26,6 +26,7 @@ "mina-credentials": "^0.2.2", "mitt": "3.0.1", "next-themes": "0.3.0", + "o1js": "^2.1.0", "p-debounce": "4.0.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 8fdbd3a6..9fa32aa9 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -1,4 +1,5 @@ import { Credential, Presentation, PresentationRequest } from "mina-credentials" +import { Signature } from "o1js" import { serializeError } from "serialize-error" import { match } from "ts-pattern" import yaml from "yaml" @@ -88,26 +89,10 @@ window.addEventListener("message", async (event) => { }) .with("presentation", async () => { try { - const mockFieldsToSign = [ - "15194438335254979123992673494772742932886141479807135737958843785282001151979", - "13058445919007356413345300070030973942059862825965583483176167800381508277987", - "26067489438851605530938171293652363087823200555042082718868551789908955769071", - ] - - window.parent.postMessage( - { - type: "presentation-signing-request", - fields: mockFieldsToSign, - }, - "*", - ) - - const signature = await new Promise((resolve, reject) => { - presentationSignaturePromise = { resolve, reject } - }) - + // get back original payload const originalPayload = recoverOriginalPayload(msg.payload) + // parse payload as PresentationRequestPayload const parsedPayload = JSON.parse( originalPayload, ) as PresentationRequestPayload @@ -117,6 +102,7 @@ window.addEventListener("message", async (event) => { const stringifiedPresentationRequest = JSON.stringify(presentationRequest) + // create mina-credentials StoredCredential[] from selectedCredentials const storedCredentials = selectedCredentials.map( (credential) => { return Credential.fromJSON(JSON.stringify(credential)) @@ -128,20 +114,52 @@ window.addEventListener("message", async (event) => { ) as PresentationRequest const requestType = parsedPresentationRequest.type + // deserialize presentation request const deserialized = PresentationRequest.fromJSON( requestType, stringifiedPresentationRequest, ) + + // compile const compiled = await Presentation.compile(deserialized) - // TODO: delete later, only here to not get unused errors - console.log(compiled) - console.log(signature) - console.log(storedCredentials) + // prepare presentation request and get fields to sign + const prepared = await Presentation.prepare({ + request: compiled, + credentials: storedCredentials, + context: { verifierIdentity: "test.com" }, + }) + + // ask wallet to sign fields + window.parent.postMessage( + { + type: "presentation-signing-request", + fields: prepared.messageFields, + }, + "*", + ) + + // get signature from wallet + const signature = (await new Promise((resolve, reject) => { + presentationSignaturePromise = { resolve, reject } + })) as string + + // o1js Signature type + const ownerSignature = Signature.fromBase58(signature) + + // finalize presentation + const presentation = await Presentation.finalize( + compiled, + ownerSignature, + prepared, + ) + + // serialize presentation + const serializedPresentation = Presentation.toJSON(presentation) const mockResult: Result = { type: "presentation-result", - result: "works so far", + result: serializedPresentation, } window.parent.postMessage(mockResult, "*") diff --git a/bun.lockb b/bun.lockb index 3cfaecceee0c9a75b798c2c18c335eda58859b55..c407e765061064bb7fa534dce60ca130e9c2d882 100755 GIT binary patch delta 6778 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 l*%2xW)|p> delta 6788 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 z Date: Sun, 24 Nov 2024 11:21:30 +0100 Subject: [PATCH 41/87] chore(private-credentials): comment out presentation verification --- apps/extension/src/sandbox/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 9fa32aa9..847d51d4 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -157,6 +157,11 @@ window.addEventListener("message", async (event) => { // serialize presentation const serializedPresentation = Presentation.toJSON(presentation) + // TODO: delete later, only used for testing verification + // const receivedPresentationDeserialized = Presentation.fromJSON(serializedPresentation) + + // const outputClaim = await Presentation.verify(deserialized, receivedPresentationDeserialized, { verifierIdentity: "test.com" }) + const mockResult: Result = { type: "presentation-result", result: serializedPresentation, From 6da4eabf38fdb8ff1aef5624da3db86f9d465fa7 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 25 Nov 2024 10:12:19 +0100 Subject: [PATCH 42/87] chore(private-credential): add presentation request to payload, credentialToStore --- apps/extension/src/sandbox/index.ts | 6 +-- .../components/credential-selection-form.tsx | 29 ++++++++++-- .../src/mina-network/mina-provider.ts | 45 +++++++++++-------- 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 847d51d4..8a3b7b1e 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -71,13 +71,13 @@ window.addEventListener("message", async (event) => { const originalPayload = recoverOriginalPayload(sanitizedPayload) const credentialDeserialized = Credential.fromJSON(originalPayload) + await Credential.validate(credentialDeserialized) const result: Result = { type: "validate-credential-result", result: Credential.toJSON(credentialDeserialized), } - window.parent.postMessage(result, "*") } catch (error: any) { const result: Result = { @@ -109,6 +109,7 @@ window.addEventListener("message", async (event) => { }, ) + // parse presentation request const parsedPresentationRequest = JSON.parse( stringifiedPresentationRequest, ) as PresentationRequest @@ -144,7 +145,7 @@ window.addEventListener("message", async (event) => { presentationSignaturePromise = { resolve, reject } })) as string - // o1js Signature type + // get o1js Signature type signature const ownerSignature = Signature.fromBase58(signature) // finalize presentation @@ -166,7 +167,6 @@ window.addEventListener("message", async (event) => { type: "presentation-result", result: serializedPresentation, } - window.parent.postMessage(mockResult, "*") } catch (error: any) { const result: Result = { diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 56a77ff8..e63cc096 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -13,6 +13,11 @@ type SelectionFormProps = { loading: boolean } +interface PayloadWithPresentation { + storedCredentials: any[] + presentationRequest: any +} + const sanitizeCredential = (credential: any) => { const yamlOptions = { indent: 2, @@ -28,6 +33,17 @@ const recoverOriginalPayload = (sanitizedPayload: string) => { return JSON.stringify(parsedYaml) } +const isPayloadWithPresentation = ( + payload: unknown, +): payload is PayloadWithPresentation => { + return ( + typeof payload === "object" && + payload !== null && + "storedCredentials" in payload && + Array.isArray((payload as PayloadWithPresentation).storedCredentials) + ) +} + export const SelectionForm = ({ onSubmit, onReject, @@ -42,9 +58,16 @@ export const SelectionForm = ({ const credentials = React.useMemo(() => { try { const originalPayload = recoverOriginalPayload(payload) - const parsedCredentials = JSON.parse(originalPayload) as any[] - return parsedCredentials.map((credential) => ({ - // TODO: use stored hash when implemented + const parsedPayload = JSON.parse(originalPayload) + + // Extract credentials using type guard + const storedCredentials = Array.isArray(parsedPayload) + ? parsedPayload + : isPayloadWithPresentation(parsedPayload) + ? parsedPayload.storedCredentials + : [] + + return storedCredentials.map((credential: any) => ({ id: createCredentialHash(credential), credential, sanitizedDisplay: sanitizeCredential(credential), diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 8831a8c1..e9f3172e 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -386,12 +386,28 @@ export const createMinaProvider = async (): Promise< const [credential] = params if (!credential) throw createProviderRpcError(4000, "Invalid Request") - const credentialWitnessType = credential.witness.type - const stringifiedCredential = JSON.stringify(credential) + let credentialToStore + try { - if (!(credentialWitnessType === "unsigned")) { + const credentialWitnessType = credential.witness.type + if (credentialWitnessType === "unsigned") { + const { value: userConfirmed } = await showUserPrompt({ + inputType: "confirmation", + metadata: { + title: "Store private credential request", + payload: stringifiedCredential, + }, + }) + + if (!userConfirmed) { + throw createProviderRpcError(4001, "User Rejected Request") + } + + credentialToStore = stringifiedCredential + } else { + // prompt user to approve incoming credential and validate if approved const { value: userConfirmed, result } = await showUserPrompt({ inputType: "confirmation", @@ -416,21 +432,12 @@ export const createMinaProvider = async (): Promise< if (!result?.result) { throw createProviderRpcError(4100, "Missing validation result") } - } else { - const { value: userConfirmed } = await showUserPrompt({ - inputType: "confirmation", - metadata: { - title: "Store private credential request", - payload: stringifiedCredential, - }, - }) - if (!userConfirmed) { - throw createProviderRpcError(4001, "User Rejected Request") - } + credentialToStore = result.result } // TODO: hash should be stored with the credential + // TODO: handle metadata // Generate hash of the new credential const newCredentialHash = createCredentialHash(credential) @@ -446,7 +453,7 @@ export const createMinaProvider = async (): Promise< } try { - const parsedResult = JSON.parse(stringifiedCredential) + const parsedResult = JSON.parse(credentialToStore) await _vault.storePrivateCredential(parsedResult) return { success: parsedResult } } catch (error: any) { @@ -468,7 +475,7 @@ export const createMinaProvider = async (): Promise< if (!presentationRequest) throw createProviderRpcError(4000, "Invalid Request") - // First, ask for approval to proceed with the presentation request + // Ask for approval to proceed with the presentation request const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", metadata: { @@ -491,7 +498,10 @@ export const createMinaProvider = async (): Promise< inputType: "selection", metadata: { title: "Select credentials for presentation", - payload: JSON.stringify(storedCredentials), + payload: JSON.stringify({ + presentationRequest, + storedCredentials, + }), submitButtonLabel: "Continue", rejectButtonLabel: "Cancel", }, @@ -531,7 +541,6 @@ export const createMinaProvider = async (): Promise< throw createProviderRpcError(4100, "Missing presentation result") } - // TODO: return presentation return result.result } catch (error: any) { throw createProviderRpcError( From a14133591a46daa8b96af65fef093fb010f354e6 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 25 Nov 2024 10:13:10 +0100 Subject: [PATCH 43/87] chore(private-credential): add loading to create presentation --- packages/features/src/web-connector/routes/web-connector.tsx | 5 ++++- packages/web-provider/src/mina-network/mina-provider.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index 7e7d3355..e49bf504 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -111,8 +111,9 @@ export const WebConnectorRoute = () => { payload: request.payload, userInput, }) - } finally { + } catch (error) { setLoading(false) + throw error } } const onSubmit: SubmitHandler< @@ -181,9 +182,11 @@ export const WebConnectorRoute = () => { }, windowId: id, }) + setLoading(false) window.close() } if (event.data.type === "validate-credential-result") { + setLoading(false) return confirm({ result: { type: event.data.type, diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index e9f3172e..848758c1 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -519,7 +519,7 @@ export const createMinaProvider = async (): Promise< inputType: "password", contract: "presentation", metadata: { - title: "Prepare presentation", + title: "Create presentation", payload: JSON.stringify({ presentationRequest, selectedCredentials: JSON.parse(selectedCredentials), From a1aec4be9180f91b955b900d942e8ce07cd58f81 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 25 Nov 2024 10:23:01 +0100 Subject: [PATCH 44/87] chore(private-credential): add loading message --- .../features/src/web-connector/routes/web-connector.tsx | 7 +++++++ .../features/src/web-connector/views/web-connector.tsx | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index e49bf504..ecf6db89 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -47,6 +47,7 @@ type ActionRequest = { export const WebConnectorRoute = () => { const [loading, setLoading] = useState(true) + const [loadingMessage, setLoadingMessage] = useState() const [request, setRequest] = useState({ title: "", payload: "", @@ -62,6 +63,7 @@ export const WebConnectorRoute = () => { try { // For presentation contract, set up message handler for signing request if (request.contract === "presentation") { + setLoadingMessage("Creating presentation...") const messageHandler = async (event: MessageEvent) => { if (event.data.type === "presentation-signing-request") { try { @@ -113,6 +115,7 @@ export const WebConnectorRoute = () => { }) } catch (error) { setLoading(false) + setLoadingMessage(undefined) throw error } } @@ -183,10 +186,12 @@ export const WebConnectorRoute = () => { windowId: id, }) setLoading(false) + setLoadingMessage(undefined) window.close() } if (event.data.type === "validate-credential-result") { setLoading(false) + setLoadingMessage(undefined) return confirm({ result: { type: event.data.type, @@ -216,6 +221,7 @@ export const WebConnectorRoute = () => { emitConnected: message.params.emitConnected, }) setLoading(false) + setLoadingMessage(undefined) } }) }, []) @@ -232,6 +238,7 @@ export const WebConnectorRoute = () => { title={request.title} payload={request.payload} loading={loading} + loadingMessage={loadingMessage} /> ) diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 62aad969..32299221 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -18,6 +18,7 @@ type WebConnectorViewProps = { submitButtonLabel?: string onSubmit: SubmitHandler loading: boolean + loadingMessage?: string } export const WebConnectorView = ({ @@ -31,6 +32,7 @@ export const WebConnectorView = ({ submitButtonLabel, onSubmit, loading, + loadingMessage, }: WebConnectorViewProps) => { const onClose = () => { onReject() @@ -39,6 +41,9 @@ export const WebConnectorView = ({ const handleSelectionSubmit = (selectedCredentials: string) => { onSubmit({ userInput: selectedCredentials }) } + + const displayTitle = loadingMessage || title + return (
@@ -46,7 +51,7 @@ export const WebConnectorView = ({
-

{title}

+

{displayTitle}

Date: Mon, 25 Nov 2024 10:26:55 +0100 Subject: [PATCH 45/87] chore(private-credential): add loading message for credential validation --- .../features/src/web-connector/routes/web-connector.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index ecf6db89..e65d412c 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -134,14 +134,19 @@ export const WebConnectorRoute = () => { const startConfirming = async () => { if (!request.contract) return confirm({}) setLoading(true) + if (request.contract === "validate-credential") { + setLoadingMessage("Validating credential...") + } try { return sendSandboxMessage({ type: "run", contract: request.contract, payload: request.payload, }) - } finally { + } catch (error) { setLoading(false) + setLoadingMessage(undefined) + throw error } } const confirm = async ({ result }: { result?: ContractResult }) => { From 2df1599e86ca719357062e1eb9dbf479ae4edb83 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 26 Nov 2024 10:10:42 +0100 Subject: [PATCH 46/87] chore(private-credential): set verifierIdentity to origin --- apps/extension/src/sandbox/index.ts | 27 ++++++++++++++----- .../src/mina-network/mina-provider.ts | 2 ++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 8a3b7b1e..2b17ba6c 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -30,6 +30,7 @@ type Result = { type PresentationRequestPayload = { presentationRequest: string selectedCredentials: string[] + verifierIdentity: string } const recoverOriginalPayload = (sanitizedPayload: string) => { @@ -97,7 +98,11 @@ window.addEventListener("message", async (event) => { originalPayload, ) as PresentationRequestPayload - const { presentationRequest, selectedCredentials } = parsedPayload + const { + presentationRequest, + selectedCredentials, + verifierIdentity, + } = parsedPayload const stringifiedPresentationRequest = JSON.stringify(presentationRequest) @@ -113,6 +118,7 @@ window.addEventListener("message", async (event) => { const parsedPresentationRequest = JSON.parse( stringifiedPresentationRequest, ) as PresentationRequest + const requestType = parsedPresentationRequest.type // deserialize presentation request @@ -128,7 +134,8 @@ window.addEventListener("message", async (event) => { const prepared = await Presentation.prepare({ request: compiled, credentials: storedCredentials, - context: { verifierIdentity: "test.com" }, + // TODO: handle zk-app verifierIdentity + context: { verifierIdentity }, }) // ask wallet to sign fields @@ -159,15 +166,21 @@ window.addEventListener("message", async (event) => { const serializedPresentation = Presentation.toJSON(presentation) // TODO: delete later, only used for testing verification - // const receivedPresentationDeserialized = Presentation.fromJSON(serializedPresentation) + const receivedPresentationDeserialized = Presentation.fromJSON( + serializedPresentation, + ) - // const outputClaim = await Presentation.verify(deserialized, receivedPresentationDeserialized, { verifierIdentity: "test.com" }) + const outputClaim = await Presentation.verify( + deserialized, + receivedPresentationDeserialized, + { verifierIdentity: "http://localhost:5173" }, + ) - const mockResult: Result = { + const result: Result = { type: "presentation-result", - result: serializedPresentation, + result: JSON.stringify(outputClaim), } - window.parent.postMessage(mockResult, "*") + window.parent.postMessage(result, "*") } catch (error: any) { const result: Result = { type: "presentation-result", diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 848758c1..b3714865 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -521,6 +521,8 @@ export const createMinaProvider = async (): Promise< metadata: { title: "Create presentation", payload: JSON.stringify({ + // TODO: handle zk-app verifierIdentity + verifierIdentity: origin, presentationRequest, selectedCredentials: JSON.parse(selectedCredentials), }), From c30e47518d7ce2d4f9260b07cbcad88d03e786fa Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 11:53:24 +0100 Subject: [PATCH 47/87] bump mina-credentials --- apps/extension/package.json | 2 +- bun.lockb | Bin 574488 -> 574488 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 9334f229..6cc3e359 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,7 +23,7 @@ "@palladco/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.2.2", + "mina-credentials": "^0.2.3", "mitt": "3.0.1", "next-themes": "0.3.0", "o1js": "^2.1.0", diff --git a/bun.lockb b/bun.lockb index c407e765061064bb7fa534dce60ca130e9c2d882..0c34e48d85a6636bfca511bbdddf5eb230b2e7a9 100755 GIT binary patch delta 177 zcmV;i08amyh$EPYBakj2W*N*FE5*^!LcQ7Y(+0&;o;ZYzM1()xUuPKM9dEf(fljqf z0Xlw@$XhUnxPAeLxPAh+xPAjoF+f$D6IJCaSO4vCjj4lO0|Wp}53e$nhcM8rIuWzs zJZX#O*S9?BWHxvFS=tW+=jC}aXu6kH!#Hbkl8dM1MC^w}umguhump!ium!h8um=1f f0W+8QLIxa%UeN}(UeO2ko|m)k2O+n0a0sJQ4B$}d delta 177 zcmV;i08amyh$EPYBakj2twVWt-$3#47@3|b7e;BV!L(7YBiqJ*Zs>?a1_02!fljqf z0Xlw@h+{B^xPAeLxPAh+xPAjoF+dZ2TqcX{D3|1t+3ZAs<+)BR=Jvf&!q(7qwX>5E z?H4A#nlA&b!~6d86<3=)BnV35E`nw@n1m(~l=}ZN!iR@Numguhump!ium!h8um=1f f0Wz2PLIxa%UeN}(UeO2ko|hwW2Ozg}a0sMRA7N4@ From 5e15a5f8e9856bc27a1d7a79433e16e8a945dec5 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 11:54:52 +0100 Subject: [PATCH 48/87] chore(private-credential): exclude credential metadata from hash --- packages/web-provider/src/mina-network/utils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/web-provider/src/mina-network/utils.ts b/packages/web-provider/src/mina-network/utils.ts index 7ce7bffc..1417ba9f 100644 --- a/packages/web-provider/src/mina-network/utils.ts +++ b/packages/web-provider/src/mina-network/utils.ts @@ -50,7 +50,10 @@ export const serializeTransaction = (transaction: MinaSignablePayload) => { } export const createCredentialHash = (credential: any): string => { - const stableString = JSON.stringify(credential) + // exclude metadata from hash + const { metadata: _, ...credentialWithoutMetadata } = credential + + const stableString = JSON.stringify(credentialWithoutMetadata) const bytes = utf8ToBytes(stableString) const hash = sha256(bytes) return Array.from(hash) From 60ee4dbc68643df7d096da22356a926bc4ec7600 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 13:09:38 +0100 Subject: [PATCH 49/87] chore(private-credential): change prompt payload display for storing credential --- .../components/credential-selection-form.tsx | 2 +- .../src/web-connector/views/web-connector.tsx | 76 ++++++++++++++++++- .../src/mina-network/mina-provider.ts | 2 +- 3 files changed, 76 insertions(+), 4 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index e63cc096..6fd40df7 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -28,7 +28,7 @@ const sanitizeCredential = (credential: any) => { return xss(yamlPayload) } -const recoverOriginalPayload = (sanitizedPayload: string) => { +export const recoverOriginalPayload = (sanitizedPayload: string) => { const parsedYaml = yaml.parse(sanitizedPayload) return JSON.stringify(parsedYaml) } diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 32299221..aa06d768 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -3,7 +3,10 @@ import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" import type { SubmitHandler } from "react-hook-form" import { ConfirmationForm } from "../components/confirmation-form" -import { SelectionForm } from "../components/credential-selection-form" +import { + SelectionForm, + recoverOriginalPayload, +} from "../components/credential-selection-form" import { InputForm } from "../components/input-form" import type { UserInputForm } from "../types" @@ -42,6 +45,73 @@ export const WebConnectorView = ({ onSubmit({ userInput: selectedCredentials }) } + const decodeHexString = (hex: string): string => { + // Convert hex to bytes and then to characters, stopping at first null byte + const bytes = hex.match(/.{1,2}/g) || [] + let result = "" + for (const byte of bytes) { + const charCode = Number.parseInt(byte, 16) + if (charCode === 0) break // Stop at first null byte + result += String.fromCharCode(charCode) + } + return result + } + + const simplifyCredentialData = (data: Record) => { + const simplified: Record = {} + for (const [key, value] of Object.entries(data)) { + if ( + typeof value === "object" && + value !== null && + "_type" in value && + "value" in value + ) { + if (value._type === "Bytes") { + simplified[key] = decodeHexString(value.value) + } else { + simplified[key] = value.value + } + } else { + simplified[key] = value + } + } + return simplified + } + + const getDisplayPayload = (payload: string) => { + try { + const originalPayload = recoverOriginalPayload(payload) + const parsedPayload = JSON.parse(originalPayload) as Record + + // Check if this is a credential with data + if ( + "credential" in parsedPayload && + typeof parsedPayload.credential === "object" && + parsedPayload.credential !== null && + "data" in parsedPayload.credential + ) { + const displayObj: Record = { + data: simplifyCredentialData(parsedPayload.credential.data), + } + + // Only add description if metadata exists and has description + if ( + typeof parsedPayload.metadata === "object" && + parsedPayload.metadata !== null && + "description" in parsedPayload.metadata + ) { + displayObj.description = parsedPayload.metadata.description + } + + return JSON.stringify(displayObj, null, 2) + } + + return payload + } catch (error: any) { + return `Error in getDisplayPayload: ${error}` + } + } + const displayTitle = loadingMessage || title return ( @@ -55,7 +125,9 @@ export const WebConnectorView = ({
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index b3714865..13af6aaf 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -413,7 +413,7 @@ export const createMinaProvider = async (): Promise< inputType: "confirmation", contract: "validate-credential", metadata: { - title: "Store private credential request", + title: "Store Private Credential", payload: stringifiedCredential, }, }) From 57807feaf4ab78cd29f0d734c67c58d5bb0f904e Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 14:43:31 +0100 Subject: [PATCH 50/87] chore(private-credential): format credential payload in prompt (simple) --- .../src/web-connector/views/web-connector.tsx | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index aa06d768..f2680300 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -41,20 +41,16 @@ export const WebConnectorView = ({ onReject() onDecline() } + const handleSelectionSubmit = (selectedCredentials: string) => { onSubmit({ userInput: selectedCredentials }) } const decodeHexString = (hex: string): string => { - // Convert hex to bytes and then to characters, stopping at first null byte - const bytes = hex.match(/.{1,2}/g) || [] - let result = "" - for (const byte of bytes) { - const charCode = Number.parseInt(byte, 16) - if (charCode === 0) break // Stop at first null byte - result += String.fromCharCode(charCode) - } - return result + const bytes = new Uint8Array( + hex.match(/.{2}/g)!.map((byte) => Number.parseInt(byte, 16)), + ) + return new TextDecoder().decode(bytes).replace(/\0/g, "") } const simplifyCredentialData = (data: Record) => { @@ -78,38 +74,36 @@ export const WebConnectorView = ({ return simplified } - const getDisplayPayload = (payload: string) => { - try { - const originalPayload = recoverOriginalPayload(payload) - const parsedPayload = JSON.parse(originalPayload) as Record + const isCredential = (value: unknown): value is Record => { + if (typeof value !== "object" || value === null) return false - // Check if this is a credential with data - if ( - "credential" in parsedPayload && - typeof parsedPayload.credential === "object" && - parsedPayload.credential !== null && - "data" in parsedPayload.credential - ) { - const displayObj: Record = { - data: simplifyCredentialData(parsedPayload.credential.data), - } + const obj = value as Record + return ( + "credential" in obj && + typeof obj.credential === "object" && + obj.credential !== null && + "data" in obj.credential + ) + } - // Only add description if metadata exists and has description - if ( - typeof parsedPayload.metadata === "object" && - parsedPayload.metadata !== null && - "description" in parsedPayload.metadata - ) { - displayObj.description = parsedPayload.metadata.description - } + const renderPayload = (payload: string) => { + const originalPayload = recoverOriginalPayload(payload) + const parsedPayload = JSON.parse(originalPayload) as Record + if (!isCredential(parsedPayload)) { + return
{payload}
+ } - return JSON.stringify(displayObj, null, 2) - } + const simplifiedData = simplifyCredentialData(parsedPayload.credential.data) + const description = parsedPayload.metadata?.description - return payload - } catch (error: any) { - return `Error in getDisplayPayload: ${error}` - } + return ( +
+ {description &&

{description}

} +
+          {JSON.stringify(simplifiedData, null, 2)}
+        
+
+ ) } const displayTitle = loadingMessage || title @@ -123,13 +117,17 @@ export const WebConnectorView = ({

{displayTitle}

-
+
+ {(() => { + try { + return renderPayload(payload) + } catch (error) { + return ( +
{`Error: ${error}`}
+ ) + } + })()} +
From ad16514f0b4cad08eb0a67fbe1e985aae3fb9599 Mon Sep 17 00:00:00 2001 From: Tomasz Marciniak Date: Wed, 27 Nov 2024 16:04:05 +0100 Subject: [PATCH 51/87] feat(credentials): add ui for credential management --- packages/features/.ladle/components.tsx | 30 ++++++++------- packages/features/.ladle/config.mjs | 5 +-- packages/features/.ladle/vite.config.ts | 2 - .../features/src/components/menu-drawer.tsx | 8 ++++ .../src/credentials/index.stories.tsx | 11 ++++++ .../credentials/routes/credential-details.tsx | 29 ++++++++++++++ .../src/credentials/routes/credentials.tsx | 7 ++++ .../credentials/views/credential-details.tsx | 33 ++++++++++++++++ .../src/credentials/views/credentials.tsx | 38 +++++++++++++++++++ packages/features/src/lib/locales/en/en.json | 4 ++ packages/features/src/lib/locales/tr/tr.json | 4 ++ packages/features/src/router.tsx | 6 +++ 12 files changed, 159 insertions(+), 18 deletions(-) create mode 100644 packages/features/src/credentials/index.stories.tsx create mode 100644 packages/features/src/credentials/routes/credential-details.tsx create mode 100644 packages/features/src/credentials/routes/credentials.tsx create mode 100644 packages/features/src/credentials/views/credential-details.tsx create mode 100644 packages/features/src/credentials/views/credentials.tsx diff --git a/packages/features/.ladle/components.tsx b/packages/features/.ladle/components.tsx index ed9e58a1..bf95c25e 100644 --- a/packages/features/.ladle/components.tsx +++ b/packages/features/.ladle/components.tsx @@ -8,7 +8,9 @@ import { import { ThemeProvider } from "next-themes" import React, { useEffect } from "react" import { ErrorBoundary } from "react-error-boundary" +import { I18nextProvider } from "react-i18next" import { MemoryRouter } from "react-router-dom" +import { i18n } from "../src/lib/i18n" export const Provider: GlobalProvider = ({ children }) => { const { dispatch } = useLadleContext() @@ -17,18 +19,20 @@ export const Provider: GlobalProvider = ({ children }) => { dispatch({ type: ActionType.UpdateTheme, value: ThemeState.Dark }) }, []) return ( - - - ( -
- {JSON.stringify(error, Object.getOwnPropertyNames(error))} -
- )} - > - {children} -
-
-
+ + + + ( +
+ {JSON.stringify(error, Object.getOwnPropertyNames(error))} +
+ )} + > + {children} +
+
+
+
) } diff --git a/packages/features/.ladle/config.mjs b/packages/features/.ladle/config.mjs index 44d7d7a8..4b3e8c5f 100644 --- a/packages/features/.ladle/config.mjs +++ b/packages/features/.ladle/config.mjs @@ -6,16 +6,15 @@ export default { width: { enabled: true, options: { - xsmall: 370, + xsmall: 480, small: 640, medium: 768, large: 1024, }, - defaultState: 370, + defaultState: 480, }, }, appendToHead: ``, } diff --git a/packages/features/.ladle/vite.config.ts b/packages/features/.ladle/vite.config.ts index 420a920a..0291ebe2 100644 --- a/packages/features/.ladle/vite.config.ts +++ b/packages/features/.ladle/vite.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from "vite" import { nodePolyfills } from "vite-plugin-node-polyfills" import svgr from "vite-plugin-svgr" -import topLevelAwait from "vite-plugin-top-level-await" const env = (import.meta as any).env @@ -12,7 +11,6 @@ export default defineConfig({ "process.env": {}, }, plugins: [ - topLevelAwait(), svgr(), nodePolyfills({ protocolImports: true, globals: { Buffer: true } }), ], diff --git a/packages/features/src/components/menu-drawer.tsx b/packages/features/src/components/menu-drawer.tsx index cb0a24cf..9d238500 100644 --- a/packages/features/src/components/menu-drawer.tsx +++ b/packages/features/src/components/menu-drawer.tsx @@ -86,6 +86,14 @@ export const MenuDrawer = () => { > {t("components.staking")} + + + + ) +} diff --git a/packages/features/src/credentials/views/credentials.tsx b/packages/features/src/credentials/views/credentials.tsx new file mode 100644 index 00000000..e2976b05 --- /dev/null +++ b/packages/features/src/credentials/views/credentials.tsx @@ -0,0 +1,38 @@ +import { AppLayout } from "@/components/app-layout" +import { MenuBar } from "@/components/menu-bar" +import type { Json } from "@mina-js/utils" +import { KeyRound } from "lucide-react" +import { useTranslation } from "react-i18next" +import { Link } from "react-router-dom" + +type CredentialsViewProps = { + credentials: [string, Json][] +} + +export const CredentialsView = ({ credentials }: CredentialsViewProps) => { + const { t } = useTranslation() + return ( + + +
+

{t("credentials.credentials")}

+
+ {credentials.map(([id]) => ( + +
+ +
+
+

{id}

+
+ + ))} +
+
+
+ ) +} diff --git a/packages/features/src/lib/locales/en/en.json b/packages/features/src/lib/locales/en/en.json index a6849b9a..6a65c342 100644 --- a/packages/features/src/lib/locales/en/en.json +++ b/packages/features/src/lib/locales/en/en.json @@ -147,5 +147,9 @@ "deny": "Deny", "sign": "Sign", "reject": "Reject" + }, + "credentials": { + "credentials": "Credentials", + "delete": "Delete" } } diff --git a/packages/features/src/lib/locales/tr/tr.json b/packages/features/src/lib/locales/tr/tr.json index 0ea06df2..b2b58507 100644 --- a/packages/features/src/lib/locales/tr/tr.json +++ b/packages/features/src/lib/locales/tr/tr.json @@ -147,5 +147,9 @@ "deny": "Reddet", "sign": "İmzala", "reject": "Reddet" + }, + "credentials": { + "credentials": "Kimlik", + "delete": "Silmek" } } diff --git a/packages/features/src/router.tsx b/packages/features/src/router.tsx index 30a3ad4a..f7d7b795 100644 --- a/packages/features/src/router.tsx +++ b/packages/features/src/router.tsx @@ -7,6 +7,8 @@ import { I18nextProvider } from "react-i18next" import { Toaster } from "sonner" import { AddressBookRoute } from "./address-book/routes/address-book" import { NewAddressRoute } from "./address-book/routes/new-address" +import { CredentialDetailsRoute } from "./credentials/routes/credential-details" +import { CredentialsRoute } from "./credentials/routes/credentials" import { ErrorView } from "./error-renderer/views/error" import { i18n } from "./lib/i18n" import { UnlockWalletRoute } from "./lock/routes/unlock-wallet" @@ -122,6 +124,10 @@ export const Router = () => { /> } /> + }> + } /> + } /> + } /> From 7ed5f3176be482af759a9eb4f598a88d543a0c63 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 16:29:27 +0100 Subject: [PATCH 52/87] feat(private-credential): isCredential, decodeBytes --- bun.lockb | Bin 574488 -> 574528 bytes .../src/web-connector/views/web-connector.tsx | 59 +++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/bun.lockb b/bun.lockb index 0c34e48d85a6636bfca511bbdddf5eb230b2e7a9..b60efa1ad51e9350e668132f6c90acaddc9be258 100755 GIT binary patch delta 77678 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%0ANO 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 => { + const isCredential = (value: unknown): value is Record => { + if (typeof value !== "object" || value === null) return false + + const obj = value as Record + if ("credential" in obj) { + const cred = obj.credential + return ( + typeof cred === "object" && + cred !== null && + ("data" in cred || // Simple credential + ("value" in cred && + typeof cred.value === "object" && + "data" in cred.value)) // Recursive/struct credential + ) + } + return false + } + + const decodeBytes = (bytes: Array<{ value: string }>): string => { + return bytes + .map((b) => String.fromCharCode(Number.parseInt(b.value))) + .join("") + .replace(/\0/g, "") + } + + const simplifyCredentialData = ( + data: Record, + ): Record => { const simplified: Record = {} for (const [key, value] of Object.entries(data)) { - if ( - typeof value === "object" && - value !== null && - "_type" in value && - "value" in value - ) { + if (typeof value === "object" && value !== null) { if (value._type === "Bytes") { simplified[key] = decodeHexString(value.value) - } else { + } else if ("bytes" in value) { + simplified[key] = decodeBytes(value.bytes) + } else if ("value" in value) { simplified[key] = value.value + } else { + simplified[key] = value } } else { simplified[key] = value @@ -74,26 +100,17 @@ export const WebConnectorView = ({ return simplified } - const isCredential = (value: unknown): value is Record => { - if (typeof value !== "object" || value === null) return false - - const obj = value as Record - return ( - "credential" in obj && - typeof obj.credential === "object" && - obj.credential !== null && - "data" in obj.credential - ) - } - const renderPayload = (payload: string) => { const originalPayload = recoverOriginalPayload(payload) const parsedPayload = JSON.parse(originalPayload) as Record + if (!isCredential(parsedPayload)) { return

{payload}
} - const simplifiedData = simplifyCredentialData(parsedPayload.credential.data) + const credentialData = + parsedPayload.credential.value?.data || parsedPayload.credential.data + const simplifiedData = simplifyCredentialData(credentialData) const description = parsedPayload.metadata?.description return ( From 3be7847ec8608513019e99ca1c6e710d74f119f8 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 17:02:59 +0100 Subject: [PATCH 53/87] chore(private-credential): change icon to IdCard --- bun.lockb | Bin 574528 -> 574528 bytes packages/features/package.json | 2 +- .../src/credentials/views/credentials.tsx | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bun.lockb b/bun.lockb index b60efa1ad51e9350e668132f6c90acaddc9be258..c5a15d85a05b29977662615ca6dc4afbf731638e 100755 GIT binary patch delta 176 zcmV;h08jtGh$Fy=Bakj2ezSb5fNLF7SYb;n;V|mmzGBw$!dfU%5+VQwMB-}jfljqf z0X7E#qL-2N1S^v;TL_1^2LXq;2LiXa2Lr7HKKh*b~I58rAdrj$p3+iPK zR&2ufK5v@FFq>c!(^}x}>&D(}TK{{US>J1iF^8q5q+4YeyT#?xtX63A%EM1IJ> { className="p-4 flex items-center space-x-4 bg-secondary rounded-2xl" >
- +

{id}

From 649cff16d99710424f7f9d06be9e557ef6c7b70c Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 18:13:08 +0100 Subject: [PATCH 54/87] chore(private-credential): remove decode --- .../src/web-connector/views/web-connector.tsx | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 94486167..a0516521 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -46,13 +46,6 @@ export const WebConnectorView = ({ onSubmit({ userInput: selectedCredentials }) } - const decodeHexString = (hex: string): string => { - const bytes = new Uint8Array( - hex.match(/.{2}/g)!.map((byte) => Number.parseInt(byte, 16)), - ) - return new TextDecoder().decode(bytes).replace(/\0/g, "") - } - const isCredential = (value: unknown): value is Record => { if (typeof value !== "object" || value === null) return false @@ -71,23 +64,16 @@ export const WebConnectorView = ({ return false } - const decodeBytes = (bytes: Array<{ value: string }>): string => { - return bytes - .map((b) => String.fromCharCode(Number.parseInt(b.value))) - .join("") - .replace(/\0/g, "") - } - const simplifyCredentialData = ( data: Record, ): Record => { const simplified: Record = {} for (const [key, value] of Object.entries(data)) { if (typeof value === "object" && value !== null) { - if (value._type === "Bytes") { - simplified[key] = decodeHexString(value.value) - } else if ("bytes" in value) { - simplified[key] = decodeBytes(value.bytes) + if ("bytes" in value) { + simplified[key] = value.bytes + .map((b: { value: string }) => b.value) + .join("") } else if ("value" in value) { simplified[key] = value.value } else { From bfcbadde7ea0d3c8d7ef020fdaee832e35d95a52 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 27 Nov 2024 18:20:02 +0100 Subject: [PATCH 55/87] refactor(private-credential): render-payload --- .../web-connector/utils/render-payload.tsx | 71 +++++++++++++++++ .../src/web-connector/views/web-connector.tsx | 79 +------------------ 2 files changed, 74 insertions(+), 76 deletions(-) create mode 100644 packages/features/src/web-connector/utils/render-payload.tsx diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx new file mode 100644 index 00000000..30fa6831 --- /dev/null +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -0,0 +1,71 @@ +import { recoverOriginalPayload } from "../components/credential-selection-form" + +const isCredential = (value: unknown): value is Record => { + if (typeof value !== "object" || value === null) return false + + // TODO: check + const obj = value as Record + if ("credential" in obj) { + const cred = obj.credential + return ( + typeof cred === "object" && + cred !== null && + ("data" in cred || // Simple credential + ("value" in cred && + typeof cred.value === "object" && + "data" in cred.value)) // Recursive/struct credential + ) + } + return false +} + +const simplifyCredentialData = ( + data: Record, +): Record => { + const simplified: Record = {} + for (const [key, value] of Object.entries(data)) { + if (typeof value === "object" && value !== null) { + if ("bytes" in value) { + simplified[key] = value.bytes + .map((b: { value: string }) => b.value) + .join("") + } else if ("value" in value) { + simplified[key] = value.value + } else { + simplified[key] = value + } + } else { + simplified[key] = value + } + } + return simplified +} + +export const renderPayload = (payload: string) => { + try { + const originalPayload = recoverOriginalPayload(payload) + const parsedPayload = JSON.parse(originalPayload) as Record + + if (!isCredential(parsedPayload)) { + return
{payload}
+ } + + const credentialData = + parsedPayload.credential.value?.data || parsedPayload.credential.data + const simplifiedData = simplifyCredentialData(credentialData) + const description = parsedPayload.metadata?.description + + return ( +
+ {description &&

{description}

} +
+          {JSON.stringify(simplifiedData, null, 2)}
+        
+
+ ) + } catch (error) { + return ( +
{`Error: ${error}`}
+ ) + } +} diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index a0516521..75abeb94 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -3,12 +3,10 @@ import { MenuBar } from "@/components/menu-bar" import { Skeleton } from "@/components/skeleton" import type { SubmitHandler } from "react-hook-form" import { ConfirmationForm } from "../components/confirmation-form" -import { - SelectionForm, - recoverOriginalPayload, -} from "../components/credential-selection-form" +import { SelectionForm } from "../components/credential-selection-form" import { InputForm } from "../components/input-form" import type { UserInputForm } from "../types" +import { renderPayload } from "../utils/render-payload" type WebConnectorViewProps = { title: string @@ -46,69 +44,6 @@ export const WebConnectorView = ({ onSubmit({ userInput: selectedCredentials }) } - const isCredential = (value: unknown): value is Record => { - if (typeof value !== "object" || value === null) return false - - const obj = value as Record - if ("credential" in obj) { - const cred = obj.credential - return ( - typeof cred === "object" && - cred !== null && - ("data" in cred || // Simple credential - ("value" in cred && - typeof cred.value === "object" && - "data" in cred.value)) // Recursive/struct credential - ) - } - return false - } - - const simplifyCredentialData = ( - data: Record, - ): Record => { - const simplified: Record = {} - for (const [key, value] of Object.entries(data)) { - if (typeof value === "object" && value !== null) { - if ("bytes" in value) { - simplified[key] = value.bytes - .map((b: { value: string }) => b.value) - .join("") - } else if ("value" in value) { - simplified[key] = value.value - } else { - simplified[key] = value - } - } else { - simplified[key] = value - } - } - return simplified - } - - const renderPayload = (payload: string) => { - const originalPayload = recoverOriginalPayload(payload) - const parsedPayload = JSON.parse(originalPayload) as Record - - if (!isCredential(parsedPayload)) { - return
{payload}
- } - - const credentialData = - parsedPayload.credential.value?.data || parsedPayload.credential.data - const simplifiedData = simplifyCredentialData(credentialData) - const description = parsedPayload.metadata?.description - - return ( -
- {description &&

{description}

} -
-          {JSON.stringify(simplifiedData, null, 2)}
-        
-
- ) - } - const displayTitle = loadingMessage || title return ( @@ -121,15 +56,7 @@ export const WebConnectorView = ({

{displayTitle}

- {(() => { - try { - return renderPayload(payload) - } catch (error) { - return ( -
{`Error: ${error}`}
- ) - } - })()} + {renderPayload(payload)}
From 25f9f8304e5d6210c8982967419f296a5b447c31 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 28 Nov 2024 08:37:23 +0100 Subject: [PATCH 56/87] chore(private-credential): todo --- .../src/web-connector/components/credential-selection-form.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 6fd40df7..3ff3e9e4 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -68,6 +68,7 @@ export const SelectionForm = ({ : [] return storedCredentials.map((credential: any) => ({ + // TODO: use correct id id: createCredentialHash(credential), credential, sanitizedDisplay: sanitizeCredential(credential), From 78c59fc94c346dad1d1ec5383e39f0b1574fa388 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 28 Nov 2024 11:27:25 +0100 Subject: [PATCH 57/87] feat(private-credential): filter credentials for presentation request (only working for one credential in request) --- .../components/credential-selection-form.tsx | 84 ++++++++++++++++++- 1 file changed, 80 insertions(+), 4 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 3ff3e9e4..bc0eb616 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -15,7 +15,18 @@ type SelectionFormProps = { interface PayloadWithPresentation { storedCredentials: any[] - presentationRequest: any + presentationRequest: { + spec: { + inputs: Record< + string, + { + type: string + credentialType?: string + data?: Record + } + > + } + } } const sanitizeCredential = (credential: any) => { @@ -40,10 +51,63 @@ const isPayloadWithPresentation = ( typeof payload === "object" && payload !== null && "storedCredentials" in payload && - Array.isArray((payload as PayloadWithPresentation).storedCredentials) + Array.isArray((payload as PayloadWithPresentation).storedCredentials) && + "presentationRequest" in payload && + typeof (payload as PayloadWithPresentation).presentationRequest === + "object" && + (payload as PayloadWithPresentation).presentationRequest !== null && + "spec" in (payload as PayloadWithPresentation).presentationRequest && + typeof (payload as PayloadWithPresentation).presentationRequest.spec === + "object" && + (payload as PayloadWithPresentation).presentationRequest.spec !== null && + "inputs" in (payload as PayloadWithPresentation).presentationRequest.spec ) } +// Get requested credential info from presentation request +const getRequestedCredentialInfo = ( + presentationRequest: PayloadWithPresentation["presentationRequest"], +) => { + const credentialRequests: Array<{ type: string; dataFields: string[] }> = [] + + // get credentialType and the required keys + for (const input of Object.values(presentationRequest.spec.inputs)) { + if (input.type === "credential" && input.credentialType && input.data) { + credentialRequests.push({ + type: input.credentialType, + dataFields: Object.keys(input.data), + }) + } + } + + return credentialRequests +} + +// Get credential data keys accounting for both simple and recursive/struct credentials +const getCredentialDataKeys = (credential: any): string[] => { + // get data from either credential.data or credential.value.data + const data = credential.credential.value?.data || credential.credential.data + return data ? Object.keys(data) : [] +} + +// Check if credential matches request requirements +const credentialMatchesRequest = ( + credential: any, + requestedType: string, + requestedFields: string[], +): boolean => { + // Check witness type + if (credential.witness?.type !== requestedType) { + return false + } + + // Get credential data fields + const credentialFields = getCredentialDataKeys(credential) + + // Check request data fields are subset of credential fields + return requestedFields.every((field) => credentialFields.includes(field)) +} + export const SelectionForm = ({ onSubmit, onReject, @@ -60,14 +124,26 @@ export const SelectionForm = ({ const originalPayload = recoverOriginalPayload(payload) const parsedPayload = JSON.parse(originalPayload) - // Extract credentials using type guard + // Get requested credential requirements + const credentialRequirements = isPayloadWithPresentation(parsedPayload) + ? getRequestedCredentialInfo(parsedPayload.presentationRequest) + : [] + + // Extract credentials const storedCredentials = Array.isArray(parsedPayload) ? parsedPayload : isPayloadWithPresentation(parsedPayload) ? parsedPayload.storedCredentials : [] - return storedCredentials.map((credential: any) => ({ + // Filter credentials based on matching both type and required data fields + const filteredCredentials = storedCredentials.filter((credential: any) => + credentialRequirements.some((req) => + credentialMatchesRequest(credential, req.type, req.dataFields), + ), + ) + + return filteredCredentials.map((credential: any) => ({ // TODO: use correct id id: createCredentialHash(credential), credential, From 7e42b38b0986f2924f09913b771d8f1daa7c7a76 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 28 Nov 2024 13:11:19 +0100 Subject: [PATCH 58/87] chore(private-credential): extractDataFields --- bun.lockb | Bin 574528 -> 574528 bytes .../components/credential-selection-form.tsx | 23 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/bun.lockb b/bun.lockb index c5a15d85a05b29977662615ca6dc4afbf731638e..bbc31e738460c1bf4b504dbc322ea57e414bc5d7 100755 GIT binary patch delta 701 zcmV;u0z&=3h$Fy=Bakj2DpDc`D#$);or<;bQ9J}4&{8U=P5!IS+xZ$%B>sKqu}*qi zm&h&wFq8OP&;di25fub0v-Dk*LIFaT5fub0v$UWTLX$*-D3dT-2$T5Y5R*iLD6=r* zSUi)+;V`$j9|6!~lZa$6x444=<()vNs4PK)kA=h%S6 z+OX6+SMP!aeojwTtkMl1`0TE2v1*0>msHX$nBE8?5g-}2-5~-X0YJcyE*|S3Ywa1j z18LCdf7}|7d`AKZ*XWMZx;l%!iBm>BGWtN&ot;N&tIl6W0w}DwOETlgDw_@W#02!% zekr#-BLaw9K%|Y37q6oGIL~gRb0-N5zT4z-H zrY)XxCo7Nm5m>sm2*rLw?FRUh<9O+=G*}?g$pj-g6&E#F6#kS)mmS&y7(gp3#lCrd zC)E<`bi~gJA|&K9WD;2Hr~$gjNdv|D)H544!T#9eWDerPoGI{9Bhwd+tuBEkto*2{ zx2IGNbFQ~_+5+%WK!f9c7zLt6KDrKg1;BgANSA&gJ2IvgZx36-h4o^f;3cGTPgeQ**L^u zxIFbTeW?!=4D0XMe@sRu|+0XDZ$_6OpC0W-HWcL)qkm197g delta 701 zcmV;u0z&=3h$Fy=Bakj2ezSb5fNLF7SYb;n;V|mmzGBw$!dfU%5+VQwMB-}ju}*qi zlSuC{llWZF0YaA%6$C4@^j(xf0YR4$6$C4@w4fA1lLTrglQ3HdllbBglLTrgvoPaW zJOK}v5fub0x3nJt)MJxKV=%Y4g8}88KwK{LaTZk)QAd1*0pmenWZ+wXmIWxI8s>KW zmlrT%%S9XWBK!6_0w4iE*Ma7>M@Ga| z8kA&TEV=y|&1f}i)`y(UZp@A@j!9RgfJG;b)dvIwq-SPtP^j1Iy4Wn2_*miMR_k_| zw>={Qh+9BCWpf5NA;-V)qMoPQYtq=l)bi4XcZ5CFpoAI`zfFmj==1qG#Fuf| z@lEYbHr*5JqkIpj@rQ{5@k<@d;hH121%CqAT0l%;JGDbM`$%~22jkl`zL}>>=Xlkt zclP~@$*QnFa$GOp4EZu`qaGCLY_?KMCr!LO0dv`TxZ8QFDOL(t`ni`K+5#9rdR6<0 zMDF{aw{LHa83!~kcb3YpV=5boCxNLr%yCcmHl`0w+`dQN+_qFem(g|Eff=SorSdqh z8>|hX433Mjw{_YA@KQjbT_c!VRFf`(UHK|{6>kLp%SmE(vo0@K$f$@zawNBptP{V; ztd;caiODCxDvKfc79=8Gb0i~K^Zp5)%IS2sr7Z(Mi9n!=4D0XDY?sRu|+0X4T#_6OpC0W!BVcL)qkqI5%| diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index bc0eb616..851acd6d 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -22,7 +22,12 @@ interface PayloadWithPresentation { { type: string credentialType?: string - data?: Record + data?: + | Record + | { + _type: "Struct" + properties: Record + } } > } @@ -64,18 +69,30 @@ const isPayloadWithPresentation = ( ) } +// Extract data fields from input data which could be direct or nested in properties +const extractDataFields = (data: any): string[] => { + if (!data) return [] + + // Handle Struct type with properties + if (data._type === "Struct" && data.properties) { + return Object.keys(data.properties) + } + + // Handle direct data fields + return Object.keys(data) +} + // Get requested credential info from presentation request const getRequestedCredentialInfo = ( presentationRequest: PayloadWithPresentation["presentationRequest"], ) => { const credentialRequests: Array<{ type: string; dataFields: string[] }> = [] - // get credentialType and the required keys for (const input of Object.values(presentationRequest.spec.inputs)) { if (input.type === "credential" && input.credentialType && input.data) { credentialRequests.push({ type: input.credentialType, - dataFields: Object.keys(input.data), + dataFields: extractDataFields(input.data), }) } } From 5d01fa87b922158c8fbfd79a972b2e765335d23f Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 28 Nov 2024 14:46:37 +0100 Subject: [PATCH 59/87] feat(private-credential): change credential card ui --- .../components/credential-selection-form.tsx | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 851acd6d..8166376c 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -1,7 +1,6 @@ import { createCredentialHash } from "@palladco/web-provider" import React, { useState } from "react" import { useTranslation } from "react-i18next" -import xss from "xss" import yaml from "yaml" type SelectionFormProps = { @@ -34,14 +33,26 @@ interface PayloadWithPresentation { } } -const sanitizeCredential = (credential: any) => { - const yamlOptions = { - indent: 2, - lineWidth: 70, - minContentWidth: 0, +const simplifyCredentialData = ( + data: Record, +): Record => { + const simplified: Record = {} + for (const [key, value] of Object.entries(data)) { + if (typeof value === "object" && value !== null) { + if ("bytes" in value) { + simplified[key] = value.bytes + .map((b: { value: string }) => b.value) + .join("") + } else if ("value" in value) { + simplified[key] = value.value + } else { + simplified[key] = value + } + } else { + simplified[key] = value + } } - const yamlPayload = yaml.stringify(credential, yamlOptions) - return xss(yamlPayload) + return simplified } export const recoverOriginalPayload = (sanitizedPayload: string) => { @@ -125,6 +136,28 @@ const credentialMatchesRequest = ( return requestedFields.every((field) => credentialFields.includes(field)) } +const CredentialDisplay = ({ credential }: { credential: any }) => { + const witnessType = credential.witness?.type || "unknown" + const credentialData = + credential.credential.value?.data || credential.credential.data + const simplifiedData = simplifyCredentialData(credentialData) + const description = credential.metadata?.description + + return ( +
+ {description &&

{description}

} +
+        {JSON.stringify(simplifiedData, null, 2)}
+      
+
+ + Type: {witnessType} + +
+
+ ) +} + export const SelectionForm = ({ onSubmit, onReject, @@ -164,7 +197,6 @@ export const SelectionForm = ({ // TODO: use correct id id: createCredentialHash(credential), credential, - sanitizedDisplay: sanitizeCredential(credential), })) } catch (error: any) { throw Error(`Issue with parsing: ${error}: ${payload}`) @@ -206,9 +238,7 @@ export const SelectionForm = ({ onChange={() => handleToggleCredential(credentialData)} disabled={loading} /> -
- {credentialData.sanitizedDisplay || "Unknown Credential"} -
+ ))}
@@ -232,3 +262,5 @@ export const SelectionForm = ({ ) } + +export default SelectionForm From b1b7dcd66b5b3dfcd840a1dd45ac1eb453fe1650 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 29 Nov 2024 14:27:23 +0100 Subject: [PATCH 60/87] chore(private-credential): extract data fields from dynamic record --- bun.lockb | Bin 574528 -> 574528 bytes .../components/credential-selection-form.tsx | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index bbc31e738460c1bf4b504dbc322ea57e414bc5d7..25cae8e23f620a29c3b5624ab9fd455f47a3ebee 100755 GIT binary patch delta 335 zcmV-V0kHnSh$Fy=Bakj2wQ=ex;bnU?vPjGwiXH7>4)0z7X9UXfIl%~FMI@Qnu}(Um z0YjG&6$C4@w4hXElZbRMw>Sj>Ol*^c+cbx`aRIluaRLnuK%YN6G|+4hxe!PJh9@d~ zg)Xs3`&PoEXn+kSj@LGwMjjFU=TQ>9s+D!|JArgLgboE(qSU-vOyBulc6B5_Ew=@K z0`Q4ICtYX*eFbdI&1L8mW;y)HBE8dm`aH06{hNVfB=sc3bU^yn=1d^@RUGHDK&0)`h6CC!3#9p3rZw+4A*B0Y~twjzX`M; zonk(J4Lb*!JeM8de8^Ik^wZAkt_%(w_;-m-eBRWl@R~{ delta 347 zcmV-h0i^!Gh$Fy=Bakj2DpDc`D#$);or<;bQ9J}4&{8U=P5!IS+xZ$%B>sKqu}(Um z0YaA%6$C4@w4hXElgME(w>Sj>Ol$!Slkr+BlQ3Hdhq!S8x43Zv4Gln~jgS|wqWd_{ zZlrT32@Jm54aq*z8ejhv|r^&u_aeW zc_CyIh!n{QCKUDuR|M|FhewU{Ac(g$2?OwyKm=SS6?loDTBTB!c|yx5mi>7Q%$)Ox z69wBf20Inh7uOPvRLday8p)08x%(%+?nW9CHElp%)yh1#0Tl`T1BYdv1BYdv1czmw t1-E6M2CKlAp#}&bw=iD^NpS%(w|dYAzmk{nVFx0Yzzzoow_;-m-e3uimaYH* diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 8166376c..9f2bc011 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -27,6 +27,11 @@ interface PayloadWithPresentation { _type: "Struct" properties: Record } + | { + _type: "DynamicRecord" + maxEntries: number + knownShape: Record + } } > } @@ -80,7 +85,7 @@ const isPayloadWithPresentation = ( ) } -// Extract data fields from input data which could be direct or nested in properties +// Extract data fields from input data which could be direct, nested in properties, or in knownShape const extractDataFields = (data: any): string[] => { if (!data) return [] @@ -89,6 +94,11 @@ const extractDataFields = (data: any): string[] => { return Object.keys(data.properties) } + // Handle DynamicRecord with knownShape + if (data._type === "DynamicRecord" && data.knownShape) { + return Object.keys(data.knownShape) + } + // Handle direct data fields return Object.keys(data) } From bd4a26767e7ce2cd8f13f3db4be6f53a3cf9e438 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 29 Nov 2024 17:39:53 +0100 Subject: [PATCH 61/87] feat(private-credential): selection form only lets user select correct credentials --- .../components/credential-selection-form.tsx | 217 +++++++++++++----- .../src/web-connector/views/web-connector.tsx | 2 +- 2 files changed, 157 insertions(+), 62 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 9f2bc011..8559cd1d 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -103,50 +103,78 @@ const extractDataFields = (data: any): string[] => { return Object.keys(data) } -// Get requested credential info from presentation request -const getRequestedCredentialInfo = ( +// Get all credential requirements from presentation request +const getCredentialRequirements = ( presentationRequest: PayloadWithPresentation["presentationRequest"], ) => { - const credentialRequests: Array<{ type: string; dataFields: string[] }> = [] + const requirements: Array<{ + inputKey: string + type: string + dataFields: string[] + }> = [] - for (const input of Object.values(presentationRequest.spec.inputs)) { + for (const [key, input] of Object.entries(presentationRequest.spec.inputs)) { if (input.type === "credential" && input.credentialType && input.data) { - credentialRequests.push({ + requirements.push({ + inputKey: key, type: input.credentialType, dataFields: extractDataFields(input.data), }) } } - return credentialRequests + return requirements } // Get credential data keys accounting for both simple and recursive/struct credentials const getCredentialDataKeys = (credential: any): string[] => { - // get data from either credential.data or credential.value.data const data = credential.credential.value?.data || credential.credential.data return data ? Object.keys(data) : [] } -// Check if credential matches request requirements -const credentialMatchesRequest = ( +// Check if credential matches a specific requirement +const credentialMatchesRequirement = ( credential: any, - requestedType: string, - requestedFields: string[], + requirement: { + type: string + dataFields: string[] + }, ): boolean => { - // Check witness type - if (credential.witness?.type !== requestedType) { + if (credential.witness?.type !== requirement.type) { return false } - // Get credential data fields const credentialFields = getCredentialDataKeys(credential) + return requirement.dataFields.every((field) => + credentialFields.includes(field), + ) +} - // Check request data fields are subset of credential fields - return requestedFields.every((field) => credentialFields.includes(field)) +// Find all requirements that a credential can satisfy +const findMatchingRequirements = ( + credential: any, + requirements: Array<{ + inputKey: string + type: string + dataFields: string[] + }>, +) => { + return requirements.filter((req) => + credentialMatchesRequirement(credential, req), + ) } -const CredentialDisplay = ({ credential }: { credential: any }) => { +const CredentialDisplay = ({ + credential, + matchingRequirements, +}: { + credential: any + matchingRequirements: Array<{ + inputKey: string + type: string + dataFields: string[] + }> +}) => { const witnessType = credential.witness?.type || "unknown" const credentialData = credential.credential.value?.data || credential.credential.data @@ -159,10 +187,14 @@ const CredentialDisplay = ({ credential }: { credential: any }) => {
         {JSON.stringify(simplifiedData, null, 2)}
       
-
+
Type: {witnessType} + + Can be used for:{" "} + {matchingRequirements.map((r) => r.inputKey).join(", ")} +
) @@ -177,37 +209,44 @@ export const SelectionForm = ({ loading, }: SelectionFormProps) => { const { t } = useTranslation() - const [selectedCredentials, setSelectedCredentials] = useState([]) + const [selectedCredentials, setSelectedCredentials] = useState< + Map + >(new Map()) - const credentials = React.useMemo(() => { + const { credentials, requirements } = React.useMemo(() => { try { const originalPayload = recoverOriginalPayload(payload) const parsedPayload = JSON.parse(originalPayload) - // Get requested credential requirements const credentialRequirements = isPayloadWithPresentation(parsedPayload) - ? getRequestedCredentialInfo(parsedPayload.presentationRequest) + ? getCredentialRequirements(parsedPayload.presentationRequest) : [] - // Extract credentials const storedCredentials = Array.isArray(parsedPayload) ? parsedPayload : isPayloadWithPresentation(parsedPayload) ? parsedPayload.storedCredentials : [] - // Filter credentials based on matching both type and required data fields - const filteredCredentials = storedCredentials.filter((credential: any) => - credentialRequirements.some((req) => - credentialMatchesRequest(credential, req.type, req.dataFields), - ), - ) - - return filteredCredentials.map((credential: any) => ({ - // TODO: use correct id - id: createCredentialHash(credential), - credential, - })) + const validCredentials = storedCredentials + .filter( + (credential: any) => + findMatchingRequirements(credential, credentialRequirements) + .length > 0, + ) + .map((credential: any) => ({ + id: createCredentialHash(credential), + credential, + matchingRequirements: findMatchingRequirements( + credential, + credentialRequirements, + ), + })) + + return { + credentials: validCredentials, + requirements: credentialRequirements, + } } catch (error: any) { throw Error(`Issue with parsing: ${error}: ${payload}`) } @@ -215,48 +254,104 @@ export const SelectionForm = ({ const handleSubmit = (e: React.FormEvent) => { e.preventDefault() - onSubmit(JSON.stringify(selectedCredentials.map((c) => c.credential))) + // Create an array of credentials in the same order as the requirements + const orderedCredentials = requirements + .map((req) => { + const selected = selectedCredentials.get(req.inputKey) + return selected?.credential + }) + .filter(Boolean) + + onSubmit(JSON.stringify(orderedCredentials)) } - const handleToggleCredential = (credentialData: any) => { - setSelectedCredentials((prev) => - prev.some((c) => c.id === credentialData.id) - ? prev.filter((c) => c.id !== credentialData.id) - : [...prev, credentialData], - ) + const handleCredentialSelect = (credentialData: any, inputKey: string) => { + setSelectedCredentials((prev) => { + const newMap = new Map(prev) + + // Update or add the selection for this input + newMap.set(inputKey, { + credential: credentialData.credential, + credentialId: credentialData.id, + }) + + return newMap + }) } - const isSelected = (credentialData: any) => { - return selectedCredentials.some((c) => c.id === credentialData.id) + const isSelectedFor = (credentialId: string, inputKey: string) => { + const selection = selectedCredentials.get(inputKey) + return selection?.credentialId === credentialId } + const allRequirementsMet = requirements.every((req) => + selectedCredentials.has(req.inputKey), + ) + return (
-
- {credentials.map((credentialData) => ( - - ))} +
+ {requirements.map((requirement) => { + const matchingCredentials = credentials.filter((cred) => + cred.matchingRequirements.some( + (req) => req.inputKey === requirement.inputKey, + ), + ) + + return ( +
+

+ Select credential for {requirement.inputKey}: +

+
+ {matchingCredentials.length > 0 ? ( + matchingCredentials.map((credentialData) => ( + + )) + ) : ( +
+ No matching credentials found for this input +
+ )} +
+
+ ) + })}
diff --git a/packages/features/src/web-connector/views/web-connector.tsx b/packages/features/src/web-connector/views/web-connector.tsx index 75abeb94..2ff51e0e 100644 --- a/packages/features/src/web-connector/views/web-connector.tsx +++ b/packages/features/src/web-connector/views/web-connector.tsx @@ -60,7 +60,7 @@ export const WebConnectorView = ({
-
+
{inputType === "confirmation" && ( Date: Sat, 30 Nov 2024 22:08:39 +0100 Subject: [PATCH 62/87] feat(private-credential): render presentation request properly --- .../web-connector/utils/render-payload.tsx | 262 ++++++++++++++++-- .../src/mina-network/mina-provider.ts | 2 +- 2 files changed, 233 insertions(+), 31 deletions(-) diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index 30fa6831..e3e74b85 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -1,22 +1,192 @@ import { recoverOriginalPayload } from "../components/credential-selection-form" -const isCredential = (value: unknown): value is Record => { - if (typeof value !== "object" || value === null) return false +type LogicNode = { + type: string + inputs?: LogicNode[] + left?: LogicNode + right?: LogicNode + key?: string + inner?: LogicNode + data?: Record + credentialKey?: string + input?: LogicNode + options?: LogicNode[] | LogicNode + condition: LogicNode + thenNode: LogicNode + elseNode: LogicNode +} - // TODO: check - const obj = value as Record - if ("credential" in obj) { - const cred = obj.credential - return ( - typeof cred === "object" && - cred !== null && - ("data" in cred || // Simple credential - ("value" in cred && - typeof cred.value === "object" && - "data" in cred.value)) // Recursive/struct credential - ) +// Extract fields from credential shape +const extractCredentialFields = (data: any): string[] => { + if (!data) return [] + + if (data._type === "Struct" && data.properties) { + return Object.keys(data.properties) + } + + if (data._type === "DynamicRecord" && data.knownShape) { + return Object.keys(data.knownShape) + } + + return Object.keys(data) +} + +const formatLogicNode = (node: LogicNode, indent = ""): string => { + const nextIndent = `${indent} ` + + switch (node.type) { + case "and": + if (!node.inputs?.length) return "AND()" + return `AND(\n${nextIndent}${node.inputs.map((n) => formatLogicNode(n, nextIndent)).join(`,\n${nextIndent}`)}\n${indent})` + case "or": + if (!node.left || !node.right) return "OR()" + return `OR(\n${nextIndent}${formatLogicNode(node.left, nextIndent)},\n${nextIndent}${formatLogicNode(node.right, nextIndent)}\n${indent})` + case "equals": + return `EQUALS(${node.left && node.right ? [formatLogicNode(node.left, nextIndent), formatLogicNode(node.right, nextIndent)].join(", ") : ""})` + case "equalsOneOf": { + const input = node.input ? formatLogicNode(node.input, nextIndent) : "" + const options = Array.isArray(node.options) + ? `[\n${nextIndent}${node.options.map((o) => formatLogicNode(o, nextIndent)).join(`,\n${nextIndent}`)}\n${indent}]` + : node.options + ? formatLogicNode(node.options, nextIndent) + : "" + return `EQUALS_ONE_OF(${input}, ${options})` + } + case "lessThan": + return node.left && node.right + ? `(${formatLogicNode(node.left)} < ${formatLogicNode(node.right)})` + : "" + case "lessThanEq": + return node.left && node.right + ? `(${formatLogicNode(node.left)} ≤ ${formatLogicNode(node.right)})` + : "" + case "add": + return node.left && node.right + ? `(${formatLogicNode(node.left)} + ${formatLogicNode(node.right)})` + : "" + case "sub": + return node.left && node.right + ? `(${formatLogicNode(node.left)} - ${formatLogicNode(node.right)})` + : "" + case "mul": + return node.left && node.right + ? `(${formatLogicNode(node.left)} × ${formatLogicNode(node.right)})` + : "" + case "div": + return node.left && node.right + ? `(${formatLogicNode(node.left)} ÷ ${formatLogicNode(node.right)})` + : "" + case "constant": + return node.data ? JSON.stringify(node.data.value || node.data) : "" + case "ifThenElse": + if (!node.condition || !node.thenNode || !node.elseNode) return "" + return [ + "IF", + formatLogicNode(node.condition, nextIndent), + "THEN", + formatLogicNode(node.thenNode, nextIndent), + "ELSE", + formatLogicNode(node.elseNode, nextIndent), + ].join(`\n${nextIndent}`) + case "property": { + // Check if this is accessing a specific property of a credential + if ( + node.inner?.type === "property" && + node.inner.key === "data" && + node.inner.inner?.type === "property" && + node.inner.inner.key + ) { + return `${node.inner.inner.key}.${node.key}` + } + // Check if this is accessing the full credential + if ( + node.key === "data" && + node.inner?.type === "property" && + node.inner.key === "credential" && + node.inner.inner?.type === "root" + ) { + return "credential" + } + if (node.inner?.type === "root") { + return node.key || "" + } + return `${node.key}${node.inner ? `.${formatLogicNode(node.inner)}` : ""}` + } + case "root": + return "" + case "hash": + return `HASH(${node.inputs?.map((n) => formatLogicNode(n, nextIndent)).join(", ") || ""})` + case "issuer": + return `ISSUER(${node.credentialKey || ""})` + case "not": + return `NOT(${node.inner ? formatLogicNode(node.inner, nextIndent) : ""})` + case "record": { + if (!node.data || Object.keys(node.data).length === 0) return "RECORD()" + return `{\n${nextIndent}${Object.entries(node.data) + .map(([key, value]) => `${key}: ${formatLogicNode(value, nextIndent)}`) + .join(`,\n${nextIndent}`)}\n${indent}}` + } + default: + return JSON.stringify(node) } - return false +} + +const formatInputs = (inputs: Record): Record => { + const grouped: Record = { + credentials: {}, + claims: {}, + constants: {}, + } + + for (const [key, input] of Object.entries(inputs)) { + switch (input.type) { + case "credential": + grouped.credentials[key] = { + type: input.credentialType, + fields: extractCredentialFields(input.data), + } + break + case "claim": + grouped.claims[key] = input.data._type + break + case "constant": + grouped.constants[key] = { + type: input.data._type, + value: input.value, + } + break + } + } + + return grouped +} + +const formatClaimValues = ( + claims: Record, +): Record => { + const formatted: Record = {} + + for (const [key, claim] of Object.entries(claims)) { + if (claim._type === "DynamicArray" && claim.value) { + formatted[key] = claim.value.map((v: any) => v.value) + } else { + formatted[key] = claim.value + } + } + + return formatted +} + +const isPresentationRequest = ( + value: unknown, +): value is { presentationRequest: any } => { + if (typeof value !== "object" || value === null) return false + return "presentationRequest" in value +} + +const isCredential = (value: unknown): value is Record => { + if (typeof value !== "object" || value === null) return false + return "credential" in value } const simplifyCredentialData = ( @@ -44,25 +214,57 @@ const simplifyCredentialData = ( export const renderPayload = (payload: string) => { try { const originalPayload = recoverOriginalPayload(payload) - const parsedPayload = JSON.parse(originalPayload) as Record + const parsedPayload = JSON.parse(originalPayload) + + // Handle presentation request format + if (isPresentationRequest(parsedPayload)) { + const request = parsedPayload.presentationRequest + const formatted = { + type: request.type, + inputs: formatInputs(request.spec.inputs), + logic: { + assert: formatLogicNode(request.spec.logic.assert), + outputClaim: formatLogicNode(request.spec.logic.outputClaim), + }, + claims: formatClaimValues(request.claims), + context: request.inputContext + ? { + type: request.inputContext.type, + action: request.inputContext.action, + serverNonce: request.inputContext.serverNonce.value, + } + : null, + } - if (!isCredential(parsedPayload)) { - return
{payload}
+ let jsonString = JSON.stringify(formatted, null, 2) + jsonString = jsonString.replace(/\\n/g, "\n") + + return ( +
+
{jsonString}
+
+ ) } - const credentialData = - parsedPayload.credential.value?.data || parsedPayload.credential.data - const simplifiedData = simplifyCredentialData(credentialData) - const description = parsedPayload.metadata?.description + // Handle credential format + if (isCredential(parsedPayload)) { + const credentialData = + parsedPayload.credential.value?.data || parsedPayload.credential.data + const simplifiedData = simplifyCredentialData(credentialData) + const description = parsedPayload.metadata?.description - return ( -
- {description &&

{description}

} -
-          {JSON.stringify(simplifiedData, null, 2)}
-        
-
- ) + return ( +
+ {description &&

{description}

} +
+            {JSON.stringify(simplifiedData, null, 2)}
+          
+
+ ) + } + + // Default fallback + return
{payload}
} catch (error) { return (
{`Error: ${error}`}
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 13af6aaf..f23be3c8 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -480,7 +480,7 @@ export const createMinaProvider = async (): Promise< inputType: "confirmation", metadata: { title: "Presentation request", - payload: JSON.stringify(presentationRequest), + payload: JSON.stringify({ presentationRequest }), }, }) From 91bf616c845fe905435f95122aa67dafbf5c3f22 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Sun, 1 Dec 2024 16:09:39 +0100 Subject: [PATCH 63/87] minor --- .../web-connector/components/credential-selection-form.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 8559cd1d..6f2b0d5b 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -184,7 +184,7 @@ const CredentialDisplay = ({ return (
{description &&

{description}

} -
+      
         {JSON.stringify(simplifiedData, null, 2)}
       
@@ -293,7 +293,7 @@ export const SelectionForm = ({ onSubmit={handleSubmit} className="flex flex-1 flex-col items-center gap-2 w-full" > -
+
{requirements.map((requirement) => { const matchingCredentials = credentials.filter((cred) => cred.matchingRequirements.some( From 90602613d71cf59c6df65a897b5748b89ae45df5 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Mon, 2 Dec 2024 15:27:25 +0100 Subject: [PATCH 64/87] chore(private-credential): swap inputs and logic and add origin --- .../src/web-connector/utils/render-payload.tsx | 14 ++++++++------ .../web-provider/src/mina-network/mina-provider.ts | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index e3e74b85..ac6d2400 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -177,7 +177,7 @@ const formatClaimValues = ( return formatted } -const isPresentationRequest = ( +const containsPresentationRequest = ( value: unknown, ): value is { presentationRequest: any } => { if (typeof value !== "object" || value === null) return false @@ -217,21 +217,23 @@ export const renderPayload = (payload: string) => { const parsedPayload = JSON.parse(originalPayload) // Handle presentation request format - if (isPresentationRequest(parsedPayload)) { + if (containsPresentationRequest(parsedPayload)) { const request = parsedPayload.presentationRequest const formatted = { + ...("origin" in parsedPayload ? { origin: parsedPayload.origin } : {}), type: request.type, + logic: formatLogicNode(request.spec.logic.assert), + outputClaim: formatLogicNode(request.spec.logic.outputClaim), inputs: formatInputs(request.spec.inputs), - logic: { - assert: formatLogicNode(request.spec.logic.assert), - outputClaim: formatLogicNode(request.spec.logic.outputClaim), - }, claims: formatClaimValues(request.claims), context: request.inputContext ? { type: request.inputContext.type, action: request.inputContext.action, serverNonce: request.inputContext.serverNonce.value, + ...("verifierIdentity" in parsedPayload + ? { verifierIdentity: parsedPayload.verifierIdentity } + : {}), } : null, } diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index f23be3c8..67146c5f 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -480,7 +480,7 @@ export const createMinaProvider = async (): Promise< inputType: "confirmation", metadata: { title: "Presentation request", - payload: JSON.stringify({ presentationRequest }), + payload: JSON.stringify({ origin, presentationRequest }), }, }) From c4808382c24af0376e673a8f2306ec3dac9d91d0 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 3 Dec 2024 09:23:01 +0100 Subject: [PATCH 65/87] chore(private-credential): more human readable presentation request --- .../web-connector/utils/render-payload.tsx | 201 ++++++++---------- 1 file changed, 92 insertions(+), 109 deletions(-) diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index ac6d2400..6a117adf 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -11,12 +11,11 @@ type LogicNode = { credentialKey?: string input?: LogicNode options?: LogicNode[] | LogicNode - condition: LogicNode - thenNode: LogicNode - elseNode: LogicNode + condition?: LogicNode + thenNode?: LogicNode + elseNode?: LogicNode } -// Extract fields from credential shape const extractCredentialFields = (data: any): string[] => { if (!data) return [] @@ -31,65 +30,40 @@ const extractCredentialFields = (data: any): string[] => { return Object.keys(data) } -const formatLogicNode = (node: LogicNode, indent = ""): string => { - const nextIndent = `${indent} ` +const formatLogicNode = (node: LogicNode, level = 0): string => { + const indent = " ".repeat(level) switch (node.type) { case "and": - if (!node.inputs?.length) return "AND()" - return `AND(\n${nextIndent}${node.inputs.map((n) => formatLogicNode(n, nextIndent)).join(`,\n${nextIndent}`)}\n${indent})` + if (!node.inputs?.length) return "all conditions must be true" + return `${indent}All of these conditions must be true:\n${node.inputs + .map((n) => `${indent}- ${formatLogicNode(n, level + 1)}`) + .join("\n")}` case "or": - if (!node.left || !node.right) return "OR()" - return `OR(\n${nextIndent}${formatLogicNode(node.left, nextIndent)},\n${nextIndent}${formatLogicNode(node.right, nextIndent)}\n${indent})` + if (!node.left || !node.right) return "any condition must be true" + return `${indent}Either:\n${indent}- ${formatLogicNode(node.left, level + 1)}\n${indent}Or:\n${indent}- ${formatLogicNode(node.right, level + 1)}` case "equals": - return `EQUALS(${node.left && node.right ? [formatLogicNode(node.left, nextIndent), formatLogicNode(node.right, nextIndent)].join(", ") : ""})` + return node.left && node.right + ? `${formatLogicNode(node.left)} equals ${formatLogicNode(node.right)}` + : "" case "equalsOneOf": { - const input = node.input ? formatLogicNode(node.input, nextIndent) : "" + const input = node.input ? formatLogicNode(node.input, level) : "" const options = Array.isArray(node.options) - ? `[\n${nextIndent}${node.options.map((o) => formatLogicNode(o, nextIndent)).join(`,\n${nextIndent}`)}\n${indent}]` + ? node.options.map((o) => formatLogicNode(o, level)).join(", ") : node.options - ? formatLogicNode(node.options, nextIndent) + ? formatLogicNode(node.options, level) : "" - return `EQUALS_ONE_OF(${input}, ${options})` + return `${options} contains ${input}` } case "lessThan": return node.left && node.right - ? `(${formatLogicNode(node.left)} < ${formatLogicNode(node.right)})` + ? `${formatLogicNode(node.left)} < ${formatLogicNode(node.right)}` : "" case "lessThanEq": return node.left && node.right - ? `(${formatLogicNode(node.left)} ≤ ${formatLogicNode(node.right)})` - : "" - case "add": - return node.left && node.right - ? `(${formatLogicNode(node.left)} + ${formatLogicNode(node.right)})` - : "" - case "sub": - return node.left && node.right - ? `(${formatLogicNode(node.left)} - ${formatLogicNode(node.right)})` - : "" - case "mul": - return node.left && node.right - ? `(${formatLogicNode(node.left)} × ${formatLogicNode(node.right)})` - : "" - case "div": - return node.left && node.right - ? `(${formatLogicNode(node.left)} ÷ ${formatLogicNode(node.right)})` + ? `${formatLogicNode(node.left)} ≤ ${formatLogicNode(node.right)}` : "" - case "constant": - return node.data ? JSON.stringify(node.data.value || node.data) : "" - case "ifThenElse": - if (!node.condition || !node.thenNode || !node.elseNode) return "" - return [ - "IF", - formatLogicNode(node.condition, nextIndent), - "THEN", - formatLogicNode(node.thenNode, nextIndent), - "ELSE", - formatLogicNode(node.elseNode, nextIndent), - ].join(`\n${nextIndent}`) case "property": { - // Check if this is accessing a specific property of a credential if ( node.inner?.type === "property" && node.inner.key === "data" && @@ -98,7 +72,6 @@ const formatLogicNode = (node: LogicNode, indent = ""): string => { ) { return `${node.inner.inner.key}.${node.key}` } - // Check if this is accessing the full credential if ( node.key === "data" && node.inner?.type === "property" && @@ -115,66 +88,81 @@ const formatLogicNode = (node: LogicNode, indent = ""): string => { case "root": return "" case "hash": - return `HASH(${node.inputs?.map((n) => formatLogicNode(n, nextIndent)).join(", ") || ""})` + return `hash(${node.inputs?.map((n) => formatLogicNode(n, level)).join(", ") || ""})` case "issuer": - return `ISSUER(${node.credentialKey || ""})` + return `issuer(${node.credentialKey || ""})` case "not": - return `NOT(${node.inner ? formatLogicNode(node.inner, nextIndent) : ""})` + return `not ${node.inner ? formatLogicNode(node.inner, level) : ""}` case "record": { - if (!node.data || Object.keys(node.data).length === 0) return "RECORD()" - return `{\n${nextIndent}${Object.entries(node.data) - .map(([key, value]) => `${key}: ${formatLogicNode(value, nextIndent)}`) - .join(`,\n${nextIndent}`)}\n${indent}}` + if (!node.data || Object.keys(node.data).length === 0) return "" + return Object.entries(node.data) + .map(([key, value]) => `${key}: ${formatLogicNode(value, level)}`) + .join(`\n${indent}`) } default: return JSON.stringify(node) } } -const formatInputs = (inputs: Record): Record => { - const grouped: Record = { - credentials: {}, - claims: {}, - constants: {}, +const formatInputsHumanReadable = (inputs: Record): string => { + const sections: string[] = [] + + // Handle credentials + const credentials = Object.entries(inputs).filter( + ([_, input]) => input.type === "credential", + ) + if (credentials.length > 0) { + sections.push("Required credentials:") + for (const [key, input] of credentials) { + const fields = extractCredentialFields(input.data) + const wrappedFields = fields.reduce((acc, field, i) => { + if (i === fields.length - 1) return acc + field + return `${acc + field}, ` + }, "") + sections.push( + `- ${key} (type: ${input.credentialType}):\n Contains: ${wrappedFields}`, + ) + } + } + + // Handle claims + const claims = Object.entries(inputs).filter( + ([_, input]) => input.type === "claim", + ) + if (claims.length > 0) { + sections.push("\nRequired claims:") + for (const [key, input] of claims) { + sections.push(`- ${key}: ${input.data._type}`) + } } - for (const [key, input] of Object.entries(inputs)) { - switch (input.type) { - case "credential": - grouped.credentials[key] = { - type: input.credentialType, - fields: extractCredentialFields(input.data), - } - break - case "claim": - grouped.claims[key] = input.data._type - break - case "constant": - grouped.constants[key] = { - type: input.data._type, - value: input.value, - } - break + // Handle constants + const constants = Object.entries(inputs).filter( + ([_, input]) => input.type === "constant", + ) + if (constants.length > 0) { + sections.push("\nConstants:") + for (const [key, input] of constants) { + sections.push(`- ${key}: ${input.data._type} = ${input.value}`) } } - return grouped + return sections.join("\n") } -const formatClaimValues = ( - claims: Record, -): Record => { - const formatted: Record = {} +const formatClaimsHumanReadable = (claims: Record): string => { + const sections = ["\nClaimed values:"] for (const [key, claim] of Object.entries(claims)) { if (claim._type === "DynamicArray" && claim.value) { - formatted[key] = claim.value.map((v: any) => v.value) + const values = claim.value.map((v: any) => v.value).join(", ") + sections.push(`- ${key}:\n ${values}`) } else { - formatted[key] = claim.value + sections.push(`- ${key}: ${claim.value}`) } } - return formatted + return sections.join("\n") } const containsPresentationRequest = ( @@ -219,33 +207,28 @@ export const renderPayload = (payload: string) => { // Handle presentation request format if (containsPresentationRequest(parsedPayload)) { const request = parsedPayload.presentationRequest - const formatted = { - ...("origin" in parsedPayload ? { origin: parsedPayload.origin } : {}), - type: request.type, - logic: formatLogicNode(request.spec.logic.assert), - outputClaim: formatLogicNode(request.spec.logic.outputClaim), - inputs: formatInputs(request.spec.inputs), - claims: formatClaimValues(request.claims), - context: request.inputContext - ? { - type: request.inputContext.type, - action: request.inputContext.action, - serverNonce: request.inputContext.serverNonce.value, - ...("verifierIdentity" in parsedPayload - ? { verifierIdentity: parsedPayload.verifierIdentity } - : {}), - } - : null, - } - let jsonString = JSON.stringify(formatted, null, 2) - jsonString = jsonString.replace(/\\n/g, "\n") + const formatted = [ + `Type: ${request.type}`, + "", + formatInputsHumanReadable(request.spec.inputs), + "", + `Requirements:\n${formatLogicNode(request.spec.logic.assert, 0)}`, + "", + `Output:\n${formatLogicNode(request.spec.logic.outputClaim, 0)}`, + formatClaimsHumanReadable(request.claims), + request.inputContext + ? `\nContext:\n- Type: ${request.inputContext.type}\n- Action: ${ + request.inputContext.action + }\n- Server Nonce: ${request.inputContext.serverNonce.value}` + : "", + "origin" in parsedPayload ? `\nOrigin: ${parsedPayload.origin}` : "", + "verifierIdentity" in parsedPayload + ? `\nVerifier Identity: ${parsedPayload.verifierIdentity}` + : "", + ].join("\n") - return ( -
-
{jsonString}
-
- ) + return
{formatted}
} // Handle credential format From 61b2e5b389cf8ed99576104f60ea95e3d6a5f774 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 3 Dec 2024 10:02:31 +0100 Subject: [PATCH 66/87] chore(private-credential): add errors --- .../web-connector/utils/render-payload.tsx | 95 +++++++++++++------ 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index 6a117adf..e9145f68 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -35,35 +35,58 @@ const formatLogicNode = (node: LogicNode, level = 0): string => { switch (node.type) { case "and": - if (!node.inputs?.length) return "all conditions must be true" + if (!node.inputs) { + throw Error("AND node must have 'inputs' array") + } + if (node.inputs.length === 0) { + throw Error("AND node must have at least one input") + } return `${indent}All of these conditions must be true:\n${node.inputs .map((n) => `${indent}- ${formatLogicNode(n, level + 1)}`) .join("\n")}` + case "or": - if (!node.left || !node.right) return "any condition must be true" + if (!node.left || !node.right) { + throw Error("OR node must have both 'left' and 'right' nodes") + } return `${indent}Either:\n${indent}- ${formatLogicNode(node.left, level + 1)}\n${indent}Or:\n${indent}- ${formatLogicNode(node.right, level + 1)}` + case "equals": - return node.left && node.right - ? `${formatLogicNode(node.left)} equals ${formatLogicNode(node.right)}` - : "" + if (!node.left || !node.right) { + throw Error("EQUALS node must have both 'left' and 'right' nodes") + } + return `${formatLogicNode(node.left)} equals ${formatLogicNode(node.right)}` + case "equalsOneOf": { - const input = node.input ? formatLogicNode(node.input, level) : "" + if (!node.input) { + throw Error("EQUALS_ONE_OF node must have 'input' node") + } + if (!node.options) { + throw Error("EQUALS_ONE_OF node must have 'options'") + } + const input = formatLogicNode(node.input, level) const options = Array.isArray(node.options) ? node.options.map((o) => formatLogicNode(o, level)).join(", ") - : node.options - ? formatLogicNode(node.options, level) - : "" + : formatLogicNode(node.options, level) return `${options} contains ${input}` } + case "lessThan": - return node.left && node.right - ? `${formatLogicNode(node.left)} < ${formatLogicNode(node.right)}` - : "" + if (!node.left || !node.right) { + throw Error("LESS_THAN node must have both 'left' and 'right' nodes") + } + return `${formatLogicNode(node.left)} < ${formatLogicNode(node.right)}` + case "lessThanEq": - return node.left && node.right - ? `${formatLogicNode(node.left)} ≤ ${formatLogicNode(node.right)}` - : "" + if (!node.left || !node.right) { + throw Error("LESS_THAN_EQ node must have both 'left' and 'right' nodes") + } + return `${formatLogicNode(node.left)} ≤ ${formatLogicNode(node.right)}` + case "property": { + if (!node.key) { + throw Error("PROPERTY node must have 'key'") + } if ( node.inner?.type === "property" && node.inner.key === "data" && @@ -72,35 +95,47 @@ const formatLogicNode = (node: LogicNode, level = 0): string => { ) { return `${node.inner.inner.key}.${node.key}` } - if ( - node.key === "data" && - node.inner?.type === "property" && - node.inner.key === "credential" && - node.inner.inner?.type === "root" - ) { - return "credential" - } if (node.inner?.type === "root") { - return node.key || "" + return node.key } return `${node.key}${node.inner ? `.${formatLogicNode(node.inner)}` : ""}` } + case "root": return "" + case "hash": - return `hash(${node.inputs?.map((n) => formatLogicNode(n, level)).join(", ") || ""})` + if (!node.inputs) { + throw Error("HASH node must have 'inputs' array") + } + return `hash(${node.inputs.map((n) => formatLogicNode(n, level)).join(", ")})` + case "issuer": - return `issuer(${node.credentialKey || ""})` + if (!node.credentialKey) { + throw Error("ISSUER node must have 'credentialKey'") + } + return `issuer(${node.credentialKey})` + case "not": - return `not ${node.inner ? formatLogicNode(node.inner, level) : ""}` + if (!node.inner) { + throw Error("NOT node must have 'inner' node") + } + return `not ${formatLogicNode(node.inner, level)}` + case "record": { - if (!node.data || Object.keys(node.data).length === 0) return "" + if (!node.data) { + throw Error("RECORD node must have 'data' object") + } + if (Object.keys(node.data).length === 0) { + throw Error("RECORD node must have at least one data field") + } return Object.entries(node.data) .map(([key, value]) => `${key}: ${formatLogicNode(value, level)}`) .join(`\n${indent}`) } + default: - return JSON.stringify(node) + throw Error(`Unknown node type: ${node.type}`) } } @@ -130,7 +165,7 @@ const formatInputsHumanReadable = (inputs: Record): string => { ([_, input]) => input.type === "claim", ) if (claims.length > 0) { - sections.push("\nRequired claims:") + sections.push("\nClaims:") for (const [key, input] of claims) { sections.push(`- ${key}: ${input.data._type}`) } From 865792227125cfd1ab3f2b6b30302c3f2146b758 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Tue, 3 Dec 2024 12:33:48 +0100 Subject: [PATCH 67/87] chore(private-credential): delete todo --- packages/web-provider/src/mina-network/mina-provider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 67146c5f..d257680d 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -437,7 +437,6 @@ export const createMinaProvider = async (): Promise< } // TODO: hash should be stored with the credential - // TODO: handle metadata // Generate hash of the new credential const newCredentialHash = createCredentialHash(credential) From 872ab6cb9ae58e192bf8d11b1102c314a2a3450e Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 4 Dec 2024 14:44:09 +0100 Subject: [PATCH 68/87] chore(private-credential): property path and verifier url --- apps/extension/src/sandbox/index.ts | 17 +++++- bun.lockb | Bin 574528 -> 574592 bytes .../web-connector/utils/render-payload.tsx | 56 +++++++++++++----- .../src/mina-network/mina-provider.ts | 19 ++++-- 4 files changed, 68 insertions(+), 24 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 2b17ba6c..9f95c9af 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -30,7 +30,13 @@ type Result = { type PresentationRequestPayload = { presentationRequest: string selectedCredentials: string[] - verifierIdentity: string + verifierIdentity: + | string + | { + address: string + tokenId: string + network: "devnet" | "mainnet" + } } const recoverOriginalPayload = (sanitizedPayload: string) => { @@ -130,12 +136,17 @@ window.addEventListener("message", async (event) => { // compile const compiled = await Presentation.compile(deserialized) + // format verifierIdentity + const verifierIdentityString = + requestType === "zk-app" + ? JSON.stringify(verifierIdentity) + : (verifierIdentity as string) + // prepare presentation request and get fields to sign const prepared = await Presentation.prepare({ request: compiled, credentials: storedCredentials, - // TODO: handle zk-app verifierIdentity - context: { verifierIdentity }, + context: { verifierIdentity: verifierIdentityString }, }) // ask wallet to sign fields diff --git a/bun.lockb b/bun.lockb index 25cae8e23f620a29c3b5624ab9fd455f47a3ebee..1dc2d2bb4c13f2b1d1de09e8f8f571f5ef8ea1e9 100755 GIT binary patch delta 23252 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 b%S*hZ!Qv;v59neoXB?E#2FrswANBtN^i>If delta 23220 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 TsBX4-<6mU7zR54T0Oh{`@?yv4 diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index e9145f68..3720990f 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -30,6 +30,21 @@ const extractCredentialFields = (data: any): string[] => { return Object.keys(data) } +const buildPropertyPath = (node: LogicNode): string => { + const parts: string[] = [] + let currentNode: LogicNode | undefined = node + + while (currentNode?.type === "property") { + if (!currentNode.key) { + throw Error("PROPERTY node must have 'key'") + } + parts.unshift(currentNode.key) + currentNode = currentNode.inner + } + + return parts.join(".") +} + const formatLogicNode = (node: LogicNode, level = 0): string => { const indent = " ".repeat(level) @@ -87,18 +102,14 @@ const formatLogicNode = (node: LogicNode, level = 0): string => { if (!node.key) { throw Error("PROPERTY node must have 'key'") } - if ( - node.inner?.type === "property" && - node.inner.key === "data" && - node.inner.inner?.type === "property" && - node.inner.inner.key - ) { - return `${node.inner.inner.key}.${node.key}` - } + + // If this is the root property, just return the path if (node.inner?.type === "root") { return node.key } - return `${node.key}${node.inner ? `.${formatLogicNode(node.inner)}` : ""}` + + // For nested properties, build the complete path + return buildPropertyPath(node) } case "root": @@ -202,7 +213,12 @@ const formatClaimsHumanReadable = (claims: Record): string => { const containsPresentationRequest = ( value: unknown, -): value is { presentationRequest: any } => { +): value is { + presentationRequest: any + verifierIdentity: + | string + | { address: string; tokenId: string; network: "devnet" | "mainnet" } +} => { if (typeof value !== "object" || value === null) return false return "presentationRequest" in value } @@ -243,6 +259,13 @@ export const renderPayload = (payload: string) => { if (containsPresentationRequest(parsedPayload)) { const request = parsedPayload.presentationRequest + // Construct verifierUrl if it's a zk-app request and verifierIdentity is a zkAppAccount + const verifierUrl = + request.type === "zk-app" && + typeof parsedPayload.verifierIdentity === "object" + ? `minascan.io/${parsedPayload.verifierIdentity.network}/account/${parsedPayload.verifierIdentity.address}` + : undefined + const formatted = [ `Type: ${request.type}`, "", @@ -253,14 +276,17 @@ export const renderPayload = (payload: string) => { `Output:\n${formatLogicNode(request.spec.logic.outputClaim, 0)}`, formatClaimsHumanReadable(request.claims), request.inputContext - ? `\nContext:\n- Type: ${request.inputContext.type}\n- Action: ${ - request.inputContext.action - }\n- Server Nonce: ${request.inputContext.serverNonce.value}` + ? `\nContext:\n- Type: ${request.inputContext.type}\n- Action: ${typeof request.inputContext.action === "string" ? request.inputContext.action : request.inputContext.action.value}\n- Server Nonce: ${request.inputContext.serverNonce.value}` : "", "origin" in parsedPayload ? `\nOrigin: ${parsedPayload.origin}` : "", - "verifierIdentity" in parsedPayload - ? `\nVerifier Identity: ${parsedPayload.verifierIdentity}` + parsedPayload.verifierIdentity + ? `\nVerifier Identity: ${ + request.type === "zk-app" + ? JSON.stringify(parsedPayload.verifierIdentity, null, 2) + : parsedPayload.verifierIdentity + }` : "", + verifierUrl ? `\nSee verifier on Minascan: https://${verifierUrl}` : "", ].join("\n") return
{formatted}
diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index d257680d..0eed4e2e 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -470,16 +470,24 @@ export const createMinaProvider = async (): Promise< }) .with({ method: "mina_requestPresentation" }, async ({ params }) => { try { - const [presentationRequest] = params - if (!presentationRequest) - throw createProviderRpcError(4000, "Invalid Request") + const [request] = params + if (!request) throw createProviderRpcError(4000, "Invalid Request") + + const { presentationRequest, zkAppAccount } = request + + const verifierIdentity = + presentationRequest.type === "zk-app" ? zkAppAccount : origin // Ask for approval to proceed with the presentation request const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", metadata: { title: "Presentation request", - payload: JSON.stringify({ origin, presentationRequest }), + payload: JSON.stringify({ + origin, + presentationRequest, + verifierIdentity: verifierIdentity, + }), }, }) @@ -520,8 +528,7 @@ export const createMinaProvider = async (): Promise< metadata: { title: "Create presentation", payload: JSON.stringify({ - // TODO: handle zk-app verifierIdentity - verifierIdentity: origin, + verifierIdentity, presentationRequest, selectedCredentials: JSON.parse(selectedCredentials), }), From 1a035c8d01a95ce4bc0c40b35dc34bd1cfa6099d Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Thu, 12 Dec 2024 13:55:31 +0100 Subject: [PATCH 69/87] chore(private-credential): bump mina-credentials, async fromJSON --- apps/extension/package.json | 2 +- apps/extension/src/sandbox/index.ts | 34 +++++++++++++++------------- bun.lockb | Bin 574592 -> 576024 bytes 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index 6cc3e359..eb60beee 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,7 +23,7 @@ "@palladco/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.2.3", + "mina-credentials": "^0.2.5", "mitt": "3.0.1", "next-themes": "0.3.0", "o1js": "^2.1.0", diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 9f95c9af..fd02cf60 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -77,7 +77,7 @@ window.addEventListener("message", async (event) => { const sanitizedPayload = msg.payload const originalPayload = recoverOriginalPayload(sanitizedPayload) const credentialDeserialized = - Credential.fromJSON(originalPayload) + await Credential.fromJSON(originalPayload) await Credential.validate(credentialDeserialized) @@ -114,11 +114,13 @@ window.addEventListener("message", async (event) => { JSON.stringify(presentationRequest) // create mina-credentials StoredCredential[] from selectedCredentials - const storedCredentials = selectedCredentials.map( - (credential) => { - return Credential.fromJSON(JSON.stringify(credential)) - }, - ) + const storedCredentials = [] + for (const credential of selectedCredentials) { + const stored = await Credential.fromJSON( + JSON.stringify(credential), + ) + storedCredentials.push(stored) + } // parse presentation request const parsedPresentationRequest = JSON.parse( @@ -176,20 +178,20 @@ window.addEventListener("message", async (event) => { // serialize presentation const serializedPresentation = Presentation.toJSON(presentation) - // TODO: delete later, only used for testing verification - const receivedPresentationDeserialized = Presentation.fromJSON( - serializedPresentation, - ) + // // TODO: delete later, only used for testing verification + // const receivedPresentationDeserialized = Presentation.fromJSON( + // serializedPresentation, + // ) - const outputClaim = await Presentation.verify( - deserialized, - receivedPresentationDeserialized, - { verifierIdentity: "http://localhost:5173" }, - ) + // const outputClaim = await Presentation.verify( + // deserialized, + // receivedPresentationDeserialized, + // { verifierIdentity: "http://localhost:5173" }, + // ) const result: Result = { type: "presentation-result", - result: JSON.stringify(outputClaim), + result: serializedPresentation, } window.parent.postMessage(result, "*") } catch (error: any) { diff --git a/bun.lockb b/bun.lockb index 1dc2d2bb4c13f2b1d1de09e8f8f571f5ef8ea1e9..18a4f950caa649a32cb4b0671176f87140f59e17 100755 GIT binary patch delta 103744 zcmeFacX(Ar*FL=WNe-M1gpM@n9SINwP6|l~O?pRqNjV9DG*W;B@gx*!Qa7-v(wp=e z2t^`@QbiFFL1`)=NE03)fPVMAXU-uikMH}tzH)tkurHH)?lo=Anl)=?mq_}gD)VMn znNhda(jOfg16$l{+`3Zci_7!9PS3iz`)Odgl&-rEXI~srt5@vAqc(-t$1{6Yu#B0% zb>u;d-qfR_Pf}S$$*(Bs=YSe8HaadkAv7szu#^v!^5btRN+IM|)Mt9sDEgwDC>=gH zG-fDTJzZWu=25=L(h7=F5QSz*jMJZbRB#@yq$tH8-3BZQTm~!xoCz!p90O$2$w1al zPD)9js&%T0dYgb$tvrzVj-;@Z=$HtlLk&eK32q0z0jwl3zr;t?O}R7ul1QW<1C~I+ zUBKeN?sV5q$2V}YA#D!treZ&A0 zq7y@tosJ|WHjUL3r9uNS+sT6+anX^fN?yr}0@*=5ROHk|#l(lP{HeEvX%7H7RZ|*@ z`sosjHWE`81!Vn%(B#41LmjCj21kbvMtyou32L?z4G_0Ne>SvIua&2Uxu$7D)MRKQVpb@o`DDC@I6OMpk(7*% zdkN2*)KlbN29`knF34G~aUZ$2n}g{RSXcac>~JBz-BI zf<9a~Rw(4-DP|>6^0_j<4;Bc+O&cH;C=)McEgs1BPXO~N*cJ97!2*FO$c(iK0u!-< zdA&7Ej0iij$t!~AN4YsD$C0*56xP*#&Bp zX*W_Vra&N_+y}_ktB=$zUe&e0G@;!r-N&nfrSmAgt5@C9SKkwp>7ZO4lS6J&uG=ztUZ zo4%}INgwM3QSAdX$6dsA(y9ezXvNr}@K(&!#}h>>AL%y>R&dUitp8+DYD9cu#E8Vu zgzl2N_LA;XgpzZCh0$7sBZgyCDt;&iR|3dEBzVV$(jBgXbFj^(3a_>UnLi2r5qC~A z+i|9ML4wv>B?RfUB%cTLf;=wX8>_~lOp*M3iNhoY0$D#2$c8IO-dFN>B!64t8$g=F z%S0@Xi1=i)hcswLjl*;?q6lyv_iVGpGI$Po0r2D`?>L-^6x&>}?YoW-59bJf{0T@4 zeIxO(#2pe>0}CR55ilRtcKR%RQenGKp9P}&Jzxn)F9A8ZrzBolDD6e2*=vfFX1sp3e23QjOT_8=@RN@U)@U-{{`iv5^O21m9 zdYRCpM*JO$3=mh^P~}pw29)H)J&A) zEMS$G$ZOkP;eoE*Bo4d;x2aGh*r5<$okho`dZ$E39P|*=cVwT?eBT~np``e@ zIJ!%sgZoQz(y;@=f=fRU3rIOA>dgc%gm%YBJOMdfKS}b|z=Gu(JJDIkB_J3Kxn zKGFXZ{nO&rozo7v#pVG4*`bMvp{X4YivcAepGymJ2LskVsm~^flRgtO;&RvJkaI>x z9ua;M4&=<3OV&F&=_)u4h=X);YJ$V5#JU7AN!X|qrI)m1`WGT{d=I4Sw1S*7(-=sX zD0EEBSZ#22SPn=-4@<0T`buHRqkVki93zvJ-p56Ic~6LPD)I|)hJMQu8Hu5>Vf6c} z;MDM2ARGSfq_EI2$v*~GgnS;53bp=HjBpA#6?hNGnaO`z_;eU}8SqZPV!$9E7kbiH z2s2J3JiithzeB)`W8lSs-+@zspMY$zACNwI?Tj#OTW~61d?WZnAT2W6Iq7lFJ!6rd-R06NPe@#D9mf#9lQuE&2TG#)CkE0BS)36K%30+6niN6PP< z69MxakP3bx`FbD+vJ6Ncm;>a1QsDobYHJqkPmL`<2n+Os{pf721O0=GVnjE9Y{0cE zx;8i0F6!D{xBMuk?$#wy-siGV)RCANpXluvc>|nNdkOheq-a&xpNU~t#M~)Yg#v5P z5EbzQ(v)>&!+U=c!M5wq;vTjskom4tNh%_DH12tl9I?Z>iWi}L1>~2yE}VEMIHxiV z$bk=Wid#;lpUmLFBov3D$>40bBam|y<%mm4jSE+XAU-sL=`LMED2IF-&>J`nSQR)# zViRCp@PZPrV_#Gf+2gv9u82ZCDq9Wf>K?+MHBtcHG- zOW<^(KKI2)HUnwWsQ82k=10=d2)2VB2zeLe(~_ls7ws9qQs6nr#{iw_1t8$EnFeIR zIS<8@Ttk79;AxQ4i2~3Nov*}ygrZ+T5n5&+umo@m&~&auQ%_}B64g*-Hrvp&{;5hRMBfoe}h!93s`(a2;+9EY?Saw_oXt|<2lkaL(YG>UghN@R3ggg2g~ zw0|b*g-A^Bj)@NsO?Cir)0M1*JQw-rWc_16FZf^j79?o;rNF{K$8g+|L;G3a9AO5K z3f}rd%-Lli75o~={Omu4JRxjoL}UX+Ng5n#hQOYRYFhLt%F(i0WW7}qVPm9j0|RzQ&6xF8g$>~q=^n(_i9)2sOD5eCz*Scau%F( zo`!m~&;*+pK!hX7)G!v71KEB;=+JojM&Mo8p8`CxbtEP$%8God>5Lxv zg+(5Kv*86mnh*y`JoQnOu$0J1uJ3ktg!6re)l&@l5uwpZsVUKl%}X_%H4(^q;VIa0 zqZP%q%ZDrwQ{Bjk1V`{mLDA7#G(?RT0Vy9{ST&bRG?4N}MZ^euNL~vE6|SC=K#tH_ zOf^@{U2v|J^Ahi(UQO_k#Z}YSj)GSQ?-L>$ste=@l9TYTEi!y415u)5r1B=@Y&Zo^ zJfj^E%J9hO7za!jUs7~@0LZ4`K2rV(+N1B62dBC=AnW~ET9m&Hr2JbT zwhcrj{~X5L5cmU zsAi;hJ%sKA?#1IpOjTjPyw!weFTfdjuL8OG)~l|X@vDqP3y=Y_X${fgag<{m90a6d z&CxJ1wx%c-RZBG=x3&W^kpBRAMc~2O=$GN83^IIxMSwJEd>!Ee<$*L^56K$>D}m<) zvco%XiB)Q^CmMbO$o!nTf?or&+zE-Bf%Jr{s7D1q^HCKiJA46+XgWV=&XF%_AR3N; zTU59MED!m64aFLmP+4FCI2-DLe8xwAAT8$ASd4H3%CTN4$SVU20omU)w9lz);*0RY z5$^C6re6(YMol0UdILz`_V5>&3M>sC3gi?#@)P9`1PI&#5k52#oQk>D zKzMk3N?fv{ys$e(gWht^x&#SDP68QrDhCU`4V(>>M>)!CG!-4-xmsd$T$EA*a?_HK z)9G4;2!&SyIlw%!UiW6gmwtz3xC$;fk>E)F-r+IGIf8jWT4EQxm?OK_LM+eoK+bL3 zRw7K)0&?yP06E9kTdGPm;O9U(+Y%td%W>4Bg*UVj<(%`7U7@=JJ7@*0 z0KC~wSm60^5&t$wh3>Q$%X35rQ9mIxG0A}gkOQ1k*A>W-1_F5s_`RbjcN2&K6-&?P zBrLF8Hu$2P{&l75&VgM-yW%B+qU?Y*XyF!+b0)&#M>^sV<~DZ~7GDK4eHX}bt^;Cx zf>})A6NaQ1MS0Rq=rgsuD0c&#d-{1GXEwTrskbwI01})^>$@T&HfaR9QznBTU3+XEw zc0IOqJ(e5+IV&7P#fre^{lsdlhv9Qow(c)R_&tycoB&ec1eyWYO_Zksn^2z$B_)R@ zr{J_Z8@vqTQh0p)&}eKWL*qlu3gZTe3W-2Ytxu>JIUZT#k#v}n8k3m9f|1Cl0)2tB zpu^!E8J(Dv+*$IL62s%oW)*+Q=Y)%TRHP#{83h3~j&O*hYdu-;c!cPuu2pM;Puzl9i8#h>5N@ zRCru*iTQw>aMzQBu$UA_Saf1UQbG(4k%|)G2uq0qx}I;(LpwB=5o?;mnLY^udP-cJ zSQ2M}w3F*W_#ki&dq%vlhwFiO?F1oT0i=EJ0jbC|AeUBE*nsT}2WL!iJ#deTr&>6I zCb1kmD-sF1=;K5&@&d`C;a|Y%QD-HVND(7ffs7HZat~3S9yJZ+sK^>16~>!ULJ6Pgj1~pc+9z0;x-l##J9 z4R|2`8T$rJpAHcm$9q?l-KVk15fp}seeyKR8Pktj#Mt_aSE89!0f%L|T8 zv`YHp@nU*nCy9} zi8ZE*N!<=k8?BT0C*<^o7{~B98sQN*^RG(0E$c-%a7Tt!yF}D;rq4x!UJ?->&fV7G zNE(*nNK93>VSx1WkAPInYo=IeFJ_32j)Bvl2>mI^k-o}($f;mul&6=ZhNh&&KoJjJ z$a7|iez0ShcgiVzSBLeYOhE-&(q+*|aIWZgfgI60Kw88P$aUZiWJjfd93j+A;gP%$ zI0q8zh@}CPYjZ`pZ-A_y;2q)MT}w>3c>Hp~KzT-D$4EywW3cP>x$EU&LW+0?_QyOi z(mb+*7h^?7$?-|?DT(2DQt5CcM#n3W3&dvL2uQ_hEEEd&0;l3_B}T-@ny-HF4A8qE zAIz(ZM1|l5`jFb?oy9&9hXdDb;1O^dqWlu!_GTz-fb-R2as0UnPFN_P?9g?LK>)##HQa$9y)h= zv0gfpe7_ckk7ju1+hl_s*6R2x1)3X^y|Ul05IEPueV+dk@GdDY!)_ z_V;7Zka#>}#^rkZx&*r?kL0e$=ZCk7`g?#FSiAI<+eE|v0dkJ713CB6N%3Jr9O22X z(CG@9n?%L*l|WhwL2jr64%vK&-qyRk<@=rb5bx?`rlVVW-0fYWRAiEPD3g%6{bTPV zmhB_!m$H;PwYhS@{O((`{Ufh@H-G22=Cy*tCfN&G`)^;{V5Dm6e{@*O7Hvm=y}e?? z(*fPPs^I?Ux`sFUIx8G|zQ7tuY>7Z`|E9ZURd(#-NN&%l%m|miP=$@$o8dVH_u<*Wm~3GH%W(bezY4?drF>h+!zrmo%oq>3Ndi}mOb(sD%Az0gwd#}dG zQ*?ER-SS5nJ#AQ!T2J3IELeSCe>yDKa=EPTpBSW-#VOAh|t0uplsF<|EJg zY)zX9i9aMZJ*1yq`yQ+nm_^SRXxHlErlJLys)vNzwL~zs z@{na5wyVB+YI3j^0U2Ag>e++r+DGmZ=wJI0j4eW&0d`yE3Zg~BXM;z5qy8aPvq=e} z^ANkXNivJBLYrT}Sl2@jnPt~%R}{=*_TmIY*(Aoz^RuU#8d6)l0~ zF)fw}#<4@kGroN2K!vSTSnZ(ur3G6f@VK|59+(zj-G)?qGxdi%)fRVaLN?c(y6R5V ztwjY{cO+7+&D246%2wMY>+DX=bEhu5Q#Idml}m7^b|ckF=;BVbsN<4NcBf7w)xs=S z+}oAvsc55TJeRmeZ4NfKh$;e1u)Ctv?+Xtd7(D z#s_OZy{#zSMR)K`--a+Mn1|_qbHUg)YGFvs?^NchRHv2N+b~c(DTOW5IKXnw}A5*M>-jdWm*5TYowsSo5%p5;h|vQuVdDn5oBA zFt?$t<k6hCA)62lo=y(deuIbwU>US-4-lhQb#<~`8x6)7hP=LZuTQ}++;mR`?>?Zh z8ST7Up!>f6kS>9=_dldhAnlP`YTT=*Y6XH{)xugxyX7v+Xz29}(*FOD_JVn${~^tW z6z8+_zv^2#E*iZ$OHh#=o`D3C@7sHn((%Rsh0*xrN5PObo60-=yXs5+VI( zXJ114Pm|TeT>qtAvxNze{b zV675XBpqIa=Kf$@JlITPeQhB0JcQ<3CV`&|y)4!?dfMzDtzjFX0zCDquMLEnV?#-{ zYr*j6cfs zAoO9P(H57-hhVa;FuQgT3wg^&%2C~_D~bixxso=&2I*@AIz4ki>5?r#<&dnjTESZ6Sp+DkBD2o8@KWOv5l1NpGXt|`?c$mS#>QZ8>0++c2Bt$1PR>``KX&JSw2IZ3$4L8^LKw6drP#!5Msb)n^wqM>-YQA z;L@~Ou>yniz~lgHbEI%Ki3+gR=>D9`e0Z# z@YlIA&#k6*0uoM-@EXqnV(1twEZq!D3?1iL>l`ps8|{0fWShh6);ACV?fU3-O+1mn zv2aa*bs`|n93#ca|ls@b+jvmQ$p&-VC@+= zEoPqUEpJEaIU9qtXv7gti_JX9E(D{Oi0FJ1jI(Z@WVN@V+y{o=eDi{^E%OXd57kyc z(!|}+B`|+?L!}3cnZ?}9h z7*BCNRj(Qf4V)`Vvp7RcLb@U^wb@}>P~&nj$rGF(AN{Bj=mqEH)xn^b)y^YL$JDL10mQ!vcQ7C%v(n56PDEXhX-g~5``SI``p(C z5`aSasHb{Nf4VzZYmp>$#EKncS7+;~dxEtSkkLHChw>!rIeUV%zRA+gM#w0HT`(?V zL^T|^zmj=46ytneBt_533ewuAxK+YxoeakDn*CV60c&B5?v05VF8VUJO0BD8*j*eL zqGYC{T91G=*7xHaUwDMrx3KF(+0{Y1-~M2AuAaI-SUZ9oIy&m_w`)(pXd=vu!)_Zm zQq(ds3VW8F)wcv4+O`=&dY1d9S^Zt#b0AoIJ5?xe9`mikz#8i>&Ni_jLDz(3aLaQE zjJ*j~Bu(6dm{qj)V2np95>t9 z!P-$s{7@{PdBQ6Ep2!!?w*nJQ&==kZYiM=`N3(7NtFQ0x8=yTviYo<%LMi{zuH}kg zt0wEIhk~`wAZvmWidjN^-!(igQ9m%YYPx|MtEV0g))qrXlVZO-=W7EA0uh0P4>pDE zL&n>+05Faij+bE9oM2Q}l*|M(>lx}&+)DTz3D)fCuH}Fmc`XTyO^M>Gz*roC1x+={ z5H}r&WtjXA^wiITwNsFBX~8zw6AO+JZHZf{?vlXTEwR9h^XB`XD zWATqWugB`^BjnE?!}ZxF5)8 zZtMfW>}I3c3BERv5D*XZ-u60}Se1x4*18|U>f-Ex6sH;X!X$11d+7rA!Nh7p9b2cV zV#|8DFU^GHW!*0&Gh>bR*)-Q8fZJt&U9i@7j+iw>oCA17I9J>gA~x)|tK)UQ^TFB~$U37IrV_4|_p3B8E0n8Oxf3O~CN3d;RUEIuLh431Y*Yz)K8CVB*$va@}T+HIPQuqJ)eM{?A zde+ZD+K5$RuEplC9jrb|nm&d5`_x~YTF`2tJtF!pyEX;vU9&BQhCjf%gL&#IrlRW_ zVLJFMj65EUp$4O#Xjd=jemDNK#;(OP6aB@60Im2s;opUg?47Ewx=zo!iI5CoTX*B% zgE7vkM#e(8^vBZJ=Hq~_V4P2LL$rMWMjv;89wER8qoX?NaN)AXlzf^ov}yBn+pZxPL+T$J6K0Tw`))Alii`WPg( ziN|hvgRR2J#SvyWnB6R;!sRzI&#e6mQl|OLP+wzPt^<9|Ape;8!_8B%|@ zR9mn^*oKd#>*@C{+pJe1sqwNv^PP&)#_UzyfkP%3w*WH=dtBbB7|-5Q1GP%K#4KTt z#{sv$WN=tKLYNQM-mJnP_%m32vpKHv5}EEOjDXW2Q_p%BWZ96Z=K$_y>i&;{EG>8I zX^#$QlXi=6hV2tk=rY*5G@)g{9zE+n?_0+1)%_m_X?ypI>A*A%uv`AKSI>GJWbxUj z=OAy~K9^@ukJDgXg&tV`mG=uh#7@x%jQb}%6FM#hYXSz3!d`X}thcC##oy?F+sE-h zB>I4!^E60%1Yt`QscP;EJ3kRC8%NtDU)w23k z%tkf+1@2JZMM{Wyu+b@JAtR$PmLFIPvr6_wU)!f*L}FL(2qvqcrz!3{Si*XU%v@{F zkZLR%z?shHkZ3_{CyT(?xHwQ>276iZjl-_KRGejdg30&`>&=u58_xi!2qx-r4%E*? zn+QJx@i^%-J?GCLZ9atbFobW!t1Dp5%x*(;?4UjBImM)vo;p#vvBs z{%fiIx#6#>c>eRbYwO{2#N}YJdzk+_cOLEah44%BbYN`-hUX)W0Btr>^aXeZY*O{8 zJG6qOfw?`~a^$Fy<$*3M9urEU#(leW5Lk$@-$M=1mLb{P99hU?yY(lq24b1r8>88d zi#%wLn;hqH!{3UgG9m4Z8fL85ik}d+FsIb=?g=9YWh{G682))sw%AGGiU@`n={sNy zw+NJo74yKFg29DD@%j*~g_*~vc(qR%X?an9_9;af3@J_&aFOR=9GV&Lw60%@B>+9} zx@8&|=S19ZoCaeA1cT<~Pa8Qlv=)0>Y!j%DS|}HXN=CT23T5r zW8|>F#&5(ENzs+(StF|eq+QO6#$g=z-HfwF4y7j{<=!Iht*zg>6bOmO`!z7e0GJ+* zmku@n%nbV4Lone5G~B>*!o@KASfES36Hjpjd;AyH>Ac&QP;wO*r&^SJ1SWc5E8V`& zU2+{5-CmS@0me8cSf>lQ^HzXSGc(U}_k!VH1mmo6(H$eP2;#wfPzE<5h}BEMT7!vO z!`eRx-^Z;IN+y7DU5j||F&Ldd+|}Kd3~z$5dk^~&HZWeifkQh|!ftR5?J*cFY`Th8 z?~-dVGS30VlA^t3U_oFuUA%DenOu-=2|Zz6~U)q z)`XuiVaEO@7&1~Ui~G=%cCGj?qE)M|&h)i`G)9*2qH$mi!LTR?*sZ(42APdEypHE% zY}9KSQe3uq75o7Xj^yGA^C?K1xjQI*!+qz6qeVNgrsiY0DM-;U`E~V)-F66!p5VUC zvKG1tQ?Wlwhnt3fS@^|dNE)CF)(RdQ?gJYRW;3$4B5wbxDDRP(QE(I35R=hoO5MuM z#(=%=&QosZX77U~xbyCSy=<0@&n^PAyc9?L%Sj*$k`?%okcA51zX zC-9zY8W~QU_YD6ED02_ec4z@*uGqEc`>rU?HJSxRH$fhv_!F@Dg2AC`J`i?;3n4ZP zePCo&Mr-RJrSD^>!uqfCyQ}{Uw6+eG_Tuj_5OpeE!{Qwka-FuEk*uV9BaV3iMkj} zmB*qV3^c-S34d((SH)mvLF$b%cv;1b^SHYZ9%ETbKQVGp$U5K&ot!)1T%;Jh5z1ka z@1Gc1)zFB~Q&-bG5Dx>x?Kqx~972j-B%;J4Fb+j*6)khbrXbjKuvTWfT&!oo8iR>5 zWBzBkn5`!m=j-Ltog*dYDPKDSMqih8pSxEXo_@3kGwbGhj;T$CkX?(Fe;SMnO6-+I zUkD4EdA2yP*6iB+Oeo=mW`m$11ZGgN{QAO3s}0Yr_lJ=M)E@mIycjzJrq1V2(Kl8U z{45@fb`*z~<6up|5E$S?RTS0LYN*{~kfIs^b#Sbn12Me@XQ2#VnKvcFza`9 zGv4ye0HcnWc06i2?9St3N{dA`wZQP;$*o+>$k>Zj4o00s-f1v981@2;rHqGazH<;J z8w~a~^Nj4;aG`~uVrbkRFM-hotVT!;H0mkx5WMjWZx|SE*73k^D^i?rm};R}h_eK* zL0{FZsyUwszQ^!16s(U~kYV~f7)>JdD3-_7h#Kx|1L3Sf;l6h3bTU0KEI@mN6ty!~ zf##Q27|wi&ri}ojgTlfC?Y7UssME`v)EAI&r3#Y-+EjV-OI7B8iFO%O&Vxy#!|l8@ z(eBHZ`a{AHtQsN1U==Xo{G716VBCb!OPJkOF`vkD2Wu@761FWIX$u(r730LKk%IYM zjzHVD2WxA#ghgeY3x;=^{R6bqNJ;IWt7ieh@IVxGe8E@;uDHh62GY^hmF08+BgYQE zF7Kt9K?qTClifNB%wK=;brb#>AzKxT;ii|7Z#`RUqeFh(n! zb7$lB4}bJRDYhiy8h+kiDmvkp{HpDXuDsMqr@Y#1pA^&CUD< zQgP-k`fdr;y!jR0wib-Gf#IR9^$p>rSdX|P4Ftpcme2rO5>lLKF@0MiH5&w6Ncqjv zb6`oaI)v@t1Cw*P(Kjzh7;Bne0p9acHP2EoiTS*DI8xFDFyxQH=$2T2{JKfz2{V?* zUlhuzM%3vF#@$VvtHyxQRHE~VWn67?)$Idgo`|Bg%BtqBhLUjg3^1xG;_V@@?rhTt z2}bX4iituVp43HwiI4?%v@HW;WPZ5}&dbtb52#g6m<9|Q3<9HlVNvwC35>mnl9uwW zcA3`%OqRqA$z(90PsUj214i4xRp8v^E4bYVXO%cG&JAV|ktGX^?gz~=pXDlw9>f7K z6pWz&W6XmHXMnO%&B(Bzi%MeU3)S8M6QMjL!^~np!ET9na%Yfb&Xf7jzgT7Aw&pUn zb^&W_1V*b(@>WsBw=1qM;Vf6G7+J01yydE@<}D*W8^T!L2kU^gz07C+WvU4qi1``} zMkQdoqrNtf0U%~n(^^zl&07S)=DJx(jIRx(msybQcdsFAg@R}Uq!Y4m8egZbg&3e^V&3jD5e3bkejFTZ;v;14CGMUW$ zV9yf_H{jSOCe=~R6OWkApTW$jHeJNe+nvXF48{W`%!_#ddDqpkwMSj-Ax2rbSnT0byn7aY(%wJe7AF)tPi(01m7+IYWQcn38IY67GfiUCC<4RXZ z#N_ZGuoH|Mn(&?v-xh5NR-mD(M3`#BLbj=3jLa{0f^(4Y83FdCti)DcQF$>>K=63Y1zAoeAq^*4pW=2Cp zodVo0??%C11Fe51E#&L zg`2>dMqp1&CQ`JIDc4qkaXAZi3+&|@XcOoTA9%kq7ObJWWF{DOFzeZh1c@apLe{;z znhgRGYdErtVCKecWHdosXcR0madyN4!WXvE=KQGR3K)yJgP+Z}>EGvbDkKaun9q&4 zO#@@_d|AU5B0`2+qV|4MRS=u~GS8na{X68)>8!7YffuhR~ zLuUEr1qsXDs_m_|a&5Xotu_e~`WCe6XSbaMW4vC`Nrx>4j-1z{EE+rlwHSQ%wg-tIJA5(#e<(0k9*9Ia^t~jcAD7{sER8*iA z+*`~G*4z+0WCo)a!t-~7alM1#1xJBCMpi7236Xt7%uTyMMDRhrw!W^xo98C5 z08|&R{|qqdf=ywPZ(b1gBmA7tB>IV(I4fcJJ-~R95n*8t7}dZBO?X#f>+d?{;3TYd zkqjXbC)Jr?>=8F#H|@6TV5Z}^C#Ti`*D~OMVh0#$!!V#lkiLUjxL3yc?iv`UMV!Lx z4HTX#!h94MO(@uAFfJp^1HKcxHqgjPL~F(%R}kat(VxN0){Kmfc&!;~WF=wq9vN!n z06jK`ViFDqYL`Ogc#Uk{u7$ZKfv39uU|cJzk+Bk?OXj@{5ND)BSguI8YQB2M+eb`i zAQ;VzvEZAlWniXN%@6QwU}n4KNxF1|una5*JN5_TIUWpq?^H0+3eVhU!MJXOeTq0- zd2lMN6BwP}JaXA4N%nF(IRuI5Q^nJrXAUE4BrFyfDcTT^L`H#$O^S20HPT2+MVad_ zrSOk(QNr@j0e{=k1&rFhvK}NkfbE2Im^1bs!l&$bH+` zGD>Z2I}6GxFQZwJXi?l;8P*W67W#{X0BsghbOI3*zX7B2cytLfelbKiAl?}4v1@II zie+n_ajgr;^wG%y+OJ3ngNC3^^%!A7L{%7j5Eu=H!wjZ#9vDNJX?l-iF{&Pr9H>2q zlrabzz^H9wjkF95Z+Wb1VmO7D!MOOu&Bxd{5!KQ9U zW|)yR4*J6JU9T1}!Nn3qFXD!<8(2NGRKUEEs*og>t2th6IM~Z2c>s+1V4T>!$|MWT z#ZA@#FnNB%yQ8(qM$QN5w|@_4kde>6q@=_r*dG z@o_sCwZZ3zINm-1;|#dtmCfHNX2Fyg^|#>}2_$ws@CQ6nL`p<|F4VhVfvAheE_f7Q zCmoB(e4afPDef(poq2c^50=X?F#lT_!YQ#x@JUAsSOfDB{u-uG4?9hQ-F6568sk-`;EgK;fl zDiiUpcA}9p7uBasRLyUeFfhgsur{nA9_?0}B-TeBbA~OGRDJJ&KK_!zpMVq{S|YKrS7p685nV4M%J zc4~Ymd;=bZH;}PltZxp+x{P_I2VX~uI^b*wJJz2nERWUBvnH6>Y4B;KI@QQoh%O6F zb4RGL_+SBy(;&K>046Fh5+9OG>=1u~;lU@~=lD$*u8um0T=CP*iLkDOR4l3=krKNE zquv`cL}|2wV@dlNM%G8rVkx9u&@bNDPqb@|XNnjs*6SEBh9&oMv7Lj&TncW7D?Q7l z1HzM~(=5Y(DU3a7mXQY3K1VJe(IfKTwOb15Mh>N&bzvO16^uO@j3XCEj4Uwe;5cI6 z2BWVa4-fMEXA9=mN1F(VIF!-M-+)nH^O&K%Imb0^bmcHGE<|khc$K~pjFSatMcyA^ zVy9(E|G7c~9GvI*+CW5vr3qJq)kQT#Q53ujCcKWrsAq`oFd4~qTM8JXkUM5*>mlJV z5s6UuCor~aZmwGSd7?{kR_hE#Bb$TPW`R*T^oh;$6qwnHkx>V+ZoVujo&$6MWusV_ zC^|thbG~iaVDtsILYAlVjhr=@jqwY_ouv4S-&NO?X^471GWqBicxqsM#Q(=Ua^IPgP&b3WU6fKrL#8xRLP? zZ%vnjilYl28)&z|!pwdUm#rOFqE|CIPG$;nv0Hu(CUoQ8R(O>d$;&0x8IqT!KLisy z2t)TbU@g#+2vVh1=UN-qfn;VR+=NskmNK%dsdnofP;6e~0<3SXLD%{VybVicN;HI! zx($qL9wx!Nlb_ZY{yT8nUwkcAtRDC{KpTLRSP*oQkHM%QltA441&j;LTy~Z>*BNO$ z;nRKAxztu~``SQgCDjP&1pkv+SZi?bS|5vo;;}|J7#E2dXl)C@%r$HVyDd948wAu- zoZCIti`a$*4dXWkV`uC0dmw&iquA-O5D)v>K-iwe{N`*87()W47tf9^gHex{M}mTzM80N( z48n~f7~T5igpY&dx7v3qpMuM15`Bg^tTgK$yLo#@3p7Pml3xFO93A2f{!ZL$70fN@I9AZon^ zCSHe@+a>E5A;s|o3akPD^ivy;6kPx(GCW@20fuiNA_6S`*=3|1!shyRriq#}Q;Y-c z;vANlndyI6t?gm-`&_mC?U&P2QIx6pvEXMqet5kKRmf-Hhd2{IymF%l_-y14f?_{oExk7f4%2^L441NgDx=a8&V zWV@f?rxbpEzz?rip!2_F{C^}D{l7}H|4{*2`bYe5X0Di}|BB4ND&?<2e%5tU_OIY` zEAt|1ULo-((P5&RsiEIxa;+XB^NVyB0Ot2$-Lu2A|ARG7t zKfH+Sz!QboP+lO*+xSZ&<@qK5H)OejvK$fplvfH%!K<)@;q^paW86Nb+A`leuHMUI zEcz2mjK7@p>qTgR%6`OO64}Wz$%$Nmt0aFFvisG@XOXoM`AbmG{8h*SeuI1#`Bs)AQvRbwI?j(WgGdD~0V%p7<+-sa zu4`n`)^&Ux1Wb(0;Kau!UVh#}hDbEW?!3zqE7iZK8xZj4Wz--L70m(Iq`J}vn ziR3Q&=%vVs2%(%);NJT2Wo*2|3)HIi~7+i&cF z{wed58M%=K{G~iMQWS_^%nyZd;H=^ zx|96h#Db_FCfoTtHp(q1go49RkRwO|Qla6pVs5k;qdhDYoLnOlkWI@^mBol0;B?9V z4cYt*S&qoqY5*yp2jm)EA^A!muUzOf3$BtGuR@Mvoy^aTly8JQA23tq6RG$f$%#}X zOX6OczhCC>_b4l7>Y&W{R2Do$ZtVB8lytKFGqOC9$!{fp6*B9*%qLQx3qa~|5lBN{ zmH9;G|0Fq){1=HgJovwX#D&B^kOhC0aw0ppB{`A&Hjtvb5+6wU?-b%9;{2$1!8a#}D1SkUO7$5O%gFps6M8L_&`I=PW;b(8W} zA@jS-d?Iz~4Wzt}#J&>y0eQUwg;klsiv4B5+{lK*Am?-q2GU?dWjP`T7c2Rzkoobl zUZO0YEOEFe`e)rV{*uTF?}4);^Xw{-MaJS66&)vWJcYQ3lz#wZ{fSaeB%dttLn$Y+ z{8UaK6VoJ4mj!Yo^Jhr8iN?viSPwMJB3W%QkOo=-WPhuqe6{3jfgI0zATJ{8Z;|rt zK-SwS^NH+sm*hmYzfW?Y(=^;cSuh*O2zE*q_r3>J*Z_#jsW8C~8UiWv6B#BVoGaZWCo!R5Q5GPw!iSRQMs_ew%8689I*{_2Qck3NmPB3RY?=R06ya0(X9ilqMR@_>QXo58 zE*o3{q(#?B+ziBj$`1Tuxm^->OUweY{6Qf8Q$E8lTKWqHAyzmh@dS_szXtLmvfx?C zb0g*7NjZ`H0+8+fAmv2zOF%mRFH%lqdFM@8;1-bE+an+gJ_pj2FMz!M4cQR2=G1ut z*{yUHc&(sAhO}&KsNY>#8MK=09n2~kmV{#UQOoL0P=bj zQjwZwIm~};Sui)&LV<3wp&meX&`XvhGC4qUA_ou-WWx~>9Y87`B{3Svi%9uUA`jKE zNO&57SMVf-0~!v>85k|gIVENQ+5Q+HuYW_98!O8Z89!%9PULvz0I7!oWchh{6yxoy zY7z59GhY@aGIN2%g%TG@Tnyy(Z^%xTpd4|TthXFUC05D$MDn$H|dJi`PM z2J#}Z-fuwOjs5{-eGBH6au11~Kz5u*qRoj!VF*eAc@e2`Ss)vzAhC+X8Zy5&kPW{D zB`RNH{#X&$`L^e1W$coWGnm!K5 zawCB3I2Fi?NaJvTwBQt(KUL;SbSg}+;W;uRH?l!P%Kr`7(PEUN<(2|z(JeqKx>eRE zl5Ydjvb%uheaaqLfXERYkOe-KctqkcAUilI`By+*L@v3@Kz49N%84AnHOYxo^d^w) z+y>g{e-Dvh$4`N5AV=~)fvjMKd1xUo{G#SXfXGrxN&Y5~^(z5+5!pdiDX%55E|B#b z0C^G3X8?_m;BmB>%pg*c=8_ZHVOtkeecy@4#>hnfEavRq%3Q z{g(p&Bj>oLqCs{%9mt881!TuMkZWZTkk>y^h9hRMfscS3>2g_tNcl?1b0a%gCFMl& z)shp**GNt*34TDzKLN7cY}%g%KLzr76*B*j%qOzqXOibedd4v+|2Jg)6SADsmH0Pg zg;TOZZlwG)<^b8ib15fQ1b-6~%C%926Z^kJ zD#(9*hFDG3BUl(w<^P7P-$#}slJ}MTRY*1a%Y0xN(7y;?a>J{Xyq6D0 zc@8^Dwm(?b&yDOiTILUt`9#WxO8zQjevHf~lE+F86t^*P5YWYwfK+6JEbuDi08?dt zZe+dDQch$!{u6V&i0n9Baw2&K|4)FtGNfP(kRCcw7JL;}K>iw8el4&%_$gUFH&TJq zQck2Josry)F3rA?1k)aIr1FMe zs*)2K1m2QzZy@W}mH9-f;REEv*d_PRCwEpP%taFnqzg0$@*=WgDbr>jlZe*VkQvNEWu2Hi7P+9I($T7sqe4t2C zkjLm>PDa|{GXGV``XiA~J>Qe%UWFXvXqo?S$o8DF98f%!918&(7$-AwBRifb4=G%ns(Z5=r3A7q(VA=|nl z^NH;1Dv)jeB;{_*ymDXNYx&#fASQkNO$hCbA6~COu_3-9u*A&f%uIGldr!CX@mvDDD(Q85E$Y0Hz5qCxL$t~^7@;Q*WZNTHlMrZ z>u*9{e-pw7evFN;zX^H$O$gi|_ctOuJ-z-W}f;? zT6!9T11(<0$v{gxwYO0^2!c{U5R49jps#V1f-flW4u+t=ks1ua$Y2P5pkSa;t0@FE zn?f+PDFmU$c?!OxATR`iaAQ&k1QSCnUhQv2oPYjdv+##Go|YRC!^d4Y9{srVfvEYV z{#f+g;7VVWxIO2CiTCI3IdE-5*1ZJ(5B3*JQtNE{u){>3;?-=I0+)O>D3|gM!><{d z^=*cJ7B@pbQN~RQZcxynIRw$h{N@nMYYxE+3WgeOT3C9jF~%}Ntnn0JJZXXK{w(zx!P=G(c(sCHn9;ix3MLv`2}y?b4j|bGC8QX82*ZsctpOv9Xu?P%n~-XhZi9wO zwLwFp+n}LQ#!(8spuoE=1fz}AwkY_%@fE>o)M|(9n(dH1wH>lEjPnqvV+^16fU(9T z!Z_m!VZ7nj0q}t_lQ6-!NtkGabOcN?<`X6x_X$&sHk|+;8p{Y%ji-cZMwiZj>Bc(3 z3`6Y#m}>%rdqTbVKV3m~Dg-<`{bb#_q0Au3R@LXBg4lAQ;>Yf|C@?H%fPhpj3B` zu7{6;(!t1{eHwcf4o;|GpR z^KWNu+T+tRKOMT~7c$^>yV)%YJz3bi%Yzk6{kyZuc|K zLp>XQF!5;DZDrczyRbMmX6AdlrcUa1F0+SoX-dSszQIvnbr_y7b^g0&KYBi|{;@xE zK5g(Ue$%GC8+(jxeyVrR->>Fs__N#%JAKP5Z$8_!rCP1@)u znmo|5WkT6&j~(6XG(BB+Mz1<)Ew7y^I`RJQZJV0Cl{TTl@E5x}ugI(7Ln^dw<0tk< zayPv2*}NeqBD&nVSi(ND^_Sg7?wdX;!Xs;a_{?96t^BiV->JK~gNrwS7Z;x3zcg*N(gL@R;*vxxA^B-TuoLzp`Z^y+sO-i4h*R!PKVqoy^dp4|28#K1uUy?yl{jO=&+P>?t8ZC>aXSY4?RAA@l!RlY>oS0 zZtvT%>z<-}e(r1aF48oi!t+9F8lS%TNukuhpWFJH>e-ZZsCF{9dXeq*8h^&m%6Irh z>A(ZUN{;`t+QZj_u{Y1w#BJYCjI6e5>FMpKOV>^GY57g`i*4IBAMd&QY0q(! z^UQ9VI$%~*DdRV)ms0FSlcocg_t`l-{LMF39}cWB`rYnvJwo%ejlAFeovZ7k>U{6l z+tR<3y-1Skxyye?^(|Z4DV~RX_Mg9z9skSk{J)pOK`o~BzRay&Q(L36v%G(es(wmu zabs@C$~8v^udCfLw&~;B`vb1uN}1IntGLhP8wED;#4ij)Z#WS4ZDdi=G)X@%+Wiwx>R+?|Uv@Nt%9RN15dtdylMt;rB8(I##Lv zY{lj(S?Mz>jvLqG%bf|EzuIX0Sz~DGq0S!bv4}V8eR# zx8$i+_O#I<3hM11@_g2t9iLRzucS0_ggoltQ+!u%@3)pO-Sr~q<~D1a8?)vPoAhRE zZ0qhT7EX<8enAQNqkFvyk-cs|`?_)dV=p?-km@mPoXM?Tx%ywGOzju_PVuYDcU|oH zQQ5+as}9(mu&(xyMhz#HKGU=KzLH!2yj^lj>HU-QQ4aNdxkXwQetbAZ%8(4bjmb;a@L3@q3|< z%9imDe{!YMs`gz0V4kd=goEeTUXFE}d(e z+WNaze)aBjo8PVTN{>$E5zrX#>ofT8dwXJ!n?g^jv{eFIN{OabP zrnJfIFxpa4ZTfk!xz!K0&8%PhcH@RME}uDd`{}*ScrYaA)25xj(J9 zbXi)uz@5a_#Kin>J+0LJ*uxS{ zDxF+)VeyetElyV`>ig!|`r{T~`p~!S+O}mpGOLZX6fV(p-;dGHdRM#t)ts8g&y@c$ z)!yWn(0%s2mX#ii$7|wx`|aX23-0gA#?P6i*Ffc$Hg)-5J#NLREH{Kwbr3O#7M z;85(PhU>}U%WZx4F~xC$mSNAN`Xhs9L|- zyC;;``D4xZpAGfj|9RsxjgJ@JAD2|N$oC^Y@6d6)N7U3$Y}F=a-tXP5SZc<=ycPa0 z;@&*2rtN?H@6lc{T_km+7S z$Z%bh@w%=d#P|6+?epRN{k-q@_vi0CJgv2#d+oK>UVH7ehqF8TXsz139rzHHDcv)JAz zoBZaWJMmBc-YWx>wl{c||IbUGqKfbBzx;K4uODyrc0T!NRHObYW~j`+ElaDP?pe0C z46;-|Bw6)Pv2QqYj8C#^XF1$bJr(2gk7YsCe!EqB%V0~jd^_gDKcvasPMT4cs_hO; z!dud8+hNt7tDS{^a{}u3jwEmY=8QB%HG6}wevjDr1~FcKos<*d_behsbJ?@@A4K2> zF74h9zS^jEU$-y&Qnn_xZaTYwL*Y|p%J!I2WUyuKKwI=>}byBu>lla=lrA~lDa41PyV!qqMj zp&t@`5z9Jrph*7Se5g$Y>{fwBe9w3$`SlOypxlAuq3v)@} zr$f9Iu~;?xg0QwkZ2W>)s$PpYAfo$Mgi>q2A_A?fY?m6WxV&20*^0){Gr5n+6-uXL zI+bZPSciyLyF`Q<5G5@Ut5ttXgp(0*8sTgHMMK%Y^-XH|Y~O#xf9Y1&qCe%YG-Bu< z!%A*zS>dwF$FF~VdS1lYW=O+(EoVhUw@;pJsk-jm_ilS+fd9;=jn6Fl`{aQxLqjU5 zbfcA>s;Z};^(x4Uf}-+KP`VXjqZ*?}cv>T_Ns7&?q5+X5Vy3K2qPij?)&}8WL~K>l zj0m6nh({ullxsf32N6s2A$F(-A`%K9T3I7@sfE@Ezk*h_?QdOQ_sXx@q*AZcb)SSc zHI`J^u;RT#SU~FsRkCB#PrPoQmF>Op@4Bys7A@KKRQ}{MkD6S2|3{TpO>#V1KK;MmV3jZP^rbEAI8Ld*fsw`$gJHrHs4agMQHkxwiI+!^|z%Ur=k>eTEuZx zv=HK^i1CFGC)IHgQN<8d3nNaeF@+JH#Szy;oK+QzAhJZvEP_Z=S46~?KzI~IoLAF| zB792H((4YsYkK40-ad=AG+bGB)kF0Q{VN^diZjZ-saAIt15lV zWG33V-(6m+(u#@W%g%_HkpE@=vG+QC*V5_AwHVocAX~Mx80B12Ud63?>MpB=5?oOa zn6102vSsQwerA{8cNHhWHT7D8>#9vjf*WcrLB!4P8#$?vW4pDH6NZP>sIV}3?CGBN z6QB2py_QOOb4}jPLU;JkII*M~mk+4h`$o?=*aNy@@yN)_n}iN`KuwV%}P#i`|&Zb9#k2 z?YR6RV9?=Jfu~20n19sw{KC#|2@9(&Z5?#?c8sY3@=ly@eV_5!=I^}kjSefc`Sn$g zOI>Ph^(|SpcedVnbkh~jl0$yHIB4n(i^X5^*{R+^|9lx!&hgQ>OO~r=R`#pa`1!jf zKNmKP$-7d{%lP*98Sni)U&FWgCuBU0xtR4^)WSZY9>+aOH#P*ko;RoR?5Gjr1G{~$ zvTJ30MW+j6o!i#i9d+z!iKaHLsqvHAc8v_Rcr#P0uw2mI`99wU6$><8t>4un_*BH> zVq4#|i>R77z?5GGyd75S%Ca*LZ6dZ_{ygVn zfNP8GO|nfH=Uw4sexLEc-YGw#~$oDGo?xI`vdtZ6J`nBWB zJu7=$9$!9xt4)Usn)1!Ndm_J)YX0c=omup7f@8$QU4vepKG^bUuZRI#Zq%E)b6(pk z#T#GURG|Nyt-qcae#raGj3UdUGVd>LFlEKpx{KBi+vi`^e}kP*LpOc|U9JR7w`J~s zpYi!>`s4Wu1qU4Ka_sQCy?Ywm`M9X+E+;O3ZjatNFnqu-!+hR3&wAO!a%5lkpISyV zoAq_!(eSaU|CF*?wJbWi?JuvJY8gjTRr9a7O0D%(hdG2>-0m=`M&R7S&bBAJ*V;L| zWY48m4uzgqTKv96FTeM93Of~-IZTFw9v>Ny0(UFxt_B_#iaRWD=>pXjFw3e^* zi9gI0?j#x4iS$kGnb~5Q{|p6y0I+ zf%IMLt9=SgZa(*6;{IBH6&`p#c+sTggG?Fc9sVDx>QH~4`Rm(6uJW^xIAUw+< zu8DY}DmoytM9g$RWUDJ8V#^~u$|9brX=M>U6%da^yil%=hz}x`IwD@F2O<(GB3hM0 zyjBa#A^a*K-immmnw3XbS4M0sk9ezIi#Q;ndj-UMwYCBxunNLZ5s{-hS47xVMeGyt zN$DyfQbi1|gveF9M1)pjNL@MB^~m}s(T40e%iC8!_+|E(IcnVA0eg>~SiG!i?D!Mm zSyeuyExueUC28;dPr3>H^nZU0nKC)PA4Ydo^}gE^1n%H`r-!tn$Y=0GTa7t;-$$RdepTm`#*@-^RxdU$ef0SXACD~WHQ;9T z3qPFeUt&u{$h_>*x86?~(ONmW(MmI2DX5~l;z~g`-RMwj61$W*Tkyov3K>s^E-K;q zWN!IhRht|NII%z-ZPe^e`>pHxZU_p_>K4_t^x=TB!#c;Eep}b3V1~o54f~HCdfhqY zX3he>+sTl z{MLH9TE1sZi8c4{7m45PairL|k8hvG_X}FMVPz%n9=6-6ExW5+>RH*fA2>hJdHap9 zl7;=cj`Dn*Z(*sL5gvPA&c4;T#E!XM3%mU>`Qgc}J%+0N3q3#dn^A6J<@{d7Prd1! zoTeXDF4fJdN8f(`=lXk1QxCt)e`M0!Df^7IdK9>sQ=(P1g5AfC z4R|$SWw%jFXCItlcfMGuM^5E;EWCHUM|V5dz%|h^4LfGGTIAdK{&(3rf4|bkQu>^J zx6bSOWz_A_@7l5AuXMlbpL8hREOE@G$Kz^W^@twd`{pf&KkYYHn3#~A6x(2abnOUz zy++6MGyDdYY8f2*w~Fy#tGUQltErsbsIO0bnm5J`;i57`d=TO7j;N!e-4O{55HCcy zDzAD7KTkw_J%qc;7Gdp$@by4=s5lSA0TH<(8mKn)5rID-lIkP8RE`L{hKPU$h=wY$ z0U}j|ttY};`FkQl8zE9eG*LEQ2q$kuuot44Iw<0%2*)1~EmY7Ch^WShbP=tTeM5w2 z6GV7J#E&XXM3xAbMu;{ltPvu%DI!xuJLT++@M(sK@kaQn3=tnhcsE9LRMCwQ3C$5N zM08eOO%Q%95b;eAT~)RS>y`-Lrikt;t|{Vxh+GjpRhwprz*dN)W(a?kBf_pVBA_{< zw@Pe|NEKn*0uiA6TOdMzM5Ku5t87{#oO}?$EfM|IK@m4aIJQCzR6(r}QEd?EA_gn_ z)(FqGi15~kp(;&8mI#+05kV^KM?`EpM5c)0%Gn3u(;gAyg9ug`B0h-lZi5)5qT3)6 zd=W21j8R@~5q=#I@ofWE z;ER~75`7V=B5XS#!j*pqL}(X8iiikh(-Gm+6%pJKF-;v5aZ`k2C&Y9W)Cm#Q4UsNl zrm~kyTF>qbS&_fhsW;WT;HryN=X`Op+8cMR!9a_#s}1Sg5?ZBmDdk@!b)NRkjH0UI^bFh@~p7 z2jYN;ToFpO>4^yJjY#T=h*LQt?0!N7_#sxPL_b8T2wQ(dyz=))ga#l|M66aey%0`) z5W&3=Yt=y!H$^!1MsV@n8xhqPkuGARvi}L;*$)x^6JoPU6OkptB><7A!U7Pn{SlcW zwkqd72%iCnm_CRkl_BDT2=Bg#9V)snB4Hrng@|3ss~^H|5F)-GVvoueVLce(+aIw{ z#q~!V5Roe)S+yB}2pob)8h|*cazxk-MFb2)99D?~5vd|<2O(0F{~$zYARh#H1S7jatI4@GzmM}!YWoKLSpi0?OoNZF4?cuqisk3~FDX(F;jxP&0GRagijb|NBE#53hQ4&f7uh#7}?p)y2#5aB%@ z@k&LHMa~dW*9FtG4&WXtq<1!UvqgRurVq$;BWMVjRb&jAYpXrF0 z2!yT55b;5TcO;^)ijG7i%s{*lQB-+NL-@@^#7{#MSJ@)0e?j>Ej3}w%enuP+kt?FK zYBL=XI17<99bvC>MA$_k0%jl_RN@RostDVe2uI~V6A>DXND)z9+5CcVnvDql1yNBQ z6me68<19pF6*LPGH3yL{qN=iwLU_(aghwH&t27Z=B3z;o&MGV#5gUWZ6j4(-&qnyn zL&VHRxTp*fA4GW1LDW&va}Wvh5idlzDzCW+zXgc+xd?ZaEy8*s!Z!xtq2gi?2SntG zXrS86Lj*2DB+Wy3sT>h@ixC0y5e-%1d_<}U+XV=3<-Y(Cx&)CTqKUFuh;Ukp2wsS2 zrVfg@DZ+6PqJ;`tgos*(NEgvc*)K+TDn$5V#E&XXM3xAbC5SdEYzZPZ7Lh5UopN4^ z@QGt6T3zz>%BjmN_J`?8#)%v&}{#YBE zxlBL(hm*JF*3<|0JvSlh@rOSh=gM1F%#VEestn2Y1KBF?Wt7uVMK41nEJwT$(OG#Z zgx?B8yh3zU*&?i0B79>J-BnyH;(&-;5j|C#I7DDPbzOI6+KB1;#LfeKr}jBBdw!pb z^JjNoFrogO8N=J#hLoQEdDnvR>04vYsG_^u+vY4unzh-ZLcx1K&ny4Va@fxeTH5eR zx&NuFzsiwp?N*WP_95N-))_G5P4eKHEhoR*edxJ$_2Bb90TTn?RIPRDvaaOEC4+SZ z$1Hu_G;GdqMUy`7{WxTF^6K2+J4crFcK7j4&$}OzcYC3?N?cC1sbs5cS5W-`<-Yk#3q5JOd(h%6B< zs}VseY&9ZwJt9-YaOJ!P;j;k|vj!2YGDLh3;k_0yN=2_lBy2>y5HUu1twZ>2Ld35_ zgs5y0)|(N&>k;Es+5b5wH<4StV{nq>8ZJga}vu zn-HN}5Gf)el+9*@(^f?AX2djgP{d6UjtPkADkuRFwGELjVy3cBM0h44!V?j*RGNq^ z5iVO0(JE{UB6d3>Q^XwQycOZI0}-I4vSh72Sid+lv^#hp~Ev zUj5O`vWH3)laAr+%ziIPLiZuU_aauSG!ahw5ia`>YgO1j#7z;IBGxPC{fMY!M9hA~ zMwKDL^8ms-8L?SKCnK^%ybzJ7ybd5@4RI&)j<(< zM-h&{A`YvdUlFMy(nX{w`=f}^V~Fshh@&b^gwt_^%Q3`p6?P19Q$(hSlgjxxBI*Pp z<~ZWC$`Ijs65)LUaaKj2KxBz{AtFtAokYZ*Ld2g$oLAW*d`=^LPa)D(+$qEd5xF8R zsWzt(31<*Vrx90FjtIZAh=4PQ-&Eomgmo&y_AKI>@;{3>ARj>yd=QZ_h zh|FG=_V*E?4-nz^5#?2y2&X>~E)NhD zRoDZ>O%a(QDl6wd5K#{iF@GScstggHe@{& zIii^gdycp%B2z>Q<@^E>^%4>D0?|rki12)c@P3K-QANK*WQlkoqK)!;g^2wN5&sI& zPGyVmd5!S>3*oEc{z7~Zkt?F3YV#VA@HZmqHKMc15#jd+5%4#nt4jPEVf_!n_6?%D z@_&OkARK9m4S~qPGfqi%1obE+RnLze9w+M})sa^i^ph zoIW62-Xr>}u=j|YA~Hn`RL&m|Q8|d14~W4kLxkr?gm(^NsEW=(WQlkoB1n0CM8tkV z#D7E#SJ@(bJ|lcTA%a!hC&UL4xgtiXHlGm*xrn6Ch%qWhgx?oLKrSLgCFUZmzanhE zAjT{IFNgyoQbbHtHeaoJE)CSv9AB9ZQwNz=b~?T7Qb#@KA4`MuG=@y3Ga0Vzbxem^ zl0ICAh)`)FoU9NomWXL8%o1@^M5c)8%GnALrANeAA!e!!5uOHww;nM|Me7k+B3_7y zR$c}~tPv4!K+I9uB7E{8e2s`06=y_z5RoflzG{;XkzkET%7<8}azyyqAOfrri&dgE z!a6^~)&{Xu`P(24h)5Bkludp_U;#vMengx)D8jBF!m$8ig$gQwNEMMTB3{`SM1bh_x!r7I9NVrik^*xsbl6ZiAX8!A6xqpgfD{IgKi;Z!c#ah4BgM z0fA+rK@}~n=b`-%`qIfOi|8*H7uW5rSCOUl)}?mv^V|IHc%*#OH!NsekbK4Sri@xu zT7Sl{#gU&BPM+qZ&!>|GY{rcrJ75&^y;Qip{6rEJninto$CGCMi5mi~#A!E%aueNF3@{JgGyhLvuw8dFa{%5h0lUgG?- zzip%OLq`M+2^$tNBssU9{-~8MBRR#B{$R6xd0u^ItD-;X-3`T7vBJu>ntqfj;;J8H zs!N52)aCOU(#h7CZrX6RL&x?XGGxSHiy~X8xA-S{-ezB3*~JOJ+j`0Un&~@P8wT8= zRU~zJQ)+dy9qnBti>%d^aQ$$bVIiYNve_+`Ca1L5*D);WT|#P*{8wjvQ=M&h-W4kw zqd%c3>%vy1`gQ6-{dyPHSrn3-9rAk1l%B|UC3W-`%pQ++en`??UHWA)7~2i#Hf#_HW{o3o@8x@tN}^Y)Ly zAtQoDQcgFX;;@yfH#C)0ajY~xZNHkoDlpf{ZiY^NjXLrLuBbF*f&bZVRZLrEZkT?A zWr5<9BAvd=CY>4;rgu~ors%D$9&XYlM>y%HeNuhbeNU7(%H(M(6{m%G&ziK;8U(GO@H)j`?En7J`cACD# z1R1kV$>u$%lc;Ml{|z0YDwNi{{?DxMxBvgYaVyILy3{!NF>Kxxu|+LiW@u8*;>*{( zkH~DEs^IpA=}ix&Y4v)Up?JhoP0Lr2<;3%Ora5^I%Tal6AOB20)?Py* zd~yh-V0LATTAKT)Il8LFHf`BYnxijT{Gz$fIH@2zgGE8}yNcyyfRds76--f?%jYXj zmXY6gEvY$6R$rp>zT$kE)8k}W_HT<>65(UeTnXayG-uRYN!(z~<&zh+NxT$zYtkAg zdCPlK8fz}UmQH?Lyou%tXwDwjPICn{CvUbm2$GMy;ZSDFyZl_n16KKPIDD-Y0RYYOs__im8b~yB@;g8w-!o8 zcxmJSlQh4=P%3gomgM86WmtvycIgm&+%;E~_%6-W!^tAmKqsAvkEfQdI`RDKK^*yRC7&m(iSzLnC6;m>1yFhYOWDuFDy*cZ#aMjXv(w41f56p~=H=5{ zbDVBjG>XvVPnv9mY^=Ee&3WUtYtH;G%Eq`In(M2jYl7RUxqdi_Hicb8WCtFgrE5lf zx0WtqpeCCm_h<>_1(veyT0m)>?CFEG3|kVn*W6GoT`QaoPWJvl&9x@}l}u#s57L(X zk@zB5@|!*I<_ z)SNHwPms|h6h~bxI)J}C#VMajTEdRRowS9`ui=yj?aaSyZ+;bLXWU$nQ6gN+unX}J zkdJxz>PlQXqKq7oS{dDlOCJ$8&78116Y^4LIn?~DCG0``o^)kC@@`M5bx*jjxtUrz zPKzy)*&V79{-Qa5;^wzM$a_F#oqEAi*=_j9t3Sm>^ya^5$ZCYqNGaqeFu#Igj^+Yz zV@M}MM~t>`AL7GsPK4%ng!Uyqo87nu;e2h`e#94OySBVDlz$feAx_@pBcEkjh69MN z)DkLf;eoixnv>(W)Orw%!O4KLTyuko@7D(66`C7@8?U*Qnj4Cf_n65z5^tbr$$ zjFf?7H3`K9!BB1Cwc5hNaDiI7by~XNI61t?XM^TO5Rcc!fKA%6!MIg88Amp2ZltWg zuaw3oL6f71=O>{zVWQ?n6Mvzl+oHKKIC%)W3E@`FjU_G*P>b89Iq8%aa7_u5G&hd; zL0m+0BHJ}Np14BFM}AIIntB4%*4$2j+!T-pU*(gGlhzCe$x!xZdB>~Fo(gwCK8H0Ytt$Js ze2!=?lDNDkUG}sToUF(+>3>U^kk3&q;m^dSL(1ov=B5+ZP9iOiYi11C;qyI~O$E#Z8eyr-%k;T6p-Aihg; zS2ec~w_kI=X>JkjBu+lR7|v-fLrb@W@-5D5@|Gr-lF*jQ^e4QHlkKz&G?EYwlO# z(g~%57SY^M;gHBGt*)9)@^ zW5uOK9khh!h)*L!X}z+VJ5RiW)tHExTci0@OTpTi4y39sNUkcImhaJXC;+PzfqS6{rf;K<*vX1i4>uj%+W&CAbV%;3~*{gURqS%mBG(FbIajNEij} zL0-qz!HS;>>`0^&bcQa_6{>)ntLrTC%LXSlhBL?u#Lv@j>ak5cpguGJuBI(6gIqw%d&&}F z8_31;4%i8D(Yzbvouaw$1-^pZg^`PAE6{_%#zK|fYB1PXGhqYymCIH`^ zkgHugkSp9WAQ!dL^`)zOQ{Nw8CRx{|K5if{LYIqNxqz(;Zr~0c>iAYeaaXxsmCIAP z9Bl$kp&2xX7SIw}L2LLCeAMyXhT;LfL_0u7kS<&Wexu~yL9SvK!7KO+j!=tVVIeGn z#jphC!#tP+kq{1(V5IWcV<_LfHql>Md^_xby|54F!z_q~*>D3UKuhp|notYm!nrQE zLSZNh#ni@ahU$D%du^Mch2tlhDT#efu72feSFUd5%5^X7Qyxi%I{aSJ;3UIj`$wdF z0$C6Xa)g%ydc4X>GITW*pnoD19Swr zDgLon{X1cS)-@$47mP_uvm;- z0&?LezcCjHKZ9J~&4gcI7EFbaFbYP)SQr8Fj>SM21cPA+^n?BoP0yYKF)$zG8gC&i zh9$7nh6BnnB1*m3X($~LPjnTmhBdGb*24za2%A9Or8*Pjl5Yx(gi$aWM1W+ftx*}(GlgyghOx`jz9{G1G(Ou023h;!eA0imN$)0AtG;hj)ZCOGfanpFa+d!Go0Qu73BAr z`#?W%19y-&nEwfn;4wUbEYQ(?^k4%8pdciY$5z+|Nw7VF|8~GG*bRGNFYJT;kPHXm z2&BNT@ScA30rc!~2H1$(1e>7@g;anL;^SZ>i~@h?1-;=X=nmB&B9^9K4l7_K$QANx zSO>{;_5*Mbw!$_@f&_?#888a^KwtO?nn81D0WF~ww1ywS2iibeXb0`}+@A6!(gEZp zTwc&X1@AGqyU2BoEt3U6{%%wL#_}Qj36J10Jb`R@s!s1QRBm;hsQh`Z{3Y#GNQHB7 z9+rSyMlXl?AeYZ|U@Ph2WSFv&MD`Z za!x7dkV|NKxptLnRk>Lb3vsX=HGyukO8;gHr#V8M(-ki>h3v<&sq{QJ;Za?aMW1{bFAEXxFcKSE|Gh1 zA0EIT@DOT{P%bB3pd5^5^NxWKux2_xSb!xIV@>5UGYam*aY%-ZP#0Xm4cuW5E#lAC zkiYZ4Uy%PoU=^%ZYY%cMI)S`Kz#s^M3!tMu_X*`j&mZt7$h{o7v|I>sD||Bag@4F@ zBMs9Pey1_6LpkEb!3tV4{Ui858)ysdpgs7?nL`I69l;ycv2yF72V9{N&)@}og8ZyZ z0kDNaPz>h70$2o#VF}EEQ!oGqLwi_6MddZyy(pssVQ<2ppu4;0K+cG01gm zQ>ekhOCc2&lSwn25BrbYb*K#Tz2hD-%!e-yAF23l=GUQBT)`dWD>eDLtUfdZ7u*=q z?1rck{5J=RfP9-IUli?E-iHkiRUeZ7pCEV2`avhkk{c0nHzgWo!(0`9*ihQ=2TMOx zafc0kBN|c5yOeMZGN{>JkgqTf!#R*|B!WS{aR`E8FaQQZ6l*XW7Qrtt3&wymRD-fm z9%itXa-)AF^oIc;_xQPgKg^;p5eq7@lT|$g@0g6EesY6;4b%rur~vI)+m_G_f`Z$o=;&O{2KfEH(*DCXf!9C(FQPU)0e_CiX;eCjKc_25o{h>Mh zNfC0t_!&F^xg{*OfFoI_9I7mL+oGA4TfiYO(p(hFCXi+u?1KGp2Dq8Z(*z{U58;UM zaGLes2xDL@@Z68-MyK4^lzT`vU`s)TU;`D($8;|WIs+d;)?3z7?udxn3N^t6^6& z7eUMhUK`3|eZp$$~6YjwkxCo_5To&YxmE56{J8_b(AvA*3w8UCi z1`1*!1f(U*EhO>F>~se}Zl1}sthpc+Fz2m`95q-+NSjIuY3qBeqIqN9CjN-kl+yFs zi}8Y*ndi$YJp}V=T_Y~J%Wbeo2x5AJRZ?0u-I*8Gxu`lJ;R<(*Us>;29Nu=uo0WbkNf+vhuC65`}xrDNaoU~$OYnyJS z4I5aC+G+LVJHlNK`lKu)MfLRAfM6JY|3hjG9?@(9z-^T$j`0e2t+Zo)}80aIW#$cn52xxp$Y@p9vK zGK7KlMA82Qlm3g7+YOS}5|BH=GDa@6P-RXUIz-3_5DRkCLT+Bf!AeMhBai@_VI8c6 zHLwvj!Ft%BO-tj+O;ov+CXKlT5@8!`1-Z>8x7*CO-hLq7PrjUz`)+c7`~Wluxd+z@ z_CXss3^GrAvKAg9JP60(D9FHnObc%i4p&~M4DEEM)U;EE>h@BF2XG(m!ClCN9qRZg zLvb&EqP0NA$v0qb@yf*I__WZVU2*L-FePX+s0uApU~I(2&66jG?a~g+xbH+!=#| z?pL+%jG<#$=_!>-?f@r=%P&1ky`{^kif0WDs^M8fkipdGDv@ayX&zasCn*JgkWSnM zej@G%@*}jeop-6%XAMnkWD}l4#VfB=Lj&7*CPy(T4>t@|;i=SbsCsaYd!v_A4SvL( z(+uSa+N2qJ+V&yw8WOI9{wgWW(A7pt<550~LCWTwp?pQD%x)(4!XDrWK#P5l3VF$V z&ly^jlw_t!!n4de1A|oJIT~qbGNrH38ICdQS2gW|sr0o3`Q;2ws@q?u&RsD4tQ(W; zo6aWE?N?(ivW@nu=!=Gv!Llomo5f&K*8+*luq3DN<$zORi(%jhaymbU1S1G#sFG8A z+1Ex9%5WyPj>Hn7CZ>*Mw_u8cso1_`gR(xzv{{jFWI2jzI!Yod}CxiOAVg3b?}&I0SP3Z~&5F zKgeB9x!bt|k`TlM~=TUU^>XqZaz+QrhL;AdnJ%k zqiEJn4i0N!4XlEAm<94=pQKv}u@DE#U*c`r4T1I zUIDU@WU91KGG7j>VLfbybzrW9E%A*|3S_?7%d`xDvJ#SJ6Ud5ffvq4tMADi=wcv`u z+DqDWJD77Z$0cVuyA?0F?FHFZ=IMRv$`yk{#NqGMQQ{{+HrelR5iY`_<2Z$ zvznKAQc?3f@p2j|UYvx|-OcfI&9OxyEPi9+3S9aoEiQi-m-|sNUoaP9F5FzPN6fnk zH$XbMw9uc#AHpB-0Pe#*xC@zZ2X4!gp|^-+fO(;3#Gk?wkj!N0&nBJ)lI9cPM<~Uf zR1ze;+2s)b3!cLZkhOlPg|Dp*S*_M?!2AZPmdKo16xvTO(=$}-cE$Y+Es^p&s} z?h9cqSm0zKE0A-2DMT_ACxuxPnhTKv%$Xa%^QI#XY0c@RaEX&X!jz$8`fo@=Ii`h^ z;S{h3JCIEy-@}ZD5Qt@ZETLTH$)kF03EO~NI{pZ)p%t_Q`Ql3QsAt9YZ$yNr)-4(m z%0<#L;&Q;qp)bgnr|qU-B zI((ZKVbO~TKj;aPkz^tZm<#BvO?M)cLS&w~K=X7D=1F>){yx2Uaoq{UOCIKBB_Ac% zauSgQ68aOGGm{FL3y|7NyfJS@43FBZHEQPr+8=^suU>vPX2N|i{9Go1C z#7luom|g_)AO<9j6f6ZUWO@P22XSU(-eTGQlEGpvG#508+Q;G)NOQ_(JMn$60hYrm zSP$!9Ev$jnAT1{IR%&6q78au%$wTJtg*_0loBt$(U9b~&KoV?)EszMCU?a$a39$LQ zxVUX#&R9Y-vaET9Bs|D8+uY<*2#?72KTJdpu}=wQK}l4aZ7G#{1*M2rqp6A$7K0*C z5NtpXk4SS7PJ(QIX_@07Yb_Nww}#}M4yQoUh~F;TU*rXl0?)!3I1S$~e2(cfNYyw` zC~GduUILkxOl4a9RgnDtglq6ST!G6Vc}RMxV5)3?$y^f13|a6uE&d1LAX>(p*=?q8 zfuz3y86e9^#U$gKAS-Yk%!NoLB&~Vc9Ey`lL`Y^5F&FZH_4wwu3 zz930s&fHwdf18#{Y3X@l^4o+d{*Y;D#=qe)SkiG`6aED+;5j@2S$kPl`i^8Mts|Lc zfw^Gm2eKDD14$>FM$%?OUK+N)BzOukQxXZ1v3Vg`Ksw?}Ft6G7g~;;eO8mF^=1Q2; z{6{{r{mr$NHI>d}MX!EO_zvEHxl_F*{trl}l1(8UN;;|Rnvx~~WJSz9T`Dg5Ngm&O zSy4;Mkoghj1fQ7r0MaXEjXpvS=tw9XQsNfGrJsC(T=)!MwfOf1d|$9sM%LWGvJ#rp z?ZJ~S!t|h*G;b1ozvf$*mH|W_2$S7W)>0k}lT2jaT@Dh@kCRLb5T4My^cP#EWsH#d z-={Ccw4|5TF0B7<`%A5*W61WB1tjyLT4I?em6U-akWE%G0#ODoGGR|BYb7&en@PL^t~`_jc?M3Ng>wLN@0ZMO!8tJZBk8>V&6^5l zp7b3VDyo*|%>_uGsZJ&2fxD_u87hHPS}HFEnfsM_x(f5Z zcUnB+e=Q&d%0lKI>coOl0dda669_khY=W9h%ce4K4jIPfK{WX)NS^1Cv0lFVk>)oK z=e3xYz9iQart#mr4Ywer!Pdb z+qwZXBHj>wkdW!-gw168cVR%?TxqIo^x7 zKjb65AWyK!v^;trKqybL$emfa**XI!-*gXwelQqT;s+4+he3Mw|ACqeBpe1&5Cd~z z5Q*myM#D^)0YAeu2!lwF7Mu!GU?Pl%aWEFfKroDe+H4Xzdmc@EB#eR(+5aaHk%cCM zoE}dil*~gR93)d&U^+Q*MgOk0)FSOJD^ohd77@1g!gkmpeQg&U0$ETNN{0Qg5B7p&a2SrkQIN`9BrHWJl|K(>;T$}`r4gorgcl$k zF2Qeb4J_D%vT}DI;x_-?gyQ(pAer7`Is@)PCOiV!GanG%hllV7{0WcYEo=RZP|``| zo)Tt*e3v2*Zgv5=Z{LDYhK+KB(r0);F2dp^37aFDK_~jDJd&J3hVpo_2gu{fPEZZ( zp(<2?%1{X^g7lFJgyo?)6oVHy$@>e)V}DZcAjoA}22Xin=a^irH>S`}NcnC>?x4xz zJcVH`art^TAGBhgkx(uHb3vL~o+td3Wu>p^h+9DpzBcpU5&jL*T5pKZE(4Rx-7uB2pm> z_$uioO8hv>2=V}=e0MDmK}O`~KWQFokQp*9;V~_-Y%8{tsp;(qOM*P~B;&#NA91Ci zG)P}5OXvWOAeBiZzi=vCow$sNbqHN#`#Te<36EH)24O9z4SzEI5L}5%vp<0Qa1ZL@ zG6~%XH<6jU7Pi7IWZH$b_QrWZQ;^3g8iFT?lleao{$QY2h>%0~Hnvj};*Cu+^1Ngs z3rb>1CuwB9#AV)Arp@zYTJkY(3h9uYp%ZjenOQvG+nxHgVX`IoKr3hsGCuo&9V{b@ zA8{R^Bbc{lcjDbZZY;<>U4P%Lm}(K`QAbvP1VHK2jPxm`D%= z!XOw3Lt!us0eOaK7_6d!WGe+yq2WxA0vYMYfjnz84lnZ>z(l5}LO4u@NiYS@v-~u| z2#ADDva@YKO2$&NH87nSKT=pLkl|wv)3abE%z$pB;WtoBW8?R|Kpvy{h4~!_qY0y6 zHq3=Ptnqrn)gXt;Mobr^qATQ#Vg+(J#K9t12n*l|h07r(jJSfaFdF1=B*(G=#O3(b z8`d!`hb)d?rbE?YLK%Yk6Uw1#9^q=jzJ$HmR3U^*Az}&tEd%p_8cY290d*DA@gUu> zDXfHbuol*U>_{6x`hoO^O^^VaK@R?MTu*(;1fMGMs1=|5je5J)4;b&+xPn{qQ$6)Ue=s?Gk&Gckx{gJWT3tH;>xYn*)yDoKC4|5DPy;Dd~ zh6FbVZ3zE56+U|9jSIg?!n$Nt*W!FxhE3-9AAM<9dH01AbI`S28JShPj|O+kTt^l8 z(J;jFayfqe%dnUCI>&!9*z4A)}zYG(z-@FkJlvN z&>guhaq6&_)>W^5OQ5foHz!KJEwFFVA40#)DZMn@Xzx&i`E=~a)O?*(>#X1t-{v=7 zy31&<>$3DbsfK8&ZciW5+I88jjszvC#wv%phknZ**y~$@d(2_*itN((a?P@iMK^z&^R}8= zsWaL+6sVq;Vr%Q5fU!-gul$yxqN?a?K)0JsaLy!>>Q2Ma7&}R&Q7hi zG}=oCKV)fiqGO;tlH+A*I>k)W6wB|&)=ZDp)!6G$(UPGp+tF7I@cnSIs5 z^0aw~wlmHw^3#YBGjuCW9n;m7-tntyqNkvX?&@V>qn$2NMSS7)A5>(H>YqkWTdOyE zQPOP^@u0(7z0uv_-*?Lm>U9y)?NR{-qkEZdoL$J?^Wo#)KG&)H99D?j*>zTK&wZLGGh(cg7EU}Mjmu-E%;-fnVaDs$@AcCYPL&!P;k+%uMT ztZQ+dBvO%nZ3Y&o6y5z6N!YN`{-z}MmhT&?_W5Xdy^6?ZEH#2$%QNOP9!2i^`uy+w zWzJRA>lp7mW&di(9LAW)&dXoEY`W&kmv3`=Y0F%9JNz}~@1DAEb0#pS9LpHTT^%&y z;v36vbCxKbwXu{J`R>v3_55pc$3jJBUHO*gDsw8a^ql#*E0Zf1efn+AKaEr;Yh%d> z7BB6cSH$CHRjuE)XnE>eA`j*;2t@{@jcL`gZ8&?lc~$(GQ-L`Rswa86eY)KG+ng|M znMKpe`cIwk*6G`vc&(gncaN@}_0P02GACbN%N$l$SQk$!^E-(g$=GpHN8O_-*CM|y z{+c;*82Gu}>fz54^SA#tr+_MNV=U#s($zV&m!+e|uBe_F)yCGGMs>0=&fsTiui4No zqgv+;zSldn-u!I-gL-UJ8P3_J3)TGFd7awSz3m<5aF~)~)305EPFjBXZGma?(?>X# zt1muh%*Jjfh5inDKq zE62i=o~$|-W@MVARugE$h#R9%MHvYCs)hvrZS>K$%zutPmNy*Kh9X9{|F03o-QlOM zd1nUC*KepB@B4W@)zXgXjZ~AOw2`(A9A!T)@tU1=S?(S0mMe1I#v1EB! z$*m-kq0@cQz)8pB*MwW@R$*krC#&OL0)3!#}Fu?PKJ?u|$TZ zZK^*BbVt-=NtaGKIkNAc9G+c1wcusaNvo0WzPeJ9bZ^!1a>f$*OlK_l{nVeujaj;W zD!l~DntuuMMCkp)=iBFww=|tAd2p^YR_SEf|ELl_ZrTy)G21V%V?F+>-5(vCy9a$+ zDps4bf7?yZ8B;2p`Zi~iif2)W{UngemaSH1NBD4$zfA2WTgzP8H1(_`J@2maD#hV1 zOH2Mq1=BJP`FXTajy+=*o*Y}P*3hsLx*AkfK3Y9Z2iQ`2RzRn&m13{0-%I5$&0eLo zX&U*JB!i4EHQ&4%-*)l0`e_-M4iqKS>e9yYtnJa#>%9LsN><>Jpj%_me|Y0y#O*lH9lJ38r z3YyaGSF1_z-%kZi3I6M;plJ@Lf-lSd+o_-_h3Qn#UgxVCIC9=hX~Lox7Y=Qkw*|wlV`qg)!=SWsbl#$EYe*jBb{#$EwB=?Bt`X7*|?a zhNwbSS+@cqs+K#lX;otx%Mu}KUQJS#3sDPXrgMneQk7|s5OtSO$FJB{GrD&?8Isr1 z83PM#n|^V?UQ69nX)=oLI4*B>a%?N@E7^1nV`K}>?6=EX=6JD&Z~L}ibe`2Q?Xm6_ zXVhXcr8l0fW*n;ftm;%ZPBYh}Y_-t5!=>dU+x@dE6=9U;RKavCat&SPB-zWXqN;>}PR2+}?@8(@(_Dc&III2$c>bePULTxrSGiN(L)MfhV%-UxsC{L_6?`?epW6~P8OUsnBE zgN|pqNnp=g9bVTkuK0hgqIT+_ZHBV0G=iKCZ0NpWOWgTh1Id{qqI8A4wQnzbV;@=} zul4NJf?CGF+Lt+`%E$^)7*V#T{efIxU;9C)n z)6`B<)UHVi>BV;(CU}3IHkwN=(;!6u{?|&V;eyc<0$U+-3?5?$RHqr%h`5?HpKsYX0!2P#*Wq0(A)t!s2I@o$x}v!Q`apNHx& z2`vq?)L(Ut?HvY1b|?NoyPdiPD@A7PWApzabF&n(-!sL^Qd!@Qm8aMC7Dxc@*qlFV@R2D zuTW8xB$cU1GEd3WGA8p(#*i!XC7I``GS6h5^M3akJW1XA`@HWTzx&61oU^`r?X}ll zd#$yHv%5=vYPjP@GbsW3J9fNGL3eJq`iP- zb1|PzVcN;s6a9f?-VJO+>F-9cnV|r%6x(&^&MDindKn9>1V9441^}+CLSx_-NVqS< zU#7HOHO5|3w>FAZxLB60GC>wsNfsCO`=troDSjQ@@moxzBCk+IFx_+KTvgxZiq2_m<$p4K z{%OiWG~y782Dj;?S}Z8~K6M75;X43~0XVMz_TCrEY^D;)sB}}s3A(w5 zo>I+^(gVfG5$O-sooOkGDr=?Eo@Ow!-`8f?(hQ5~SKP_Q13pz;qaj}pPNl4~h$8V$ z)o_v6XbY2CmB!WRn#TqlRU1I?VfrnkY{n^nu_(*qb<+&5T;ZYskmlR+%7B zW_)FqK)DF1mfbSi;>C4Tyri#Q@N?p%SylF|+G{x_w7_8Pv0QYVn{JpkJoLc_OH$70 zW><7y1Z`^pQyNdF@MF0cIAkD+=hZt}W}kV}M}ylzKNuhv0G4U)TNGl}c3$`q4d4;E zwuH~cs`gnV5*Jp9S=aeTVHaW?;~LnOn~gUuP_o);alQL>r>C*24U%z2_yH*Hpg6C_ zpT^}nlJXDE2deP<1D@Y=HBI`13ssfPPb{@aS#=GqLTUD=7+S$_>#iaF)<|q(sd;NG za5P**$*nm%_V*)OL(1dyqBYlDRRLSkl~ME4d3PtrCcW=f7iw{0dm&m@>!?o~csp<( z*@j!BY62wN(pWmMu0vqAZ)vs)DM`?3w~id!!u|z;&6Qo(QE*$-n?v*4qN1yGvMpEN z<1va`pg8_sLDayZ5n7h5qQCUBJ!oa5P~!7DCc;SkGA}(aX3LK+h8x2$RG9I>I+Mt` zoiNxtv;)IIG?qP$q=oEhA)RJV8|YCxuC=oKCUR`gxi{RrNi?h6BX^hIKeg$mV8|@` zYyB-zRz?~BGko%N7l9)9nA5bhJviN<%=X~>h@Q3QI$6E}ocZ{I;N{^*({d5EVBd_7 zmH;rP2yaYx-_m4np-h%H_r!AJR&mS^%L({owQeL_inF7Tk7K}Qcfc?^0stGZoB!_n zVod902yrq1%1-GBRh}b*j*#Ux)#(VnN2nK`RL-y)R!n_3TXmEFk_6GEa#AtYSFE^d z&^A%(tL}F83AvtFVMgBV?1*dzh&&)H%SIfbN}XUm5|CPT;wtN^wu}78t0QMYBRgRq z;NN=d4jB9wV1Q}|m{vq{>~A&+4td&QgDq6sP#BS@yT1<%c@S;$ffhE>Dg0PwN@`7b ze7&9DKf_IJp*5jPwM4@sv(AvK&koUwYW30jU{J&CDwHHFS|K5)PMt9hTJ5AIonhA) zSGzlNE^gCyil*Y%;MErA8P(Q_J&e3lYlt)ZQzJOjP%ZwD-Q&pmM&<4TTL&W3o(r5? zxf;8)=+yBHLB^M+6? z{J@N+Wr{A@bKY`e0!b`hu8DY9;PqEs z_;n!()M~Phyt-fx`fM*HcYz7(>=V1?V?qwUGV6SNT?N~uWdqM-A06((xu~3gVD_`` z+_e1V%cs1u#k5u!$XcHJ$fzrLbOwUeHuut$3q68;_cBBifd?#1aI`61xq<3nz$^f> zoibwj>q-aLiG~Qjqcs{7L&l(1)XL#s+Pz^6MDI9#A31h|xC{2t=x$KYhJBQQUsVoD z=%d6@ttVaI%p6dk@p5AkU+c;~D(VKk+}%fJ-BIGjKI+&VLMpPvI=t37Ixl{m?!^3R zLm}1~Wl`EnscynMKMTT&OZAiy|&SuE;E!z@D-A@w^90ZbwO$ml)Um z7`)ADiYXfx@W$u?^sJ3PN*v!$?*7mLN={+Fev9aeKRB#7K%PAzcMe=WlY8yd7a_HS z>b4bJt>DnN91y#1)vL@0@pFdm0R?JeVQ2pVnt`&)oCCC`CugU+1|-`*DQTcaifaex zc~5SI(mk6}{zPrd$z z4$&H=Hp-eaF}=G|F;SuZSk%rp zH;~QdaqNLf+V6O30F*xXIOX=@%*;j}7jvZv>48@~Y_jW)4 zQXuea+#4x);t4T}j~{dM>;U6`Hh>??R?xN^Cn&u)_#w%8*_*S|`v9aPYL=drA5M@( zAI?Uq!%S6j;3$6%9K#$s&Vz@*ROBmC^Ku%l9=h9&m(_5M=?#zP7W(!m?kgM#ece*TI6G37A?DxSSQ>0q3 zH`7?_+G!dYh)N>Ph~B@r1gdstMT_$-Z(yiQ=*D(^nAO6kR5(Wkfv~}nehKpuHmSh) zZ*pFYS*iB|jONeSxLGLcjBHTL`#d=Yq2mL9s0u+lzde}IGi5|o0U_)-$DF6&Ao$7O zn}B%{Y!v4&&r=3?DDR)A#9;7xE7i7RP>tI={5r%6yj)-;TG|(=D2TJOt$G0~u&C{K z<;xU$>5m{(g0oUA4_|YEb_PRHGFrl=_Cw|)zoW!3?E5$9$LYvy82M+BdlxCZA7|$& zN7~<;CsSgBf`fyCBSLgPZyN6Zfa)ISn zsbVN+Hg+Qr#z3rZGC!(|`I}{I&V-Xv@I2X|u<6$8_CCEg=rxl5u@meZH40P2f(7s*4N`(6vz;7Zi$}SZB8w9H~%x^p;5LF0wYo0rg;Nkt0uR_ zs3Yyiv7Nh&Dexd)25|Oza>qF4k<&m7r6zfli(gfTJki}8?rCMw^hCcjr9xbaz_G_X zN??e`sF=;c=>CJ@H*QUzVe~T{Ey-&wc(H&qS!Yh&n@w-B85VL6CSpcjY8Wc@NG6Lg zWT{vXS`vorAU~g;hQa)v<&$+dlKV3>C>*}sxq#Bckyi@mgv?cs3&fD|Au=_|SZ_@Y z!Ip$xekN75h6(=&5t9_OP!{b4+`@7#5wn`jM#JSB!;wH7HYK_ihipZ!3CCY zabHZB#JwsO2(^SgFB2Q~PajZOzT5V0L~FZ4ne0FVwzwE2;6B}oK=TFx!O|FuPlI2q z?_fJkM6gY;xcg)@7+O9N;K~3$d%S2-*9J#A0?Z~#=s;mh-MG5YnM;7G z2GpN%tNwm(lD9=uY1Vz3GZ^bvr5u7p2Fk{^a8AKo<@G?U=(ws%(b6Y|W*VuwJRsvp z>}{1Tx7j1nV*6Y#bo5ELn5ro&Ekud>GcCu~T-l}|IYlA94!Tb{k+89!igc9}$+7)E zNnJ`&DW>IIwM4a)g8|czA)Mv!<^Qs@6~ev zRKlCYmvm()*Gf6}C8?s39eKPW&u9$Yj<2X^G=^%gS2P39mV;l3?z?59haVp;+k6+i zS>6Rx5f)_4RpS6)3>$T$ulkoau!A7Tl9|Jr^NQYql{y^=BOu~l9|-%R=AbMaL|GRe2Cs|R$u_N|rc^4VKp>R1g%lSHf8|t2 zCt{(5j6(XxO71U|JT8B7c;K#0J*AS3@G(sxISqqc`9Lr&^xPEirg}sd7Pv7ESbEy@ zwHRWCES&IomGwb*2BB7z^?OZTqcHwchas!{>ow(qQTSHCS>DVqnVnl>{KFLz904`( zjYz3*{oVYYyDNxWheD{m2MP<9)eT;+_{>=?kjg+QUqGo0irKRGg)`T6V{TDuvi{rD z;gH+>t(aC8W==_2sQaL?01!^n#DT)%_GQ(>V~U%S)=y<=-SJTl)F$M0dY^D>wI&bDQZJ>C0#rJ3scTbd)iS zGqDofS*e2=mMw_HliWvgCOBsV#r|50stkEFKvvX3Y4U-hMwV?Y&Td+N zq5BP?z^?r&Ua7yNPo}2HqP3XlKv3AqwUL+;Wq%a)V_^E}ufiDx;%1K%Tk4ZcODTyd z^^vl|CrXCJscL-|3ocl@Iljwqi#(|o^zGKqba)gjA3Nh8Mqwo2w^bZ+_7-17hy!~tT z6C+UAx(-ZxQ4u-DL$1|8Fyptl=+s{ob3RBYE9g6;h^!}Igk}}dXdsm*izqc7D!70W zY)miK4*v4^k1h2Dp2C^Pf+8vcQvD1Fmev?#zZib!?|_k#JZNiyRNJNW=1*JP`4#{Q z>SAsahagfCF&#zoq<>QUXwFKt+l7jb zR5jKgQ%#>Wi+Krjj98gVIf-L_e*T2kAc&^$WZ}36{%e4$4T!24HVH2z|3z0PVIVES-Q+A?AE!{ysMXS2j99{n zrj>eRG#NG|yE}}=H+s}(GR9P?4qPzPauuim2xZ(`+Qg7$gdxZ$BV`9E@s_Kr2FM%8 zRtd7TJL+NT6Yb+KjVg==-+01V9|xK>h0{?fF$=502F=x0&&NHAuPJnsFt3&7W8#_2 zs#GwAGyXX(!z`}|b2a6gTVysBXF7gASJnre!v1?iW2a)mt!qGwra~Xl26SdB3Sw33 zF?-Ign5mk^`6}3&ZRB*cc?JIXHZz+Aoip^3=Ivsckqh=zz)f1=+hj=l0kqsL0UZvm zyScima~OcqBuY5cVakTBIO8*}=7wN$5P0StszjbT_jqotwZKb@oYJ}UQxf1)w+xeG zCgIGlODp?A4sNczVn{P)pys;(vc-Z5doCn39Fo!qKrG2KI~Auo?yS0(0I`*0@4Wn` z_K&_z&{P*7O>tUw?%ui6%((|Z!6b;4LC#-sCUo!>Wm$w-yky*h1<$t62ZBW@xJohK zH`ZZjG2^GGnVhyt4}b8bGD_GUH%LqSyz)5g7vfZ?N$S||Ecs? zKnO?ZT7Y5<%EXwz+nkRYWC03uW6*eaBg$j)gh>dkY58ZruAlf95QujSF~*20CzpBx zz|%uKB+#7tCS#7=uoBHnhOd@-M3_UItVG|E!Twbxg|N3%+s3p}wb9*ggS~X{v1(;< zngwgASDCzLadzd^xOa{v+R~(m9fg->m+YU{L1n8T`g2-$t2E(STg@W%tICuMK9)LF z6hek+HQPI~U;5k;8ic?RL!YUv8293@g_?|c!JCXUrX?v5OrHLfc&0NcTxF|eCZc!v zeI*SP%C3xk$f~os!OCn?@|p`~Ii{388^3v`v~M=XMy;ykv;-lRo5T4iovTuhIZ&YV zQaPk59hd{K{CuD)-P$ZZryK(3+Ki*jSpunY%%wkjZ}qxI6$_i=LPrX1zG6;^87T4G zoYu`n-9OCf7C5MMEkvCzSz77R;+N+>qlB~|VQoQ1^I%xcKrr)Jo^Z>yZGtu%HWH#W zD9k%L#hgFdwWvEQEBSLD3-aBD+JY^pXg+>NT9D^LwDkE#L^!!c+Lly+3Y3*B>G=Wt zmV7TgQ{a3Ql3J>&RaI zy5X)8QxVjz;yr8Z?Qv#XcF7?!AN*!LuXQ-v z*JN9Y+zy_yAaWfGY$=?e`c1Z!hC0INjWIXN#e&-T>6a#w9q_2oM)p4v+P@ zGbBH&k4EJ;ZRt76s@|e38|`x<>H6mf->Pd=&($EC1>kN{L+qR)UX`&E9R;cg8I z^FH%u&mPol>ropG#i0g8qO7V35X?v0Tv6;@@b)UpHKZ>8qXzk8qHUdP(0(9sMiA%g zT$KSeC}BNb%SI~p_fHG|sfxgwSNR^fbJ;s7>~Z@!Oy_1s4DHszYAsXi(W!BiB5*E@f;52dM;oSq!6- ziLzzhu1lM?z>IyS{p5-@sImFkI#ZnH5dV)Dr2$Dk}JPFd8WmrS}2^(Yre<$!ur zu)LU*Qe8i_CQJXbRZ@BRy;QyOpdFoCT8z)#`lOu(t^Fe2%lZ_-D(CGfV+DRCrfO?@ zalpq%UCArAHuMn0l?JUFDAm#HACB+tJg9n+wuT}%L{_uhknZ->Y#DgV-8ICXqS&)6 zFdCS?2cxR&I*TD$M-?wAbX?gbW#!4rlAnt!LABLU9OgdWE$k9~PA$?jDc6yVSYJr$ zQQZTQtxeQ^I!Tpj!?A2uQp*=d>cfyyMgP(m(*~5j5f;&?fkOD0an;cNEe*z=$8imr zS4qW{qA)=Xa-&MBr$lF#RF~WuS=Qoo))A$>|F`;7$M88m^YE>syH#7$vnh`A*oj%6 zmNYa}$u6QhY;RHMaBH|J+tZO;#S#~qunNm+hOQ!y1@pX)UfR>s3<$RB2RCO13j5Gf zrv~YJKeJ|wI#OA8S9%UVq3R9<%LkTaU9v2Q>ab0t$sw*}vl@u9jaD`Y`E#Ixbr`hr zsE`%>(v-71#!U{jAm0jAP_5;tC6ux)h%P4j<`pt7>1X!I{- zr!-Xv$5B(R<@B0m^|}tYN*yIRYt>31SSr-QWn+z9`%RW;5IdVv0h8Yq?R&iDOg9YIXhTB$ z##zj=T~ymq(h}14de9@~Y4_@Ef+v}gocxuYRsUbixv`|&H>;LXWg~*XrW#^)Gyr||5q=>Sr+q9q=J23vlD$FT+2acPrY9S^w z_VHW0Z|~BJO^YSVk{uD?6?YbM%aWs_DRYW7s9Q^ga6Zbk>gn-&E_z?rbeCLQcC%$? z=CYi!5y}2tGKrsA|Npm+m*y67DlIF>wmEIz4F$>aORh_Os+Bn48a_*15qI=%ltw4l zL1C%V&VB=KbJnrLG!%JuP}qtFW`d{e1||1KXEHep^|IFDYQP~bX<7~Ar)(Ec>a%}9 zVKMA-%YKD%@r&7AG7{xcYqH)0FQDH>%;z%PYi3)VyB4ZJ)B}YjuU!-Cgf@TiV1|a` z-G(Ai_TMuFAv-D=>`G=|2+jY6`;T;24jOXeT&xCxvz)WY?@LM~r!R8CE$5SRIwQZA z%gg-aklCiaLf9%Vn)2gVa#rjIjg~^%QvqgN>d`=`phrC}baUq?-wtXJ3qWC0;|5dK z9a^%=gEW*)?a7e^Q#p#E+e`JY^80viDq{E&f$XQbl=2?@9K@BGl0;brlC6>30nSbJ zq=V>xJ?uvuTlqcf0%Vo^udFEvuKG4y+&)ZRzPSR0zXjyLq(^hpN=z!ATl&9-Tz@a>c_}=jg8SscsWPcb_(P;;f5y+y*zNSPNP!P{^&9GQ7_RkK zk<66iI@1=&t1Ky+gj3a7ByL%m7TLDW-g+?^>>J_E9_$ge@*}4sIHc3pkG3CyyrrD# zk?vzy(k1mMBF5@2k77^$dRIEfo*#Fm(ckg=sVk*^=ju~~V;ryk)K!ds zt!MYo8Wq!srASh*&BRq^Z0;TrB=L1BwOpO;tp$11WMo5Evz0ZP!S=ugd#Loz#mDMDAc-e;KEv35ee zXcxBm{V56vWjlYGb{t1>{ed(BFVCc~7fXWdl|Zr-5lhhnKw-HBw&hTN)?%&A zw)2kwAq6bqI)YBhDZMBIK-H4~vBwU0#O+mgcGMME30t_|0_grph|{h&x#YmQb9;+| zzb>qmy~0&}T3{(8WH)+eCg$Km9#!Q)(JR`u+5ATC zfhmi3f(bKfSKL}7QEGQ;(WIMUn7Kd^I>J4WB3aqi65?1_ZF95wz1cvNK2rCUD4q-Z zscHr7VO*uw_6nr^D60wuf^D2w2ELs=p_i$zRIeLuEeNDS#(e@1%ye)6(c;!^zc1^t z1qd}TotAxe1zU8Ur{MyfgDCnmjH-1Y-8c=E#rLDSXK>DNYCo~o`TZ#145T>KUvy}( z7xw+5(yxvEjs(_v^eEbx!Vu0uBBFs}F7-JT^iJ4_gmJrRxrEZuGpGY~+2hL)RptN@ z8Lczu;bX6qPb@uV=d5rY??4J~As)CEG=&eHndevYEVri6;&#bU&x^qujyD=oq29dQ1__EWJ>GbUZ&Ld*K#$eCO!a+OJS316Ze&unywYpziL z?#Sg6hkD_ng+IH$W#$f#zu;Jz38DkFs)W;~%Wz++a7t0~*fR*H0z9i6QGyA0QvGAO zWB-tb?6ADB#-!CaoQ$tv8R}WS*o1)%`>ttV{{mAo_H7{J*%D>hPM*H)sfeJaqgS%B zt^%oZI8{U~r35EoLl0Zs0pXN!1$I3MJead=+&sTo?($Yx1jY^?^KV*l5+!`G?~GYb zeg9z=B-|mRH8q^_l)Slc5drgA3xH%vK&nw<3)kLTS~Dbu21LZA7agyn)f>X+7xHG5 za25MS*iSu!cWS*sV#~M9n|jX4I=-GT=7haFV^G*6bk``Sz8#Jmyaq)$qzx}Hh*Z~b z+G6_`9SbE5Cf{rFQob>bxyEIwYe$L>#B`1Or>YIMtVU5upUx8H1wPH4HvT~eP^2Y= zW|0(m9RjtL5G^j=)G`Z?@j$0yg(^c$E6{(gUmkextxc2RWj2E-a3 zr4WvMsg19VXyUil8m!UBLa+jbRa(*c{QbR0-Pmr6ZEAV;RIc|bAcOuhh0G^Nq!9>F$nW(PV!M+PMrwB_Ps_4WcVfp0pbX;V#d{S`VWs5D4{0 zAeehK7@GWt#l0C!e^S5c#fXhGG=JgPaDhL|L0S3+1%<}Y7L--$$I^*g_$F3tq^j(u zyo)8L+o()GR%}Yvw~dvWyR8}kmXawbhKW;!A8tc^+HHKwwhW~KY%+`zSlP1GP-%o{ zdV}j(2XB}cj6)()IM%WrNx3MitTU1x-iD8E8%aKS;8ib99KRR*FW=37lQIvrNlI6P z!W3puE4x{%^9@2I3f%YXI6C+UDlOx#I>e(TadZycRqMfnO?y1Y7?|FR&V)SRE*t@o z5X!UhWS!52THYQbNg)W zdAOpk9N&qe?;vlU*^QF%j(xqp?hYFHE-BOKE|;oMz8O#J?s4v_@8d<^xc%)W=ld0M zF;$Shq0r(cP|-c;!*GI#h&vH>cwM9UI5jOL>RM)?FfZ9O{PU!Rw-PahV?zKopk+IO zI^IWX9e`jFd|ch_wTcu4Duxge2dyR(C=m#CTOgRH8+-6a2Sv?557s{-j~<{f1D>;T zm-EH-?~u~6vQVW~=ma{$%9icnMxrb;+(%nR&Gx@L^ds}1qW_*gfm9D5SsD+CG7Nfl%g5pzsIy6r|0>%+v>5PlYmdA{9P_e#I+qstdU{Z9SL)jGtX8(D+|LcG3{mOtXGl(GT+ z4K!2O;)OL2beg*ssRTRQz*;SxCSe|{;$w(+a$>3uV#zfWVEQvL+LjeJD{=t}NMA@l znn(eUVIChRQVI%K{;m^P9x_l|AkGZNT#4P%JOI`FByrXD&Xk+6+kA4w>{8A8)dmz6 z0z7=8Mp;cf+)QW-yP4Fj=_Im$0=51Lgf$TE&Kt8cy~${XcfT-Cx#JeNuwtoUes z+a3K`)MV2hH1z#Ux&(y!2N2B8NA7*!NXNbXMj%*&F;%?_3L9TLPL7?^a=@lqQdzVO zWt+W#GEqy97ia-$pY{SSKpuCmQ$#bevF>l$e*8RS-B5`z@V=*z{!5fJm`$}`LOa!P zUpmX}?Q2vnd%!l>rcyf!J(#_o7{cEp;G;l*Q4$|1y_(Z;F0iAgbF>!FC@GY9sd=VvRBO&x&L}_m@ zCVDOsgVW@bJ-^kc(d@0%Nf03vlxk2#s=MTlNm?HZsqwcQ|WU#%UTD&#z@&$m>0pxc+sN zq`Zd;W-S%1(ZS!}px1nN_Gv5b=47_N5EN!ZXJ@T_cj?>#_)<^=C%$Sa<*~9EK(J9- zB`)+>J(oITfRLQveo$Dp>}hwm%JX$!SRN(K0#7a_`wy_cYd};2;&8d=t4u7uvNT0H zXZK_&1%AL7`wj#<$TeZvo!W-kaXo=x?jD}4N*Zlph*G|vkOIQ-H2U@dca8jhR21V> z7}?g#DB&aID7y_(D=FtAI$HG0%D5G&pWt*$aVac{L21%)ymp^BYfI+>@k_m?(^lMa zss5R*z(_-^0gd~_jZ>vg7r!N$o24`V$F86!5&&N0_$spgjEYLRY>Kf!cMGo7Rdsx| zXu-`tMb+QOznB6R(orM~(R8p-EnFjZqn@Mj*mmu^!t>(ztuQ%VwT3Qz#@#nIYehup z$Z*f;Kf*i(9>N*ju(cHR1&a1tCwAxQ-mc1fE6zRuf`ubYZKQbtUHQUUl-3{Ywi`J4 z^mU~F72{;ydaC`EODyHfmjrf}5Zc?U4-U*X2JKRUfS0u|eRJ z(qrhwM^TADN_`mCo$h}}x-Z^6DJ8_><=ti8ZVZL}^kD4n$dxCH1|Etk)G?tSKe(={Rd~fB&bbZV z_rpyh77E=b#L6w(=11~o>b(H4RRfebS{3JM#@lj{+F3~*>mSr z+bMv}%*)Owh;D=mF%V{JBBzh>-^W9=yTl=r;vnufGdN%6a zgiC3nGAT)i53LX-{UwPEeV)E%>spWj$Je389Pe9wW)1N)c+Ok$NH{d=RXU#8BKOBe zDQoJjF?U^0>p8xf?LPQBW;Hjv$FK6=Xk&g1&%(5zYWIpijNS6iJJC~)x5g#e<$1mu ze(K>TIBA0D^iE9M{_Tjb-OsAxhqi5@dLYq9o!4Zukg$QNBrO`tqKOXR2YS4CfuHvwNA`^tsAB_kv8zW_1KN`MCs=5w#qP_oKb5x zo*AxNXtw~p2|EvG`|!Fp*6}Hd-F!b{-v#v3UyeJey3j;KqdMV+KE>QTv82rK68C1 z{=K215zQ{IYnyqfH}9#S>h_SNT3_A?ul@Xao6M-bd=G7Ebq=o+EqLwBr~P;XBZX_` zrx?D2f|Ld5|CD1qml-~cKU@WWY{X$IzlyZ2Q1bOuzK4S55lR|Og@Oi8=Y!eSr(^7Z zIQlV*ua^0KI)7V96D9#sI9gYSJ|^>jD%>*tX7N)UDh>{d407lf9nwD}GBzxTg7kE4 zh@y0B=`<7=oY&*4I1X`khzJUfX~1re@@mpV9TFVu8WR~5J!q6e^sva7=za}?hlNG- zZ-58K@R-cbk-DvwLd(DH=MO3rZd89OUxQv=JkI6MmxI9j&habCQEXG)>X~CM@kh1G!4p!e z>--MOVX`YnfdT_ z#aW&$z&N>`&)4|nZ9)NGfz$;h_~LEtUtlPVtEh?zXnTjZDfU8pZP*=DnluH*F!dR~ zK%r36>?%;`!5662`vq?aI|_Zlo9NN~9lEyE{0l#h8h_#~nl@(L&@U(=!XY>;vcE%6 zR8+($hk+pxQ6bSWAu$g9LqfwMLmXH?g+#}W8W0le5EdC59TpiA){nwI@x#gk6cQah zBszvFea3|F!zX?j`6t7IHhko5D+m_Ue^_MykZ8L75d!V{%r~_Vo*C2FAq^ZFh-C4R zs&CM()u0S{fGw3meoYXpUVY|$GY@{@-OOo6B$ah?Z5~Qojyd9-Gr5whUZbj0s z!`CFQg}NMV9mUtooE58k+FQ@&n6BWdryQfuY+YL&;ejS+>xSu_lSp1CGQVW&Zc*w* doe;6tP6$}KbXYe+&*r4W;AE!v5nZ+7e*i2Tfh_<4 delta 103744 zcmeFacYIXE_db4ilZCyI(2?GI2@pUwkdV-O@1dtGWJ7u(1cePvdh-gGASeh31Sz4T zB7*cHMQI{Z6p=uL&_T-YdG5?6(KjD|@9*#T`Toa!nLP8HX=l!yGc&gY7kyMEWqOr) z^=duwt8?T*%j*|Xdo7A;_0G{T(O!|wTjakQ8U8Z!_>=n?r|x}cRd}tQ-@k%+=EC$b z-MT|o8mI{he0J&j7@m?b$f<}gfMUQfX2E~ntw~w|*CB&bV`G+K~(6Zbr zIG(d}0g-6I4~y`xQvtdIOnnj}K0CM1(36 zYbZ(y@Ce{LzLgx#SAPBywP09j|0(;Gi3u3@Z^*kKv*gz99R+9MapXdtAOVPRtEmz zrzr5?lp_+?0a<@8uq-e}%KJ#(6iCJE0%^?fXv|WSqR^PZ$!>}=N$Z)ngm+jw;WmSS zEY=;!S#K@TW#gvc^nwOjYTo+JQyqmBns*Xb42h4o$A{!Z$G6C*tv3T19Wl}I2`HnS z?<{(W3W|z$geuBPnIC6|5l7pVYF))3%K+J%Cy@0K+tEo-epol7eyfzdT||Kx`VFr2 z;F!sjR5ZwGERL}d=Yq4L$~{EKQzZXYn{KV){O1DnPnQWxj3343kC=rExm@49w{SEp zFOCF|UXcxKMDeT77_=i`xz{2OYpM7tWNVaIt_!290!t1jQ#57$pis0~zUkfQ(!d5MGk9 z3{F8GJ{KVr@^%-qQaV!bg)-la0Kw9dk_9;x*ayy8D-kW)PXOlQ${&IR3*10KdPk2K zfpLgnUO#|yMA(iEei%GIcylTLGgffdTIq<2O?1TB<1WXE4ih3#5Z9=9pw z0Z&iC)*TmWPf$*y0u|T}d(zYg!P(K*KvsxK6z)0)i!<}LKu%1PIKnY95le@%QrqiM zqx6F$5llCLbn=Tpw*GyRX7;SE-asVN9L+Ru&kE+JW3^tM^-9fnUrdrK@?A%b5G~cS zMv?E)0`p6dd-6;McMc6SuI)p=2!Y7ChhXbkpeTm`m!I%m~nThh09{^Ip z?LcbOb&{wDM~e)KAEl&%vweGfOq?S!NU1bg3|sERm64H{;E0G;W7cWuH<6>@t(d7^(?l!nv|9x#IQ=BE%n-GcqT@o7;(}sc zOcz}2AByq<`Bc(>rm$eB9qx(iFgORd8_4_^ugD;}!;D#Cuo*y4$gcpI?~VS5L*^Lm zI8&a@7V2~rf|S#ew*Y6wsAw-lja_LZd3A}UB;Jta3xKoXLz25mepm8K62Ae`skRx2 z@Cc1gFnXvA%{V>zG%+F%a5!ShCh(%bl|T<*LcCWL&Ogeg1!9YL9Tk>0v1&0Q{rngHZdH3-P1r!|mkV;zabfF;0REfc2u!-Xcn$3}-j7e)DfrFOk= z_0nZO7sXGl64{Q(NIODZ*|SQkT%@}5uhrr#H4^R^78{`?#T%6s=Ne%dY?^UF5fMrp zICT#W3K7V6+9HxsWIHHoh5*?x6x(RDf z+9ecE-Yy0d9~~9N*^RSvJ4lG1`jr^)kgwTZ7px#i6hwpFBnC*FzFQP*Ah`ud*R3RZ zQOQFad4)trM8`e(N-I*ly0i1Qq8P-+ehv(ZiwjE5zgLW>0rD9MklVSwBujlpNo==I zOuEavhC$A0Yx$iRml0WBj`%v@TqfSxFYJeNZ$fg6-KkVW1`Qe#5kH28EG`Y%{D25_ z9at9mZjjU94|a$Sj~^5>b`zW({sg3u@?zuYyvW4>Pex{0&ps@9LNSs0ZRavof4+Z3r+{ zKZC10PffR86c!i^`_b84 z=kJw}Gk-CV4Y)Qj*Iwk>^jw=^@Fg*IOMe#Se+5!edt6*}oR@vf;>#j`KIBxSeO1_> zi7LN{x!Vk+0)c3Vc>5<|+N(hNMC3KGHo9LIx0(0BIR&mmL^2jy2X0Z~?UADy#odt4 zL&nixg%g(p=Tz1Oa$w<3afhfBkQqEj1mO(h2hN5SAm?hNJt{sqDntp#`tUAHH~%VD zUdTg%UceSW%w9@aiGN;ElzQObN=yaT08a$6Tqz8Y7InVF$QWL0;0*NAn7HT=JJz&@ zx5boPzauQeqm_bdex`6Dk3Ypof`GKl$mkejPJaT&ET%NPD=g>+PD}0ur;|6iCwyfi zI0ooUsU-_mMh2Z_1ZOHJBy4MzXgCucz5{vB`$EA<;03^=fW?8qKu%#|oS~l*8&5SA z<*x^FjvtEht_LzdVnD3_9k4LtKj@JtxDx`7WK4oRibJ^#ITc!M6jV|c0Ski1j2g)s z8fAndD%1-PH>N!i^~Onz@rsBJ2}-a7ac`8MjC(5br_1{913l4BFtD@}iC#$18N`D* zMQH<04I2Rq18e*x=Bg}^3Kjq||D}}21dj?G(NIz1!-9;ZPkSLuZb3dxf9JWVcTHks z=(|R_NiSi4HrNvt*kEgk2VaQ}gW{vSS+ezOF?YdHVrjiA6>#wd`{qxtk0HLhbQ}h818rPMs%^QS|DzoVuV<(e#bGlB554dt8E|T*+fH<|H7m z$uMy}AR9ghIW@(34-aP)B{*@!2*&lx4B>nW5H%;Aa-u_NqnZq7-2i00kVNdX z4n=Y8?zd9KR9^;i0Dn32iH_`Oh#Ch1nX${mWGtzxfRx92iV@D2++IK^+#ARdwk&8e zmfku*MoV#tb&y{Zd}|?-5#AQ?>fqyKJI-(*QGKvdOoPCTk0CF~*h-Z)v zd#Eycgd>8dxphTF$IpRWT7!U8I3X@Nab%dHL`se=*9fCf`{;=17+5YytRJP3PiG&S z5F>5@WO#f6IY%-BNDE8=(xiM=9*mPnq?G@KqZ*xfAUFro2FQB8 zvV2V`FCyi6fK)gS6e-5|Zzo4;1JVg=1F3*k)?_S^<-u9OyPTMU8bB_cMS)bTh|JFm zq#`f!3tUveWUT$JC&e?t+3uQ(!m_O^L1D&!QzY16d0-jfsLCc|W$P!=AIR(F2^5A_SuMF%A%*`xuPQ^BswuFK~b8beYWS2Q#RY#OlYF|ii$&l)a*~l*}y;)q*I3Yi4O2!EY1-% zQt1gfN7l5taJGp+Dt;BnDQqR{&GQ$&R3Dt}mH=`fuKt{^4)Y*`Blr;}q$Td>7bC0N zQiNx5Am{djR$>9M13C8{fLsTv0ILDrfONJ?D9?o_FOU}dqpc|SBarRyXlKZsDLWyc zmo5jggNeWjz-k?Y1y+t0E8`zhq1qiq7;OQv;h3Pfcsq_n%fV@ZIY5py8OZZN{m!CX zH6W*IH;@+i#c0o+?>4mBm8&~H?kd`ij|hs#I;L!eHE7`!$T<_i(PQjUkl*emEPf5h z_AUTf&UIvrjxmZUd_)i*p(u@e2z`zKS*|LO3t({|XLeOjLvLrwVkEeJwCp7^BIA?L zouVA=EiCpmkOSTfWXCIjY(N9D!O4;*0lChM0CGk<0cl_xkcOGpPZ+AY%x}=2?P4LU zY$TMF{XjPCdhY0YuDAtqHkbz$D*}B2MKspOuo#t-!8yWr1_}kNKx2kz23*yUPX#hC zKq?fU5R{OJ^Y1Be;~*3gjdzsTWJW~?85O=AEGldOa%v-oh>_!&GoC32E6EXYi7faT z@~MChqy_DEuMv*8_=H)KPmmZAZ8WQlmi+WEQICprqb55bpvIwgahM$?3+4?H9S@hh zKaeBsCeiRg96)(Ti+f!qDp*@wwTbybh<2uG^`<54qIR^mabv3N0Oy3QmN;O9P@{&s zICf>fQq;1FmT=~kr5=U~W4K-tCE0^mn(uf~t%6mxAs;=kWdBAC;CQ(9d*YodF;FNca z7V?EaD$p3nK&%Rjv7NHu3_#cO^^wt3M^QG#igF%t!aPgCi_$MQL%@b-K|ud|PvTec zVx+5qTvA-+7K1YY8lxQDqAQT~@fHJXiK6UC6ayLsIp<-J#1=r-J26_++YeNSKu{AI zZ0IRW#D+4Zsjf>rFY&mr|tB<(cD!J>!GMa1=^oSx}CGXbluII+HiuizkR? zM#e=aMI_@EMCQj#5>aW7k8p6SDmO(e=&vV>J@uNz@+ikBJ_t@fD?U}!TMv${txC#L zBxu&6(?m!3`XC_zC&<}S{zHt`t7dg)-Wg&Ke=uDbDH_@IyTmw$7vp5S#>Vj7c!630eBk+t)Md>N4a zU|%rqkQ4bz4Sub7OG~;e>H*G3e1V48Q6`WUxdNoy{QzV~-vBv6sGGSCl{$PQLW zOo)z;PK*n|6H2>1&JnG6q>3&3(juYQ32-X>3Y>UPVrX=v@rDM^{=A%ge!hCKsBi-X z7#Oa{CVa(X$IxONQPCXHt|j7Z;JQDISSl>EAIKHKSkoFR$_kX@>1QsGQ#T&S{AeI8 z5e#H3^jm_1Cr#N20%8D=3cL%XX~W^Kyn@1w6+>}3X~pHj`CSi~T+hN?-(s^y`yy6|{_;4SBI9M4n7fFT!c-3>zb!Gz5fx`2sVGTd4%{s%%E47a(Sn}~ zbi`v4Ay2}`B2>5&^4Z}NFxuwZ=7!W-c0kTd#!NYe(^^>?}sF?iu0VRwwR|I?%7;U=a22GLw)Al2Fm zq`m)n<_V9+BW7H#ccqs?#d+EF^gMi%s6Pyd`p%S2>7wB!Ku+XrAZOYU9~~TS4@qz> zk}PIJ7KLGWrtt7UPmW}CCAW|aM5T+6P}e&A80K4;X`>lp2LO2CC4Nv z+Cr})rH?^JhU;8=N-T0X{#Qlk{9#NzS)23>@}sP3}{`>GW5rwo|l$f|7m={mf>w;%!Tf3Y`(nM zw!SsXm3`@)pLX+zcC}r_iq*PSTDCvn=b~rJe*1Ipt@~Fhm2XX%`OT??`7b_PFkpNB z*ex~NH^{G*Y}vxvv;N%;-m@yK(FXMDv1L=Q7v(Je7@kSb(o8lr2KQY}K;5+TQ$E_Q zm;m*@lqi~axXs+Cj20g2Zwl4c#s-+SXt!bm%*D%Uwd4HN9ys&)pk`hzE6Ao!12dY{ zvXX7;L9k}XvufTieXO{jXa{1}y>*kp+JKp~*btk#8hLEQUCSC~Gu_v2#Rph?;mQrQ z%w@i&NX?NDpr(SeF^iTp+@}7(Tu}qv7R9XvTZ0lqZEAlo*&39XE14SyqW&tGS@Rxd zQ_EBo_1yH>Ezn6av(dv=uufNQL8mJz> zq&gWj)+5!yNIl9`m7Ja0lby17(Gt|Y zV|HqGcItF?s(3wFP7Oq=6|4gH9Bi|G4AufH$10b!TPXo*&H9Ss2RZx#J~Iid3z)m+ zecZ<#q=Dvj&d-VjXV$F64z-zW4Yafg{%SI2gB49$I^1L%7^eU%#AbfSTg#Z}Z4ZlGTs zU{aY+E1@nT;Wn7?Vf3grLcBvEjvEnZ2jdV`Eq$a-{Zuk|dz{VmSi3bfK=rYS5>})9 zDF)REeX=U z8Ao5{XHq>N{m*vmxA{j|!|2l>?f*|5)GLr;jyS!OY-;JYxCsJt)3Zv$X}~yn`Hcvk z14e%rEA(+Nda&^BSCUz@^h}?;aE5NkGD3k}t4APVD46xEQ6?Yv_V7$?{V-o^XQpyW z&QUdo7N8!1lpdYOh<^*>kHLZP#%d4%M(@H#1kXzZgJTPo%T zw(lskhMw^@^(I(9Zp7;eFt*}u;WU+046GMamfJV7ACgK(%luM2N)JNY{=nYoHj90 zYb49VVOf3$^W#jY^-;l?A;ZeCU`FeD`X2NQX3T&d+eol_XwRf)4FKyYUW!@_Gqnbz z#@IaPiac*HxKFapx(0dFBgZR#hlH+|->6#&iws#lLxaI!>{FP3AsC$v>(yYJ`EV~S zW2wJd6p_vyC9gO?fN>EL!(0VM$3XQMn>n+$mhp+dC8`g%!OS4vqFa%IlcksxalLc& zh*oh>HTtUguRdDZr~YaR)*O`LgkrtE3?|JTYV#}w7ee5rm|0uP$}$$U!h<2jh>S)p z$Y_J*u7*B*mPs}B(=wL%TW+I3J8k_)U(1h(!^TXR_YKg}miwz72yGe%y6hWJ`54HTgucAVi$O{zO22rP7_|u1E?}bUG^CoatojX8Xbq<%#L+{r z24F^rTK%!~GB0P^6CmN-2$%T+Os*=ha|W0gIfK3V&}_$R26qAz?P6Q9d;@0F)_>vW zjzl+Y{c2xJYpjG_jMUuh)FmU8xz5jhxGOUrDcA-Tb|clnNLhkJ%FkUUd@T#IQLpT`UMdpeN=?sBoitKjYyI3q=^88+n4MZGQqVG6RLw4nnH<{M z^#SS%a9Yizd$%(AnCx2Z4gP9jtRS35s}VD;!RRPP2w3NXwE{DaW%}?sa1TgYXqgUQ zwdhD!cyRUT4Ca^J%2cpsu2$5&V4Oazbtw7dZ}sYjDarukVWN-uSV0h_=p081^&*&1 zh4WYg8?6zIB2vNHpd=y(=j|0>Sg=vg8}*)mwEz?6B3rm%i0~emf5}kqM}x3QplL-5OvTqTSjW zU|AB0UCy`@C=;b92p0?pT3ei8tqu8Uq}pX`RV7+zh1eNkQ^$kRcqZdk?aOE_ZM(nu zWwe&D-CrFXBT8aIhTAMl!0Kw5SZsesiq^s17`8)etXM*^3t_Ve2J=UraqDMU2G&i> z4DnT;NjakCnvXRu*IH?c(`xMsQ13uSC5_HZe%e~d65_>N8XKH>L%de|OMlfZ!DVA^ zp{>Cib}Aj9$|Z`&dEfI>yGR zK9>v|x80^T9-Z5*qQKazo9-PA3xM?i!x4X^&1BUay8}%A+S=U#YE+VNaI~@8rY-}k zhjN%7yUm(+jHsn&J#lZKbN#bILS-;B$u`r++O2N_)Ju?2d2EKb3n`T>`W3ep-NEQY zh^cAN0*t`~V-2>cyTIxi^}Kf&S<<#KHnqdp>~3%?F$;{1z-6&F?H{Yv-s`WL-gEVX z+0xeT4NzktX^LX`bnh7SCG&+=e}ai77%kP`cO4$mai;{*K+7EDt1d>0fg)7D4n|XB z7J_W1vfA430@TQHVrDRvXl5;#F*xI3cMYtuQJYJ2@$q6Qh0`Y3)V5$WD{gDPglb?k z7+OZer-RWbxMiP$8+b4p7)}T~)NqO(+(cM|$$Hamrlp$WV1RlBGC!1uNzqT46wwx2 z_OXJncpgKA-@tI-!a@ckn(Aq54+W^BCkQ_k$C&M4Y)afCy^u^a>@(3d93HU3CTba> z{_08y4QJ53=V4S}oI%{IVf=xUMALco^e)H)qce&{=O-{KCKiGIlaXhfkai+PiyOyZ z^NYz^#!-LOXNs$8dZ^731%}1O;cHHtqNN@4S8qVTVdXV$?CO6YW>Dym1jb%*%0*Od z2jgMJIG3sBsiH6FfPnDRYMlr$;d|&40qSYw_@W$^hb=bK2<;YRi>C?G;MRJI&2kQ` zrM4coyd|cK`N_-2EvD|;t?vU&POa9-0Q0xgweXYvrqbHllL2bq87@cRgwF<(!^9LH z0(%$T2N8E(SWhqsZHl*XCa&u z!Pq#|fVFpki5bs=H)P5@<1nPwpC?Khu4RptEa&*L1rl~?_s1WG1KYG7h<$lC8?1qnctaFZCDrKE-qwDr4ualou~ zAwc~OygPE?94Bq2BHCKW+!lyA%co_1V^hz8;q1xPez(o!r8zDJsP8Ql>nP?C%f>M< zp)^-PRd+EuX?rmCjsan(`rvQu09YF%4+b`=TCGa~YTHG^9EfTxQZux*knM)70m_Mk zeI^*a28;_ts#tSjK15S{F!&J8mou3{sY06fYai=k5xe=gaG2LG*1|9QtIEgXM2>|C z>ql$t*5v?o9%S@n!=Efi!TfndP_0Wu*)m%CUL1bFM7YyGr-N~oE=+&7>;p66S$%~R zmrv|Nu!G-H*K~0i91X^hEW&44>OrtZ+3Xou3ov7$HFeZ(U3IF9KFN+SJTAEcM#nUw z$W%$YbuB<0@Tt%VcKFE03c_Jv%GTpx1xC+>r(l&WsNK3AU_HYucA?xX}>rHrbkrjZgyVm_ZxMjI@ zKS2F_v!V<))Mm3)wzzHyyqEb{LD-J5h?-Vww;lvony$nw>&uI|H!|+SA8*mZANpHn zL)uJ8m)%oMTea{f{^t2xwKTxlty%`4_BO5d({I$MZDK9KQ3Wg40kD3?n9?zdGTX%* zz%s+?Ys;Q>Ft^yLWjym&$Lw_Nr|EbAy=A8s{@maE=T0r{xxdR)MTFZ|WbUx^1qRgE<| z?rRZZxSPf}j)QT{HQqp|`FCeCjH*)(8)8#+u;xa|tSLV3%+kED0T=zoC1!Iyz(jND zJAJGmZHyWm;16IN5}y6>u4GSkHT2X0%*fMXCmLCzpmBId7N-)?giZWUSx_wRf!~S_ z5bwxa3YJsy2QblO)?}MnY_Drk9bzOz<}vxILy>IFF0`y?Hp_CbhDI`;p65@ z$Mv-QXsz}Mv1lVoF^LIa>=E@5a67^L!C;6Wo4LdHdYT7neT)%yax6fD4~0cQUA zq#o{xv0gr@rx8n?(ldaT-lwo~>yZUazUJ+x^zZ`6GM(1bfNJ<@(Et{1-a&!2&+bw= zqt`BovR%*UX+U+x8R5TJ!c%>$Afo5kXq#&K!8LO3Ud_RVq8T_WR^D_l+6W`Z38UTaagBQ?ZG(!6L!978(<+t_2e@&$Z~9ENSFfO8ktHdS*`?>XG791q(1Thjm+{@Z=ou^+jO`)Nut==}V?E3socUKUx-T3b&fMS^!7w(AGzN_NRrJLJq-D-EMF};YE>*scsWnn5Na5M?Wnc9m zQfv*&2PR+n)wO((H38%5kB}N_vxI{UH(LB1sewj2Eq;TZqD7=y87&?|s-dADUFM~$ zgxdUu7=3;%{khGW2u8;ekAtsP!}C5!j3cl4^$k6v9DLUAchM4p2#?;Pz(%8n2;Seo z-WLp37=9CfWuBdP^lz;3ANZ6kJ8$#fSc6;m#3(y&8CXs$`7*>z8c#~pc3=ZtCC$q+ z^o)v#F2`-Xb|q-K{I)nPU}iCUckj67i^1=msb{dvXPK_EXx24s@qfxiS2y04fcc|! zV+ppTfi=)08(|iaf>kH`s=jx{Jc&g*F`MzF(T`x=jM_Xrbh{^>bBg=Q&%tPC)PpD8 z2jgrDJ?my=KgfcAzYj+5#O)Y%sy$hHcok^<5>oCqXbnA$y00jMvs*g^*4AL&lWeNT z1B9@_a5hngfr%|5_Gcf{1HE<)H1<7&UMP}B_jbqDmG@zGnMpQt--mhz3RxCI>SJt7 zXOL=x;?U@|kLi(~RugSRK5|vUs%=>h=C5Vq@xg1P=yoFHy&t=F6%Km>SSREmxWJBq zajC%Rx1q@=?-Swj^1-ueQvW6~UI=O^!|4&>cv>>!G;A&SRG2NNz7>)tqPO8T>ohRd zHJ8n^;Hc+%8c_BA zOSmg03X>TL#$JsRtGW)1hIBXX2lKvgEm7WZmtkPC)gYVOk{60zr@pDVdKzMS3Jwda zaf*2f^ci#}EmA7o)}k7B6>W6+D4DsDE(;NjeK2NR9Z2vfi~r%-s1&2o%PiwyQv zz1@Tg=n6wl1oKBJs25~Yw}ABk!yypuxw*UAqmMQP6X8QsC4Y}2i*Z{1%~nA zEkdWfVjN;r)4+swS+9KDLGZ$Fh_C8l%~lL*wvbFbKTH5)72}Da`VAQ8*XYXZq3RjU z;LrnAldf2(_eXG^ETE?W)d2-f#uE!X!7XUAnO7IoYvY}P`B6bV9B64($fU&Sk)^TV zBh}B?P^%U;DN*|R030xo>S%OCKlu%e#)5({Ys(_SU!mY&na1e|o#bdV8WrRfp8wkcg6kARj7^ef)!m{!hj2;J#Vei1Q zq6g!aM_mfWWyP##S+TnP07^59TlIi)BJxF}lfbxSVl{!Q?g3+mxEsOytAh9=E;&6g zN_Q~2s)*&;U^)BKjtVB@%Z}{GHUo zVy-H#QmqhB8DYb#U_*@#c>`YAWIT!x>)e^Yv8q+X3_~-lbMwGB22t`VSa&c?9vrTI zRaange+vU^i9F+D4RtTr0MQ)`daxQIhfKV$tZq_<8+n|-kHEsf#Nntw4KXd~4{i%G z!_|o8H!$2D1n;OsN}1sX8=|Idcv4S9IJD{#Qe}% zvcRZ~aHPZaMLU9ZXkb!8U7A{tfN`bHb`Q0vw{Qz=95{gW18b^9PV%+RMT)k_DR~M?+zHVS&?N>_znXZX=TtkWT!q-xM&840(7Zu?I}7sLXo+Mm0peuFXUM8!MN(3{0#$ zoV}91q6bCC7uGg47L=Ka5kq^xgweTtmGcut;qM>#e{t zwifYb=%Zh4k5}=Kh)AM+?|{Xzv>rPZy|i)pE%Oe7jWP1lzd~NyT)t_wv=gm}c84e8 zRss_0D@J}bO|?QGoS8eG+FpcuwqdLeNT_zUMBM|)2zF>}PAxjPW*07F{RGTt-uS}% z>Il^e0WE@u{+I<@N3mmK^MK}i!PvEE$kIvp9!lcrLsKvj9;`P7j58qaw0{8OT#Ao* zn|Bti7-wpA0vP*452$w*jLWc?53erSA+pz|I>3C9=V9ow5{&yYUd;~1hZ|k=j4&L7 zigz`RFZkl8Gg9v&zkudF%_lEND-iMJ#MKl`7bHBs7(1V}Y&YSyIp>CckVrSd*9-1o z4Yf=>Tz-rc_d$2DGjtaUisdN=jLt6{CQUND3P))E1|}aoVNGb?1E$lxI^!6D6b&Vu z^9)!{3m!eiX-2fy2aGNbji=kJJHTk}9F5(2NzDxN^Z;XNV;Vg_1FHvSRul!_AB2l< z;(qBZ#weaX*6Smt1?MU}-UH#RAfDpz?IoCqE^ea_!NfTgyP2C`Uz4_OWOMbszG8N8 z*2W(`YzL#6@M;1dlYodr4yv0w^wZN~u(^EJPb^Q0an!yp86LhNoc;T|>_FR%0prBu zp&gv?2QVswKn${3OAQbm$$;TEF_6%Pa3PeQ55`lBSQt)&Q4>7V#ruOcf%1f-r_V+p zN(Oy~8iZY9T5jP9-$3C$Cfyq!3Gq*ojVRF5ZScH-dUyhca{*F5J9XD%lTc=mm>#T( z7{Dkn`YKfZ(8!|sL=fFZR%0;C0sio%!eBik5sm#YIC}xZYr{%IWMjrhrlui!+GuRj zTZiZwK=n3q8=wV@5c^V@p|0`riS!^aF%3M?rGiln3@X%SJuUNc)`^0{a(hr$u(~LX zk1Q~u$ubWE!gooR!Gu*gymG@`?eh5C7mVgXFL0JrFrghc+aqAq2YU%h77lVb8C&TJ zCh~Ylnh7R068gh|Y{o_6HJBKOHy$(Dg7vibV29*jQD6Ae4luDT(dROQ_3-ymrbOxN0X}2FWS64yGuHYgQY}RX%<%D{< zk*>9thI4?ieYg+|mkK6)jqY$7jLrt5;GsgPFiee>8RM&lBgLVMHTVlK8Vjp6rfiu* zcso8&+=b`h;bM`%bWXQf;>fhf1YdO@QeuUOMV(h*oG#UvSf5cs2P}(loft4KwIUWi z1LJ~+o-uj%M(N=bVa5&-uF0pHd;rD}7k4+cBE{|ji(y0`fYD9FxnMsS7q*;9yAMel zNW}itDoQviMh4qV1T*^9v)Us@!9;Ly1bw5$?Eu1PlFhOV3?D+^sp-#1aiKMi`{tT4 zdfF7|J2FP-1gpT2c7ZV*uykTRo`KZ|!#;&OwF9wYT`nhA%Z^?jQSY&qw2R{ z)Evt_+H{Y19SGC$m0h=ZJ!2~RJqKxjl))oP96P-d#N5EoFuHMItS`K7FIX!u@ujR= zqR>!mC9T0^PY9=}VDul>tl0sKvurVzgo$A60e+4B|00-J639v= zxk^&A-eAlVy=!3XUEF4#2V;L0-J4(6j}c6aq4(d|e96S!dnOn@YQ~lvk}Rx%*70Cz z3mCP+%wTMfz}Pzag1s7zb$K@Pri1lBp6Kf$m{@S=Wkuf;9&F60wKEu_CCAI0G9Nbs z>G-x$WQ%FM4MuktXM%F?i_ikY@whh_O)aK)4j7d)6fhruUr(EdDK0urIKNnT1Hl;1 z_zDoN^$A$c;I4v6ljAW<#qoF`p+(|_On;=rp2Agj0a$aifTuS2#`g?ZJ>$`MEvIly zm}U{4Z-eC+<1`qL`3MGlU{@xErysAuzUHnedWL55w>lx=-jHLEb&#-6I0J&|3K)%P zxQ4mZ1U=&;jI93zaod+qJcI?KEfAVm;eP}Zt1BI*&_vN1CK1o6`%ctrFGT%Wlf+rq zcs_5=J6TVowAB=G)HaqE%T}3Z$O=xE+_F(90BkK&uz>3SNam1el^{TcD&z&HgWE>3`P4HUPVMQ4ioVleH& z#CeRqIvb37;GhXZo&%%lVWbQn>#S_6Vi)W(OV3z>Znr@yP9S`w{t}GyAiDLM?W)11 z9g>N~e-#)$IvfoQR7o+(r&J> zKg==}FJQsA)QTE4=Ls#1=&+6hqvz*%+#X1T4&DcSO!M^G%VF>O^Yw6`8adx&JmJUf z^j({I+k8EP(#MdB7^l4(d?*Hv!NFyRgE4Hy%KRZ1XA^mFjH{A~m7<>J+7bA=Wh@wt zY3vW`J}@zBtY`g5gdUCzcuC$HOoS_)Z6%o4KaC#1*t@agS&J+Xdgko-T_CB4e2bpN z(tC97_re`28nzaL{p{ed22t$Dd8=b%%EDynORKj0uG*}@z7yIBCFsT=I zuI*qPfe4|;e=FH=rSKVy6)W{vFnWNo9$CMUc{!nAS(WW!aQ8l7oI*uUuW7PbJ_5y! z`ea|rX{7Ki0Msh|xllyJ#{e*TJw}hWEHggWYj4AIgD)X%u4O*+Roz!-#{oQ~2bkEF zxKz#p6H5*v&Ae~59=;v+RMupxf6K=TB6iNK&kZ6%gVA?VmV+b0?&{j?(7^3{OE9*a zPvX|KILJ6vIbU@(p_ukP)Ql3;Xr1Pa3D9GI~c=&?hPw?T|h zv=Rr#l14C?_iWJ9c0=h`kP3H$b*+9IMZY<2GZ7N%jUa`SZ3d&>XanDcTm>5_`bOj@ zZ88~OA;4em+T4zA!t;#@%~g+dmlrW~dxOcD#S*gyjLwZ2z#q$kaL5QKOjW(jt|9aM zHUf-!mE0F8)!1A=`J65o{5kkB<7Xazc)bbP-hBKJ zKg18O+~@|r06)xMXnd_968LQhj1Cqd%>t4!K4x0IBjUK}ULGUj7O(~`A{~1vkfKkeoJegxlbpy1{9N)kA^TsAd=^&kD}(=(lJX@AvZ1eJh1}=~`C*yQ|LYSkB17hT$=`$=;5p>8$OW_XoC{#g zxGF2=Mk;VkR`^xs=f)z)e*`(pJ(l@I@+XoLnS3VY&n5m{=mFDQ9oAg|n57`(D9S4EbqCd<76g=OB5VKhuR6{{{A_-~L7 zUl-+R=*F^MZluU2jRQxN+iERICiM!pZhyr_L0V0$8@QW4q15Nt43)rtokAbrN zvn(T#$qSOd37K_C<`dcf&p@{Ki
7zalx2{3?*5Uuh^NewP_HNpKNy2vjOz^lY#S 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 From caf75dc75e20cc72adcbd26e1ff372adc4fac74b Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 18 Dec 2024 11:10:46 +0100 Subject: [PATCH 70/87] chore(private-credential): delete logs and comments --- .../extension/src/background/handlers/web-provider.ts | 1 - apps/extension/src/sandbox/index.ts | 11 ----------- .../web-provider/src/mina-network/mina-provider.ts | 5 ----- packages/web-provider/src/utils/prompts.ts | 3 --- 4 files changed, 20 deletions(-) diff --git a/apps/extension/src/background/handlers/web-provider.ts b/apps/extension/src/background/handlers/web-provider.ts index 4de84cbc..e09407fb 100644 --- a/apps/extension/src/background/handlers/web-provider.ts +++ b/apps/extension/src/background/handlers/web-provider.ts @@ -158,7 +158,6 @@ export const minaSignFieldsWithPassphrase: Handler = async ({ data }) => { context: data.context, }) const response = await provider.request(payload) - console.log(`response in handler ${JSON.stringify(response)}`) return response } catch (error: unknown) { return { error: serializeError(error) } diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index fd02cf60..a3ac5074 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -178,17 +178,6 @@ window.addEventListener("message", async (event) => { // serialize presentation const serializedPresentation = Presentation.toJSON(presentation) - // // TODO: delete later, only used for testing verification - // const receivedPresentationDeserialized = Presentation.fromJSON( - // serializedPresentation, - // ) - - // const outputClaim = await Presentation.verify( - // deserialized, - // receivedPresentationDeserialized, - // { verifierIdentity: "http://localhost:5173" }, - // ) - const result: Result = { type: "presentation-result", result: serializedPresentation, diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 0eed4e2e..13b9f1ad 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -114,7 +114,6 @@ export const createMinaProvider = async (): Promise< removeListener: _emitter.off, emit: _emitter.emit, request: async (args) => { - console.log(`In request: ${JSON.stringify(args)}`) const typedArgs: ProviderRequestParams = args const { context } = typedArgs const { origin } = context as Record @@ -302,9 +301,6 @@ export const createMinaProvider = async (): Promise< .with( { method: "mina_signFieldsWithPassphrase" }, async ({ params }) => { - console.log( - `In mina_signFieldsWithPassphrase ${JSON.stringify(params)}`, - ) const [fieldsAndPassphrase] = params if ( !fieldsAndPassphrase || @@ -436,7 +432,6 @@ export const createMinaProvider = async (): Promise< credentialToStore = result.result } - // TODO: hash should be stored with the credential // Generate hash of the new credential const newCredentialHash = createCredentialHash(credential) diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 0f5eef6f..082e0fe6 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -53,9 +53,6 @@ export const showUserPrompt = async ({ } return reject(new Error("4001 - User Rejected Request")) } - console.log( - `in event handler - response: ${JSON.stringify(response)}`, - ) if (response.userInput.length > 0) { return resolve({ value: response.userInput, From 281dee59dde1196a71d8aed7f73794549fa300c3 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Wed, 18 Dec 2024 12:28:32 +0100 Subject: [PATCH 71/87] bump mina-credentials and o1js --- apps/extension/package.json | 4 ++-- bun.lockb | Bin 576024 -> 578408 bytes packages/contracts/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index eb60beee..c339b65c 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,10 +23,10 @@ "@palladco/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.2.5", + "mina-credentials": "^0.2.6", "mitt": "3.0.1", "next-themes": "0.3.0", - "o1js": "^2.1.0", + "o1js": "https://pkg.pr.new/o1-labs/o1js@996ebb3", "p-debounce": "4.0.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/bun.lockb b/bun.lockb index 18a4f950caa649a32cb4b0671176f87140f59e17..05d33ddd0f7c4960f0acfb58f7fccae5ecb3d4cc 100755 GIT binary patch delta 69851 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 delta 68147 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 Date: Fri, 20 Dec 2024 10:20:47 +0100 Subject: [PATCH 72/87] chore(private-credential): remove try-catch from sandbox --- apps/extension/src/sandbox/index.ts | 272 ++++++++++++++-------------- 1 file changed, 134 insertions(+), 138 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index a3ac5074..1d6297e9 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -50,151 +50,147 @@ let presentationSignaturePromise: { } | null = null window.addEventListener("message", async (event) => { - try { - const message = MessageSchema.parse(event.data) + const message = MessageSchema.parse(event.data) - if (message.type === "presentation-signature") { - if (presentationSignaturePromise) { - presentationSignaturePromise.resolve(message.signature) - presentationSignaturePromise = null - } - return + if (message.type === "presentation-signature") { + if (presentationSignaturePromise) { + presentationSignaturePromise.resolve(message.signature) + presentationSignaturePromise = null } + return + } - if (message.type === "presentation-signature-error") { - if (presentationSignaturePromise) { - presentationSignaturePromise.reject(new Error(message.error)) - presentationSignaturePromise = null - } - return + if (message.type === "presentation-signature-error") { + if (presentationSignaturePromise) { + presentationSignaturePromise.reject(new Error(message.error)) + presentationSignaturePromise = null } + return + } - return match(message) - .with({ type: "run" }, async (msg) => { - return match(msg.contract) - .with("validate-credential", async () => { - try { - const sanitizedPayload = msg.payload - const originalPayload = recoverOriginalPayload(sanitizedPayload) - const credentialDeserialized = - await Credential.fromJSON(originalPayload) - - await Credential.validate(credentialDeserialized) - - const result: Result = { - type: "validate-credential-result", - result: Credential.toJSON(credentialDeserialized), - } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: Result = { - type: "validate-credential-result", - error: serializeError(error), - } - window.parent.postMessage(result, "*") + return match(message) + .with({ type: "run" }, async (msg) => { + return match(msg.contract) + .with("validate-credential", async () => { + try { + const sanitizedPayload = msg.payload + const originalPayload = recoverOriginalPayload(sanitizedPayload) + const credentialDeserialized = + await Credential.fromJSON(originalPayload) + + await Credential.validate(credentialDeserialized) + + const result: Result = { + type: "validate-credential-result", + result: Credential.toJSON(credentialDeserialized), } - }) - .with("presentation", async () => { - try { - // get back original payload - const originalPayload = recoverOriginalPayload(msg.payload) - - // parse payload as PresentationRequestPayload - const parsedPayload = JSON.parse( - originalPayload, - ) as PresentationRequestPayload - - const { - presentationRequest, - selectedCredentials, - verifierIdentity, - } = parsedPayload - - const stringifiedPresentationRequest = - JSON.stringify(presentationRequest) - - // create mina-credentials StoredCredential[] from selectedCredentials - const storedCredentials = [] - for (const credential of selectedCredentials) { - const stored = await Credential.fromJSON( - JSON.stringify(credential), - ) - storedCredentials.push(stored) - } - - // parse presentation request - const parsedPresentationRequest = JSON.parse( - stringifiedPresentationRequest, - ) as PresentationRequest - - const requestType = parsedPresentationRequest.type - - // deserialize presentation request - const deserialized = PresentationRequest.fromJSON( - requestType, - stringifiedPresentationRequest, - ) - - // compile - const compiled = await Presentation.compile(deserialized) - - // format verifierIdentity - const verifierIdentityString = - requestType === "zk-app" - ? JSON.stringify(verifierIdentity) - : (verifierIdentity as string) - - // prepare presentation request and get fields to sign - const prepared = await Presentation.prepare({ - request: compiled, - credentials: storedCredentials, - context: { verifierIdentity: verifierIdentityString }, - }) - - // ask wallet to sign fields - window.parent.postMessage( - { - type: "presentation-signing-request", - fields: prepared.messageFields, - }, - "*", - ) - - // get signature from wallet - const signature = (await new Promise((resolve, reject) => { - presentationSignaturePromise = { resolve, reject } - })) as string - - // get o1js Signature type signature - const ownerSignature = Signature.fromBase58(signature) - - // finalize presentation - const presentation = await Presentation.finalize( - compiled, - ownerSignature, - prepared, + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: Result = { + type: "validate-credential-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") + } + }) + .with("presentation", async () => { + try { + // get back original payload + const originalPayload = recoverOriginalPayload(msg.payload) + + // parse payload as PresentationRequestPayload + const parsedPayload = JSON.parse( + originalPayload, + ) as PresentationRequestPayload + + const { + presentationRequest, + selectedCredentials, + verifierIdentity, + } = parsedPayload + + const stringifiedPresentationRequest = + JSON.stringify(presentationRequest) + + // create mina-credentials StoredCredential[] from selectedCredentials + const storedCredentials = [] + for (const credential of selectedCredentials) { + const stored = await Credential.fromJSON( + JSON.stringify(credential), ) + storedCredentials.push(stored) + } - // serialize presentation - const serializedPresentation = Presentation.toJSON(presentation) - - const result: Result = { - type: "presentation-result", - result: serializedPresentation, - } - window.parent.postMessage(result, "*") - } catch (error: any) { - const result: Result = { - type: "presentation-result", - error: serializeError(error), - } - window.parent.postMessage(result, "*") + // parse presentation request + const parsedPresentationRequest = JSON.parse( + stringifiedPresentationRequest, + ) as PresentationRequest + + const requestType = parsedPresentationRequest.type + + // deserialize presentation request + const deserialized = PresentationRequest.fromJSON( + requestType, + stringifiedPresentationRequest, + ) + + // compile + const compiled = await Presentation.compile(deserialized) + + // format verifierIdentity + const verifierIdentityString = + requestType === "zk-app" + ? JSON.stringify(verifierIdentity) + : (verifierIdentity as string) + + // prepare presentation request and get fields to sign + const prepared = await Presentation.prepare({ + request: compiled, + credentials: storedCredentials, + context: { verifierIdentity: verifierIdentityString }, + }) + + // ask wallet to sign fields + window.parent.postMessage( + { + type: "presentation-signing-request", + fields: prepared.messageFields, + }, + "*", + ) + + // get signature from wallet + const signature = (await new Promise((resolve, reject) => { + presentationSignaturePromise = { resolve, reject } + })) as string + + // get o1js Signature type signature + const ownerSignature = Signature.fromBase58(signature) + + // finalize presentation + const presentation = await Presentation.finalize( + compiled, + ownerSignature, + prepared, + ) + + // serialize presentation + const serializedPresentation = Presentation.toJSON(presentation) + + const result: Result = { + type: "presentation-result", + result: serializedPresentation, } - }) - .exhaustive() - }) - .exhaustive() - } catch (error: any) { - throw Error(`Sandbox Error: ${error}`) - } + window.parent.postMessage(result, "*") + } catch (error: any) { + const result: Result = { + type: "presentation-result", + error: serializeError(error), + } + window.parent.postMessage(result, "*") + } + }) + .exhaustive() + }) + .exhaustive() }) From f43ff99a68cb490fc04c40e83db2674f5ca79dd9 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 10:41:40 +0100 Subject: [PATCH 73/87] chore(private-credential): remove unnecessary parse --- apps/extension/src/sandbox/index.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 1d6297e9..62b46ebb 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -28,7 +28,7 @@ type Result = { } type PresentationRequestPayload = { - presentationRequest: string + presentationRequest: PresentationRequest selectedCredentials: string[] verifierIdentity: | string @@ -121,16 +121,9 @@ window.addEventListener("message", async (event) => { storedCredentials.push(stored) } - // parse presentation request - const parsedPresentationRequest = JSON.parse( - stringifiedPresentationRequest, - ) as PresentationRequest - - const requestType = parsedPresentationRequest.type - // deserialize presentation request const deserialized = PresentationRequest.fromJSON( - requestType, + presentationRequest.type, stringifiedPresentationRequest, ) @@ -139,7 +132,7 @@ window.addEventListener("message", async (event) => { // format verifierIdentity const verifierIdentityString = - requestType === "zk-app" + presentationRequest.type === "zk-app" ? JSON.stringify(verifierIdentity) : (verifierIdentity as string) From 5f5f95c643c2f2196db3c306d93a5e597d25c933 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 10:46:21 +0100 Subject: [PATCH 74/87] chore(private-credential): remove compile --- apps/extension/src/sandbox/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 62b46ebb..734eb54b 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -127,18 +127,17 @@ window.addEventListener("message", async (event) => { stringifiedPresentationRequest, ) - // compile - const compiled = await Presentation.compile(deserialized) - // format verifierIdentity const verifierIdentityString = presentationRequest.type === "zk-app" ? JSON.stringify(verifierIdentity) : (verifierIdentity as string) + // TODO: cache compiled presentation request? + // prepare presentation request and get fields to sign const prepared = await Presentation.prepare({ - request: compiled, + request: deserialized, credentials: storedCredentials, context: { verifierIdentity: verifierIdentityString }, }) @@ -162,7 +161,7 @@ window.addEventListener("message", async (event) => { // finalize presentation const presentation = await Presentation.finalize( - compiled, + deserialized, ownerSignature, prepared, ) From 7240fc7ef474e3949b1f74e69d340977f69f2207 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 10:50:47 +0100 Subject: [PATCH 75/87] typo --- packages/web-provider/src/mina-network/mina-provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index 13b9f1ad..df536675 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -262,11 +262,11 @@ export const createMinaProvider = async (): Promise< return item }, ) - const seriliasedResponse = { + const serializedResponse = { ...signedResponse, data: serializedResponseData, } - return seriliasedResponse + return serializedResponse }) .with({ method: "mina_createNullifier" }, async ({ params }) => { const [message] = params From 3920cdfbd21a477daf707b36c19739c2ee6a0369 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 10:51:51 +0100 Subject: [PATCH 76/87] chore(private-credential): prompt title --- packages/web-provider/src/mina-network/mina-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-provider/src/mina-network/mina-provider.ts b/packages/web-provider/src/mina-network/mina-provider.ts index df536675..e52ac182 100644 --- a/packages/web-provider/src/mina-network/mina-provider.ts +++ b/packages/web-provider/src/mina-network/mina-provider.ts @@ -392,7 +392,7 @@ export const createMinaProvider = async (): Promise< const { value: userConfirmed } = await showUserPrompt({ inputType: "confirmation", metadata: { - title: "Store private credential request", + title: "Store Private Credential", payload: stringifiedCredential, }, }) From 20c8dcbe0c08b550dbf79267f2acffb6687c8beb Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 10:56:57 +0100 Subject: [PATCH 77/87] chore(private-credential): better error msg in selection form --- .../src/web-connector/components/credential-selection-form.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index 6f2b0d5b..df957d9f 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -248,7 +248,8 @@ export const SelectionForm = ({ requirements: credentialRequirements, } } catch (error: any) { - throw Error(`Issue with parsing: ${error}: ${payload}`) + error.message = `Issue with parsing: ${error.message}: ${payload}` + throw error } }, [payload]) From abc9b9874ee7f8fc5913e203241571c5ebace2ed Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 11:06:24 +0100 Subject: [PATCH 78/87] chore(private-credential): expect payload with presentation in selection form --- .../components/credential-selection-form.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/features/src/web-connector/components/credential-selection-form.tsx b/packages/features/src/web-connector/components/credential-selection-form.tsx index df957d9f..aa2704a4 100644 --- a/packages/features/src/web-connector/components/credential-selection-form.tsx +++ b/packages/features/src/web-connector/components/credential-selection-form.tsx @@ -218,17 +218,17 @@ export const SelectionForm = ({ const originalPayload = recoverOriginalPayload(payload) const parsedPayload = JSON.parse(originalPayload) - const credentialRequirements = isPayloadWithPresentation(parsedPayload) - ? getCredentialRequirements(parsedPayload.presentationRequest) - : [] + if (!isPayloadWithPresentation(parsedPayload)) { + throw new Error( + "Invalid payload format: Expected PayloadWithPresentation", + ) + } - const storedCredentials = Array.isArray(parsedPayload) - ? parsedPayload - : isPayloadWithPresentation(parsedPayload) - ? parsedPayload.storedCredentials - : [] + const credentialRequirements = getCredentialRequirements( + parsedPayload.presentationRequest, + ) - const validCredentials = storedCredentials + const validCredentials = parsedPayload.storedCredentials .filter( (credential: any) => findMatchingRequirements(credential, credentialRequirements) From 1e7580025500a50ceb1a7e0bd9606dcbf80d36af Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 11:25:06 +0100 Subject: [PATCH 79/87] chore(private-credential): remove sanitizePayload for sandbox --- apps/extension/src/sandbox/index.ts | 16 ++++------------ .../src/web-connector/routes/web-connector.tsx | 5 ++++- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/apps/extension/src/sandbox/index.ts b/apps/extension/src/sandbox/index.ts index 734eb54b..9071f963 100644 --- a/apps/extension/src/sandbox/index.ts +++ b/apps/extension/src/sandbox/index.ts @@ -2,7 +2,6 @@ import { Credential, Presentation, PresentationRequest } from "mina-credentials" import { Signature } from "o1js" import { serializeError } from "serialize-error" import { match } from "ts-pattern" -import yaml from "yaml" import { z } from "zod" const MessageSchema = z.discriminatedUnion("type", [ @@ -39,11 +38,6 @@ type PresentationRequestPayload = { } } -const recoverOriginalPayload = (sanitizedPayload: string) => { - const parsedYaml = yaml.parse(sanitizedPayload) - return JSON.stringify(parsedYaml) -} - let presentationSignaturePromise: { resolve: (value: any) => void reject: (reason: any) => void @@ -73,10 +67,8 @@ window.addEventListener("message", async (event) => { return match(msg.contract) .with("validate-credential", async () => { try { - const sanitizedPayload = msg.payload - const originalPayload = recoverOriginalPayload(sanitizedPayload) - const credentialDeserialized = - await Credential.fromJSON(originalPayload) + const payload = msg.payload + const credentialDeserialized = await Credential.fromJSON(payload) await Credential.validate(credentialDeserialized) @@ -96,11 +88,11 @@ window.addEventListener("message", async (event) => { .with("presentation", async () => { try { // get back original payload - const originalPayload = recoverOriginalPayload(msg.payload) + const payload = msg.payload // parse payload as PresentationRequestPayload const parsedPayload = JSON.parse( - originalPayload, + payload, ) as PresentationRequestPayload const { diff --git a/packages/features/src/web-connector/routes/web-connector.tsx b/packages/features/src/web-connector/routes/web-connector.tsx index e65d412c..db64c40b 100644 --- a/packages/features/src/web-connector/routes/web-connector.tsx +++ b/packages/features/src/web-connector/routes/web-connector.tsx @@ -215,12 +215,15 @@ export const WebConnectorRoute = () => { }, [request.inputType]) useEffect(() => { runtime.onMessage.addListener(async (message) => { + const payload = message.params.contract + ? message.params.payload + : await sanitizePayload(message.params.payload) if (message.type === "action_request") { setRequest({ title: message.params.title, submitButtonLabel: message.params.submitButtonLabel, rejectButtonLabel: message.params.rejectButtonLabel, - payload: await sanitizePayload(message.params.payload), + payload: payload, contract: message.params.contract, inputType: message.params.inputType, emitConnected: message.params.emitConnected, From 21e89803179196d52050a62fedf0c8a7f52ec278 Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 14:12:22 +0100 Subject: [PATCH 80/87] chore(private-credential): change error to any --- packages/web-provider/src/utils/prompts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-provider/src/utils/prompts.ts b/packages/web-provider/src/utils/prompts.ts index 082e0fe6..0e23458a 100644 --- a/packages/web-provider/src/utils/prompts.ts +++ b/packages/web-provider/src/utils/prompts.ts @@ -9,7 +9,7 @@ type Metadata = { type ContractResult = { type?: string result?: string - error?: string + error?: any } type PromptResult = { From 37e0a9b0bd95fa55e58a764b035113fe0540ea1f Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 14:35:52 +0100 Subject: [PATCH 81/87] chore(private-credential): sanitize error in render-payload --- .../web-connector/utils/render-payload.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/features/src/web-connector/utils/render-payload.tsx b/packages/features/src/web-connector/utils/render-payload.tsx index 3720990f..d0621cce 100644 --- a/packages/features/src/web-connector/utils/render-payload.tsx +++ b/packages/features/src/web-connector/utils/render-payload.tsx @@ -1,5 +1,16 @@ +import xss from "xss" import { recoverOriginalPayload } from "../components/credential-selection-form" +const handleRenderError = (error: Error) => { + const sanitizedError = xss(error.message) + + return ( +
+      {`Error: ${sanitizedError}`}
+    
+ ) +} + type LogicNode = { type: string inputs?: LogicNode[] @@ -312,8 +323,14 @@ export const renderPayload = (payload: string) => { // Default fallback return
{payload}
} catch (error) { + if (error instanceof Error) { + return handleRenderError(error) + } + // This case should never occur given the error sources return ( -
{`Error: ${error}`}
+
+        Error: Unexpected render error
+      
) } } From 87f34ea9fe0ea25a7952c1c7fa84a648eeb3871f Mon Sep 17 00:00:00 2001 From: Marton Moro Date: Fri, 20 Dec 2024 18:27:33 +0100 Subject: [PATCH 82/87] chore(private-credential): add arithmetic nodes to formatLogicNode --- apps/extension/package.json | 4 +-- bun.lockb | Bin 578408 -> 579400 bytes packages/contracts/package.json | 2 +- .../web-connector/utils/render-payload.tsx | 24 ++++++++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/apps/extension/package.json b/apps/extension/package.json index c339b65c..6f815613 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -23,10 +23,10 @@ "@palladco/web-provider": "workspace:*", "@plasmohq/messaging": "0.6.2", "buffer": "6.0.3", - "mina-credentials": "^0.2.6", + "mina-credentials": "^0.2.7", "mitt": "3.0.1", "next-themes": "0.3.0", - "o1js": "https://pkg.pr.new/o1-labs/o1js@996ebb3", + "o1js": "2.2.0", "p-debounce": "4.0.0", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/bun.lockb b/bun.lockb index 05d33ddd0f7c4960f0acfb58f7fccae5ecb3d4cc..af2a3e0d853ecce7136126cf6da9a3a402cdcd62 100755 GIT binary patch delta 66911 zcmeFad7Mw>|Nno^%)EFV`;brxMV9Q_YZ#0rGNDk~$qa+B4KpK4%M21js_CRdn^a0W zNkfuUvZb0zQK=NARg|Ljdw-nkdJXUIuiN|c`Tc(X_PTj`T#v_foojtw%Q>%Q4nA`B z)~CT;74Fs$5yp__h9zjZ3=szUp4ZweLqAy`C+; ztX{&{WviyGDBs}50ghA8aSHRn3g9TP3OFVsFK6mR$64$5h{oLO{OQr0f}s~XPF3Qv zCgx}7XJ_SYNN}7=@U@p1{Yg;VxA^K1$2k>#2fuJ^Rh>0PaKuwJc?co9=~uA7pNkWGV;e{ z(cmS-t5G+CszAf54UW&5GD-0ZY