@oratis/lisa 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +20 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/autonomy/state.d.ts +14 -0
  6. package/dist/autonomy/state.d.ts.map +1 -0
  7. package/dist/autonomy/state.js +54 -0
  8. package/dist/autonomy/state.js.map +1 -0
  9. package/dist/cli/mail.d.ts +2 -0
  10. package/dist/cli/mail.d.ts.map +1 -0
  11. package/dist/cli/mail.js +209 -0
  12. package/dist/cli/mail.js.map +1 -0
  13. package/dist/cli/pair.d.ts +1 -5
  14. package/dist/cli/pair.d.ts.map +1 -1
  15. package/dist/cli/pair.js +58 -20
  16. package/dist/cli/pair.js.map +1 -1
  17. package/dist/cli.js +15 -14
  18. package/dist/cli.js.map +1 -1
  19. package/dist/consent/store.d.ts +2 -2
  20. package/dist/consent/store.d.ts.map +1 -1
  21. package/dist/consent/store.js +3 -2
  22. package/dist/consent/store.js.map +1 -1
  23. package/dist/edition.d.ts +24 -0
  24. package/dist/edition.d.ts.map +1 -0
  25. package/dist/edition.js +19 -0
  26. package/dist/edition.js.map +1 -0
  27. package/dist/heartbeat/runner.d.ts.map +1 -1
  28. package/dist/heartbeat/runner.js +8 -0
  29. package/dist/heartbeat/runner.js.map +1 -1
  30. package/dist/idle/runner.d.ts.map +1 -1
  31. package/dist/idle/runner.js +7 -0
  32. package/dist/idle/runner.js.map +1 -1
  33. package/dist/mail/accounts.d.ts +20 -0
  34. package/dist/mail/accounts.d.ts.map +1 -0
  35. package/dist/mail/accounts.js +113 -0
  36. package/dist/mail/accounts.js.map +1 -0
  37. package/dist/mail/alerts.d.ts +29 -0
  38. package/dist/mail/alerts.d.ts.map +1 -0
  39. package/dist/mail/alerts.js +40 -0
  40. package/dist/mail/alerts.js.map +1 -0
  41. package/dist/mail/classify.d.ts +26 -0
  42. package/dist/mail/classify.d.ts.map +1 -0
  43. package/dist/mail/classify.js +191 -0
  44. package/dist/mail/classify.js.map +1 -0
  45. package/dist/mail/connectors/gmail.d.ts +55 -0
  46. package/dist/mail/connectors/gmail.d.ts.map +1 -0
  47. package/dist/mail/connectors/gmail.js +87 -0
  48. package/dist/mail/connectors/gmail.js.map +1 -0
  49. package/dist/mail/connectors/imap.d.ts +13 -0
  50. package/dist/mail/connectors/imap.d.ts.map +1 -0
  51. package/dist/mail/connectors/imap.js +136 -0
  52. package/dist/mail/connectors/imap.js.map +1 -0
  53. package/dist/mail/digest.d.ts +21 -0
  54. package/dist/mail/digest.d.ts.map +1 -0
  55. package/dist/mail/digest.js +89 -0
  56. package/dist/mail/digest.js.map +1 -0
  57. package/dist/mail/google-oauth.d.ts +50 -0
  58. package/dist/mail/google-oauth.d.ts.map +1 -0
  59. package/dist/mail/google-oauth.js +74 -0
  60. package/dist/mail/google-oauth.js.map +1 -0
  61. package/dist/mail/hosts.d.ts +3 -0
  62. package/dist/mail/hosts.d.ts.map +1 -0
  63. package/dist/mail/hosts.js +19 -0
  64. package/dist/mail/hosts.js.map +1 -0
  65. package/dist/mail/scheduler.d.ts +9 -0
  66. package/dist/mail/scheduler.d.ts.map +1 -0
  67. package/dist/mail/scheduler.js +21 -0
  68. package/dist/mail/scheduler.js.map +1 -0
  69. package/dist/mail/service.d.ts +32 -0
  70. package/dist/mail/service.d.ts.map +1 -0
  71. package/dist/mail/service.js +129 -0
  72. package/dist/mail/service.js.map +1 -0
  73. package/dist/mail/store.d.ts +7 -0
  74. package/dist/mail/store.d.ts.map +1 -0
  75. package/dist/mail/store.js +58 -0
  76. package/dist/mail/store.js.map +1 -0
  77. package/dist/mail/types.d.ts +114 -0
  78. package/dist/mail/types.d.ts.map +1 -0
  79. package/dist/mail/types.js +26 -0
  80. package/dist/mail/types.js.map +1 -0
  81. package/dist/providers/anthropic.d.ts.map +1 -1
  82. package/dist/providers/anthropic.js +43 -21
  83. package/dist/providers/anthropic.js.map +1 -1
  84. package/dist/providers/gemini.d.ts.map +1 -1
  85. package/dist/providers/gemini.js +67 -64
  86. package/dist/providers/gemini.js.map +1 -1
  87. package/dist/providers/openai.d.ts.map +1 -1
  88. package/dist/providers/openai.js +77 -71
  89. package/dist/providers/openai.js.map +1 -1
  90. package/dist/providers/registry.d.ts +10 -0
  91. package/dist/providers/registry.d.ts.map +1 -1
  92. package/dist/providers/registry.js +26 -0
  93. package/dist/providers/registry.js.map +1 -1
  94. package/dist/providers/stream-retry.d.ts +37 -0
  95. package/dist/providers/stream-retry.d.ts.map +1 -0
  96. package/dist/providers/stream-retry.js +92 -0
  97. package/dist/providers/stream-retry.js.map +1 -0
  98. package/dist/providers/types.d.ts +3 -0
  99. package/dist/providers/types.d.ts.map +1 -1
  100. package/dist/subagent.d.ts +2 -0
  101. package/dist/subagent.d.ts.map +1 -1
  102. package/dist/subagent.js +1 -0
  103. package/dist/subagent.js.map +1 -1
  104. package/dist/web/cloudAuth.d.ts +57 -0
  105. package/dist/web/cloudAuth.d.ts.map +1 -0
  106. package/dist/web/cloudAuth.js +139 -0
  107. package/dist/web/cloudAuth.js.map +1 -0
  108. package/dist/web/island.d.ts.map +1 -1
  109. package/dist/web/island.js +1 -0
  110. package/dist/web/island.js.map +1 -1
  111. package/dist/web/lisa-client.d.ts +1 -1
  112. package/dist/web/lisa-client.d.ts.map +1 -1
  113. package/dist/web/lisa-client.js +703 -40
  114. package/dist/web/lisa-client.js.map +1 -1
  115. package/dist/web/lisa-css.d.ts +1 -1
  116. package/dist/web/lisa-css.d.ts.map +1 -1
  117. package/dist/web/lisa-css.js +568 -43
  118. package/dist/web/lisa-css.js.map +1 -1
  119. package/dist/web/lisa-html.d.ts +1 -1
  120. package/dist/web/lisa-html.d.ts.map +1 -1
  121. package/dist/web/lisa-html.js +71 -21
  122. package/dist/web/lisa-html.js.map +1 -1
  123. package/dist/web/pairing.d.ts +37 -0
  124. package/dist/web/pairing.d.ts.map +1 -0
  125. package/dist/web/pairing.js +79 -0
  126. package/dist/web/pairing.js.map +1 -0
  127. package/dist/web/push.d.ts +12 -1
  128. package/dist/web/push.d.ts.map +1 -1
  129. package/dist/web/push.js +19 -4
  130. package/dist/web/push.js.map +1 -1
  131. package/dist/web/qr-svg.d.ts +11 -0
  132. package/dist/web/qr-svg.d.ts.map +1 -0
  133. package/dist/web/qr-svg.js +41 -0
  134. package/dist/web/qr-svg.js.map +1 -0
  135. package/dist/web/server.d.ts +1 -1
  136. package/dist/web/server.d.ts.map +1 -1
  137. package/dist/web/server.js +342 -12
  138. package/dist/web/server.js.map +1 -1
  139. package/package.json +2 -1
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Sign in with Apple — identity-token verification for the hosted LISA Cloud
3
+ * edition (docs/PLAN_CLOUD_v1.0.md §"Auth + account lifecycle", milestone M4 of
4
+ * docs/PLAN_IOS_ONBOARDING_v1.0.md).
5
+ *
6
+ * The iOS app runs the native Sign in with Apple flow and POSTs the resulting
7
+ * **identity token** (a JWT signed by Apple) to `POST /api/auth/apple`. We verify
8
+ * it here against Apple's published public keys and, on success, hand back the
9
+ * cloud session token so the phone can authenticate like any other client.
10
+ *
11
+ * Scope is deliberately single-tenant (matches the deployed M0/C2 demo: one
12
+ * shared soul behind one `LISA_WEB_TOKEN`). Verifying Apple's signature lets a
13
+ * reviewer — or any operator-approved Apple ID — sign in instead of pasting the
14
+ * token, which is the App Store reviewability unlock. Per-`uid` isolation +
15
+ * Firebase + account deletion stay deferred C3 work; this module does NOT mint
16
+ * per-user state.
17
+ *
18
+ * No external dependencies: Apple uses RS256, which Node verifies natively from
19
+ * a JWK via `node:crypto`. The verifier is pure (JWKS fetch + clock injected) so
20
+ * it unit-tests offline — see cloudAuth.test.ts.
21
+ */
22
+ import crypto from "node:crypto";
23
+ export class AppleAuthError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = "AppleAuthError";
27
+ }
28
+ }
29
+ const APPLE_ISSUER = "https://appleid.apple.com";
30
+ const APPLE_KEYS_URL = "https://appleid.apple.com/auth/keys";
31
+ function b64urlToBuffer(s) {
32
+ return Buffer.from(s, "base64url");
33
+ }
34
+ function decodeJson(segment) {
35
+ try {
36
+ return JSON.parse(b64urlToBuffer(segment).toString("utf8"));
37
+ }
38
+ catch {
39
+ throw new AppleAuthError("malformed token segment");
40
+ }
41
+ }
42
+ /**
43
+ * Verify an Apple identity-token JWT. Throws `AppleAuthError` on any failure
44
+ * (bad signature, wrong issuer/audience, expired). Returns the identity on success.
45
+ */
46
+ export async function verifyAppleIdentityToken(idToken, opts) {
47
+ const now = opts.now ?? Date.now;
48
+ const tolerance = opts.clockToleranceSec ?? 60;
49
+ const parts = idToken.split(".");
50
+ if (parts.length !== 3)
51
+ throw new AppleAuthError("not a JWT");
52
+ const headerB64 = parts[0];
53
+ const payloadB64 = parts[1];
54
+ const sigB64 = parts[2];
55
+ const header = decodeJson(headerB64);
56
+ if (header.alg !== "RS256")
57
+ throw new AppleAuthError(`unexpected alg ${String(header.alg)}`);
58
+ const kid = typeof header.kid === "string" ? header.kid : null;
59
+ if (!kid)
60
+ throw new AppleAuthError("missing key id");
61
+ const keys = await opts.fetchKeys();
62
+ const jwk = keys.find((k) => k.kid === kid && k.kty === "RSA");
63
+ if (!jwk)
64
+ throw new AppleAuthError("no matching Apple signing key");
65
+ // RS256 = RSASSA-PKCS1-v1_5 over SHA-256. Node imports the JWK directly.
66
+ const pubKey = crypto.createPublicKey({ key: jwk, format: "jwk" });
67
+ const signingInput = Buffer.from(`${headerB64}.${payloadB64}`, "utf8");
68
+ const ok = crypto.verify("RSA-SHA256", signingInput, pubKey, b64urlToBuffer(sigB64));
69
+ if (!ok)
70
+ throw new AppleAuthError("bad signature");
71
+ const claims = decodeJson(payloadB64);
72
+ if (claims.iss !== APPLE_ISSUER)
73
+ throw new AppleAuthError("wrong issuer");
74
+ // `aud` may be a string or array.
75
+ const aud = claims.aud;
76
+ const audOk = Array.isArray(aud) ? aud.includes(opts.audience) : aud === opts.audience;
77
+ if (!audOk)
78
+ throw new AppleAuthError("wrong audience");
79
+ const nowSec = Math.floor(now() / 1000);
80
+ const exp = typeof claims.exp === "number" ? claims.exp : 0;
81
+ if (exp + tolerance < nowSec)
82
+ throw new AppleAuthError("token expired");
83
+ const iat = typeof claims.iat === "number" ? claims.iat : 0;
84
+ if (iat - tolerance > nowSec)
85
+ throw new AppleAuthError("token not yet valid");
86
+ const sub = typeof claims.sub === "string" ? claims.sub : "";
87
+ if (!sub)
88
+ throw new AppleAuthError("missing subject");
89
+ const email = typeof claims.email === "string" ? claims.email : undefined;
90
+ const emailVerified = claims.email_verified === true || claims.email_verified === "true" ? true
91
+ : claims.email_verified === false || claims.email_verified === "false" ? false
92
+ : undefined;
93
+ return { sub, email, emailVerified };
94
+ }
95
+ // ── Apple JWKS fetch (cached) ───────────────────────────────────────────────
96
+ let keyCache = null;
97
+ const KEY_TTL_MS = 60 * 60 * 1000; // Apple rotates infrequently; an hour is safe.
98
+ /** Fetch Apple's signing keys, cached for an hour. The default `fetchKeys`. */
99
+ export async function fetchAppleKeys(now = Date.now) {
100
+ if (keyCache && now() - keyCache.at < KEY_TTL_MS)
101
+ return keyCache.keys;
102
+ const res = await fetch(APPLE_KEYS_URL);
103
+ if (!res.ok)
104
+ throw new AppleAuthError(`Apple JWKS fetch failed (${res.status})`);
105
+ const body = (await res.json());
106
+ const keys = Array.isArray(body.keys) ? body.keys : [];
107
+ if (keys.length === 0)
108
+ throw new AppleAuthError("Apple JWKS empty");
109
+ keyCache = { keys, at: now() };
110
+ return keys;
111
+ }
112
+ function truthy(v) {
113
+ if (!v)
114
+ return false;
115
+ const s = v.trim().toLowerCase();
116
+ return s === "1" || s === "true" || s === "yes" || s === "on";
117
+ }
118
+ /**
119
+ * Read the Sign in with Apple config from the environment. Default-OFF: with
120
+ * `LISA_CLOUD_APPLE_SIGNIN` unset the endpoint reports disabled and never hands
121
+ * back the session token. `LISA_CLOUD_APPLE_AUD` overrides the expected bundle id
122
+ * (default `ai.meetlisa.main`); `LISA_CLOUD_APPLE_SUBS` is a comma-separated
123
+ * allowlist (set it to the reviewer's `sub` to restrict the shared demo).
124
+ */
125
+ export function appleSignInConfig(env = process.env) {
126
+ return {
127
+ enabled: truthy(env.LISA_CLOUD_APPLE_SIGNIN),
128
+ audience: env.LISA_CLOUD_APPLE_AUD?.trim() || "ai.meetlisa.main",
129
+ allowedSubs: (env.LISA_CLOUD_APPLE_SUBS ?? "")
130
+ .split(",")
131
+ .map((s) => s.trim())
132
+ .filter(Boolean),
133
+ };
134
+ }
135
+ /** True when `sub` is permitted by the (possibly empty) allowlist. */
136
+ export function subAllowed(sub, cfg) {
137
+ return cfg.allowedSubs.length === 0 || cfg.allowedSubs.includes(sub);
138
+ }
139
+ //# sourceMappingURL=cloudAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudAuth.js","sourceRoot":"","sources":["../../src/web/cloudAuth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"island.d.ts","sourceRoot":"","sources":["../../src/web/island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,eAAO,MAAM,WAAW,QAs6CvB,CAAC"}
1
+ {"version":3,"file":"island.d.ts","sourceRoot":"","sources":["../../src/web/island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,eAAO,MAAM,WAAW,QAu6CvB,CAAC"}
@@ -32,6 +32,7 @@ export const ISLAND_HTML = `<!doctype html>
32
32
  --accent-warm: #ffd066;
33
33
  --accent-dream: #b487ff;
34
34
  --accent-claude: #ff8c42;
35
+ --accent-proactive: #3ddc97;
35
36
  --border: rgba(255, 255, 255, 0.08);
36
37
  /* 1px top inner highlight that reads as a glass bevel */
37
38
  --hairline: rgba(255, 255, 255, 0.12);
@@ -1 +1 @@
1
- {"version":3,"file":"island.js","sourceRoot":"","sources":["../../src/web/island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExG,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0jBvB,iBAAiB;IACjB,mBAAmB;IACnB,WAAW;IACX,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAy2BjB,CAAC"}
1
+ {"version":3,"file":"island.js","sourceRoot":"","sources":["../../src/web/island.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExG,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2jBvB,iBAAiB;IACjB,mBAAmB;IACnB,WAAW;IACX,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAy2BjB,CAAC"}