@mikeargento/bitgraph 1.1.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 (80) hide show
  1. package/LICENSE +9 -0
  2. package/NOTICE +14 -0
  3. package/README.md +175 -0
  4. package/dist/__tests__/canonical.test.d.ts +2 -0
  5. package/dist/__tests__/canonical.test.d.ts.map +1 -0
  6. package/dist/__tests__/canonical.test.js +162 -0
  7. package/dist/__tests__/canonical.test.js.map +1 -0
  8. package/dist/__tests__/commit-service.integration.test.d.ts +2 -0
  9. package/dist/__tests__/commit-service.integration.test.d.ts.map +1 -0
  10. package/dist/__tests__/commit-service.integration.test.js +95 -0
  11. package/dist/__tests__/commit-service.integration.test.js.map +1 -0
  12. package/dist/__tests__/constructor.test.d.ts +2 -0
  13. package/dist/__tests__/constructor.test.d.ts.map +1 -0
  14. package/dist/__tests__/constructor.test.js +267 -0
  15. package/dist/__tests__/constructor.test.js.map +1 -0
  16. package/dist/__tests__/hello-world.test.d.ts +2 -0
  17. package/dist/__tests__/hello-world.test.d.ts.map +1 -0
  18. package/dist/__tests__/hello-world.test.js +9 -0
  19. package/dist/__tests__/hello-world.test.js.map +1 -0
  20. package/dist/__tests__/policy-enforcement.test.d.ts +2 -0
  21. package/dist/__tests__/policy-enforcement.test.d.ts.map +1 -0
  22. package/dist/__tests__/policy-enforcement.test.js +188 -0
  23. package/dist/__tests__/policy-enforcement.test.js.map +1 -0
  24. package/dist/__tests__/proof-hash-regression.test.d.ts +2 -0
  25. package/dist/__tests__/proof-hash-regression.test.d.ts.map +1 -0
  26. package/dist/__tests__/proof-hash-regression.test.js +134 -0
  27. package/dist/__tests__/proof-hash-regression.test.js.map +1 -0
  28. package/dist/__tests__/proof-hash.test.d.ts +2 -0
  29. package/dist/__tests__/proof-hash.test.d.ts.map +1 -0
  30. package/dist/__tests__/proof-hash.test.js +134 -0
  31. package/dist/__tests__/proof-hash.test.js.map +1 -0
  32. package/dist/__tests__/verifier.test.d.ts +2 -0
  33. package/dist/__tests__/verifier.test.d.ts.map +1 -0
  34. package/dist/__tests__/verifier.test.js +457 -0
  35. package/dist/__tests__/verifier.test.js.map +1 -0
  36. package/dist/canonical.d.ts +54 -0
  37. package/dist/canonical.d.ts.map +1 -0
  38. package/dist/canonical.js +119 -0
  39. package/dist/canonical.js.map +1 -0
  40. package/dist/constructor.d.ts +66 -0
  41. package/dist/constructor.d.ts.map +1 -0
  42. package/dist/constructor.js +339 -0
  43. package/dist/constructor.js.map +1 -0
  44. package/dist/host.d.ts +138 -0
  45. package/dist/host.d.ts.map +1 -0
  46. package/dist/host.js +3 -0
  47. package/dist/host.js.map +1 -0
  48. package/dist/index.d.ts +20 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +9 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/policy.d.ts +68 -0
  53. package/dist/policy.d.ts.map +1 -0
  54. package/dist/policy.js +176 -0
  55. package/dist/policy.js.map +1 -0
  56. package/dist/proof-hash.d.ts +9 -0
  57. package/dist/proof-hash.d.ts.map +1 -0
  58. package/dist/proof-hash.js +75 -0
  59. package/dist/proof-hash.js.map +1 -0
  60. package/dist/types.d.ts +705 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +3 -0
  63. package/dist/types.js.map +1 -0
  64. package/dist/verifier.d.ts +27 -0
  65. package/dist/verifier.d.ts.map +1 -0
  66. package/dist/verifier.js +844 -0
  67. package/dist/verifier.js.map +1 -0
  68. package/package.json +40 -0
  69. package/src/__tests__/canonical.test.ts +253 -0
  70. package/src/__tests__/commit-service.integration.test.ts +117 -0
  71. package/src/__tests__/constructor.test.ts +340 -0
  72. package/src/__tests__/hello-world.test.ts +10 -0
  73. package/src/__tests__/policy-enforcement.test.ts +226 -0
  74. package/src/__tests__/proof-hash-regression.test.ts +147 -0
  75. package/src/__tests__/proof-hash.test.ts +148 -0
  76. package/src/__tests__/verifier.test.ts +541 -0
  77. package/src/constructor.ts +435 -0
  78. package/src/host.ts +153 -0
  79. package/src/index.ts +51 -0
  80. package/src/policy.ts +239 -0
@@ -0,0 +1,267 @@
1
+ // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
+ import { describe, test } from "node:test";
3
+ import * as assert from "node:assert/strict";
4
+ import { getPublicKeyAsync, signAsync } from "@noble/ed25519";
5
+ import { Constructor } from "../constructor.js";
6
+ async function makeKeys() {
7
+ const privateKey = crypto.getRandomValues(new Uint8Array(32));
8
+ const publicKeyBytes = await getPublicKeyAsync(privateKey);
9
+ const publicKeyB64 = Buffer.from(publicKeyBytes).toString("base64");
10
+ return { privateKey, publicKeyBytes, publicKeyB64 };
11
+ }
12
+ /** Minimal stub host — all required capabilities, no optional ones. */
13
+ function baseHost(km) {
14
+ return {
15
+ enforcementTier: "stub",
16
+ getMeasurement: async () => "test-measurement-cafebabe",
17
+ getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
18
+ sign: async (data) => signAsync(data, km.privateKey),
19
+ getPublicKey: async () => km.publicKeyBytes,
20
+ };
21
+ }
22
+ /** Stub host that also exposes a monotonic counter. */
23
+ function hostWithCounter(km) {
24
+ let c = 0;
25
+ return {
26
+ enforcementTier: "stub",
27
+ getMeasurement: async () => "test-measurement-cafebabe",
28
+ getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
29
+ sign: async (data) => signAsync(data, km.privateKey),
30
+ getPublicKey: async () => km.publicKeyBytes,
31
+ nextCounter: async () => String(++c),
32
+ };
33
+ }
34
+ /** Stub host that also exposes a secure clock. */
35
+ function hostWithTime(km, timeMs) {
36
+ return {
37
+ enforcementTier: "stub",
38
+ getMeasurement: async () => "test-measurement-cafebabe",
39
+ getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
40
+ sign: async (data) => signAsync(data, km.privateKey),
41
+ getPublicKey: async () => km.publicKeyBytes,
42
+ secureTime: async () => timeMs,
43
+ };
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // Constructor.initialize
47
+ // ---------------------------------------------------------------------------
48
+ describe("Constructor.initialize", () => {
49
+ test("succeeds with a minimal host", async () => {
50
+ const km = await makeKeys();
51
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
52
+ assert.ok(ctor instanceof Constructor);
53
+ });
54
+ test("fails when getMeasurement() rejects", async () => {
55
+ const km = await makeKeys();
56
+ const host = {
57
+ ...baseHost(km),
58
+ getMeasurement: async () => { throw new Error("measurement unavailable"); },
59
+ };
60
+ await assert.rejects(Constructor.initialize({ host }), /preflight failed/);
61
+ });
62
+ test("fails when getPublicKey() rejects", async () => {
63
+ const km = await makeKeys();
64
+ const host = {
65
+ ...baseHost(km),
66
+ getPublicKey: async () => { throw new Error("key unavailable"); },
67
+ };
68
+ await assert.rejects(Constructor.initialize({ host }), /preflight failed/);
69
+ });
70
+ test("rejects requireCounter policy when host has no nextCounter", async () => {
71
+ const km = await makeKeys();
72
+ await assert.rejects(Constructor.initialize({ host: baseHost(km), policy: { requireCounter: true } }), /nextCounter/);
73
+ });
74
+ test("rejects requireTime policy when host has no secureTime", async () => {
75
+ const km = await makeKeys();
76
+ await assert.rejects(Constructor.initialize({ host: baseHost(km), policy: { requireTime: true } }), /secureTime/);
77
+ });
78
+ test("accepts requireCounter policy when host has nextCounter", async () => {
79
+ const km = await makeKeys();
80
+ const ctor = await Constructor.initialize({
81
+ host: hostWithCounter(km),
82
+ policy: { requireCounter: true },
83
+ });
84
+ assert.ok(ctor instanceof Constructor);
85
+ });
86
+ test("accepts requireTime policy when host has secureTime", async () => {
87
+ const km = await makeKeys();
88
+ const ctor = await Constructor.initialize({
89
+ host: hostWithTime(km, Date.now()),
90
+ policy: { requireTime: true },
91
+ });
92
+ assert.ok(ctor instanceof Constructor);
93
+ });
94
+ });
95
+ // ---------------------------------------------------------------------------
96
+ // Constructor.commit
97
+ // ---------------------------------------------------------------------------
98
+ describe("Constructor.commit", () => {
99
+ test("returns a structurally valid BitGraphProof", async () => {
100
+ const km = await makeKeys();
101
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
102
+ const bytes = new TextEncoder().encode("hello bitgraph");
103
+ const proof = await ctor.commit({ bytes });
104
+ assert.equal(proof.version, "bitgraph/1");
105
+ assert.equal(proof.artifact.hashAlg, "sha256");
106
+ assert.ok(typeof proof.artifact.digestB64 === "string" && proof.artifact.digestB64.length > 0);
107
+ assert.ok(typeof proof.commit.nonceB64 === "string" && proof.commit.nonceB64.length > 0);
108
+ assert.equal(proof.signer.publicKeyB64, km.publicKeyB64);
109
+ assert.ok(typeof proof.signer.signatureB64 === "string" && proof.signer.signatureB64.length > 0);
110
+ assert.equal(proof.environment.enforcement, "stub");
111
+ assert.equal(proof.environment.measurement, "test-measurement-cafebabe");
112
+ });
113
+ test("works with empty bytes", async () => {
114
+ const km = await makeKeys();
115
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
116
+ const proof = await ctor.commit({ bytes: new Uint8Array(0) });
117
+ assert.equal(proof.version, "bitgraph/1");
118
+ assert.ok(proof.artifact.digestB64.length > 0);
119
+ });
120
+ test("works with large bytes (100 KB)", async () => {
121
+ const km = await makeKeys();
122
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
123
+ // crypto.getRandomValues is limited to 65536 bytes; use fill instead
124
+ const bytes = new Uint8Array(100_000).fill(0xab);
125
+ const proof = await ctor.commit({ bytes });
126
+ assert.equal(proof.version, "bitgraph/1");
127
+ });
128
+ test("includes metadata when provided (outside signature)", async () => {
129
+ const km = await makeKeys();
130
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
131
+ const proof = await ctor.commit({
132
+ bytes: new Uint8Array([1, 2, 3]),
133
+ metadata: { source: "test-suite" },
134
+ });
135
+ assert.deepEqual(proof.metadata, { source: "test-suite" });
136
+ });
137
+ test("omits metadata field when not provided", async () => {
138
+ const km = await makeKeys();
139
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
140
+ const proof = await ctor.commit({ bytes: new Uint8Array([1]) });
141
+ assert.equal(proof.metadata, undefined);
142
+ });
143
+ test("includes counter when host provides nextCounter", async () => {
144
+ const km = await makeKeys();
145
+ const ctor = await Constructor.initialize({ host: hostWithCounter(km) });
146
+ const proof = await ctor.commit({ bytes: new Uint8Array([1]) });
147
+ assert.ok(typeof proof.commit.counter === "string");
148
+ assert.equal(proof.commit.counter, "1");
149
+ });
150
+ test("counter increments across commits", async () => {
151
+ const km = await makeKeys();
152
+ const ctor = await Constructor.initialize({ host: hostWithCounter(km) });
153
+ const p1 = await ctor.commit({ bytes: new Uint8Array([1]) });
154
+ const p2 = await ctor.commit({ bytes: new Uint8Array([2]) });
155
+ assert.equal(p1.commit.counter, "1");
156
+ assert.equal(p2.commit.counter, "2");
157
+ });
158
+ test("includes time when host provides secureTime", async () => {
159
+ const km = await makeKeys();
160
+ const fixedTime = 1_700_000_000_000;
161
+ const ctor = await Constructor.initialize({ host: hostWithTime(km, fixedTime) });
162
+ const proof = await ctor.commit({ bytes: new Uint8Array([1]) });
163
+ assert.equal(proof.commit.time, fixedTime);
164
+ });
165
+ test("includes prevB64 when provided", async () => {
166
+ const km = await makeKeys();
167
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
168
+ const prevHash = Buffer.alloc(32).toString("base64");
169
+ const proof = await ctor.commit({
170
+ bytes: new Uint8Array([1]),
171
+ prevProofHashB64: prevHash,
172
+ });
173
+ assert.equal(proof.commit.prevB64, prevHash);
174
+ });
175
+ test("includes epochId when Constructor was initialized with one", async () => {
176
+ const km = await makeKeys();
177
+ const epochId = "epoch-abc-123";
178
+ const ctor = await Constructor.initialize({ host: baseHost(km), epochId });
179
+ const proof = await ctor.commit({ bytes: new Uint8Array([1]) });
180
+ assert.equal(proof.commit.epochId, epochId);
181
+ });
182
+ test("omits epochId when not provided at initialization", async () => {
183
+ const km = await makeKeys();
184
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
185
+ const proof = await ctor.commit({ bytes: new Uint8Array([1]) });
186
+ assert.equal(proof.commit.epochId, undefined);
187
+ });
188
+ test("each commit has a unique nonce", async () => {
189
+ const km = await makeKeys();
190
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
191
+ const p1 = await ctor.commit({ bytes: new Uint8Array([1]) });
192
+ const p2 = await ctor.commit({ bytes: new Uint8Array([1]) });
193
+ assert.notEqual(p1.commit.nonceB64, p2.commit.nonceB64);
194
+ });
195
+ test("fail-closed: throws when sign() rejects (no partial proof)", async () => {
196
+ const km = await makeKeys();
197
+ const badSignHost = {
198
+ enforcementTier: "stub",
199
+ getMeasurement: async () => "meas",
200
+ getFreshNonce: async () => crypto.getRandomValues(new Uint8Array(16)),
201
+ sign: async () => { throw new Error("HSM offline"); },
202
+ getPublicKey: async () => km.publicKeyBytes,
203
+ };
204
+ const ctor = await Constructor.initialize({ host: badSignHost });
205
+ await assert.rejects(ctor.commit({ bytes: new Uint8Array([1]) }), /host\.sign\(\) rejected/);
206
+ });
207
+ test("throws when nonce is too short", async () => {
208
+ const km = await makeKeys();
209
+ const shortNonceHost = {
210
+ ...baseHost(km),
211
+ getFreshNonce: async () => new Uint8Array(8), // < 16 bytes required
212
+ };
213
+ const ctor = await Constructor.initialize({ host: shortNonceHost });
214
+ await assert.rejects(ctor.commit({ bytes: new Uint8Array([1]) }), /insufficient length/);
215
+ });
216
+ test("two commits to same bytes produce different proofs (nonce)", async () => {
217
+ const km = await makeKeys();
218
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
219
+ const bytes = new Uint8Array([42, 43, 44]);
220
+ const p1 = await ctor.commit({ bytes });
221
+ const p2 = await ctor.commit({ bytes });
222
+ assert.equal(p1.artifact.digestB64, p2.artifact.digestB64); // same digest
223
+ assert.notEqual(p1.signer.signatureB64, p2.signer.signatureB64); // different signature
224
+ });
225
+ });
226
+ // ---------------------------------------------------------------------------
227
+ // Constructor.commitDigest
228
+ // ---------------------------------------------------------------------------
229
+ describe("Constructor.commitDigest", () => {
230
+ test("returns a valid proof given a correct 32-byte base64 digest", async () => {
231
+ const km = await makeKeys();
232
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
233
+ // SHA-256 of empty bytes
234
+ const digest = Buffer.alloc(32, 0xab).toString("base64");
235
+ const proof = await ctor.commitDigest({ digestB64: digest });
236
+ assert.equal(proof.version, "bitgraph/1");
237
+ assert.equal(proof.artifact.digestB64, digest);
238
+ });
239
+ test("throws for invalid base64", async () => {
240
+ const km = await makeKeys();
241
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
242
+ await assert.rejects(ctor.commitDigest({ digestB64: "not-valid-base64!!!" }), /base64/i);
243
+ });
244
+ test("throws when digest decodes to != 32 bytes", async () => {
245
+ const km = await makeKeys();
246
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
247
+ // 16 bytes, valid base64, but not 32 bytes
248
+ const shortDigest = Buffer.alloc(16).toString("base64");
249
+ await assert.rejects(ctor.commitDigest({ digestB64: shortDigest }), /32/);
250
+ });
251
+ test("throws for empty string digest", async () => {
252
+ const km = await makeKeys();
253
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
254
+ await assert.rejects(ctor.commitDigest({ digestB64: "" }), /non-empty|base64/i);
255
+ });
256
+ test("includes metadata when provided", async () => {
257
+ const km = await makeKeys();
258
+ const ctor = await Constructor.initialize({ host: baseHost(km) });
259
+ const digest = Buffer.alloc(32, 0x77).toString("base64");
260
+ const proof = await ctor.commitDigest({
261
+ digestB64: digest,
262
+ metadata: { mode: "digest-only" },
263
+ });
264
+ assert.deepEqual(proof.metadata, { mode: "digest-only" });
265
+ });
266
+ });
267
+ //# sourceMappingURL=constructor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructor.test.js","sourceRoot":"","sources":["../../src/__tests__/constructor.test.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAahD,KAAK,UAAU,QAAQ;IACrB,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AACtD,CAAC;AAED,uEAAuE;AACvE,SAAS,QAAQ,CAAC,EAAe;IAC/B,OAAO;QACL,eAAe,EAAE,MAAe;QAChC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,2BAA2B;QACvD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,EAAE,KAAK,EAAE,IAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC;QAChE,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,cAAc;KAC5C,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,SAAS,eAAe,CAAC,EAAe;IACtC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO;QACL,eAAe,EAAE,MAAe;QAChC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,2BAA2B;QACvD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,EAAE,KAAK,EAAE,IAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC;QAChE,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,cAAc;QAC3C,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,SAAS,YAAY,CAAC,EAAe,EAAE,MAAc;IACnD,OAAO;QACL,eAAe,EAAE,MAAe;QAChC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,2BAA2B;QACvD,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACrE,IAAI,EAAE,KAAK,EAAE,IAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC;QAChE,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,cAAc;QAC3C,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;KAC/B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAqB;YAC7B,GAAG,QAAQ,CAAC,EAAE,CAAC;YACf,cAAc,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;SAC5E,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAClB,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,EAChC,kBAAkB,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAqB;YAC7B,GAAG,QAAQ,CAAC,EAAE,CAAC;YACf,YAAY,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC;QACF,MAAM,MAAM,CAAC,OAAO,CAClB,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,EAChC,kBAAkB,CACnB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,OAAO,CAClB,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC,EAChF,aAAa,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,OAAO,CAClB,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,EAC7E,YAAY,CACb,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;YACxC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACzB,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;YACxC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;SAC9B,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,IAAI,YAAY,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAE3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,qEAAqE;QACrE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;SACnC,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,iBAAiB,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,gBAAgB,EAAE,QAAQ;SAC3B,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,eAAe,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAqB;YACpC,eAAe,EAAE,MAAe;YAChC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;YAClC,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YACrE,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACrD,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,cAAc;SAC5C,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3C,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAqB;YACvC,GAAG,QAAQ,CAAC,EAAE,CAAC;YACf,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,sBAAsB;SACrE,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACpE,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3C,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;QAC1E,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB;IACzF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC,EACvD,SAAS,CACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,2CAA2C;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAC7C,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,CAAC,OAAO,CAClB,IAAI,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EACpC,mBAAmB,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;YACpC,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hello-world.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-world.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hello-world.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
+ import { describe, test } from "node:test";
3
+ import * as assert from "node:assert/strict";
4
+ describe("hello world", () => {
5
+ test("passes", () => {
6
+ assert.strictEqual("hello world", "hello world");
7
+ });
8
+ });
9
+ //# sourceMappingURL=hello-world.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-world.test.js","sourceRoot":"","sources":["../../src/__tests__/hello-world.test.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAE7C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=policy-enforcement.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-enforcement.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/policy-enforcement.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,188 @@
1
+ // Copyright (c) Mike Argento. All rights reserved. See LICENSE.
2
+ // End-to-end test for the BitGraph policy enforcement pipeline.
3
+ import { test, describe } from "node:test";
4
+ import * as assert from "node:assert/strict";
5
+ import { tmpdir } from "node:os";
6
+ import { mkdirSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { Constructor } from "../constructor.js";
9
+ import { canonicalize } from "../index.js";
10
+ import { hashPolicy, createPolicyBinding } from "../policy.js";
11
+ import { sha256 } from "@noble/hashes/sha256";
12
+ // Inline stub host for test isolation — dynamic import avoids tsc dist conflicts
13
+ async function createTestHost(statePath) {
14
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
15
+ const mod = await import("bitgraph-stub");
16
+ const StubHost = mod.StubHost ?? mod.default?.StubHost;
17
+ return StubHost.createPersistent({
18
+ statePath,
19
+ measurement: "test",
20
+ enableTime: true,
21
+ enableCounter: true,
22
+ });
23
+ }
24
+ const TEST_POLICY = `# Policy: Test Policy
25
+ version: 2.0
26
+
27
+ ## Allowed Tools
28
+ - search
29
+ - read_file
30
+
31
+ ## Limits
32
+ - max_actions: 100
33
+ - rate_limit: 10/min
34
+ `;
35
+ const TEST_POLICY_REVOKED = `# Policy: Test Policy Revoked
36
+ version: 3.0
37
+
38
+ ## Allowed Tools
39
+ - search
40
+
41
+ ## Limits
42
+ - max_actions: 50
43
+ `;
44
+ describe("Policy Enforcement Pipeline", () => {
45
+ test("policy binding is created from markdown", () => {
46
+ const binding = createPolicyBinding(TEST_POLICY);
47
+ assert.ok(binding.digestB64, "should have digestB64");
48
+ assert.equal(binding.name, "Test Policy");
49
+ assert.equal(binding.version, "2.0");
50
+ });
51
+ test("policy committed as slot 0 with binding in proof", async () => {
52
+ const testDir = join(tmpdir(), `bitgraph-test-${Date.now()}`);
53
+ mkdirSync(testDir, { recursive: true });
54
+ const stub = await createTestHost(join(testDir, "state.json"));
55
+ const constructor = await Constructor.initialize({
56
+ host: stub.host,
57
+ policy: { requireCounter: true, requireTime: true },
58
+ });
59
+ const binding = createPolicyBinding(TEST_POLICY);
60
+ const policyDigest = hashPolicy(TEST_POLICY);
61
+ const policyProof = await constructor.commitDigest({
62
+ digestB64: policyDigest,
63
+ metadata: { kind: "policy-commitment", policyName: binding.name },
64
+ policy: binding,
65
+ });
66
+ assert.ok(policyProof, "should return a proof");
67
+ assert.equal(policyProof.commit.counter, "1");
68
+ assert.ok(policyProof.policy, "proof should have policy field");
69
+ assert.equal(policyProof.policy.digestB64, policyDigest);
70
+ assert.equal(policyProof.policy.name, "Test Policy");
71
+ const proofHash = Buffer.from(sha256(canonicalize(policyProof))).toString("base64");
72
+ binding.authorProofDigestB64 = proofHash;
73
+ assert.ok(binding.authorProofDigestB64);
74
+ });
75
+ test("action proofs carry the policy binding", async () => {
76
+ const testDir = join(tmpdir(), `bitgraph-test-${Date.now()}`);
77
+ mkdirSync(testDir, { recursive: true });
78
+ const stub = await createTestHost(join(testDir, "state.json"));
79
+ const constructor = await Constructor.initialize({
80
+ host: stub.host,
81
+ policy: { requireCounter: true, requireTime: true },
82
+ });
83
+ const binding = createPolicyBinding(TEST_POLICY);
84
+ const policyDigest = hashPolicy(TEST_POLICY);
85
+ const policyProof = await constructor.commitDigest({
86
+ digestB64: policyDigest,
87
+ metadata: { kind: "policy-commitment" },
88
+ policy: binding,
89
+ });
90
+ const proofHash = Buffer.from(sha256(canonicalize(policyProof))).toString("base64");
91
+ binding.authorProofDigestB64 = proofHash;
92
+ const actionDigest = Buffer.from(sha256(new TextEncoder().encode("search:query"))).toString("base64");
93
+ const actionProof = await constructor.commitDigest({
94
+ digestB64: actionDigest,
95
+ metadata: { kind: "tool-execution", tool: "search" },
96
+ prevProofHashB64: proofHash,
97
+ policy: binding,
98
+ });
99
+ assert.ok(actionProof.policy, "action proof should have policy");
100
+ assert.equal(actionProof.policy.digestB64, policyDigest);
101
+ assert.equal(actionProof.policy.authorProofDigestB64, proofHash);
102
+ assert.equal(actionProof.commit.counter, "2");
103
+ });
104
+ test("policy revocation updates binding", async () => {
105
+ const testDir = join(tmpdir(), `bitgraph-test-${Date.now()}`);
106
+ mkdirSync(testDir, { recursive: true });
107
+ const stub = await createTestHost(join(testDir, "state.json"));
108
+ const constructor = await Constructor.initialize({
109
+ host: stub.host,
110
+ policy: { requireCounter: true, requireTime: true },
111
+ });
112
+ // Slot 0: original policy
113
+ const originalBinding = createPolicyBinding(TEST_POLICY);
114
+ const originalDigest = hashPolicy(TEST_POLICY);
115
+ const slot0Proof = await constructor.commitDigest({
116
+ digestB64: originalDigest,
117
+ metadata: { kind: "policy-commitment" },
118
+ policy: originalBinding,
119
+ });
120
+ const slot0Hash = Buffer.from(sha256(canonicalize(slot0Proof))).toString("base64");
121
+ originalBinding.authorProofDigestB64 = slot0Hash;
122
+ // Action under original policy
123
+ const action1 = await constructor.commitDigest({
124
+ digestB64: Buffer.from(sha256(new TextEncoder().encode("action1"))).toString("base64"),
125
+ metadata: { kind: "tool-execution", tool: "read_file" },
126
+ prevProofHashB64: slot0Hash,
127
+ policy: originalBinding,
128
+ });
129
+ assert.equal(action1.policy.digestB64, originalDigest);
130
+ // Revoke: commit new policy
131
+ const revokedBinding = createPolicyBinding(TEST_POLICY_REVOKED);
132
+ const revokedDigest = hashPolicy(TEST_POLICY_REVOKED);
133
+ const action1Hash = Buffer.from(sha256(canonicalize(action1))).toString("base64");
134
+ const revokeProof = await constructor.commitDigest({
135
+ digestB64: revokedDigest,
136
+ metadata: { kind: "policy-change", removed: ["read_file"] },
137
+ prevProofHashB64: action1Hash,
138
+ policy: revokedBinding,
139
+ });
140
+ const revokeHash = Buffer.from(sha256(canonicalize(revokeProof))).toString("base64");
141
+ revokedBinding.authorProofDigestB64 = revokeHash;
142
+ // Action under new (revoked) policy
143
+ const action2 = await constructor.commitDigest({
144
+ digestB64: Buffer.from(sha256(new TextEncoder().encode("action2"))).toString("base64"),
145
+ metadata: { kind: "tool-execution", tool: "search" },
146
+ prevProofHashB64: revokeHash,
147
+ policy: revokedBinding,
148
+ });
149
+ assert.equal(action2.policy.digestB64, revokedDigest);
150
+ assert.equal(action2.policy.authorProofDigestB64, revokeHash);
151
+ assert.notEqual(action2.policy.digestB64, originalDigest);
152
+ });
153
+ test("causal ordering: policy counter < action counter", async () => {
154
+ const testDir = join(tmpdir(), `bitgraph-test-${Date.now()}`);
155
+ mkdirSync(testDir, { recursive: true });
156
+ const stub = await createTestHost(join(testDir, "state.json"));
157
+ const constructor = await Constructor.initialize({
158
+ host: stub.host,
159
+ policy: { requireCounter: true, requireTime: true },
160
+ });
161
+ const binding = createPolicyBinding(TEST_POLICY);
162
+ const policyProof = await constructor.commitDigest({
163
+ digestB64: hashPolicy(TEST_POLICY),
164
+ metadata: { kind: "policy-commitment" },
165
+ policy: binding,
166
+ });
167
+ const policyCounter = BigInt(policyProof.commit.counter ?? "0");
168
+ const proofHash = Buffer.from(sha256(canonicalize(policyProof))).toString("base64");
169
+ binding.authorProofDigestB64 = proofHash;
170
+ for (let i = 1; i <= 3; i++) {
171
+ const actionProof = await constructor.commitDigest({
172
+ digestB64: Buffer.from(sha256(new TextEncoder().encode(`action-${i}`))).toString("base64"),
173
+ metadata: { kind: "tool-execution", tool: "search" },
174
+ policy: binding,
175
+ });
176
+ const actionCounter = BigInt(actionProof.commit.counter ?? "0");
177
+ assert.ok(actionCounter > policyCounter, `action ${i} counter (${actionCounter}) > policy counter (${policyCounter})`);
178
+ }
179
+ });
180
+ test("hashPolicy produces consistent digest", () => {
181
+ const digest1 = hashPolicy(TEST_POLICY);
182
+ const digest2 = hashPolicy(TEST_POLICY);
183
+ assert.equal(digest1, digest2);
184
+ const digest3 = hashPolicy(TEST_POLICY_REVOKED);
185
+ assert.notEqual(digest1, digest3);
186
+ });
187
+ });
188
+ //# sourceMappingURL=policy-enforcement.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-enforcement.test.js","sourceRoot":"","sources":["../../src/__tests__/policy-enforcement.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proof-hash-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof-hash-regression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/proof-hash-regression.test.ts"],"names":[],"mappings":""}