raz-encrypt 2.1.0 → 2.4.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.
package/dist/trust.js CHANGED
@@ -4,12 +4,14 @@ import { hkdf } from "@noble/hashes/hkdf.js";
4
4
  import { hmac } from "@noble/hashes/hmac.js";
5
5
  import { sha384 } from "@noble/hashes/sha2.js";
6
6
  import { bytesToHex, concatBytes, hexToBytes, randomBytes, utf8ToBytes } from "@noble/hashes/utils.js";
7
- import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
8
- import { join } from "node:path";
7
+ import { readFile } from "node:fs/promises";
8
+ import { join, resolve } from "node:path";
9
9
  import { canonicalize } from "./canonicalJson.js";
10
10
  import { isValidIsoInstant, signCore, verifyCore } from "./crypto/hybrid.js";
11
+ import { writeFileAtomic } from "./fileCrypto.js";
11
12
  import { fingerprint } from "./fingerprint.js";
12
13
  import { exportPublicIdentity } from "./identity.js";
14
+ import { appendLogEntry } from "./store.js";
13
15
  /**
14
16
  * Thrown when trust.json cannot be trusted: its MAC does not verify (edited,
15
17
  * truncated, copied from another identity), it is not valid JSON, or it is an
@@ -29,6 +31,8 @@ const TRUST_STORE_HMAC_INFO = utf8ToBytes("raz-encrypt-trust-store-v1|hmac-key")
29
31
  // separate from its entry key (ADR 0019) — independent HKDF outputs per use
30
32
  // (ADR 0027).
31
33
  const TRUST_STORE_ENC_INFO = utf8ToBytes("raz-encrypt-trust-store-v1|enc-key");
34
+ // Third independent key, for the freshness sidecar (ADR 0030).
35
+ const TRUST_STORE_SEQ_INFO = utf8ToBytes("raz-encrypt-trust-store-v1|seq-key");
32
36
  function trustFilePath(storageDir) {
33
37
  return join(storageDir, "trust.json");
34
38
  }
@@ -44,26 +48,29 @@ function deriveTrustStoreKey(identity) {
44
48
  function deriveTrustStoreEncKey(identity) {
45
49
  return hkdf(sha384, concatBytes(identity.classical.secretKey, identity.pqcSign.secretKey), undefined, TRUST_STORE_ENC_INFO, 32);
46
50
  }
47
- function computeMac(identity, entries) {
48
- return bytesToHex(hmac(sha384, deriveTrustStoreKey(identity), utf8ToBytes(canonicalize({ version: 3, entries }))));
51
+ // `seq` joins the MAC input only when present, so files written before ADR 0030 keep verifying unchanged.
52
+ function computeMac(identity, entries, seq) {
53
+ const body = seq === undefined ? { version: 3, entries } : { version: 3, entries, seq };
54
+ return bytesToHex(hmac(sha384, deriveTrustStoreKey(identity), utf8ToBytes(canonicalize(body))));
49
55
  }
50
56
  /**
51
57
  * Exported (ADR 0026) so the timing-safety test can exercise this exact
52
58
  * compare in isolation, without the file I/O its only internal callers do.
53
59
  */
54
- export function macMatches(identity, entries, mac) {
60
+ export function macMatches(identity, entries, mac, seq) {
55
61
  if (typeof mac !== "string" || !/^[0-9a-f]{96}$/.test(mac))
56
62
  return false;
57
- return equalBytes(hexToBytes(mac), hexToBytes(computeMac(identity, entries)));
63
+ return equalBytes(hexToBytes(mac), hexToBytes(computeMac(identity, entries, seq)));
58
64
  }
59
65
  /** v4's MAC covers the ciphertext blob instead of the plaintext entries (ADR 0027) — same chain-authentication mechanism, different bytes underneath it. */
60
- function computeMacV4(identity, nonce, ciphertext) {
61
- return bytesToHex(hmac(sha384, deriveTrustStoreKey(identity), utf8ToBytes(canonicalize({ version: 4, nonce, ciphertext }))));
66
+ function computeMacV4(identity, nonce, ciphertext, seq) {
67
+ const body = seq === undefined ? { version: 4, nonce, ciphertext } : { version: 4, nonce, ciphertext, seq };
68
+ return bytesToHex(hmac(sha384, deriveTrustStoreKey(identity), utf8ToBytes(canonicalize(body))));
62
69
  }
63
- function macMatchesV4(identity, nonce, ciphertext, mac) {
70
+ function macMatchesV4(identity, nonce, ciphertext, mac, seq) {
64
71
  if (typeof mac !== "string" || !/^[0-9a-f]{96}$/.test(mac))
65
72
  return false;
66
- return equalBytes(hexToBytes(mac), hexToBytes(computeMacV4(identity, nonce, ciphertext)));
73
+ return equalBytes(hexToBytes(mac), hexToBytes(computeMacV4(identity, nonce, ciphertext, seq)));
67
74
  }
68
75
  /** Associated data for the entries AEAD: binds the ciphertext to the format version and its own nonce, same pattern as fileCrypto.ts's headerAad. */
69
76
  function entriesAad(version, nonce) {
@@ -92,7 +99,10 @@ function isV3(data) {
92
99
  if (typeof data !== "object" || data === null || data.version !== 3)
93
100
  return false;
94
101
  const entries = data.entries;
95
- return typeof entries === "object" && entries !== null && !Array.isArray(entries);
102
+ return typeof entries === "object" && entries !== null && !Array.isArray(entries) && validSeq(data.seq);
103
+ }
104
+ function validSeq(seq) {
105
+ return seq === undefined || (typeof seq === "number" && Number.isSafeInteger(seq) && seq >= 1);
96
106
  }
97
107
  function isHex96(value) {
98
108
  return typeof value === "string" && /^[0-9a-f]{96}$/.test(value);
@@ -101,7 +111,7 @@ function isV4(data) {
101
111
  if (typeof data !== "object" || data === null || data.version !== 4)
102
112
  return false;
103
113
  const d = data;
104
- return typeof d.nonce === "string" && /^[0-9a-f]{24}$/.test(d.nonce) && typeof d.ciphertext === "string" && /^[0-9a-f]*$/.test(d.ciphertext) && isHex96(d.mac);
114
+ return typeof d.nonce === "string" && /^[0-9a-f]{24}$/.test(d.nonce) && typeof d.ciphertext === "string" && /^[0-9a-f]*$/.test(d.ciphertext) && isHex96(d.mac) && validSeq(data.seq);
105
115
  }
106
116
  function isV2(data) {
107
117
  return typeof data === "object" && data !== null && data.version === 2;
@@ -140,39 +150,128 @@ function parse(raw) {
140
150
  throw new TrustStoreIntegrityError("trust.json is not valid JSON; refusing to use it.");
141
151
  }
142
152
  }
143
- /** Reads and AUTHENTICATES the trust store, transparently decrypting a v4 (issue #43) file. Missing file = empty store. Anything unauthenticated throws TrustStoreIntegrityError. */
144
- async function readTrustStore(identity) {
153
+ const ROLLBACK_MESSAGE = "trust.json is older than the last recorded trust change: it was rolled back (or its sequence file was removed). Refusing to use it. Restore the newest copy, or investigate before re-trusting anyone.";
154
+ function seqFilePath(storageDir) {
155
+ return join(storageDir, "trust.seq.json");
156
+ }
157
+ function computeSeqMac(identity, seq, storeMac) {
158
+ const key = hkdf(sha384, concatBytes(identity.classical.secretKey, identity.pqcSign.secretKey), undefined, TRUST_STORE_SEQ_INFO, 32);
159
+ return bytesToHex(hmac(sha384, key, utf8ToBytes(canonicalize({ version: 1, seq, storeMac }))));
160
+ }
161
+ /** The sidecar's contents, or undefined if absent. Throws TrustStoreIntegrityError if it exists but is malformed or fails its MAC. */
162
+ async function readSeqRecord(identity) {
163
+ let raw;
164
+ try {
165
+ raw = await readFile(seqFilePath(identity.storageDir), "utf8");
166
+ }
167
+ catch (err) {
168
+ if (err.code === "ENOENT")
169
+ return undefined;
170
+ throw err;
171
+ }
172
+ const bad = () => new TrustStoreIntegrityError("trust.seq.json failed its integrity check: it was modified or belongs to a different identity.");
173
+ let data;
174
+ try {
175
+ data = JSON.parse(raw);
176
+ }
177
+ catch {
178
+ throw bad();
179
+ }
180
+ const d = data;
181
+ if (typeof d !== "object" || d === null || d.version !== 1 || !validSeq(d.seq) || d.seq === undefined || !isHex96(d.storeMac) || !isHex96(d.mac))
182
+ throw bad();
183
+ if (!equalBytes(hexToBytes(d.mac), hexToBytes(computeSeqMac(identity, d.seq, d.storeMac))))
184
+ throw bad();
185
+ return d;
186
+ }
187
+ /**
188
+ * Reads and AUTHENTICATES the trust store, transparently decrypting a v4 (issue #43) file, and
189
+ * checks its freshness against the sequence sidecar (ADR 0030): a store whose `seq` is below the
190
+ * sidecar's, or equal with a different MAC, is a rollback. A store AHEAD of the sidecar is a crash
191
+ * between the two writes and is accepted (the next write repairs it). Missing file = empty store.
192
+ */
193
+ async function readStoreState(identity) {
145
194
  const raw = await readRaw(identity.storageDir);
146
195
  if (raw === undefined)
147
- return {};
196
+ return { entries: {}, seq: 0, mac: "" };
148
197
  const data = parse(raw);
198
+ let state;
149
199
  if (isV4(data)) {
150
- if (!macMatchesV4(identity, data.nonce, data.ciphertext, data.mac)) {
200
+ if (!macMatchesV4(identity, data.nonce, data.ciphertext, data.mac, data.seq)) {
151
201
  throw new TrustStoreIntegrityError("trust.json failed its integrity check: it was modified, truncated, or belongs to a different identity.");
152
202
  }
153
- return decryptEntries(identity, data.nonce, data.ciphertext);
203
+ state = { entries: decryptEntries(identity, data.nonce, data.ciphertext), seq: data.seq ?? 0, mac: data.mac };
154
204
  }
155
- if (!isV3(data)) {
205
+ else if (!isV3(data)) {
156
206
  throw new TrustStoreIntegrityError("trust.json is an unauthenticated legacy file (written before trust-store MACs). Review it, then call migrateLegacyTrustStore(identity) to adopt it.");
157
207
  }
158
- if (!macMatches(identity, data.entries, data.mac)) {
159
- throw new TrustStoreIntegrityError("trust.json failed its integrity check: it was modified, truncated, or belongs to a different identity.");
208
+ else {
209
+ if (!macMatches(identity, data.entries, data.mac, data.seq)) {
210
+ throw new TrustStoreIntegrityError("trust.json failed its integrity check: it was modified, truncated, or belongs to a different identity.");
211
+ }
212
+ state = { entries: data.entries, seq: data.seq ?? 0, mac: data.mac };
160
213
  }
161
- return data.entries;
162
- }
163
- async function writeStoreFile(identity, store) {
164
- await mkdir(identity.storageDir, { recursive: true, mode: 0o700 });
165
- const finalPath = trustFilePath(identity.storageDir);
166
- const tmpPath = `${finalPath}.${process.pid}.${Date.now()}.tmp`;
167
- try {
168
- await writeFile(tmpPath, JSON.stringify(store, null, 2), { mode: 0o600 });
169
- await rename(tmpPath, finalPath);
214
+ const record = await readSeqRecord(identity);
215
+ if (record === undefined) {
216
+ // Only a first-ever write can legitimately leave a store with no sidecar (crash between the two writes).
217
+ if (state.seq > 1)
218
+ throw new TrustStoreIntegrityError(ROLLBACK_MESSAGE);
170
219
  }
171
- catch (err) {
172
- await rm(tmpPath, { force: true });
173
- throw err;
220
+ else if (state.seq < record.seq || (state.seq === record.seq && state.mac !== record.storeMac)) {
221
+ throw new TrustStoreIntegrityError(ROLLBACK_MESSAGE);
222
+ }
223
+ return state;
224
+ }
225
+ async function readTrustStore(identity) {
226
+ return (await readStoreState(identity)).entries;
227
+ }
228
+ /** The current `{ seq, mac }` of the trust store. Store it off-box after changes you care about. */
229
+ export async function getTrustStoreAnchor(identity) {
230
+ const { seq, mac } = await readStoreState(identity);
231
+ return { seq, mac };
232
+ }
233
+ /**
234
+ * Throws TrustStoreIntegrityError if the local trust store is older than `anchor`, or has the
235
+ * same sequence number with different contents. Newer is fine. This is the only check that
236
+ * catches a rollback where trust.json and trust.seq.json were restored together (ADR 0030).
237
+ */
238
+ export async function verifyTrustStoreAnchor(identity, anchor) {
239
+ const { seq, mac } = await readStoreState(identity);
240
+ if (seq < anchor.seq || (seq === anchor.seq && mac !== anchor.mac)) {
241
+ throw new TrustStoreIntegrityError("the trust store does not match the anchor you supplied: it was rolled back or replaced.");
174
242
  }
175
243
  }
244
+ async function writeStoreFile(identity, store, seq) {
245
+ // Temp file with a unique name, fsync of file and directory, then rename (ADR 0028):
246
+ // a crash leaves the complete old file or the complete new one, never a torn one.
247
+ await writeFileAtomic(trustFilePath(identity.storageDir), JSON.stringify(store, null, 2));
248
+ // Then the freshness sidecar (ADR 0030). A crash between the two leaves the store one ahead, which reads accept.
249
+ const record = { version: 1, seq, storeMac: store.mac, mac: computeSeqMac(identity, seq, store.mac) };
250
+ await writeFileAtomic(seqFilePath(identity.storageDir), JSON.stringify(record));
251
+ }
252
+ /**
253
+ * Serializes every read-modify-write of one identity's trust store (ADR
254
+ * 0028, issue #56). Without this, two overlapping mutations each read the
255
+ * same snapshot and the later write erased the earlier one, so a revocation
256
+ * could be lost while the revoked party stayed trusted. In-process only, like
257
+ * the audit log's queue (ADR 0011): separate OS processes sharing one
258
+ * storageDir are not coordinated.
259
+ *
260
+ * A failure in one task never blocks the next. The map entry is removed once
261
+ * its chain drains, so it does not grow with every storageDir ever touched.
262
+ */
263
+ const mutationQueues = new Map();
264
+ function serialized(identity, task) {
265
+ const key = resolve(identity.storageDir);
266
+ const run = (mutationQueues.get(key) ?? Promise.resolve()).then(task);
267
+ const tail = run.then(() => undefined, () => undefined);
268
+ mutationQueues.set(key, tail);
269
+ void tail.then(() => {
270
+ if (mutationQueues.get(key) === tail)
271
+ mutationQueues.delete(key);
272
+ });
273
+ return run;
274
+ }
176
275
  /**
177
276
  * Writes the store with a fresh MAC, atomically (temp file in the same
178
277
  * directory, then rename), mode 0o600. Preserves whatever format is
@@ -183,15 +282,22 @@ async function writeStoreFile(identity, store) {
183
282
  async function writeTrustStore(identity, entries) {
184
283
  const raw = await readRaw(identity.storageDir);
185
284
  const current = raw === undefined ? undefined : parse(raw);
285
+ const seq = (current?.seq ?? 0) + 1;
186
286
  if (isV4(current)) {
187
- await writeTrustStore4(identity, entries);
287
+ await writeTrustStore4(identity, entries, seq);
188
288
  return;
189
289
  }
190
- await writeStoreFile(identity, { version: 3, entries, mac: computeMac(identity, entries) });
290
+ await writeStoreFile(identity, { version: 3, entries, seq, mac: computeMac(identity, entries, seq) }, seq);
191
291
  }
192
- async function writeTrustStore4(identity, entries) {
292
+ async function writeTrustStore4(identity, entries, seq) {
293
+ const next = seq ?? (await currentSeq(identity)) + 1;
193
294
  const { nonce, ciphertext } = encryptEntries(identity, entries);
194
- await writeStoreFile(identity, { version: 4, nonce, ciphertext, mac: computeMacV4(identity, nonce, ciphertext) });
295
+ await writeStoreFile(identity, { version: 4, nonce, ciphertext, seq: next, mac: computeMacV4(identity, nonce, ciphertext, next) }, next);
296
+ }
297
+ async function currentSeq(identity) {
298
+ const raw = await readRaw(identity.storageDir);
299
+ const seq = raw === undefined ? undefined : parse(raw).seq;
300
+ return typeof seq === "number" ? seq : 0;
195
301
  }
196
302
  /**
197
303
  * One-time, explicit opt-in (issue #43/ADR 0027) to encrypt `trust.json`'s
@@ -200,13 +306,15 @@ async function writeTrustStore4(identity, entries) {
200
306
  * is not implicitly adopted here — call `migrateLegacyTrustStore` first, same
201
307
  * as reading it would require.
202
308
  */
203
- export async function migrateTrustStoreToEncrypted(identity) {
204
- const raw = await readRaw(identity.storageDir);
205
- const current = raw === undefined ? undefined : parse(raw);
206
- const entries = await readTrustStore(identity); // verifies/decrypts whichever format; throws on a legacy or tampered file
207
- if (isV4(current))
208
- return; // already encrypted — true no-op, same spirit as migrateLegacyTrustStore's
209
- await writeTrustStore4(identity, entries);
309
+ export function migrateTrustStoreToEncrypted(identity) {
310
+ return serialized(identity, async () => {
311
+ const raw = await readRaw(identity.storageDir);
312
+ const current = raw === undefined ? undefined : parse(raw);
313
+ const entries = await readTrustStore(identity); // verifies/decrypts whichever format; throws on a legacy or tampered file
314
+ if (isV4(current))
315
+ return; // already encrypted — true no-op, same spirit as migrateLegacyTrustStore's
316
+ await writeTrustStore4(identity, entries);
317
+ });
210
318
  }
211
319
  /**
212
320
  * One-time, explicit adoption of a trust.json written before trust-store
@@ -218,18 +326,20 @@ export async function migrateTrustStoreToEncrypted(identity) {
218
326
  * adopted; returns 0 and changes nothing if the file is missing or already
219
327
  * authenticated (a modified authenticated file still throws).
220
328
  */
221
- export async function migrateLegacyTrustStore(identity) {
222
- const raw = await readRaw(identity.storageDir);
223
- if (raw === undefined)
224
- return 0;
225
- const data = parse(raw);
226
- if (isV3(data) || isV4(data)) {
227
- await readTrustStore(identity); // verifies (and decrypts, for v4); throws if tampered
228
- return 0;
229
- }
230
- const entries = legacyEntries(data);
231
- await writeTrustStore(identity, entries);
232
- return Object.keys(entries).length;
329
+ export function migrateLegacyTrustStore(identity) {
330
+ return serialized(identity, async () => {
331
+ const raw = await readRaw(identity.storageDir);
332
+ if (raw === undefined)
333
+ return 0;
334
+ const data = parse(raw);
335
+ if (isV3(data) || isV4(data)) {
336
+ await readTrustStore(identity); // verifies (and decrypts, for v4); throws if tampered
337
+ return 0;
338
+ }
339
+ const entries = legacyEntries(data);
340
+ await writeTrustStore(identity, entries);
341
+ return Object.keys(entries).length;
342
+ });
233
343
  }
234
344
  /**
235
345
  * Records another party's public card as trusted, keyed by the card's
@@ -241,10 +351,13 @@ export async function migrateLegacyTrustStore(identity) {
241
351
  *
242
352
  * Trusting a card again after it was revoked reinstates it (clears revokedAt).
243
353
  */
244
- export async function trustParty(identity, card) {
245
- const entries = await readTrustStore(identity);
246
- entries[fingerprint(card)] = { card, trustedAt: new Date().toISOString() };
247
- await writeTrustStore(identity, entries);
354
+ export function trustParty(identity, card) {
355
+ return serialized(identity, async () => {
356
+ const entries = await readTrustStore(identity);
357
+ entries[fingerprint(card)] = { card, trustedAt: new Date().toISOString() };
358
+ await writeTrustStore(identity, entries);
359
+ await appendLogEntry(identity, { action: "trust", counterpartAlias: card.alias });
360
+ });
248
361
  }
249
362
  /**
250
363
  * Revokes every currently-trusted card recorded under `alias` — e.g. after a
@@ -253,14 +366,17 @@ export async function trustParty(identity, card) {
253
366
  * lost, and so verify() can report "revoked-signer" distinctly from
254
367
  * "untrusted-signer" (never trusted at all).
255
368
  */
256
- export async function untrustParty(identity, alias) {
257
- const entries = await readTrustStore(identity);
258
- const revokedAt = new Date().toISOString();
259
- for (const record of Object.values(entries)) {
260
- if (record.card.alias === alias && !record.revokedAt)
261
- record.revokedAt = revokedAt;
262
- }
263
- await writeTrustStore(identity, entries);
369
+ export function untrustParty(identity, alias) {
370
+ return serialized(identity, async () => {
371
+ const entries = await readTrustStore(identity);
372
+ const revokedAt = new Date().toISOString();
373
+ for (const record of Object.values(entries)) {
374
+ if (record.card.alias === alias && !record.revokedAt)
375
+ record.revokedAt = revokedAt;
376
+ }
377
+ await writeTrustStore(identity, entries);
378
+ await appendLogEntry(identity, { action: "untrust", counterpartAlias: alias });
379
+ });
264
380
  }
265
381
  /**
266
382
  * Revokes exactly one card, identified by its `fingerprint(card)` string
@@ -269,16 +385,19 @@ export async function untrustParty(identity, alias) {
269
385
  * Returns true if a currently-trusted record was revoked, false if no such
270
386
  * trusted record exists (a typo'd fingerprint is reported, not ignored).
271
387
  */
272
- export async function untrustFingerprint(identity, fingerprintValue) {
388
+ export function untrustFingerprint(identity, fingerprintValue) {
273
389
  const normalize = (value) => value.replace(/\s+/g, "").toUpperCase();
274
390
  const wanted = normalize(fingerprintValue);
275
- const entries = await readTrustStore(identity);
276
- const key = Object.keys(entries).find((candidate) => normalize(candidate) === wanted);
277
- if (key === undefined || entries[key].revokedAt)
278
- return false;
279
- entries[key].revokedAt = new Date().toISOString();
280
- await writeTrustStore(identity, entries);
281
- return true;
391
+ return serialized(identity, async () => {
392
+ const entries = await readTrustStore(identity);
393
+ const key = Object.keys(entries).find((candidate) => normalize(candidate) === wanted);
394
+ if (key === undefined || entries[key].revokedAt)
395
+ return false;
396
+ entries[key].revokedAt = new Date().toISOString();
397
+ await writeTrustStore(identity, entries);
398
+ await appendLogEntry(identity, { action: "untrust", counterpartAlias: entries[key].card.alias });
399
+ return true;
400
+ });
282
401
  }
283
402
  /** Every currently-trusted (non-revoked) card. */
284
403
  export async function listTrustedParties(identity) {
@@ -346,7 +465,8 @@ export async function trustSignedCard(identity, card, certificate) {
346
465
  * NEW identity, to get a complete, dual-signed RotationStatement — a single
347
466
  * signature from the old key alone is never enough to redirect a peer's
348
467
  * trust (see `applyRotation`), so this function's output is not yet usable
349
- * on its own.
468
+ * on its own. Even a dual-signed statement is only as trustworthy as the new
469
+ * fingerprint the receiver confirms out of band (`applyRotation`).
350
470
  */
351
471
  export async function beginRotation(oldIdentity, newCard, options = {}) {
352
472
  const rotatedAt = options.rotatedAt ?? new Date().toISOString();
@@ -359,8 +479,11 @@ export async function beginRotation(oldIdentity, newCard, options = {}) {
359
479
  /**
360
480
  * Finishes a key rotation: the NEW identity signs the SAME document
361
481
  * `beginRotation` produced, proving the new key exists and agrees to be
362
- * named as successor — not just asserted unilaterally by whoever holds the
363
- * old key (which could be an attacker who compromised it alone).
482
+ * named as successor. This proves the statement's author controls the new
483
+ * key; it does NOT prove the new key belongs to the real owner — an attacker
484
+ * who stole the old key can mint their own "new" identity and complete the
485
+ * statement themselves. Receivers close that gap with `applyRotation`'s
486
+ * out-of-band `confirmNewFingerprint`.
364
487
  */
365
488
  export async function completeRotation(newIdentity, draft) {
366
489
  const newCertificate = await signCore(newIdentity, draft.document);
@@ -374,8 +497,19 @@ export async function completeRotation(newIdentity, draft) {
374
497
  * fingerprint). A statement for a card you never trusted is a no-op — this
375
498
  * is not a way to seed your trust store with a card you never decided to
376
499
  * trust in the first place.
500
+ *
501
+ * `options.confirmNewFingerprint` is REQUIRED: the new card's fingerprint as
502
+ * the real owner gave it to you over a channel the statement did not travel
503
+ * on (phone call, in person). Dual signatures alone only prove the author
504
+ * holds both keys; an attacker with a stolen old key supplies their own
505
+ * "new" key and signs both. Spacing and case are ignored when comparing.
506
+ * A mismatch returns `{ valid: false, reason: "fingerprint-mismatch" }` and
507
+ * changes nothing; a missing value throws (ADR 0029).
377
508
  */
378
- export async function applyRotation(identity, statement) {
509
+ export async function applyRotation(identity, statement, options) {
510
+ if (typeof options?.confirmNewFingerprint !== "string" || options.confirmNewFingerprint.trim() === "") {
511
+ throw new Error("applyRotation requires options.confirmNewFingerprint: the new card's fingerprint, confirmed with its owner out of band (ADR 0029).");
512
+ }
379
513
  const { document, oldCertificate, newCertificate } = statement;
380
514
  const oldResult = await verifyCore(identity, document, oldCertificate, {
381
515
  checkTrust: async (signer) => (cardMatchesSigner(document.oldCard, signer) ? "trusted" : "untrusted"),
@@ -387,16 +521,24 @@ export async function applyRotation(identity, statement) {
387
521
  });
388
522
  if (!newResult.valid)
389
523
  return newResult;
390
- const entries = await readTrustStore(identity);
391
- const oldKey = fingerprint(document.oldCard);
392
- const existing = entries[oldKey];
393
- if (!existing || existing.revokedAt)
394
- return { valid: true }; // nothing trusted to migrate from — no-op
395
- const revokedAt = new Date().toISOString();
396
- entries[oldKey] = { ...existing, revokedAt, rotatedTo: fingerprint(document.newCard) };
397
- entries[fingerprint(document.newCard)] = { card: document.newCard, trustedAt: revokedAt };
398
- await writeTrustStore(identity, entries);
399
- return { valid: true };
524
+ const normalize = (value) => value.replace(/\s+/g, "").toUpperCase();
525
+ if (normalize(fingerprint(document.newCard)) !== normalize(options.confirmNewFingerprint)) {
526
+ return { valid: false, reason: "fingerprint-mismatch" };
527
+ }
528
+ // Signature checks above need no store access; only the read-modify-write is serialized.
529
+ return serialized(identity, async () => {
530
+ const entries = await readTrustStore(identity);
531
+ const oldKey = fingerprint(document.oldCard);
532
+ const existing = entries[oldKey];
533
+ if (!existing || existing.revokedAt)
534
+ return { valid: true }; // nothing trusted to migrate from — no-op
535
+ const revokedAt = new Date().toISOString();
536
+ entries[oldKey] = { ...existing, revokedAt, rotatedTo: fingerprint(document.newCard) };
537
+ entries[fingerprint(document.newCard)] = { card: document.newCard, trustedAt: revokedAt };
538
+ await writeTrustStore(identity, entries);
539
+ await appendLogEntry(identity, { action: "rotate", counterpartAlias: document.oldCard.alias });
540
+ return { valid: true };
541
+ });
400
542
  }
401
543
  /**
402
544
  * Produces a self-signed, portable revocation notice for `identity`'s own
@@ -435,13 +577,16 @@ export async function applyRevocationNotice(identity, notice) {
435
577
  });
436
578
  if (!result.valid)
437
579
  return result;
438
- const entries = await readTrustStore(identity);
439
- const key = fingerprint(document.revokedCard);
440
- const existing = entries[key];
441
- if (!existing || existing.revokedAt)
442
- return { valid: true }; // nothing trusted to revoke — no-op
443
- entries[key] = { ...existing, revokedAt: document.revokedAt };
444
- await writeTrustStore(identity, entries);
445
- return { valid: true };
580
+ return serialized(identity, async () => {
581
+ const entries = await readTrustStore(identity);
582
+ const key = fingerprint(document.revokedCard);
583
+ const existing = entries[key];
584
+ if (!existing || existing.revokedAt)
585
+ return { valid: true }; // nothing trusted to revoke — no-op
586
+ entries[key] = { ...existing, revokedAt: document.revokedAt };
587
+ await writeTrustStore(identity, entries);
588
+ await appendLogEntry(identity, { action: "revoke", counterpartAlias: document.revokedCard.alias });
589
+ return { valid: true };
590
+ });
446
591
  }
447
592
  //# sourceMappingURL=trust.js.map
package/dist/trust.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"trust.js","sourceRoot":"","sources":["../src/trust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAuC,MAAM,oBAAoB,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAkC,MAAM,eAAe,CAAC;AAwCrF;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,qBAAqB,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;AACjF,2EAA2E;AAC3E,4EAA4E;AAC5E,cAAc;AACd,MAAM,oBAAoB,GAAG,WAAW,CAAC,oCAAoC,CAAC,CAAC;AAE/E,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,QAAkB;IAC7C,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACnI,CAAC;AAED,gLAAgL;AAChL,SAAS,sBAAsB,CAAC,QAAkB;IAChD,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAClI,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB,EAAE,OAAgB;IACtD,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACrH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAkB,EAAE,OAAgB,EAAE,GAAY;IAC3E,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,4JAA4J;AAC5J,SAAS,YAAY,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB;IACzE,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/H,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB,EAAE,GAAY;IACvF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,qJAAqJ;AACrJ,SAAS,UAAU,CAAC,OAAU,EAAE,KAAa;IAC3C,OAAO,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB,EAAE,OAAgB;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrI,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,oIAAoI;AACpI,SAAS,cAAc,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB;IAC3E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACjI,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAY,CAAC;QAC3E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACjJ,OAAO,OAAkB,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;IAC/I,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,MAAM,OAAO,GAAI,IAA8B,CAAC,OAAO,CAAC;IACxD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,MAAM,CAAC,GAAG,IAAgE,CAAC;IAC3E,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjK,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,gHAAgH;AAChH,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,wEAAwE;QACxE,mEAAmE;QACnE,iEAAiE;QACjE,MAAM,IAAI,wBAAwB,CAAC,0EAA0E,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAkC,CAAC,EAAE,CAAC;QACrE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,UAAkB;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACvE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAwB,CAAC,mDAAmD,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,qLAAqL;AACrL,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;QAC/I,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,wBAAwB,CAChC,qJAAqJ,CACtJ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;IAC/I,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,KAAkC;IAClF,MAAM,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,OAAgB;IACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,OAAgB;IAClE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;AACpH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,QAAkB;IACnE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,0EAA0E;IAC1H,IAAI,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,2EAA2E;IACtG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAkB;IAC9D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,sDAAsD;QACtF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAkB,EAAE,IAAgB;IACnE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3E,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAkB,EAAE,KAAa;IAClE,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IACrF,CAAC;IACD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAkB,EAAE,gBAAwB;IACnF,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC;IACtF,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IACzD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;SAC1B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,KAAa;IACrE,OAAO,CAAC,MAAM,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAkB,EAAE,KAAa;IAC9E,OAAO,CAAC,MAAM,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACnD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,KAAa;IAC5E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AACvG,CAAC;AAED,2EAA2E;AAC3E,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAE1E,oJAAoJ;AACpJ,SAAS,iBAAiB,CAAC,IAAgB,EAAE,MAA+E;IAC1H,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,KAAK,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,CAAC;AACnJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,IAAgB,EAAE,WAAwB;IAClG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3D,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAC1F,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAcD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAqB,EACrB,OAAmB,EACnB,UAAkC,EAAE;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yGAAyG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE1L,MAAM,QAAQ,GAAqB,EAAE,OAAO,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACtG,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAqB,EACrB,KAAkE;IAElE,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAkB,EAAE,SAA4B;IAClF,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAE/D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;QACrE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KACtG,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;QACrE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KACtG,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,0CAA0C;IAEvG,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACvF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAC1F,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAcD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,UAA+B,EAAE;IAChG,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAuB;QACnC,WAAW,EAAE,oBAAoB,CAAC,QAAQ,CAAC;QAC3C,SAAS;QACT,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAkB,EAAE,MAAwB;IACtF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAErG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;QAC/D,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAC1G,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,oCAAoC;IAEjG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;IAC9D,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../src/trust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAuC,MAAM,oBAAoB,CAAC;AAClH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAkC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2C5C;;;;;;;GAOG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,qBAAqB,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;AACjF,2EAA2E;AAC3E,4EAA4E;AAC5E,cAAc;AACd,MAAM,oBAAoB,GAAG,WAAW,CAAC,oCAAoC,CAAC,CAAC;AAC/E,+DAA+D;AAC/D,MAAM,oBAAoB,GAAG,WAAW,CAAC,oCAAoC,CAAC,CAAC;AAE/E,SAAS,aAAa,CAAC,UAAkB;IACvC,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,QAAkB;IAC7C,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;AACnI,CAAC;AAED,gLAAgL;AAChL,SAAS,sBAAsB,CAAC,QAAkB;IAChD,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAClI,CAAC;AAED,0GAA0G;AAC1G,SAAS,UAAU,CAAC,QAAkB,EAAE,OAAgB,EAAE,GAAY;IACpE,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACxF,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAkB,EAAE,OAAgB,EAAE,GAAY,EAAE,GAAY;IACzF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,4JAA4J;AAC5J,SAAS,YAAY,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB,EAAE,GAAY;IACvF,MAAM,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAC5G,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB,EAAE,GAAY,EAAE,GAAY;IACrG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,qJAAqJ;AACrJ,SAAS,UAAU,CAAC,OAAU,EAAE,KAAa;IAC3C,OAAO,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB,EAAE,OAAgB;IAC1D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrI,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,oIAAoI;AACpI,SAAS,cAAc,CAAC,QAAkB,EAAE,KAAa,EAAE,UAAkB;IAC3E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACjI,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAY,CAAC;QAC3E,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACjJ,OAAO,OAAkB,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;IAC/I,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,MAAM,OAAO,GAAI,IAA8B,CAAC,OAAO,CAAC;IACxD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAE,IAA0B,CAAC,GAAG,CAAC,CAAC;AACjI,CAAC;AAED,SAAS,QAAQ,CAAC,GAAY;IAC5B,OAAO,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7G,MAAM,CAAC,GAAG,IAAgE,CAAC;IAC3E,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAE,IAA0B,CAAC,GAAG,CAAC,CAAC;AAC9M,CAAC;AAED,SAAS,IAAI,CAAC,IAAa;IACzB,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAA8B,CAAC,OAAO,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,gHAAgH;AAChH,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,wEAAwE;QACxE,mEAAmE;QACnE,iEAAiE;QACjE,MAAM,IAAI,wBAAwB,CAAC,0EAA0E,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,OAAO,GAAY,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAkC,CAAC,EAAE,CAAC;QACrE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,UAAkB;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACvE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,wBAAwB,CAAC,mDAAmD,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GACpB,wMAAwM,CAAC;AAE3M,SAAS,WAAW,CAAC,UAAkB;IACrC,OAAO,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAC5C,CAAC;AASD,SAAS,aAAa,CAAC,QAAkB,EAAE,GAAW,EAAE,QAAgB;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACrI,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,sIAAsI;AACtI,KAAK,UAAU,aAAa,CAAC,QAAkB;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACvE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,wBAAwB,CAAC,gGAAgG,CAAC,CAAC;IACjJ,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,IAAiC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAAE,MAAM,GAAG,EAAE,CAAC;IAC9J,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,EAAE,CAAC;IACxG,OAAO,CAAc,CAAC;AACxB,CAAC;AAUD;;;;;GAKG;AACH,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,KAAiB,CAAC;IACtB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7E,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;QAC/I,CAAC;QACD,KAAK,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAChH,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,wBAAwB,CAChC,qJAAqJ,CACtJ,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,wBAAwB,CAAC,wGAAwG,CAAC,CAAC;QAC/I,CAAC;QACD,KAAK,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,yGAAyG;QACzG,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC;YAAE,MAAM,IAAI,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,OAAO,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AAClD,CAAC;AAQD,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAkB;IAC1D,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,MAAwB;IACvF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,wBAAwB,CAAC,yFAAyF,CAAC,CAAC;IAChI,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,KAAkC,EAAE,GAAW;IAC/F,qFAAqF;IACrF,kFAAkF;IAClF,MAAM,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,iHAAiH;IACjH,MAAM,MAAM,GAAc,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACjH,MAAM,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;AAExD,SAAS,UAAU,CAAI,QAAkB,EAAE,IAAsB;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CACnB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAClB,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,OAAgB;IACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,CAAE,OAAyC,EAAE,GAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7F,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IACD,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC7G,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,OAAgB,EAAE,GAAY;IAChF,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3I,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAkB;IAC1C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,CAAuB,CAAC,GAAG,CAAC;IAClF,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAkB;IAC7D,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,0EAA0E;QAC1H,IAAI,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,2EAA2E;QACtG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACxD,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,sDAAsD;YACtF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,QAAkB,EAAE,IAAgB;IAC7D,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3E,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,KAAa;IAC5D,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QACrF,CAAC;QACD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB,EAAE,gBAAwB;IAC7E,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC;QACtF,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjG,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAkB;IACzD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;SAC1B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB;IACvD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,KAAa;IACrE,OAAO,CAAC,MAAM,wBAAwB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAkB,EAAE,KAAa;IAC9E,OAAO,CAAC,MAAM,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SACnD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;SACrC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,KAAa;IAC5E,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AACvG,CAAC;AAED,2EAA2E;AAC3E,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAE1E,oJAAoJ;AACpJ,SAAS,iBAAiB,CAAC,IAAgB,EAAE,MAA+E;IAC1H,OAAO,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,KAAK,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,gBAAgB,CAAC;AACnJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAkB,EAAE,IAAgB,EAAE,WAAwB;IAClG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE;QAC3D,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAC1F,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAcD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAqB,EACrB,OAAmB,EACnB,UAAkC,EAAE;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yGAAyG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAE1L,MAAM,QAAQ,GAAqB,EAAE,OAAO,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACtG,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAqB,EACrB,KAAkE;IAElE,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAkB,EAClB,SAA4B,EAC5B,OAA0C;IAE1C,IAAI,OAAO,OAAO,EAAE,qBAAqB,KAAK,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtG,MAAM,IAAI,KAAK,CAAC,oIAAoI,CAAC,CAAC;IACxJ,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,SAAS,CAAC;IAE/D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;QACrE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KACtG,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE;QACrE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KACtG,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAEvC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,IAAI,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC1F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC1D,CAAC;IAED,yFAAyF;IACzF,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAkB,CAAC,CAAC,0CAA0C;QAEvH,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC1F,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAkB,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAcD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAkB,EAAE,UAA+B,EAAE;IAChG,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAuB;QACnC,WAAW,EAAE,oBAAoB,CAAC,QAAQ,CAAC;QAC3C,SAAS;QACT,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAkB,EAAE,MAAwB;IACtF,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAErG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE;QAC/D,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;KAC1G,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAEjC,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAkB,CAAC,CAAC,oCAAoC;QAEjH,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC9D,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QACnG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAkB,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "raz-encrypt",
3
- "version": "2.1.0",
3
+ "version": "2.4.0",
4
4
  "description": "Local-first, hybrid classical+post-quantum signing and verification for two consenting parties. No server, no database required.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -32,7 +32,9 @@
32
32
  "demo:verify": "tsx demo/verify-as-bob.ts",
33
33
  "demo:tamper": "tsx demo/verify-as-bob.ts --tamper",
34
34
  "demo:clean": "rm -rf demo/.alice-store demo/.bob-store demo/alice-card.json demo/bob-card.json demo/signed-doc.json",
35
- "prepublishOnly": "npm run typecheck && npm test && npm run build"
35
+ "prepublishOnly": "npm run typecheck && npm test && npm run build",
36
+ "lint": "eslint src",
37
+ "sbom": "cyclonedx-npm --omit dev --output-file sbom.cdx.json"
36
38
  },
37
39
  "dependencies": {
38
40
  "@noble/ciphers": "2.4.0",
@@ -41,10 +43,15 @@
41
43
  "@noble/post-quantum": "0.7.1"
42
44
  },
43
45
  "devDependencies": {
46
+ "@cyclonedx/cyclonedx-npm": "6.0.1",
47
+ "@eslint/js": "10.0.1",
44
48
  "@types/node": "^26.6.4",
49
+ "eslint": "10.12.0",
50
+ "eslint-plugin-security": "4.2.0",
45
51
  "fast-check": "^4.10.2",
46
52
  "tsx": "^4.19.2",
47
53
  "typescript": "^5.7.2",
54
+ "typescript-eslint": "8.71.1",
48
55
  "vitest": "^5.0.0"
49
56
  },
50
57
  "repository": {
@@ -56,7 +63,6 @@
56
63
  },
57
64
  "homepage": "https://github.com/razmans/raz-encrypt#readme",
58
65
  "publishConfig": {
59
- "access": "public",
60
- "provenance": true
66
+ "access": "public"
61
67
  }
62
68
  }