@xyo-network/event-kit-statement-graph 0.1.7 → 0.1.9
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/neutral/finalizedReplayChain.d.ts +16 -0
- package/dist/neutral/finalizedReplayChain.d.ts.map +1 -0
- package/dist/neutral/finalizedReplayController.d.ts +3 -2
- package/dist/neutral/finalizedReplayController.d.ts.map +1 -1
- package/dist/neutral/index.d.ts +1 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +83 -43
- package/dist/neutral/index.mjs.map +4 -4
- package/package.json +6 -6
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk';
|
|
2
|
+
type Promisable<T> = PromiseLike<T> | T;
|
|
3
|
+
/**
|
|
4
|
+
* Public XL1 viewers expose height-aware chain identity through `chainId(block)`.
|
|
5
|
+
* Fakes and older adapters may omit it, in which case replay remains deliberately
|
|
6
|
+
* restricted to a single ChainId.
|
|
7
|
+
*/
|
|
8
|
+
export interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {
|
|
9
|
+
chainId?(block: number | 'latest'): Promisable<unknown>;
|
|
10
|
+
}
|
|
11
|
+
export declare function exactFinalizedBlockHash(chain: FinalizedEventKitReplayChain, block: number, chainId: string): Promise<string>;
|
|
12
|
+
/** Validates every block actually consumed by the scanner without adding a second range read. */
|
|
13
|
+
export declare function lineageValidatingScanChain(chain: FinalizedEventKitReplayChain, chainId: string): FinalizedBlockViewer;
|
|
14
|
+
export declare function requireCurrentReplayChain(chain: FinalizedEventKitReplayChain, finalizedHead: number, chainId: string): Promise<void>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=finalizedReplayChain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalizedReplayChain.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayChain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,KAAK,UAAU,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEvC;;;;GAIG;AACH,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,OAAO,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;CACxD;AA2BD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,EACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,iGAAiG;AACjG,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,4BAA4B,EACnC,OAAO,EAAE,MAAM,GACd,oBAAoB,CAoBtB;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,4BAA4B,EACnC,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine';
|
|
2
|
-
import type { BodyReader
|
|
2
|
+
import type { BodyReader } from '@xyo-network/xl1-statement-graph-sdk';
|
|
3
|
+
import type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts';
|
|
3
4
|
import type { EventKitReplayCheckpoint, EventKitReplayCheckpointIdentity, ReplayBlockedState } from './replayCheckpoint.ts';
|
|
4
5
|
export interface EventKitReplayCheckpointStore {
|
|
5
6
|
/** Returns durable JSON-compatible checkpoint content, if one exists. */
|
|
@@ -9,7 +10,7 @@ export interface EventKitReplayCheckpointStore {
|
|
|
9
10
|
}
|
|
10
11
|
export interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {
|
|
11
12
|
readonly bodies: BodyReader;
|
|
12
|
-
readonly chain:
|
|
13
|
+
readonly chain: FinalizedEventKitReplayChain;
|
|
13
14
|
/** Maximum contiguous blocks staged before one atomic checkpoint save. */
|
|
14
15
|
readonly checkpointBatchSize?: number;
|
|
15
16
|
readonly checkpointStore: EventKitReplayCheckpointStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAMnF,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAM7E,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,kBAAkB,EAGnB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,oFAAoF;IACpF,IAAI,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,8BAA+B,SAAQ,gCAAgC;IACtF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAA;IACvD,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kCAAkC;IACjD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAChD,6EAA6E;IAC7E,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAA;IACxD,8FAA8F;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,QAAQ,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAA;IAC9C,MAAM,IAAI,6BAA6B,CAAA;IACvC,yFAAyF;IACzF,IAAI,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1F,sFAAsF;IACtF,MAAM,IAAI,oBAAoB,CAAA;CAC/B;AA0YD,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,iCAAiC,CAAC,CAwB5C;AAED,uFAAuF;AACvF,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,OAAO,GAChB,6BAA6B,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,CAazF"}
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export type { ActiveSourceWakeGrantAuthorizerOptions } from './activeSourceWakeG
|
|
|
2
2
|
export { createActiveSourceWakeGrantAuthorizer } from './activeSourceWakeGrantAuthorizer.ts';
|
|
3
3
|
export { createCheckpointStatementGraphViewer } from './checkpointViewer.ts';
|
|
4
4
|
export { EventKitClaimedObjectSchemas, EventKitClaimedObjectSchemaSet, } from './eventKitSchemaPolicy.ts';
|
|
5
|
+
export type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts';
|
|
5
6
|
export type { EventKitReplayCheckpointStore, FinalizedEventKitReplayController, FinalizedEventKitReplayOptions, FinalizedEventKitReplayStatus, FinalizedEventKitReplaySyncOptions, } from './finalizedReplayController.ts';
|
|
6
7
|
export { createFinalizedEventKitReplayController, createMemoryEventKitReplayCheckpointStore, } from './finalizedReplayController.ts';
|
|
7
8
|
export type { StatementGraphGrantReadModelOptions } from './grantReadModel.ts';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sCAAsC,EAAE,MAAM,sCAAsC,CAAA;AAClG,OAAO,EAAE,qCAAqC,EAAE,MAAM,sCAAsC,CAAA;AAC5F,OAAO,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,6BAA6B,EAC7B,iCAAiC,EACjC,8BAA8B,EAC9B,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,uCAAuC,EACvC,yCAAyC,GAC1C,MAAM,gCAAgC,CAAA;AACvC,YAAY,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAA;AAC1E,YAAY,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,iCAAiC,EACjC,0BAA0B,EAC1B,sBAAsB,EACtB,4BAA4B,EAC5B,qCAAqC,EACrC,4CAA4C,EAC5C,iCAAiC,EACjC,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,wCAAwC,EACxC,2CAA2C,EAC3C,yBAAyB,EACzB,gCAAgC,EAChC,sCAAsC,EACtC,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iDAAiD,EACjD,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,mCAAmC,EACnC,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sCAAsC,EAAE,MAAM,sCAAsC,CAAA;AAClG,OAAO,EAAE,qCAAqC,EAAE,MAAM,sCAAsC,CAAA;AAC5F,OAAO,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAA;AAC5E,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,2BAA2B,CAAA;AAClC,YAAY,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAC7E,YAAY,EACV,6BAA6B,EAC7B,iCAAiC,EACjC,8BAA8B,EAC9B,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,uCAAuC,EACvC,yCAAyC,GAC1C,MAAM,gCAAgC,CAAA;AACvC,YAAY,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAA;AAC9E,OAAO,EAAE,kCAAkC,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAA;AAC1E,YAAY,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,iCAAiC,EACjC,0BAA0B,EAC1B,sBAAsB,EACtB,4BAA4B,EAC5B,qCAAqC,EACrC,4CAA4C,EAC5C,iCAAiC,EACjC,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,wCAAwC,EACxC,2CAA2C,EAC3C,yBAAyB,EACzB,gCAAgC,EAChC,sCAAsC,EACtC,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,mCAAmC,EACnC,8CAA8C,EAC9C,iDAAiD,EACjD,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,8BAA8B,CAAA;AACrC,YAAY,EACV,wBAAwB,EACxB,gCAAgC,EAChC,4BAA4B,EAC5B,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,mCAAmC,EACnC,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,uBAAuB,CAAA"}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -217,29 +217,84 @@ var EventKitClaimedObjectSchemas = Object.freeze([
|
|
|
217
217
|
var EventKitClaimedObjectSchemaSet = new Set(EventKitClaimedObjectSchemas);
|
|
218
218
|
|
|
219
219
|
// src/finalizedReplayController.ts
|
|
220
|
-
import { HashZod as
|
|
220
|
+
import { HashZod as HashZod4 } from "@ariestools/sdk";
|
|
221
221
|
import {
|
|
222
|
-
ChainIdZod as
|
|
222
|
+
ChainIdZod as ChainIdZod3,
|
|
223
223
|
normalizeAddress as normalizeAddress3,
|
|
224
224
|
NormalizedAddressZod as NormalizedAddressZod3,
|
|
225
225
|
WakeSubscriptionAcceptanceSchema as WakeSubscriptionAcceptanceSchema2,
|
|
226
226
|
WakeSubscriptionAcceptanceZod
|
|
227
227
|
} from "@xyo-network/event-kit-schemas";
|
|
228
|
-
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk";
|
|
229
|
-
import { isBlockBoundWitness } from "@xyo-network/xl1-protocol";
|
|
230
228
|
import { STATEMENT_FOLD_VERSION as STATEMENT_FOLD_VERSION2 } from "@xyo-network/xl1-statement-graph-schemas";
|
|
231
229
|
import {
|
|
232
230
|
resolveVerifiedBodies,
|
|
233
231
|
scanFinalizedStatements
|
|
234
232
|
} from "@xyo-network/xl1-statement-graph-sdk";
|
|
235
233
|
|
|
236
|
-
// src/
|
|
234
|
+
// src/finalizedReplayChain.ts
|
|
237
235
|
import { HashZod as HashZod2 } from "@ariestools/sdk";
|
|
236
|
+
import { ChainIdZod } from "@xyo-network/event-kit-schemas";
|
|
237
|
+
import { PayloadBuilder } from "@xyo-network/sdk";
|
|
238
|
+
import { isBlockBoundWitness } from "@xyo-network/xl1-protocol";
|
|
239
|
+
async function requireBlockIdentity(chain, raw, chainId, requestedBlock) {
|
|
240
|
+
if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {
|
|
241
|
+
throw new TypeError(requestedBlock === void 0 ? "finalized block is unavailable" : `finalized block ${requestedBlock} is unavailable`);
|
|
242
|
+
}
|
|
243
|
+
const header = raw[0];
|
|
244
|
+
if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {
|
|
245
|
+
throw new TypeError("finalized block has an invalid header");
|
|
246
|
+
}
|
|
247
|
+
const block = header.block;
|
|
248
|
+
const expectedChainId = chain.chainId === void 0 ? chainId : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase());
|
|
249
|
+
if (requestedBlock !== void 0 && block !== requestedBlock || header.chain !== expectedChainId) {
|
|
250
|
+
throw new TypeError(`finalized block ${block} does not match the configured chain`);
|
|
251
|
+
}
|
|
252
|
+
return header;
|
|
253
|
+
}
|
|
254
|
+
async function exactFinalizedBlockHash(chain, block, chainId) {
|
|
255
|
+
const raw = await chain.block.blockByNumber(block);
|
|
256
|
+
const header = await requireBlockIdentity(chain, raw, chainId, block);
|
|
257
|
+
const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header));
|
|
258
|
+
const storageHash = header._hash;
|
|
259
|
+
if (typeof storageHash === "string" && storageHash !== hash) {
|
|
260
|
+
throw new TypeError(`finalized block ${block} has invalid storage hash metadata`);
|
|
261
|
+
}
|
|
262
|
+
return HashZod2.parse(hash);
|
|
263
|
+
}
|
|
264
|
+
function lineageValidatingScanChain(chain, chainId) {
|
|
265
|
+
return {
|
|
266
|
+
block: {
|
|
267
|
+
async blockByNumber(block) {
|
|
268
|
+
const raw = await chain.block.blockByNumber(block);
|
|
269
|
+
await requireBlockIdentity(chain, raw, chainId, block);
|
|
270
|
+
return raw;
|
|
271
|
+
},
|
|
272
|
+
...chain.block.blocksByNumber === void 0 ? {} : {
|
|
273
|
+
async blocksByNumber(high, count) {
|
|
274
|
+
const values = await chain.block.blocksByNumber?.(high, count) ?? [];
|
|
275
|
+
for (const value of values) await requireBlockIdentity(chain, value, chainId);
|
|
276
|
+
return values;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
finalization: chain.finalization
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
async function requireCurrentReplayChain(chain, finalizedHead, chainId) {
|
|
284
|
+
if (chain.chainId === void 0) return;
|
|
285
|
+
const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase());
|
|
286
|
+
if (headChainId !== chainId) {
|
|
287
|
+
throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// src/replayCheckpoint.ts
|
|
292
|
+
import { HashZod as HashZod3 } from "@ariestools/sdk";
|
|
238
293
|
import {
|
|
239
|
-
ChainIdZod,
|
|
294
|
+
ChainIdZod as ChainIdZod2,
|
|
240
295
|
NormalizedAddressZod as NormalizedAddressZod2
|
|
241
296
|
} from "@xyo-network/event-kit-schemas";
|
|
242
|
-
import { PayloadBuilder } from "@xyo-network/sdk";
|
|
297
|
+
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk";
|
|
243
298
|
import {
|
|
244
299
|
AppliedEventRecordZod,
|
|
245
300
|
BlockNumberZod,
|
|
@@ -254,7 +309,7 @@ import { z } from "zod";
|
|
|
254
309
|
var EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3;
|
|
255
310
|
var ResolvedReplayBodyZod = z.strictObject({
|
|
256
311
|
body: z.record(z.string(), z.unknown()),
|
|
257
|
-
hash:
|
|
312
|
+
hash: HashZod3
|
|
258
313
|
});
|
|
259
314
|
var ReplayCorruptBodyZod = z.strictObject({
|
|
260
315
|
claimedHash: z.string().optional(),
|
|
@@ -263,19 +318,19 @@ var ReplayCorruptBodyZod = z.strictObject({
|
|
|
263
318
|
var ReplayBlockedStateZod = z.strictObject({
|
|
264
319
|
atBlock: BlockNumberZod,
|
|
265
320
|
corrupt: z.array(ReplayCorruptBodyZod),
|
|
266
|
-
objectHashes: z.array(
|
|
321
|
+
objectHashes: z.array(HashZod3),
|
|
267
322
|
unresolvedEvents: z.array(UnresolvedEventReferenceZod)
|
|
268
323
|
});
|
|
269
324
|
var EventKitReplayCheckpointZod = z.strictObject({
|
|
270
325
|
applied: z.array(AppliedEventRecordZod),
|
|
271
326
|
blocked: ReplayBlockedStateZod.optional(),
|
|
272
327
|
bodies: z.array(ResolvedReplayBodyZod),
|
|
273
|
-
chainId:
|
|
328
|
+
chainId: ChainIdZod2,
|
|
274
329
|
finalizedHead: BlockNumberZod,
|
|
275
330
|
floorBlock: BlockNumberZod,
|
|
276
331
|
foldVersion: z.literal(STATEMENT_FOLD_VERSION),
|
|
277
332
|
indexedThrough: z.union([BlockNumberZod, z.null()]),
|
|
278
|
-
indexedThroughHash: z.union([
|
|
333
|
+
indexedThroughHash: z.union([HashZod3, z.null()]),
|
|
279
334
|
network: z.string().min(1),
|
|
280
335
|
objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map((schema) => z.literal(schema))),
|
|
281
336
|
publisher: NormalizedAddressZod2,
|
|
@@ -284,7 +339,7 @@ var EventKitReplayCheckpointZod = z.strictObject({
|
|
|
284
339
|
version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION)
|
|
285
340
|
});
|
|
286
341
|
var LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({
|
|
287
|
-
chainId:
|
|
342
|
+
chainId: ChainIdZod2,
|
|
288
343
|
floorBlock: BlockNumberZod,
|
|
289
344
|
network: z.string().min(1),
|
|
290
345
|
publisher: NormalizedAddressZod2,
|
|
@@ -522,7 +577,7 @@ async function persistedBodyIntegrityError(checkpoint) {
|
|
|
522
577
|
for (const entry of checkpoint.bodies) {
|
|
523
578
|
let computedHash;
|
|
524
579
|
try {
|
|
525
|
-
computedHash = await
|
|
580
|
+
computedHash = await PayloadBuilder2.dataHash(entry.body);
|
|
526
581
|
} catch {
|
|
527
582
|
return `persisted body ${entry.hash} cannot be hashed`;
|
|
528
583
|
}
|
|
@@ -558,7 +613,7 @@ async function loadEventKitReplayCheckpoint(value, identity) {
|
|
|
558
613
|
|
|
559
614
|
// src/finalizedReplayController.ts
|
|
560
615
|
var DEFAULT_CHECKPOINT_BATCH_SIZE = 4096;
|
|
561
|
-
var DEFAULT_SCAN_BATCH_SIZE =
|
|
616
|
+
var DEFAULT_SCAN_BATCH_SIZE = 16;
|
|
562
617
|
function requireHead(value) {
|
|
563
618
|
const head = Number(value);
|
|
564
619
|
if (!Number.isSafeInteger(head) || head < 0) {
|
|
@@ -646,23 +701,7 @@ function mergeBodies(existing, additions) {
|
|
|
646
701
|
}
|
|
647
702
|
merged.set(hash, body);
|
|
648
703
|
}
|
|
649
|
-
return [...merged].map(([hash, body]) => ({ body, hash:
|
|
650
|
-
}
|
|
651
|
-
async function exactBlockHash(chain, block, chainId) {
|
|
652
|
-
const raw = await chain.block.blockByNumber(block);
|
|
653
|
-
if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {
|
|
654
|
-
throw new TypeError(`finalized block ${block} is unavailable`);
|
|
655
|
-
}
|
|
656
|
-
const header = raw[0];
|
|
657
|
-
if (!isBlockBoundWitness(header) || header.block !== block || header.chain !== chainId) {
|
|
658
|
-
throw new TypeError(`finalized block ${block} does not match the configured chain`);
|
|
659
|
-
}
|
|
660
|
-
const hash = await PayloadBuilder2.hash(PayloadBuilder2.omitStorageMeta(header));
|
|
661
|
-
const storageHash = header._hash;
|
|
662
|
-
if (typeof storageHash === "string" && storageHash !== hash) {
|
|
663
|
-
throw new TypeError(`finalized block ${block} has invalid storage hash metadata`);
|
|
664
|
-
}
|
|
665
|
-
return HashZod3.parse(hash);
|
|
704
|
+
return [...merged].map(([hash, body]) => ({ body, hash: HashZod4.parse(hash) })).toSorted((left, right) => left.hash.localeCompare(right.hash));
|
|
666
705
|
}
|
|
667
706
|
async function stageAppliedBlock(options, applied) {
|
|
668
707
|
const appliedObjectHashes = uniqueStrings(applied.map((record) => record.objectHash));
|
|
@@ -689,7 +728,7 @@ async function stageAppliedBlock(options, applied) {
|
|
|
689
728
|
...missingObjects,
|
|
690
729
|
...schemaMismatchedObjects,
|
|
691
730
|
...missingAttachments
|
|
692
|
-
]).map((hash) =>
|
|
731
|
+
]).map((hash) => HashZod4.parse(hash));
|
|
693
732
|
return {
|
|
694
733
|
bodies: new Map([...objects.bodies, ...attachments.bodies]),
|
|
695
734
|
corrupt,
|
|
@@ -698,10 +737,10 @@ async function stageAppliedBlock(options, applied) {
|
|
|
698
737
|
}
|
|
699
738
|
async function stageRange(options, prior, fromBlock, throughBlock, signal) {
|
|
700
739
|
signal?.throwIfAborted();
|
|
701
|
-
const beforeHash = await
|
|
740
|
+
const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId);
|
|
702
741
|
signal?.throwIfAborted();
|
|
703
742
|
const result = await scanFinalizedStatements(
|
|
704
|
-
options.chain,
|
|
743
|
+
lineageValidatingScanChain(options.chain, options.chainId),
|
|
705
744
|
options.bodies,
|
|
706
745
|
replayContract(options, throughBlock),
|
|
707
746
|
{
|
|
@@ -713,7 +752,7 @@ async function stageRange(options, prior, fromBlock, throughBlock, signal) {
|
|
|
713
752
|
}
|
|
714
753
|
);
|
|
715
754
|
signal?.throwIfAborted();
|
|
716
|
-
const throughHash = await
|
|
755
|
+
const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId);
|
|
717
756
|
signal?.throwIfAborted();
|
|
718
757
|
if (beforeHash !== throughHash) {
|
|
719
758
|
throw new Error(`finalized block root changed while staging through ${throughBlock}`);
|
|
@@ -822,11 +861,11 @@ var DefaultFinalizedEventKitReplayController = class {
|
|
|
822
861
|
return false;
|
|
823
862
|
}
|
|
824
863
|
async #commitStaged(staged, throughBlock, finalizedHead, signal) {
|
|
864
|
+
const { blocked: _blocked, ...unblocked } = this.#checkpoint;
|
|
825
865
|
const committed = EventKitReplayCheckpointZod.parse({
|
|
826
|
-
...
|
|
866
|
+
...unblocked,
|
|
827
867
|
applied: mergeApplied(this.#checkpoint.applied, staged.applied),
|
|
828
868
|
bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),
|
|
829
|
-
blocked: void 0,
|
|
830
869
|
finalizedHead,
|
|
831
870
|
indexedThrough: throughBlock,
|
|
832
871
|
indexedThroughHash: staged.throughHash,
|
|
@@ -842,6 +881,7 @@ var DefaultFinalizedEventKitReplayController = class {
|
|
|
842
881
|
signal?.throwIfAborted();
|
|
843
882
|
const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber());
|
|
844
883
|
signal?.throwIfAborted();
|
|
884
|
+
await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId);
|
|
845
885
|
if (finalizedHead < this.#checkpoint.finalizedHead) {
|
|
846
886
|
throw new RangeError(
|
|
847
887
|
`finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`
|
|
@@ -881,7 +921,7 @@ var DefaultFinalizedEventKitReplayController = class {
|
|
|
881
921
|
async function createFinalizedEventKitReplayController(rawOptions) {
|
|
882
922
|
const options = {
|
|
883
923
|
...rawOptions,
|
|
884
|
-
chainId:
|
|
924
|
+
chainId: ChainIdZod3.parse(rawOptions.chainId),
|
|
885
925
|
checkpointBatchSize: requirePositiveInteger(
|
|
886
926
|
rawOptions.checkpointBatchSize,
|
|
887
927
|
DEFAULT_CHECKPOINT_BATCH_SIZE,
|
|
@@ -918,7 +958,7 @@ function createMemoryEventKitReplayCheckpointStore(initial) {
|
|
|
918
958
|
}
|
|
919
959
|
|
|
920
960
|
// src/grantReadModel.ts
|
|
921
|
-
import { HashZod as
|
|
961
|
+
import { HashZod as HashZod5 } from "@ariestools/sdk";
|
|
922
962
|
import { XyoAddressZod } from "@xyo-network/sdk-protocol/address";
|
|
923
963
|
function createStatementGraphGrantReadModel(options) {
|
|
924
964
|
const { viewer } = options;
|
|
@@ -931,7 +971,7 @@ function createStatementGraphGrantReadModel(options) {
|
|
|
931
971
|
return Object.freeze(records.map(toGrantClaim));
|
|
932
972
|
},
|
|
933
973
|
async object(objectHash) {
|
|
934
|
-
const record = await viewer.object(
|
|
974
|
+
const record = await viewer.object(HashZod5.parse(objectHash));
|
|
935
975
|
return record === void 0 ? void 0 : toGrantObject(record);
|
|
936
976
|
}
|
|
937
977
|
});
|
|
@@ -940,7 +980,7 @@ function toClaimQuery(query) {
|
|
|
940
980
|
if (query === void 0) return void 0;
|
|
941
981
|
return {
|
|
942
982
|
...query.declaredObjectSchemaPrefix === void 0 ? {} : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix },
|
|
943
|
-
...query.objectHash === void 0 ? {} : { objectHash:
|
|
983
|
+
...query.objectHash === void 0 ? {} : { objectHash: HashZod5.parse(query.objectHash) },
|
|
944
984
|
...query.subject === void 0 ? {} : { subject: XyoAddressZod.parse(query.subject) }
|
|
945
985
|
};
|
|
946
986
|
}
|
|
@@ -993,7 +1033,7 @@ import {
|
|
|
993
1033
|
selectPublisherService
|
|
994
1034
|
} from "@xyo-network/event-kit-protocol";
|
|
995
1035
|
import {
|
|
996
|
-
ChainIdZod as
|
|
1036
|
+
ChainIdZod as ChainIdZod4,
|
|
997
1037
|
NormalizedAddressZod as NormalizedAddressZod4,
|
|
998
1038
|
PublisherEncryptionKeyRevocationSchema as PublisherEncryptionKeyRevocationSchema2,
|
|
999
1039
|
PublisherEncryptionKeyRevocationZod,
|
|
@@ -1201,7 +1241,7 @@ function hasPendingPublisherService(catalogs, query) {
|
|
|
1201
1241
|
async function discoverHandshakeService(options, rawQuery) {
|
|
1202
1242
|
const query = {
|
|
1203
1243
|
...rawQuery,
|
|
1204
|
-
chainId:
|
|
1244
|
+
chainId: ChainIdZod4.parse(rawQuery.chainId),
|
|
1205
1245
|
eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND2,
|
|
1206
1246
|
publisher: NormalizedAddressZod4.parse(rawQuery.publisher)
|
|
1207
1247
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/activeSourceWakeGrantAuthorizer.ts", "../../src/checkpointViewer.ts", "../../src/eventKitSchemaPolicy.ts", "../../src/finalizedReplayController.ts", "../../src/replayCheckpoint.ts", "../../src/grantReadModel.ts", "../../src/handshakeReadModel.ts", "../../src/handshakeCatalog.ts", "../../src/publisherSubjectViewer.ts", "../../src/subscriptionLifecycleView.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.authorizationChainId !== binding.route.authorizationChainId\n || !service.events.some(event => wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims([...claims.values()])\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n async claimsByObject(objectHash: StatementObjectHash): Promise<ClaimRecord[]> {\n return claims.filter(record => record.objectHash === objectHash)\n },\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n async event(txHash: string, eventHash: string): Promise<AppliedEventRecord[]> {\n return applied.filter(record => record.txHash === txHash && record.eventHash === eventHash)\n },\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n return {\n claims: new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash))).size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n async unresolved(txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> {\n return unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash)\n },\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n FinalizedBlockViewer,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedBlockViewer\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\nconst DEFAULT_SCAN_BATCH_SIZE = 4096\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: null,\n indexedThroughHash: null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n return [...new Map(records.map(record => [corruptKey(record), record])).values()]\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values)]\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return [...merged.values()].toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return [...merged]\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function exactBlockHash(\n chain: FinalizedBlockViewer,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(`finalized block ${block} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || header.block !== block || header.chain !== chainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([...objects.bodies, ...attachments.bodies]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n options.chain,\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevantBlocks = [...new Set([...appliedByBlock.keys(), ...unresolvedByBlock.keys()])].toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const result = this.#syncTail.then(async () => await this.#syncOnce(options))\n this.#syncTail = result.then(\n () => true,\n () => false,\n )\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt === throughBlock\n ? false\n : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const committed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n blocked: undefined,\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = budget === 0 ? next - 1 : next + budget - 1\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n async load(): Promise<unknown> {\n return value\n },\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`\n return undefined\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords([...records.values()])\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n if (candidate === undefined) return false\n return record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && record.objectHash === candidate.objectHash\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n if (indexedThrough === null && checkpoint.bodies.length > 0) {\n return 'resolved bodies exist before floorBlock has been indexed'\n }\n return undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n if (scan.watermark !== undefined && scan.watermark.block > indexedThrough) {\n return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n }\n return watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const actualKeys = [...new Set(watermarkGroupEventKeys)].toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const expectedKeys = [...new Set(group.map(eventKey))].toSorted()\n if (expectedKeys.some(key => !actualKeys.includes(key))) {\n return 'scan watermark group event keys omit publisher applied-event history'\n }\n return undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock)) {\n return 'blocked unresolved event does not belong to blocked block'\n }\n return undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n if (integrityError !== undefined) return { detail: integrityError, status: 'corrupt' }\n return { checkpoint, status: 'valid' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n async head(): Promise<number> {\n return await viewer.head()\n },\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n const tupleBlock = subscriptionRecord.block\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const sources = candidateSources === undefined\n ? [...new Set((await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source))]\n .filter(source => !isPublisherSubject(source, query.publisher))\n : [...new Set(candidateSources)]\n .filter(source => !isPublisherSubject(source, query.publisher))\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: [...tuples.values()] }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = [...discovery.catalogs.serviceByHash.values()].filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n async discoverPublisherService(query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> {\n return (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result\n },\n\n async publisher(query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> {\n return handshakeView(await handshakeLifecycle(options, query))\n },\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return [...result.values()]\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: [...keyByHash.values()].map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })),\n serviceByHash,\n serviceLifecycles: [...serviceByHash.values()].map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery) {\n return await filterClaims(viewer.claims(source, claimQuery(query)))\n },\n async claimsByObject(objectHash: StatementObjectHash) {\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash })))\n },\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery) {\n if (!isPublisherSubject(subject, publisher)) return []\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))\n },\n async event(txHash: string, eventHash: string) {\n return await filterEvents(viewer.event(txHash, eventHash))\n },\n async events(source: StatementSource, query?: AppliedEventQuery) {\n return await filterEvents(viewer.events(source, eventQuery(query)))\n },\n async head() {\n return await viewer.head()\n },\n async object(objectHash: StatementObjectHash) {\n return await viewer.object(objectHash)\n },\n async source(source: StatementSource) {\n return await viewer.source(source)\n },\n async unresolved(txHash: string, eventHash: string) {\n return await viewer.unresolved(txHash, eventHash)\n },\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)) {\n return 'revoked'\n }\n if (tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return 'expired'\n return 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["tuple", "HashZod", "ChainIdZod", "normalizeAddress", "NormalizedAddressZod", "WakeSubscriptionAcceptanceSchema", "
|
|
3
|
+
"sources": ["../../src/activeSourceWakeGrantAuthorizer.ts", "../../src/checkpointViewer.ts", "../../src/eventKitSchemaPolicy.ts", "../../src/finalizedReplayController.ts", "../../src/finalizedReplayChain.ts", "../../src/replayCheckpoint.ts", "../../src/grantReadModel.ts", "../../src/handshakeReadModel.ts", "../../src/handshakeCatalog.ts", "../../src/publisherSubjectViewer.ts", "../../src/subscriptionLifecycleView.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.authorizationChainId !== binding.route.authorizationChainId\n || !service.events.some(event => wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims([...claims.values()])\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n async claimsByObject(objectHash: StatementObjectHash): Promise<ClaimRecord[]> {\n return claims.filter(record => record.objectHash === objectHash)\n },\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n async event(txHash: string, eventHash: string): Promise<AppliedEventRecord[]> {\n return applied.filter(record => record.txHash === txHash && record.eventHash === eventHash)\n },\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n return {\n claims: new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash))).size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n async unresolved(txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> {\n return unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash)\n },\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts'\nimport {\n exactFinalizedBlockHash,\n lineageValidatingScanChain,\n requireCurrentReplayChain,\n} from './finalizedReplayChain.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedEventKitReplayChain\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\n// The public REST viewer may implement a bulk range as concurrent per-block\n// requests. Stay within the resident publisher's default bounded HTTP budget.\nconst DEFAULT_SCAN_BATCH_SIZE = 16\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: null,\n indexedThroughHash: null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n return [...new Map(records.map(record => [corruptKey(record), record])).values()]\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values)]\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return [...merged.values()].toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return [...merged]\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([...objects.bodies, ...attachments.bodies]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n lineageValidatingScanChain(options.chain, options.chainId),\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevantBlocks = [...new Set([...appliedByBlock.keys(), ...unresolvedByBlock.keys()])].toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const result = this.#syncTail.then(async () => await this.#syncOnce(options))\n this.#syncTail = result.then(\n () => true,\n () => false,\n )\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt === throughBlock\n ? false\n : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const { blocked: _blocked, ...unblocked } = this.#checkpoint\n const committed = EventKitReplayCheckpointZod.parse({\n ...unblocked,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId)\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = budget === 0 ? next - 1 : next + budget - 1\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n async load(): Promise<unknown> {\n return value\n },\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport { ChainIdZod } from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk'\n\ntype Promisable<T> = PromiseLike<T> | T\n\n/**\n * Public XL1 viewers expose height-aware chain identity through `chainId(block)`.\n * Fakes and older adapters may omit it, in which case replay remains deliberately\n * restricted to a single ChainId.\n */\nexport interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {\n chainId?(block: number | 'latest'): Promisable<unknown>\n}\n\nasync function requireBlockIdentity(\n chain: FinalizedEventKitReplayChain,\n raw: unknown,\n chainId: string,\n requestedBlock?: number,\n) {\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(requestedBlock === undefined\n ? 'finalized block is unavailable'\n : `finalized block ${requestedBlock} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {\n throw new TypeError('finalized block has an invalid header')\n }\n const block = header.block\n const expectedChainId = chain.chainId === undefined\n ? chainId\n : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase())\n if ((requestedBlock !== undefined && block !== requestedBlock) || header.chain !== expectedChainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n return header\n}\n\nexport async function exactFinalizedBlockHash(\n chain: FinalizedEventKitReplayChain,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\n/** Validates every block actually consumed by the scanner without adding a second range read. */\nexport function lineageValidatingScanChain(\n chain: FinalizedEventKitReplayChain,\n chainId: string,\n): FinalizedBlockViewer {\n return {\n block: {\n async blockByNumber(block) {\n const raw = await chain.block.blockByNumber(block)\n await requireBlockIdentity(chain, raw, chainId, block)\n return raw\n },\n ...(chain.block.blocksByNumber === undefined\n ? {}\n : {\n async blocksByNumber(high: number, count: number) {\n const values = await chain.block.blocksByNumber?.(high, count) ?? []\n for (const value of values) await requireBlockIdentity(chain, value, chainId)\n return values\n },\n }),\n },\n finalization: chain.finalization,\n }\n}\n\nexport async function requireCurrentReplayChain(\n chain: FinalizedEventKitReplayChain,\n finalizedHead: number,\n chainId: string,\n): Promise<void> {\n if (chain.chainId === undefined) return\n const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase())\n if (headChainId !== chainId) {\n throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`)\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`\n return undefined\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords([...records.values()])\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n if (candidate === undefined) return false\n return record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && record.objectHash === candidate.objectHash\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n if (indexedThrough === null && checkpoint.bodies.length > 0) {\n return 'resolved bodies exist before floorBlock has been indexed'\n }\n return undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n if (scan.watermark !== undefined && scan.watermark.block > indexedThrough) {\n return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n }\n return watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const actualKeys = [...new Set(watermarkGroupEventKeys)].toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const expectedKeys = [...new Set(group.map(eventKey))].toSorted()\n if (expectedKeys.some(key => !actualKeys.includes(key))) {\n return 'scan watermark group event keys omit publisher applied-event history'\n }\n return undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock)) {\n return 'blocked unresolved event does not belong to blocked block'\n }\n return undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n if (integrityError !== undefined) return { detail: integrityError, status: 'corrupt' }\n return { checkpoint, status: 'valid' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n async head(): Promise<number> {\n return await viewer.head()\n },\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n const tupleBlock = subscriptionRecord.block\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const sources = candidateSources === undefined\n ? [...new Set((await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source))]\n .filter(source => !isPublisherSubject(source, query.publisher))\n : [...new Set(candidateSources)]\n .filter(source => !isPublisherSubject(source, query.publisher))\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: [...tuples.values()] }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = [...discovery.catalogs.serviceByHash.values()].filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n async discoverPublisherService(query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> {\n return (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result\n },\n\n async publisher(query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> {\n return handshakeView(await handshakeLifecycle(options, query))\n },\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return [...result.values()]\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: [...keyByHash.values()].map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })),\n serviceByHash,\n serviceLifecycles: [...serviceByHash.values()].map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery) {\n return await filterClaims(viewer.claims(source, claimQuery(query)))\n },\n async claimsByObject(objectHash: StatementObjectHash) {\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash })))\n },\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery) {\n if (!isPublisherSubject(subject, publisher)) return []\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))\n },\n async event(txHash: string, eventHash: string) {\n return await filterEvents(viewer.event(txHash, eventHash))\n },\n async events(source: StatementSource, query?: AppliedEventQuery) {\n return await filterEvents(viewer.events(source, eventQuery(query)))\n },\n async head() {\n return await viewer.head()\n },\n async object(objectHash: StatementObjectHash) {\n return await viewer.object(objectHash)\n },\n async source(source: StatementSource) {\n return await viewer.source(source)\n },\n async unresolved(txHash: string, eventHash: string) {\n return await viewer.unresolved(txHash, eventHash)\n },\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)) {\n return 'revoked'\n }\n if (tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return 'expired'\n return 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
|
|
5
|
+
"mappings": ";AAOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwBP,SAAS,iBACP,eACA,SACA,cACA;AACA,QAAM,SAAS,cAAc,OAAO,kBAAgB,aAAa,eAAe,QAAQ,MAAM,cACzF,aAAa,UAAU,YACvB,aAAa,yBAAyB,QAAQ,MAAM,oBACpD,aAAa,oBAAoB,UACjC,aAAa,mBAAmB,gBAChC,aAAa,YAAY,KAAK,iBAAiB,QAAQ,MAAM,oBAC7D,aAAa,WAAW,KAAK,YAAY,QAAQ,eACjD,aAAa,WAAW,KAAK,UAAU,QAAQ,aAC/C,aAAa,WAAW,SAAS,WAAW,QAAQ,SAAS;AAClE,MAAI,OAAO,WAAW,EAAG;AACzB,QAAM,WAAW,OAAO,CAAC;AACzB,QAAM,SAAS,SAAS,OAAO,OAAO,CAAAA,WAASA,OAAM,aAAa,eAAe,QAAQ,MAAM,oBAC1FA,OAAM,eAAe,QAAQ,MAAM,cACnCA,OAAM,MAAM,eAAe,QAAQ,aACnCA,OAAM,MAAM,KAAK,cAAc,QAAQ,aACvCA,OAAM,MAAM,KAAK,iBAAiB,QAAQ,MAAM,gBAChDA,OAAM,MAAM,KAAK,YAAY,QAAQ,MAAM,WAC3CA,OAAM,QAAQ,eAAe,QAAQ,eACrCA,OAAM,aAAa,KAAK,cAAc,QAAQ,aAC9CA,OAAM,aAAa,KAAK,YAAY,QAAQ,MAAM,wBAClDA,OAAM,aAAa,KAAK,cAAc,0BACtCA,OAAM,aAAa,KAAK,iBAAiB,YAAY;AAC1D,MAAI,OAAO,WAAW,EAAG;AACzB,QAAM,QAAQ,OAAO,CAAC;AACtB,QAAM,UAAU,MAAM,QAAQ;AAC9B,MAAI,QAAQ,yBAAyB,QAAQ,MAAM,wBAC9C,CAAC,QAAQ,OAAO,KAAK,WAAS,iBAAiB,MAAM,QAAQ,QAAQ,MAAM,MAAM,CAAC,EAAG;AAC1F,SAAO,EAAE,UAAU,MAAM;AAC3B;AAOO,SAAS,sCACd,SACqB;AACrB,QAAM,cAAc,sBAAsB,MAAM,QAAQ,KAAK;AAC7D,QAAM,UAA6B,OAAO,OAAO;AAAA,IAC/C,OAAO,OAAO,OAAO,EAAE,GAAG,aAAa,QAAQ,OAAO,OAAO,YAAY,MAAM,EAAE,CAAC;AAAA,IAClF,WAAW,qBAAqB,MAAM,QAAQ,SAAS;AAAA,IACvD,aAAa,QAAQ,MAAM,QAAQ,WAAW;AAAA,IAC9C,WAAW,QAAQ,MAAM,QAAQ,SAAS;AAAA,EAC5C,CAAC;AACD,QAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,SAAO,wCAAwC;AAAA,IAC7C,sBAAsB,QAAQ,MAAM;AAAA,IACpC,QAAQ,QAAQ,MAAM;AAAA,IACtB;AAAA,IACA,YAAY;AAAA,MACV,MAAM,KAAK,SAA+F;AACxG,YAAI,QAAQ,cAAc,QAAQ,aAC7B,QAAQ,eAAe,QAAQ,MAAM,cACrC,QAAQ,iBAAiB,QAAQ,MAAM,gBACvC,QAAQ,YAAY,QAAQ,MAAM,WAClC,QAAQ,qBAAqB,QAAQ,MAAM,oBAC3C,QAAQ,eAAe,QAAQ,MAAM,WAAY,QAAO;AAC7D,cAAM,aAAa,MAAM,qBAAqB;AAAA,UAC5C,QAAQ;AAAA,UACR,QAAQ,QAAQ,MAAM;AAAA,UACtB,cAAc,QAAQ,MAAM;AAAA,UAC5B,qBAAqB,QAAQ,MAAM;AAAA,QACrC,CAAC;AACD,YAAI,eAAe,QAAQ,MAAM,WAAY,OAAM,IAAI,UAAU,gDAAgD;AACjH,YAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,aAAc,OAAM,IAAI,MAAM,uDAAuD;AACzH,cAAM,OAAO,MAAM,UAAU,WAAW;AAAA,UACtC,SAAS,QAAQ,MAAM;AAAA,UACvB,WAAW;AAAA,UACX,eAAe,QAAQ;AAAA,UACvB,WAAW,QAAQ;AAAA,UACnB,YAAY,QAAQ,MAAM;AAAA,QAC5B,CAAC;AACD,YAAI,CAAC,KAAK,MAAM,KAAK,kBAAkB,QAAQ,gBAAgB,KAAK,mBAAmB,QAAQ,cAAc;AAC3G,gBAAM,IAAI,MAAM,8DAA8D;AAAA,QAChF;AACA,cAAM,QAAQ,iBAAiB,KAAK,eAAe,SAAS,QAAQ,YAAY;AAChF,YAAI,UAAU,OAAW,QAAO;AAChC,YAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,aAAc,OAAM,IAAI,MAAM,mDAAmD;AACrH,cAAM,kBAAkB,MAAM,SAAS;AACvC,YAAI,oBAAoB,OAAW,QAAO;AAC1C,eAAO;AAAA,UACL,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,gBAAgB,MAAM,MAAM,aAAa,KAAK;AAAA,UAC9C,sBAAsB,QAAQ,MAAM;AAAA,UACpC,YAAY,QAAQ,MAAM;AAAA,UAC1B,WAAW,QAAQ;AAAA,UACnB,cAAc,QAAQ,MAAM;AAAA,UAC5B,GAAI,QAAQ,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,MAAM,QAAQ;AAAA,UAChF,YAAY,MAAM,eAAe,QAAQ,MAAM,MAAM;AAAA,UACrD;AAAA,UACA,kBAAkB,QAAQ,MAAM;AAAA,UAChC,aAAa,QAAQ;AAAA,UACrB,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AClIA,SAAS,SAAS,QAAkE;AAClF,SAAO,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS;AAC7C;AAEA,SAAS,UAAU,QAAgF;AACjG,SAAO,GAAG,SAAS,MAAM,CAAC,IAAI,OAAO,SAAS;AAChD;AAEA,SAAS,eAAe,MAA0B,OAAmC;AACnF,SAAO,KAAK,QAAQ,MAAM,SACrB,KAAK,kBAAkB,KAAK,MAAM,kBAAkB,MACpD,KAAK,kBAAkB,QAAQ,MAAM,kBAAkB,SACvD,KAAK,YAAY,MAAM,aACvB,UAAU,IAAI,EAAE,cAAc,UAAU,KAAK,CAAC;AACrD;AAEA,IAAM,mBAAmB;AAEzB,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,iBAAiB,KAAK,KAAK,IAAI,MAAM,YAAY,IAAI;AAC9D;AAEA,SAAS,SAAS,QAAgB,SAAiB,YAA4B;AAC7E,SAAO,GAAG,iBAAiB,MAAM,CAAC,IAAI,iBAAiB,OAAO,CAAC,IAAI,UAAU;AAC/E;AAEA,SAAS,aAAa,QAAqB,OAA6B;AACtE,UAAQ,OAAO,eAAe,UAAa,OAAO,eAAe,MAAM,gBACjE,OAAO,YAAY,UAAa,iBAAiB,OAAO,OAAO,MAAM,iBAAiB,MAAM,OAAO,OACnG,OAAO,+BAA+B,UACrC,OAAO,qBAAqB,WAAW,MAAM,0BAA0B;AAChF;AAEA,SAAS,WAAW,SAAuC;AACzD,SAAO,QAAQ,SAAS,CAAC,MAAM,UAC7B,SAAS,KAAK,QAAQ,KAAK,SAAS,KAAK,UAAU,EAChD,cAAc,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,CAAC,CAAC;AAC7E;AAEA,SAAS,YAAY,SAAuD;AAC1E,QAAM,SAAS,oBAAI,IAAyB;AAC5C,aAAW,UAAU,QAAQ,SAAS,cAAc,GAAG;AACrD,UAAM,MAAM,SAAS,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU;AACrE,UAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,QAAI,UAAU,QAAW;AACvB,aAAO,IAAI,KAAK;AAAA,QACd,sBAAsB,OAAO;AAAA,QAC7B,YAAY,OAAO;AAAA,QACnB,gBAAgB,OAAO;AAAA,QACvB,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,QACnB,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,OAAO,QAAQ,MAAM,WAAW;AACzC,aAAO,IAAI,KAAK,EAAE,GAAG,OAAO,WAAW,OAAO,MAAM,CAAC;AAAA,IACvD;AAAA,EACF;AACA,SAAO,WAAW,CAAC,GAAG,OAAO,OAAO,CAAC,CAAC;AACxC;AAEA,SAAS,cAAc,MAAkE;AACvF,SAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ,CAAC;AACpF;AAGO,SAAS,qCACd,YACsB;AACtB,QAAM,UAAU,WAAW,QAAQ,SAAS,cAAc;AAC1D,QAAM,SAAS,YAAY,OAAO;AAClC,QAAM,SAAS,IAAI,IAAI,WAAW,OAAO,IAAI,WAAS,CAAC,MAAM,MAAM,MAAM,IAAI,CAAU,CAAC;AACxF,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,gBAAgB,IAAI,OAAO,UAAU,EAAG,iBAAgB,IAAI,OAAO,YAAY,OAAO,YAAY;AAAA,EACzG;AACA,QAAM,aAAa,WAAW,SAAS,oBAAoB,CAAC;AAE5D,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,OAAO,QAAyB,OAA4C;AAChF,YAAM,aAAa,iBAAiB,MAAM;AAC1C,aAAO,OAAO,OAAO,YAAU,iBAAiB,OAAO,MAAM,MAAM,cAAc,aAAa,QAAQ,KAAK,CAAC;AAAA,IAC9G;AAAA,IAEA,MAAM,eAAe,YAAyD;AAC5E,aAAO,OAAO,OAAO,YAAU,OAAO,eAAe,UAAU;AAAA,IACjE;AAAA,IAEA,MAAM,gBAAgB,SAA2B,OAA4C;AAC3F,YAAM,aAAa,iBAAiB,OAAO;AAC3C,aAAO,OAAO,OAAO,YAAU,iBAAiB,OAAO,OAAO,MAAM,cAAc,aAAa,QAAQ,KAAK,CAAC;AAAA,IAC/G;AAAA,IAEA,MAAM,MAAM,QAAgB,WAAkD;AAC5E,aAAO,QAAQ,OAAO,YAAU,OAAO,WAAW,UAAU,OAAO,cAAc,SAAS;AAAA,IAC5F;AAAA,IAEA,MAAM,OAAO,QAAyB,OAA0D;AAC9F,YAAM,aAAa,iBAAiB,MAAM;AAC1C,aAAO,QAAQ,OAAO,YAAU,iBAAiB,OAAO,MAAM,MAAM,eAC9D,OAAO,cAAc,UAAa,OAAO,SAAS,MAAM,eACxD,OAAO,YAAY,UAAa,OAAO,SAAS,MAAM,aACtD,OAAO,uBAAuB,UAAa,OAAO,aAAa,WAAW,MAAM,kBAAkB,OAClG,OAAO,YAAY,UAClB,iBAAiB,OAAO,OAAO,MAAM,iBAAiB,MAAM,OAAO,EAAE;AAAA,IAC9E;AAAA,IAEA,MAAM,OAAwB;AAC5B,UAAI,WAAW,mBAAmB,KAAM,OAAM,IAAI,MAAM,kDAAkD;AAC1G,aAAO,WAAW;AAAA,IACpB;AAAA,IAEA,MAAM,OAAO,YAAoE;AAC/E,YAAM,OAAO,OAAO,IAAI,UAAU;AAClC,YAAM,iBAAiB,gBAAgB,IAAI,UAAU;AACrD,UAAI,SAAS,UAAa,mBAAmB,OAAW,QAAO;AAC/D,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,QAAQ,cAAc,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,QAAyB;AACpC,YAAM,aAAa,iBAAiB,MAAM;AAC1C,YAAM,UAAU,QAAQ,OAAO,YAAU,iBAAiB,OAAO,MAAM,MAAM,UAAU;AACvF,YAAM,SAAS,QAAQ,IAAI,YAAU,OAAO,KAAK;AACjD,aAAO;AAAA,QACL,QAAQ,IAAI,IAAI,QAAQ,IAAI,YAAU,SAAS,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,QACnG,YAAY,OAAO,WAAW,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM;AAAA,QAC3D,WAAW,OAAO,WAAW,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM;AAAA,QAC1D,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,WAAW,QAAgB,WAAkE;AACjG,aAAO,WAAW,KAAK,YAAU,OAAO,WAAW,UAAU,OAAO,cAAc,SAAS;AAAA,IAC7F;AAAA,EACF,CAAC;AACH;;;AC7JA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOA,IAAM,+BAA+B,OAAO,OAAO;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAU;AAEH,IAAM,iCAAsD,IAAI,IAAI,4BAA4B;;;AC/BvG,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,cAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,oCAAAC;AAAA,EACA;AAAA,OACK;AAMP,SAAS,0BAAAC,+BAA8B;AAKvC;AAAA,EACE;AAAA,EACA;AAAA,OACK;;;ACrBP,SAAS,WAAAC,gBAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AAcpC,eAAe,qBACb,OACA,KACA,SACA,gBACA;AACA,MAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,KAAK,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC,GAAG;AACrE,UAAM,IAAI,UAAU,mBAAmB,SACnC,mCACA,mBAAmB,cAAc,iBAAiB;AAAA,EACxD;AACA,QAAM,SAAkB,IAAI,CAAC;AAC7B,MAAI,CAAC,oBAAoB,MAAM,KAAK,CAAC,OAAO,cAAc,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3F,UAAM,IAAI,UAAU,uCAAuC;AAAA,EAC7D;AACA,QAAM,QAAQ,OAAO;AACrB,QAAM,kBAAkB,MAAM,YAAY,SACtC,UACA,WAAW,MAAM,OAAO,MAAM,MAAM,QAAQ,KAAK,CAAC,EAAE,YAAY,CAAC;AACrE,MAAK,mBAAmB,UAAa,UAAU,kBAAmB,OAAO,UAAU,iBAAiB;AAClG,UAAM,IAAI,UAAU,mBAAmB,KAAK,sCAAsC;AAAA,EACpF;AACA,SAAO;AACT;AAEA,eAAsB,wBACpB,OACA,OACA,SACiB;AACjB,QAAM,MAAM,MAAM,MAAM,MAAM,cAAc,KAAK;AACjD,QAAM,SAAS,MAAM,qBAAqB,OAAO,KAAK,SAAS,KAAK;AACpE,QAAM,OAAO,MAAM,eAAe,KAAK,eAAe,gBAAgB,MAAM,CAAC;AAC7E,QAAM,cAAe,OAAmD;AACxE,MAAI,OAAO,gBAAgB,YAAY,gBAAgB,MAAM;AAC3D,UAAM,IAAI,UAAU,mBAAmB,KAAK,oCAAoC;AAAA,EAClF;AACA,SAAOA,SAAQ,MAAM,IAAI;AAC3B;AAGO,SAAS,2BACd,OACA,SACsB;AACtB,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,cAAc,OAAO;AACzB,cAAM,MAAM,MAAM,MAAM,MAAM,cAAc,KAAK;AACjD,cAAM,qBAAqB,OAAO,KAAK,SAAS,KAAK;AACrD,eAAO;AAAA,MACT;AAAA,MACA,GAAI,MAAM,MAAM,mBAAmB,SAC/B,CAAC,IACD;AAAA,QACE,MAAM,eAAe,MAAc,OAAe;AAChD,gBAAM,SAAS,MAAM,MAAM,MAAM,iBAAiB,MAAM,KAAK,KAAK,CAAC;AACnE,qBAAW,SAAS,OAAQ,OAAM,qBAAqB,OAAO,OAAO,OAAO;AAC5E,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACN;AAAA,IACA,cAAc,MAAM;AAAA,EACtB;AACF;AAEA,eAAsB,0BACpB,OACA,eACA,SACe;AACf,MAAI,MAAM,YAAY,OAAW;AACjC,QAAM,cAAc,WAAW,MAAM,OAAO,MAAM,MAAM,QAAQ,aAAa,CAAC,EAAE,YAAY,CAAC;AAC7F,MAAI,gBAAgB,SAAS;AAC3B,UAAM,IAAI,UAAU,kBAAkB,aAAa,8CAA8C;AAAA,EACnG;AACF;;;AC7FA,SAAS,WAAAC,gBAAe;AACxB;AAAA,EACE,cAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;AAEP,SAAS,kBAAAC,uBAAsB;AAC/B;AAAA,EAEE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAIX,IAAM,sCAAsC;AAE5C,IAAM,wBAAwB,EAAE,aAAa;AAAA,EAClD,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA,EACtC,MAAMC;AACR,CAAC;AAGM,IAAM,uBAAuB,EAAE,aAAa;AAAA,EACjD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO;AACzB,CAAC;AAGM,IAAM,wBAAwB,EAAE,aAAa;AAAA,EAClD,SAAS;AAAA,EACT,SAAS,EAAE,MAAM,oBAAoB;AAAA,EACrC,cAAc,EAAE,MAAMA,QAAO;AAAA,EAC7B,kBAAkB,EAAE,MAAM,2BAA2B;AACvD,CAAC;AAaM,IAAM,8BAA8B,EAAE,aAAa;AAAA,EACxD,SAAS,EAAE,MAAM,qBAAqB;AAAA,EACtC,SAAS,sBAAsB,SAAS;AAAA,EACxC,QAAQ,EAAE,MAAM,qBAAqB;AAAA,EACrC,SAASC;AAAA,EACT,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,aAAa,EAAE,QAAQ,sBAAsB;AAAA,EAC7C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAAA,EAClD,oBAAoB,EAAE,MAAM,CAACD,UAAS,EAAE,KAAK,CAAC,CAAC;AAAA,EAC/C,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,eAAe,EAAE,MAAM,6BAA6B,IAAI,YAAU,EAAE,QAAQ,MAAM,CAAC,CAGlF;AAAA,EACD,WAAWE;AAAA,EACX,MAAM,EAAE,MAAM,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;AAAA,EACpD,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,EAAE,QAAQ,mCAAmC;AACxD,CAAC;AAWD,IAAM,4CAA4C,EAAE,YAAY;AAAA,EAC9D,SAASD;AAAA,EACT,YAAY;AAAA,EACZ,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,WAAWC;AAAA,EACX,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,EAAE,QAAQ,CAAC;AACtB,CAAC;AAOD,SAAS,wBACP,YACA,UACoB;AACpB,MAAI,WAAW,YAAY,SAAS,QAAS,QAAO,WAAW,WAAW,OAAO,OAAO,SAAS,OAAO;AACxG,MAAI,WAAW,eAAe,SAAS,WAAY,QAAO,cAAc,WAAW,UAAU,OAAO,SAAS,UAAU;AACvH,MAAI,WAAW,YAAY,SAAS,QAAS,QAAO,WAAW,WAAW,OAAO,OAAO,SAAS,OAAO;AACxG,MAAI,WAAW,aAAa,SAAS,SAAU,QAAO,YAAY,WAAW,QAAQ,OAAO,SAAS,QAAQ;AAC7G,MAAI,WAAW,cAAc,SAAS,UAAW,QAAO,aAAa,WAAW,SAAS,OAAO,SAAS,SAAS;AAClH,SAAO;AACT;AAEA,SAAS,WAAW,QAAoC;AACtD,SAAO,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS;AACjE;AAEA,SAASC,gBAAe,MAA0B,OAAmC;AACnF,SAAO,KAAK,QAAQ,MAAM,SACrB,KAAK,kBAAkB,KAAK,MAAM,kBAAkB,MACpD,KAAK,kBAAkB,QAAQ,MAAM,kBAAkB,SACvD,KAAK,YAAY,MAAM,aACvB,WAAW,IAAI,EAAE,cAAc,WAAW,KAAK,CAAC;AACvD;AAEA,IAAMC,oBAAmB;AAEzB,SAASC,kBAAiB,OAAuB;AAC/C,SAAOD,kBAAiB,KAAK,KAAK,IAAI,MAAM,YAAY,IAAI;AAC9D;AAEA,SAASE,UAAS,QAAgB,SAAiB,YAA4B;AAC7E,SAAO,GAAGD,kBAAiB,MAAM,CAAC,IAAIA,kBAAiB,OAAO,CAAC,IAAI,UAAU;AAC/E;AAEA,SAASE,UAAS,QAAkE;AAClF,SAAO,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS;AAC7C;AAEA,SAAS,iBAAiB,SAAuC;AAC/D,SAAO,QAAQ,SAAS,CAAC,MAAM,UAC7BD,UAAS,KAAK,QAAQ,KAAK,SAAS,KAAK,UAAU,EAChD,cAAcA,UAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,CAAC,CAAC;AAC7E;AAEA,SAAS,qBAAqB,SAAuD;AACnF,QAAM,UAAU,oBAAI,IAAyB;AAC7C,aAAW,SAAS,QAAQ,SAASH,eAAc,GAAG;AACpD,UAAM,MAAMG,UAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU;AAClE,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,UAAU,QAAW;AACvB,cAAQ,IAAI,KAAK;AAAA,QACf,sBAAsB,MAAM;AAAA,QAC5B,YAAY,MAAM;AAAA,QAClB,gBAAgB,MAAM;AAAA,QACtB,WAAW,MAAM;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH,WAAW,MAAM,QAAQ,MAAM,WAAW;AACxC,cAAQ,IAAI,KAAK,EAAE,GAAG,OAAO,WAAW,MAAM,MAAM,CAAC;AAAA,IACvD;AAAA,EACF;AACA,SAAO,iBAAiB,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC/C;AAEA,SAAS,iBAAiB,MAA8B,OAAwC;AAC9F,SAAO,KAAK,WAAW,MAAM,UAAU,KAAK,MAAM,CAAC,QAAQ,UAAU;AACnE,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,cAAc,OAAW,QAAO;AACpC,WAAO,OAAO,yBAAyB,UAAU,wBAC5C,OAAO,eAAe,UAAU,cAChC,OAAO,mBAAmB,UAAU,kBACpC,OAAO,cAAc,UAAU,aAC/B,OAAO,eAAe,UAAU,cAChCD,kBAAiB,OAAO,MAAM,MAAMA,kBAAiB,UAAU,MAAM,KACrEA,kBAAiB,OAAO,OAAO,MAAMA,kBAAiB,UAAU,OAAO;AAAA,EAC9E,CAAC;AACH;AAEA,SAAS,uBAAuB,YAA0D;AACxF,QAAM,EAAE,gBAAgB,mBAAmB,IAAI;AAC/C,MAAI,mBAAmB,QAAQ,iBAAiB,WAAW,eAAe;AACxE,WAAO,kBAAkB,cAAc,0BAA0B,WAAW,aAAa;AAAA,EAC3F;AACA,MAAI,mBAAmB,QAAQ,iBAAiB,WAAW,YAAY;AACrE,WAAO,kBAAkB,cAAc,wBAAwB,WAAW,UAAU;AAAA,EACtF;AACA,MAAI,mBAAmB,QAAQ,WAAW,SAAS,MAAM;AACvD,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,QAAQ,WAAW,SAAS,MAAM;AACvD,WAAO;AAAA,EACT;AACA,MAAK,mBAAmB,UAAW,uBAAuB,OAAO;AAC/D,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,QAAQ,WAAW,QAAQ,SAAS,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,QAAQ,WAAW,OAAO,SAAS,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,YAA0D;AACvF,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,SAAS,WAAW,QAAQ;AACrC,QAAI,OAAO,IAAI,MAAM,IAAI,EAAG,QAAO,4BAA4B,MAAM,IAAI;AACzE,QAAI,OAAO,MAAM,KAAK,WAAW,YAAY,MAAM,KAAK,OAAO,WAAW,GAAG;AAC3E,aAAO,kBAAkB,MAAM,IAAI;AAAA,IACrC;AACA,WAAO,IAAI,MAAM,IAAI;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,YAA0D;AACvF,QAAM,EAAE,eAAe,IAAI;AAC3B,QAAM,aAAa,IAAI,IAAI,WAAW,OAAO,IAAI,WAAS,CAAC,MAAM,MAAM,KAAK,CAAU,CAAC;AACvF,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,MAAI;AACJ,aAAW,SAAS,WAAW,SAAS;AACtC,UAAM,MAAM,WAAW,KAAK;AAC5B,QAAIA,kBAAiB,MAAM,OAAO,MAAMA,kBAAiB,WAAW,SAAS,GAAG;AAC9E,aAAO,iBAAiB,GAAG,YAAY,MAAM,OAAO,iBAAiB,WAAW,SAAS;AAAA,IAC3F;AACA,QAAI,kBAAkB,IAAI,GAAG,EAAG,QAAO,oCAAoC,GAAG;AAC9E,sBAAkB,IAAI,GAAG;AACzB,UAAM,YAAY,GAAG,MAAM,MAAM,IAAI,MAAM,SAAS,IAAI,MAAM,UAAU;AACxE,QAAI,aAAa,IAAI,SAAS,EAAG,QAAO,kCAAkC,SAAS;AACnF,iBAAa,IAAI,SAAS;AAC1B,QAAI,UAAU,UAAaF,gBAAe,OAAO,KAAK,IAAI,EAAG,QAAO;AACpE,YAAQ;AAER,QAAI,mBAAmB,QAAQ,MAAM,QAAQ,WAAW,cAAc,MAAM,QAAQ,gBAAgB;AAClG,aAAO,iBAAiB,GAAG;AAAA,IAC7B;AACA,UAAMI,YAAW,GAAG,MAAM,MAAM,IAAI,MAAM,SAAS;AACnD,UAAM,WAAW;AAAA,MACf,MAAM;AAAA,MACN,MAAM,kBAAkB;AAAA,MACxB,MAAM,kBAAkB;AAAA,MACxBF,kBAAiB,MAAM,MAAM;AAAA,MAC7BA,kBAAiB,MAAM,OAAO;AAAA,IAChC,EAAE,KAAK,GAAG;AACV,UAAM,gBAAgB,eAAe,IAAIE,SAAQ;AACjD,QAAI,kBAAkB,UAAa,kBAAkB,UAAU;AAC7D,aAAO,iBAAiBA,SAAQ;AAAA,IAClC;AACA,mBAAe,IAAIA,WAAU,QAAQ;AAErC,UAAM,OAAO,WAAW,IAAI,MAAM,UAAU,GAAG;AAC/C,QAAI,SAAS,OAAW,QAAO,uBAAuB,MAAM,UAAU;AACtE,QAAI,KAAK,WAAW,MAAM,cAAc;AACtC,aAAO,kBAAkB,MAAM,UAAU,WAAW,OAAO,KAAK,MAAM,CAAC,OAAO,MAAM,YAAY;AAAA,IAClG;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,SACA,YACA,gBACoB;AACpB,QAAM,iBAAiB,IAAI,IAAY,WAAW,aAAa;AAC/D,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAMD,UAAS,OAAO,QAAQ,OAAO,SAAS,OAAO,UAAU;AACrE,QAAI,OAAO,aAAa,WAAW,cAAc,OAAO,YAAY,gBAAgB;AAClF,aAAO,qBAAqB,GAAG;AAAA,IACjC;AACA,QAAI,OAAO,YAAY,OAAO,WAAY,QAAO,qBAAqB,GAAG;AACzE,QAAI,CAAC,eAAe,IAAI,OAAO,oBAAoB,GAAG;AACpD,aAAO,qBAAqB,GAAG;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,YAA0D;AACpF,QAAM,EAAE,gBAAgB,KAAK,IAAI;AACjC,MAAI,SAAS,QAAQ,mBAAmB,KAAM,QAAO;AACrD,QAAM,WAAW,KAAK;AACtB,MAAI,SAAS,iBAAiB,gBAAgB;AAC5C,WAAO,qBAAqB,SAAS,YAAY,sBAAsB,cAAc;AAAA,EACvF;AACA,MAAI,SAAS,eAAe,WAAW,WAAY,QAAO;AAC1D,MAAI,SAAS,gBAAgB,WAAW,YAAa,QAAO;AAC5D,MAAI,SAAS,YAAY,WAAW,QAAS,QAAO;AACpD,MAAI,SAAS,gBAAgB,aAAa,WAAW,SAAU,QAAO;AACtE,MAAI,SAAS,gBAAgB,qBAAqB,QAAW;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,SAAS,mBAAmB,MACzC,KAAK,UAAU,EAAE,qBAAqB,WAAW,cAAc,CAAC,GAAG;AACvE,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,SAAS,EAAG,QAAO;AACvC,MAAI,KAAK,aAAa,SAAS,EAAG,QAAO;AAEzC,QAAM,YAAY,0BAA0B,MAAM,CAAC,CAAC;AACpD,MAAI,UAAU,WAAW,QAAS,QAAO,uCAAuC,UAAU,MAAM;AAChG,QAAM,uBAAuB,yBAAyB,UAAU,SAAS,YAAY,cAAc;AACnG,MAAI,yBAAyB,OAAW,QAAO;AAC/C,QAAM,gBAAgB;AAAA,IACpB,UAAU,QAAQ,OAAO,YAAUD,kBAAiB,OAAO,OAAO,MAAMA,kBAAiB,WAAW,SAAS,CAAC;AAAA,EAChH;AACA,MAAI,CAAC,iBAAiB,eAAe,qBAAqB,WAAW,OAAO,CAAC,GAAG;AAC9E,WAAO;AAAA,EACT;AACA,MAAI,KAAK,cAAc,UAAa,KAAK,UAAU,QAAQ,gBAAgB;AACzE,WAAO,wBAAwB,KAAK,UAAU,KAAK,2BAA2B,cAAc;AAAA,EAC9F;AACA,SAAO,wBAAwB,UAAU;AAC3C;AAEA,SAAS,wBAAwB,YAA0D;AACzF,QAAM,OAAO,WAAW;AACxB,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,EAAE,WAAW,wBAAwB,IAAI;AAC/C,MAAI,cAAc,QAAW;AAC3B,QAAI,WAAW,QAAQ,SAAS,EAAG,QAAO;AAC1C,WAAO,wBAAwB,WAAW,IAAI,SAAY;AAAA,EAC5D;AACA,MAAI,UAAU,QAAQ,WAAW,YAAY;AAC3C,WAAO,wBAAwB,UAAU,KAAK,wBAAwB,WAAW,UAAU;AAAA,EAC7F;AACA,QAAM,iBAAiB,WAAW,QAAQ,KAAK,WAC7C,MAAM,QAAQ,UAAU,SACpB,MAAM,UAAU,UAAU,SAAS,MAAM,kBAAkB,KAAK,UAAU,QAAQ,MAClF,MAAM,UAAU,UAAU,SACzB,MAAM,kBAAkB,OAAO,UAAU,QAAQ,MACjD,MAAM,kBAAkB,QAAQ,UAAU,QAAQ,KAAM;AAC/D,MAAI,mBAAmB,OAAW,QAAO;AAEzC,QAAM,aAAa,CAAC,GAAG,IAAI,IAAI,uBAAuB,CAAC,EAAE,SAAS;AAClE,MAAI,WAAW,WAAW,wBAAwB,QAAQ;AACxD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK,SAAO,CAAC,+BAA+B,KAAK,GAAG,CAAC,GAAG;AACrE,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,WAAW,QAAQ,OAAO,WACtC,MAAM,UAAU,UAAU,SAAS,MAAM,kBAAkB,OAAO,UAAU,QAAQ,EAAE;AACxF,QAAM,eAAe,CAAC,GAAG,IAAI,IAAI,MAAM,IAAIE,SAAQ,CAAC,CAAC,EAAE,SAAS;AAChE,MAAI,aAAa,KAAK,SAAO,CAAC,WAAW,SAAS,GAAG,CAAC,GAAG;AACvD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,YAA0D;AACvF,QAAM,EAAE,SAAS,eAAe,IAAI;AACpC,MAAI,YAAY,OAAW,QAAO;AAClC,QAAM,gBAAgB,mBAAmB,OAAO,WAAW,aAAa,iBAAiB;AACzF,MAAI,QAAQ,YAAY,eAAe;AACrC,WAAO,mBAAmB,QAAQ,OAAO,4BAA4B,aAAa;AAAA,EACpF;AACA,MAAI,QAAQ,UAAU,WAAW,eAAe;AAC9C,WAAO,mBAAmB,QAAQ,OAAO,0BAA0B,WAAW,aAAa;AAAA,EAC7F;AACA,MAAI,QAAQ,iBAAiB,KAAK,WAAS,MAAM,UAAU,QAAQ,OAAO,GAAG;AAC3E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,YAA0D;AAC1F,SAAO,uBAAuB,UAAU,KACnC,sBAAsB,UAAU,KAChC,sBAAsB,UAAU,KAChC,mBAAmB,UAAU,KAC7B,sBAAsB,UAAU;AACvC;AAEA,eAAe,4BAA4B,YAAmE;AAC5G,aAAW,SAAS,WAAW,QAAQ;AACrC,QAAI;AACJ,QAAI;AACF,qBAAe,MAAMC,gBAAe,SAAS,MAAM,IAA0B;AAAA,IAC/E,QAAQ;AACN,aAAO,kBAAkB,MAAM,IAAI;AAAA,IACrC;AACA,QAAI,iBAAiB,MAAM,MAAM;AAC/B,aAAO,kBAAkB,MAAM,IAAI,cAAc,YAAY;AAAA,IAC/D;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,6BACpB,OACA,UACuC;AACvC,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,EAAE,QAAQ,UAAU;AACtE,MAAI,OAAO,UAAU,YAAY,UAAU,QAAS,MAAgC,YAAY,GAAG;AACjG,UAAM,SAAS,0CAA0C,UAAU,KAAK;AACxE,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,EAAE,QAAQ,kEAAkE,QAAQ,UAAU;AAAA,IACvG;AACA,UAAMC,YAAW,wBAAwB,OAAO,MAAM,QAAQ;AAC9D,WAAOA,cAAa,SAChB,EAAE,QAAQ,UAAU,IACpB,EAAE,QAAQA,WAAU,QAAQ,oBAAoB;AAAA,EACtD;AACA,QAAM,SAAS,4BAA4B,UAAU,KAAK;AAC1D,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,QAAQ,8DAA8D,QAAQ,UAAU;AAAA,EACnG;AACA,QAAM,aAAa,OAAO;AAC1B,QAAM,WAAW,wBAAwB,YAAY,QAAQ;AAC7D,MAAI,aAAa,OAAW,QAAO,EAAE,QAAQ,UAAU,QAAQ,oBAAoB;AACnF,QAAM,qBAAqB,MAAM,4BAA4B,UAAU;AACvE,MAAI,uBAAuB,OAAW,QAAO,EAAE,QAAQ,oBAAoB,QAAQ,UAAU;AAC7F,QAAM,iBAAiB,yBAAyB,UAAU;AAC1D,MAAI,mBAAmB,OAAW,QAAO,EAAE,QAAQ,gBAAgB,QAAQ,UAAU;AACrF,SAAO,EAAE,YAAY,QAAQ,QAAQ;AACvC;;;AFzUA,IAAM,gCAAgC;AAGtC,IAAM,0BAA0B;AAEhC,SAAS,YAAY,OAAgC;AACnD,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,CAAC,OAAO,cAAc,IAAI,KAAK,OAAO,GAAG;AAC3C,UAAM,IAAI,UAAU,+DAA+D,OAAO,KAAK,CAAC,EAAE;AAAA,EACpG;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAM,IAAI,UAAU,2DAA2D,OAAO,KAAK,CAAC,EAAE;AAAA,EAChG;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAA2B,UAAkB,MAAsB;AACjG,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,GAAG;AACnD,UAAM,IAAI,UAAU,GAAG,IAAI,8CAA8C,OAAO,QAAQ,CAAC,EAAE;AAAA,EAC7F;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA+C;AACvE,MAAI,UAAU,WAAc,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI;AACtE,UAAM,IAAI,UAAU,0DAA0D,OAAO,KAAK,CAAC,EAAE;AAAA,EAC/F;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAyC,cAAsC;AACrG,SAAO;AAAA,IACL,iBAAiB,EAAE,UAAU,QAAQ,SAAS;AAAA,IAC9C,YAAY,QAAQ;AAAA,IACpB,aAAaC;AAAA,IACb,qBAAqB,EAAE,qBAAqB,CAAC,GAAG,4BAA4B,EAAE;AAAA,IAC9E,SAAS,QAAQ;AAAA,IACjB;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,SAAmE;AAC5F,SAAO,4BAA4B,MAAM;AAAA,IACvC,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,SAAS,QAAQ;AAAA,IACjB,eAAe;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,aAAaA;AAAA,IACb,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,eAAe,CAAC,GAAG,4BAA4B;AAAA,IAC/C,WAAW,QAAQ;AAAA,IACnB,MAAM;AAAA,IACN,UAAU,QAAQ;AAAA,IAClB,SAAS;AAAA,EACX,CAAC;AACH;AAEA,SAAS,WAAW,QAAmC;AACrD,SAAO,GAAG,OAAO,eAAe,EAAE,IAAI,OAAO,YAAY;AAC3D;AAEA,SAAS,cAAc,SAA4D;AACjF,SAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,YAAU,CAAC,WAAW,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;AAClF;AAEA,SAAS,cAAc,QAAqC;AAC1D,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAEA,SAASC,YAAW,QAAoC;AACtD,SAAO,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS;AACjE;AAEA,SAAS,aACP,UACA,WACsB;AACtB,QAAM,SAAS,IAAI,IAAI,SAAS,IAAI,YAAU,CAACA,YAAW,MAAM,GAAG,MAAM,CAAU,CAAC;AACpF,aAAW,UAAU,WAAW;AAC9B,UAAM,MAAMA,YAAW,MAAM;AAC7B,UAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,QAAI,UAAU,UAAa,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,MAAM,GAAG;AAC3E,YAAM,IAAI,MAAM,uCAAuC,GAAG,EAAE;AAAA,IAC9D;AACA,WAAO,IAAI,KAAK,MAAM;AAAA,EACxB;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,UAC1C,KAAK,QAAQ,MAAM,SAChB,KAAK,kBAAkB,KAAK,MAAM,kBAAkB,MACpD,KAAK,kBAAkB,QAAQ,MAAM,kBAAkB,SACvD,KAAK,YAAY,MAAM,SAAS;AACvC;AAEA,SAAS,YACP,UACA,WACsB;AACtB,QAAM,SAAS,IAAI,IAAqC,SAAS,IAAI,WAAS,CAAC,MAAM,MAAM,MAAM,IAAI,CAAU,CAAC;AAChH,aAAW,CAAC,MAAM,IAAI,KAAK,WAAW;AACpC,UAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,QAAI,UAAU,UAAa,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,GAAG;AACzE,YAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAAA,IAChE;AACA,WAAO,IAAI,MAAM,IAAI;AAAA,EACvB;AACA,SAAO,CAAC,GAAG,MAAM,EACd,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,MAAMC,SAAQ,MAAM,IAAI,EAAE,EAAE,EAC3D,SAAS,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAClE;AAUA,eAAe,kBACb,SACA,SACA;AACA,QAAM,sBAAsB,cAAc,QAAQ,IAAI,YAAU,OAAO,UAAU,CAAC;AAClF,QAAM,UAAU,MAAM,sBAAsB,QAAQ,QAAQ,mBAAmB;AAC/E,QAAM,iBAAiB,oBAAoB,OAAO,UAAQ,CAAC,QAAQ,OAAO,IAAI,IAAI,CAAC;AACnF,QAAM,0BAA0B,cAAc,QAAQ,QAAQ,CAAC,WAAW;AACxE,UAAM,OAAO,QAAQ,OAAO,IAAI,OAAO,UAAU;AACjD,WAAO,SAAS,UAAa,KAAK,WAAW,OAAO,eAAe,CAAC,OAAO,UAAU,IAAI,CAAC;AAAA,EAC5F,CAAC,CAAC;AAEF,QAAM,wBAAkC,CAAC;AACzC,aAAW,UAAU,SAAS;AAC5B,QACEC,kBAAiB,OAAO,MAAM,MAAM,QAAQ,aACzC,OAAO,iBAAiBC,kCAC3B;AACF,UAAM,aAAa,8BAA8B,UAAU,QAAQ,OAAO,IAAI,OAAO,UAAU,CAAC;AAChG,QAAI,WAAW,QAAS,uBAAsB,KAAK,WAAW,KAAK,WAAW,WAAW,KAAK,QAAQ;AAAA,EACxG;AACA,QAAM,mBAAmB,cAAc,qBAAqB;AAC5D,QAAM,cAAc,MAAM,sBAAsB,QAAQ,QAAQ,gBAAgB;AAChF,QAAM,qBAAqB,iBAAiB,OAAO,UAAQ,CAAC,YAAY,OAAO,IAAI,IAAI,CAAC;AAExF,QAAM,UAAU,cAAc;AAAA,IAC5B,GAAG,QAAQ;AAAA,IACX,GAAG,YAAY;AAAA,EACjB,CAAC;AACD,QAAM,eAAe,cAAc;AAAA,IACjC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC,EAAE,IAAI,UAAQF,SAAQ,MAAM,IAAI,CAAC;AAClC,SAAO;AAAA,IACL,QAAQ,IAAI,IAAI,CAAC,GAAG,QAAQ,QAAQ,GAAG,YAAY,MAAM,CAAC;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,WACb,SACA,OACA,WACA,cACA,QACsB;AACtB,UAAQ,eAAe;AACvB,QAAM,aAAa,MAAM,wBAAwB,QAAQ,OAAO,cAAc,QAAQ,OAAO;AAC7F,UAAQ,eAAe;AACvB,QAAM,SAAS,MAAM;AAAA,IACnB,2BAA2B,QAAQ,OAAO,QAAQ,OAAO;AAAA,IACzD,QAAQ;AAAA,IACR,eAAe,SAAS,YAAY;AAAA,IACpC;AAAA,MACE,WAAW,uBAAuB,QAAQ,eAAe,yBAAyB,eAAe;AAAA,MACjG,GAAI,MAAM,SAAS,OAAO,CAAC,IAAI,EAAE,YAAY,MAAM,KAAK;AAAA,MACxD,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,MACzC,QAAQ,EAAE,mCAAmC,KAAK;AAAA,MAClD,SAAS;AAAA,IACX;AAAA,EACF;AACA,UAAQ,eAAe;AACvB,QAAM,cAAc,MAAM,wBAAwB,QAAQ,OAAO,cAAc,QAAQ,OAAO;AAC9F,UAAQ,eAAe;AACvB,MAAI,eAAe,aAAa;AAC9B,UAAM,IAAI,MAAM,sDAAsD,YAAY,EAAE;AAAA,EACtF;AACA,MAAI,OAAO,SAAS,gBAAgB,OAAO,WAAW,SAAS,iBAAiB,cAAc;AAC5F,UAAM,IAAI;AAAA,MACR,mCAAmC,OAAO,IAAI,IAAI,OAAO,WAAW,SAAS,YAAY,eAAe,YAAY;AAAA,IACtH;AAAA,EACF;AAMA,QAAM,UAAU,OAAO,KAAK,QAAQ,OAAO,YAAU,OAAO,SAAS,aAChE,OAAO,SAAS,gBAChBC,kBAAiB,OAAO,OAAO,MAAM,QAAQ,SAAS;AAC3D,QAAM,iBAAiB,IAAI,QAAQ,SAAS,YAAU,OAAO,KAAK;AAClE,QAAM,oBAAoB,IAAI;AAAA,IAC5B,OAAO,WAAW,OAAO,WAAS,MAAM,SAAS,aAAa,MAAM,SAAS,YAAY;AAAA,IACzF,WAAS,MAAM;AAAA,EACjB;AACA,QAAM,iBAAiB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,eAAe,KAAK,GAAG,GAAG,kBAAkB,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,UAAU,OAAO,KAAK;AACnI,QAAM,SAAS,oBAAI,IAAqC;AACxD,aAAW,SAAS,gBAAgB;AAClC,YAAQ,eAAe;AACvB,UAAM,SAAS,MAAM,kBAAkB,SAAS,eAAe,IAAI,KAAK,KAAK,CAAC,CAAC;AAC/E,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,OAAQ,QAAO,IAAI,MAAM,IAAI;AAC/D,UAAM,mBAAmB,kBAAkB,IAAI,KAAK,KAAK,CAAC;AAC1D,QAAI,iBAAiB,SAAS,KAAK,OAAO,aAAa,SAAS,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9F,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA,UACP,SAAS;AAAA,UACT,SAAS,OAAO;AAAA,UAChB,cAAc,OAAO;AAAA,UACrB;AAAA,QACF;AAAA,QACA;AAAA,QACA,MAAM,OAAO;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IAAS;AAAA,IAAQ,MAAM,OAAO;AAAA,IAAY;AAAA,EAC5C;AACF;AAEA,IAAM,2CAAN,MAA4F;AAAA,EAC1F;AAAA,EACS;AAAA,EACT,YAA8B,QAAQ,QAAQ;AAAA,EAE9C,YAAY,SAAyC,YAAsC;AACzF,SAAK,WAAW;AAChB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,SAAyD;AACvD,WAAO,KAAK,YAAY,mBAAmB,QAAQ,KAAK,YAAY,uBAAuB,OACvF,OACA,OAAO,OAAO,EAAE,OAAO,KAAK,YAAY,gBAAgB,MAAM,KAAK,YAAY,mBAAmB,CAAC;AAAA,EACzG;AAAA,EAEA,KAAK,MAA6D;AAChE,WAAO,KAAK,YAAY,OAAO,KAAK,WAAS,MAAM,SAAS,IAAI,GAAG;AAAA,EACrE;AAAA,EAEA,WAA+C;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAwC;AACtC,WAAO;AAAA,MACL,GAAI,KAAK,YAAY,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,KAAK,YAAY,QAAQ;AAAA,MACtF,eAAe,KAAK,YAAY;AAAA,MAChC,gBAAgB,KAAK,YAAY;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,KAAK,SAAsF;AACzF,UAAM,SAAS,KAAK,UAAU,KAAK,YAAY,MAAM,KAAK,UAAU,OAAO,CAAC;AAC5E,SAAK,YAAY,OAAO;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAA+B;AAC7B,WAAO,qCAAqC,KAAK,WAAW;AAAA,EAC9D;AAAA,EAEA,MAAM,aACJ,WACA,cACA,eACA,QACkB;AAClB,UAAM,SAAS,MAAM,WAAW,KAAK,UAAU,KAAK,aAAa,WAAW,cAAc,MAAM;AAChG,YAAQ,eAAe;AACvB,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,YAAY,OAAO,QAAQ;AACjC,UAAI,YAAY,WAAW;AACzB,cAAM,gBAAgB,MAAM,KAAK,aAAa,WAAW,YAAY,GAAG,eAAe,MAAM;AAC7F,YAAI,cAAe,QAAO;AAAA,MAC5B;AAIA,YAAM,QAAQ,MAAM,WAAW,KAAK,UAAU,KAAK,aAAa,WAAW,WAAW,MAAM;AAC5F,cAAQ,eAAe;AACvB,UAAI,MAAM,YAAY,QAAW;AAC/B,cAAM,KAAK,cAAc,OAAO,WAAW,eAAe,MAAM;AAChE,eAAO,cAAc,eACjB,QACA,MAAM,KAAK,aAAa,YAAY,GAAG,cAAc,eAAe,MAAM;AAAA,MAChF;AACA,YAAM,UAAU,4BAA4B,MAAM;AAAA,QAChD,GAAG,KAAK;AAAA,QACR,SAAS,MAAM;AAAA,QACf;AAAA,MACF,CAAC;AACD,cAAQ,eAAe;AACvB,YAAM,KAAK,SAAS,gBAAgB,KAAK,OAAO;AAChD,WAAK,cAAc;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,cAAc,QAAQ,cAAc,eAAe,MAAM;AACpE,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cACJ,QACA,cACA,eACA,QACe;AACf,UAAM,EAAE,SAAS,UAAU,GAAG,UAAU,IAAI,KAAK;AACjD,UAAM,YAAY,4BAA4B,MAAM;AAAA,MAClD,GAAG;AAAA,MACH,SAAS,aAAa,KAAK,YAAY,SAAS,OAAO,OAAO;AAAA,MAC9D,QAAQ,YAAY,KAAK,YAAY,QAAQ,OAAO,MAAM;AAAA,MAC1D;AAAA,MACA,gBAAgB;AAAA,MAChB,oBAAoB,OAAO;AAAA,MAC3B,MAAM,OAAO;AAAA,IACf,CAAC;AACD,YAAQ,eAAe;AACvB,UAAM,KAAK,SAAS,gBAAgB,KAAK,SAAS;AAClD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,UAAU,YAAyF;AACvG,UAAM,YAAY,iBAAiB,YAAY,SAAS;AACxD,UAAM,SAAS,YAAY;AAC3B,YAAQ,eAAe;AACvB,UAAM,gBAAgB,YAAY,MAAM,KAAK,SAAS,MAAM,aAAa,WAAW,CAAC;AACrF,YAAQ,eAAe;AACvB,UAAM,0BAA0B,KAAK,SAAS,OAAO,eAAe,KAAK,SAAS,OAAO;AACzF,QAAI,gBAAgB,KAAK,YAAY,eAAe;AAClD,YAAM,IAAI;AAAA,QACR,iCAAiC,KAAK,YAAY,aAAa,OAAO,aAAa;AAAA,MACrF;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,YAAY;AACxC,QAAI,mBAAmB,QAAQ,gBAAgB,gBAAgB;AAC7D,YAAM,IAAI,WAAW,kBAAkB,aAAa,6BAA6B,cAAc,EAAE;AAAA,IACnG;AAEA,QAAI,OAAO,mBAAmB,OAAO,KAAK,SAAS,aAAa,iBAAiB;AACjF,UAAM,YAAY,QAAQ,gBAAgB,gBAAgB,OAAO,IAAI;AACrE,UAAM,SAAS,cAAc,SAAY,YAAY,KAAK,IAAI,WAAW,SAAS;AAClF,UAAM,SAAS,WAAW,IAAI,OAAO,IAAI,OAAO,SAAS;AACzD,UAAM,sBAAsB;AAAA,MAC1B,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,IACF;AACA,WAAO,QAAQ,QAAQ;AACrB,cAAQ,eAAe;AACvB,YAAM,eAAe,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,qBAAqB,SAAS,OAAO,CAAC,IAAI,CAAC;AACjG,UAAI,MAAM,KAAK,aAAa,MAAM,cAAc,eAAe,MAAM,EAAG,QAAO,KAAK,OAAO;AAC3F,aAAO,eAAe;AAAA,IACxB;AAEA,QAAI,KAAK,YAAY,kBAAkB,eAAe;AACpD,YAAM,WAAW,4BAA4B,MAAM;AAAA,QACjD,GAAG,KAAK;AAAA,QACR;AAAA,MACF,CAAC;AACD,cAAQ,eAAe;AACvB,YAAM,KAAK,SAAS,gBAAgB,KAAK,QAAQ;AACjD,WAAK,cAAc;AAAA,IACrB;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;AAEA,eAAsB,wCACpB,YAC4C;AAC5C,QAAM,UAA0C;AAAA,IAC9C,GAAG;AAAA,IACH,SAASE,YAAW,MAAM,WAAW,OAAO;AAAA,IAC5C,qBAAqB;AAAA,MACnB,WAAW;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,IACA,YAAY,aAAa,WAAW,UAAU;AAAA,IAC9C,SAAS,WAAW,QAAQ,KAAK;AAAA,IACjC,WAAWC,sBAAqB,MAAM,WAAW,SAAS;AAAA,IAC1D,eAAe,uBAAuB,WAAW,eAAe,yBAAyB,eAAe;AAAA,IACxG,UAAU,WAAW,SAAS,KAAK;AAAA,EACrC;AACA,MAAI,QAAQ,QAAQ,WAAW,EAAG,OAAM,IAAI,UAAU,2BAA2B;AACjF,MAAI,QAAQ,SAAS,WAAW,EAAG,OAAM,IAAI,UAAU,4BAA4B;AAEnF,QAAM,SAAS,MAAM,6BAA6B,MAAM,QAAQ,gBAAgB,KAAK,GAAG,OAAO;AAC/F,MAAI,OAAO,WAAW,aAAa,OAAO,WAAW,qBAAqB;AACxE,UAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,EAAE;AAAA,EAC7E;AACA,QAAM,aAAa,OAAO,WAAW,UAAU,OAAO,aAAa,kBAAkB,OAAO;AAC5F,SAAO,IAAI,yCAAyC,SAAS,UAAU;AACzE;AAGO,SAAS,0CACd,SACyF;AACzF,MAAI,QAAQ;AACZ,QAAM,QAAoC,CAAC;AAC3C,SAAO;AAAA,IACL,MAAM,OAAyB;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,YAAqD;AAC9D,cAAQ;AACR,YAAM,KAAK,UAAU;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;;;AG/gBA,SAAS,WAAAC,gBAAe;AAOxB,SAAS,qBAAqB;AA4BvB,SAAS,mCACd,SAC8B;AAC9B,QAAM,EAAE,OAAO,IAAI;AAEnB,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,OAAwB;AAC5B,aAAO,MAAM,OAAO,KAAK;AAAA,IAC3B;AAAA,IAEA,MAAM,OACJ,QACA,OACyC;AACzC,YAAM,UAAU,MAAM,OAAO,OAAO,cAAc,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC;AACpF,aAAO,OAAO,OAAO,QAAQ,IAAI,YAAY,CAAC;AAAA,IAChD;AAAA,IAEA,MAAM,OAAO,YAA+D;AAC1E,YAAM,SAAS,MAAM,OAAO,OAAOA,SAAQ,MAAM,UAAU,CAAC;AAC5D,aAAO,WAAW,SAAY,SAAY,cAAc,MAAM;AAAA,IAChE;AAAA,EACF,CAAC;AACH;AAOA,SAAS,aAAa,OAA0D;AAC9E,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO;AAAA,IACL,GAAI,MAAM,+BAA+B,SACrC,CAAC,IACD,EAAE,4BAA4B,MAAM,2BAA2B;AAAA,IACnE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAYA,SAAQ,MAAM,MAAM,UAAU,EAAE;AAAA,IACxF,GAAI,MAAM,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,cAAc,MAAM,MAAM,OAAO,EAAE;AAAA,EACvF;AACF;AAQA,SAAS,aAAa,QAA0C;AAC9D,SAAO,OAAO,OAAO;AAAA,IACnB,sBAAsB,OAAO;AAAA,IAC7B,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,cAAc,QAA4C;AACjE,SAAO,OAAO,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,IACvB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO,WAAW,OAAO,OAAO,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,EAC5E,CAAC;AACH;;;AC7FA;AAAA,EACE,mCAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,yBAAAC;AAAA,EACA;AAAA,EACA,6BAAAC;AAAA,EACA;AAAA,EACA,8CAAAC;AAAA,EACA;AAAA,EACA,oCAAAC;AAAA,EACA,iCAAAC;AAAA,EACA,oCAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAAC,sBAAqB;;;ACxB9B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAKP;AAAA,EACE,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,0CAAAC;AAAA,EACA;AAAA,EACA,gCAAAC;AAAA,EACA;AAAA,EACA,oCAAAC;AAAA,EACA;AAAA,EACA,0BAAAC;AAAA,EACA;AAAA,EACA,0BAAAC;AAAA,OACK;AAEP,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,iBAAAC,sBAAqB;AA0BvB,SAAS,kBAAkB,QAAoD;AACpF,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,SAAS,OAAO;AAAA,IAChB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,EACjB;AACF;AAEO,SAAS,uBACd,QAC0D;AAC1D,QAAM,OAAO,kBAAkB,MAAM;AACrC,SAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,EACf;AACF;AAEO,SAAS,kBAAkB,QAAkE;AAClG,SAAO,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS;AAC7C;AAEA,SAAS,eAAe,SAA8D;AACpF,QAAM,SAAS,oBAAI,IAAgC;AACnD,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,OAAO,IAAI,OAAO,UAAU;AAC1C,QAAI,UAAU,UACT,OAAO,QAAQ,MAAM,SACpB,OAAO,UAAU,MAAM,SAAS,OAAO,kBAAkB,KAAK,MAAM,kBAAkB,MACtF,OAAO,UAAU,MAAM,SACtB,OAAO,kBAAkB,OAAO,MAAM,kBAAkB,MACxD,OAAO,kBAAkB,QAAQ,MAAM,kBAAkB,OAAQ;AACtE,aAAO,IAAI,OAAO,YAAY,MAAM;AAAA,IACtC;AAAA,EACF;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,eAAsB,4BACpB,QACA,QAC8C;AAC9C,QAAM,SAAS,MAAM,OAAO,OAAO,OAAO,UAAU;AACpD,MAAI,QAAQ,cAAc,cACrB,OAAO,mBAAmB,OAAO,gBACjC,OAAO,WAAW,KAAM,QAAO;AACpC,QAAM,OAAO,EAAE,QAAQ,OAAO,gBAAgB,GAAG,OAAO,OAAO;AAC/D,SAAO,MAAMD,gBAAe,SAAS,IAAe,MAAM,OAAO,aAAa,OAAO;AACvF;AAEA,eAAsB,gCACpB,UACA,MAC8C;AAC9C,QAAM,OAAO,WAAW,IAAI;AAC5B,MAAI,SAAS,OAAW,QAAO;AAC/B,SAAO,MAAMA,gBAAe,SAAS,IAA0B,MAAM,OAAO,EAAE,GAAG,KAAK,IAAI;AAC5F;AAEO,SAAS,yBACd,aACA,QACoB;AACpB,QAAM,SAAS,YAAY,OAAO,UAAQ,KAAK,WAAW,MAAM,EAAE,IAAI,UAAQ,KAAK,KAAK;AACxF,SAAO,OAAO,WAAW,IAAI,SAAY,KAAK,IAAI,GAAG,MAAM;AAC7D;AAEA,eAAsB,uBACpB,QACA,SACA,OACsC;AACtC,QAAM,UAAuC,CAAC;AAC9C,aAAW,UAAU,eAAe,OAAO,GAAG;AAC5C,UAAM,OAAO,MAAM,4BAA4B,QAAQ,MAAM;AAC7D,UAAM,SAAS,MAAM,IAAI;AACzB,QAAI,CAAC,OAAO,QAAS;AACrB,YAAQ,KAAK;AAAA,MACX,MAAM,OAAO;AAAA,MACb,UAAU,kBAAkB,MAAM;AAAA,MAClC,YAAY,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAsB,qBACpB,QACA,SACA,OACA,OAC8C;AAC9C,QAAM,SAA8C,CAAC;AACrD,aAAW,UAAU,eAAe,OAAO,GAAG;AAC5C,UAAM,SAAS,MAAM,MAAM,4BAA4B,QAAQ,MAAM,CAAC;AACtE,QAAI,OAAO,WAAW,OAAO,OAAO,KAAK,KAAK,MAAM,UAAU;AAC5D,aAAO,KAAK,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,IACjE;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,uBACpB,QACA,WAC4B;AAC5B,QAAM,SAAS,MAAM,OAAO,OAAOC,eAAc,MAAM,SAAS,CAAC;AACjE,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,OAAO,OAAO,YAAU,OAAO,iBAAiBH,2BAA0B,OAAO,iBAAiBA,uBAAsB;AAAA,IACxH,WAAS,oBAAoB,UAAU,KAAK;AAAA,EAC9C;AACA,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA,OAAO,OAAO,YAAU,OAAO,iBAAiBF,6BAA4B;AAAA,IAC5E,WAAS,0BAA0B,UAAU,KAAK;AAAA,EACpD;AACA,QAAM,qBAAqB,MAAM;AAAA,IAC/B;AAAA,IACA,OAAO,OAAO,YAAU,OAAO,iBAAiBC,iCAAgC;AAAA,IAChF,WAAS,8BAA8B,UAAU,KAAK;AAAA,IACtD;AAAA,EACF;AACA,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA,OAAO,OAAO,YAAU,OAAO,iBAAiBF,uCAAsC;AAAA,IACtF,WAAS,oCAAoC,UAAU,KAAK;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,gBAAgB,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY;AACtD,UAAM,iBAAiB,yBAAyB,oBAAoB,QAAQ,UAAU;AACtF,WAAO,CAAC,QAAQ,YAAY;AAAA,MAC1B,GAAG;AAAA,MACH,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IAC3D,CAAC;AAAA,EACH,CAAC,CAAC;AACF,QAAM,YAAY,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ;AAC1C,UAAM,iBAAiB,yBAAyB,gBAAgB,IAAI,UAAU;AAC9E,WAAO,CAAC,IAAI,YAAY;AAAA,MACtB,GAAG;AAAA,MACH,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IAC3D,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,SAAO;AAAA,IACL;AAAA,IACA,eAAe,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,IAAI,UAAQ;AAAA,MACjD,gBAAgB,IAAI,SAAS;AAAA,MAC7B,gBAAgB,IAAI,KAAK;AAAA,MACzB,OAAO,IAAI,KAAK;AAAA,MAChB,YAAY,IAAI;AAAA,MAChB,gBAAgB,IAAI;AAAA,MACpB,QAAQ,IAAI,SAAS;AAAA,MACrB,gBAAgB,IAAI,KAAK;AAAA,IAC3B,EAAE;AAAA,IACF;AAAA,IACA,mBAAmB,CAAC,GAAG,cAAc,OAAO,CAAC,EAAE,IAAI,cAAY;AAAA,MAC7D,gBAAgB,QAAQ,SAAS;AAAA,MACjC,gBAAgB,QAAQ,KAAK;AAAA,MAC7B,YAAY,QAAQ,KAAK,OAAO,IAAI,WAAS,MAAM,IAAI;AAAA,MACvD,gBAAgB,QAAQ,KAAK;AAAA,MAC7B,YAAY,QAAQ;AAAA,MACpB,wBAAwB,QAAQ,KAAK;AAAA,MACrC,UAAU,QAAQ,KAAK;AAAA,MACvB,gBAAgB,QAAQ;AAAA,MACxB,WAAW,QAAQ,KAAK;AAAA,MACxB,QAAQ,QAAQ,SAAS;AAAA,MACzB,YAAY,QAAQ,KAAK;AAAA,MACzB,gBAAgB,QAAQ,KAAK;AAAA,IAC/B,EAAE;AAAA,EACJ;AACF;AAEA,eAAe,SACb,QACA,eACwE;AACxE,MAAI,CAAC,OAAO,cAAc,aAAa,KAAK,gBAAgB,GAAG;AAC7D,UAAM,IAAI,UAAU,kDAAkD;AAAA,EACxE;AACA,MAAI;AACJ,MAAI;AACF,qBAAiB,MAAM,OAAO,KAAK;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,MAAe,gBAAgB;AAAA,MAAM,IAAI;AAAA,MAAO,QAAQ;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,iBAAiB,cAAe,QAAO;AAAA,IACzC;AAAA,IAAe;AAAA,IAAgB,IAAI;AAAA,IAAO,QAAQ;AAAA,EACpD;AACA,MAAI,iBAAiB,cAAe,QAAO;AAAA,IACzC;AAAA,IAAe;AAAA,IAAgB,IAAI;AAAA,IAAO,QAAQ;AAAA,EACpD;AACA,SAAO,EAAE,eAAe;AAC1B;AAEO,SAAS,wBACd,UACA,SACA,WACA,eACS;AACT,QAAM,YAAY,uBAAuB;AAAA,IACvC,WAAW,QAAQ,KAAK,OAAO,CAAC,EAAE;AAAA,IAClC;AAAA,IACA,iBAAiB;AAAA,IACjB,WAAW,QAAQ,KAAK;AAAA,IACxB,UAAU,SAAS;AAAA,EACrB,CAAC;AACD,SAAO,UAAU,MAAM,UAAU,QAAQ,eAAe,QAAQ;AAClE;AAEO,SAAS,oBACd,UACA,SACA,SACA,eACS;AACT,QAAM,mBAAmB,SAAS,kBAAkB,KAAK,UAAQ,KAAK,eAAe,QAAQ,UAAU;AACvG,MAAI,qBAAqB,OAAW,QAAO;AAC3C,QAAM,aAAa,8BAA8B;AAAA,IAC/C;AAAA,IACA,MAAM,SAAS;AAAA,IACf,SAAS;AAAA,EACX,CAAC;AACD,SAAO,WAAW,MAAM,WAAW,IAAI,eAAe;AACxD;AAEA,SAAS,2BACP,UACA,OACS;AACT,SAAO,SAAS,kBAAkB,KAAK,aAAW,QAAQ,WAAW,MAAM,aACtE,QAAQ,kBAAkB,MAAM,iBAChC,QAAQ,iBAAiB,MAAM,kBAC9B,QAAQ,mBAAmB,UAAa,QAAQ,iBAAiB,MAAM,mBACvE,MAAM,cAAc,UAAa,QAAQ,cAAc,MAAM,cAC9D,QAAQ,WAAW,SAAS,MAAM,aAAaI,uBAAsB,CAAC;AAC7E;AAEA,eAAsB,yBACpB,SACA,UACoC;AACpC,QAAM,QAAiC;AAAA,IACrC,GAAG;AAAA,IACH,SAASN,YAAW,MAAM,SAAS,OAAO;AAAA,IAC1C,WAAW,SAAS,aAAaM;AAAA,IACjC,WAAWL,sBAAqB,MAAM,SAAS,SAAS;AAAA,EAC1D;AACA,QAAM,OAAO,MAAM,SAAS,QAAQ,QAAQ,MAAM,aAAa;AAC/D,MAAI,QAAQ,KAAM,QAAO,EAAE,OAAO,QAAQ,KAAK;AAE/C,QAAM,WAAW,MAAM,uBAAuB,QAAQ,QAAQ,MAAM,SAAS;AAC7E,QAAM,mBAAmB,uBAAuB;AAAA,IAC9C,WAAW,MAAM,aAAaK;AAAA,IAC9B,eAAe,MAAM;AAAA,IACrB,iBAAiB,MAAM;AAAA,IACvB,GAAI,MAAM,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;AAAA,IACtE,UAAU,SAAS;AAAA,EACrB,CAAC;AACD,MAAI,CAAC,iBAAiB,IAAI;AACxB,UAAM,SAAS,iBAAiB,WAAW,uBACtC,2BAA2B,UAAU,KAAK,IAC3C,oBACA,iBAAiB;AACrB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,eAAe,MAAM;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,IAAI;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,SAAS,cAAc,IAAI,iBAAiB,QAAQ,UAAU;AAC9E,MAAI,YAAY,OAAW,OAAM,IAAI,MAAM,sCAAsC;AACjF,MAAI,QAAQ,KAAK,yBAAyB,MAAM,SAAS;AACvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,eAAe,MAAM;AAAA,QAAe,gBAAgB,KAAK;AAAA,QAAgB,IAAI;AAAA,QAAO,QAAQ;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACA,QAAM,eAAe,8BAA8B;AAAA,IACjD,eAAe,MAAM;AAAA,IACrB,MAAM,SAAS;AAAA,IACf,SAAS,iBAAiB;AAAA,EAC5B,CAAC;AACD,MAAI,CAAC,aAAa,IAAI;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,QACN,eAAe,MAAM;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,IAAI;AAAA,QACJ,QAAQ,aAAa;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,SAAS,UAAU,IAAI,aAAa,IAAI,UAAU;AAC9D,MAAI,QAAQ,OAAW,OAAM,IAAI,MAAM,6CAA6C;AACpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,eAAe,MAAM;AAAA,MACrB,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;;;ACnXA,IAAMG,oBAAmB;AAEzB,SAASC,kBAAiB,OAAuB;AAC/C,SAAOD,kBAAiB,KAAK,KAAK,IAAI,MAAM,YAAY,IAAI;AAC9D;AAEO,SAAS,mBAAmB,SAAiB,WAA4B;AAC9E,SAAOC,kBAAiB,OAAO,MAAMA,kBAAiB,SAAS;AACjE;AAOO,SAAS,uBACd,QACA,WACsB;AACtB,QAAM,aAAa,CAAC,WAAoC,EAAE,GAAG,OAAO,SAAS,UAAU;AACvF,QAAM,aAAa,CAAC,WAAkD,EAAE,GAAG,OAAO,SAAS,UAAU;AACrG,QAAM,eAAe,OAAO,aACzB,MAAM,SAAS,OAAO,YAAU,mBAAmB,OAAO,SAAS,SAAS,CAAC;AAChF,QAAM,eAAe,OAAO,aACzB,MAAM,SAAS,OAAO,YAAU,mBAAmB,OAAO,SAAS,SAAS,CAAC;AAEhF,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,OAAO,QAAyB,OAAoB;AACxD,aAAO,MAAM,aAAa,OAAO,OAAO,QAAQ,WAAW,KAAK,CAAC,CAAC;AAAA,IACpE;AAAA,IACA,MAAM,eAAe,YAAiC;AACpD,aAAO,MAAM,aAAa,OAAO,gBAAgB,WAAW,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAAA,IACzF;AAAA,IACA,MAAM,gBAAgB,SAA2B,OAAoB;AACnE,UAAI,CAAC,mBAAmB,SAAS,SAAS,EAAG,QAAO,CAAC;AACrD,aAAO,MAAM,aAAa,OAAO,gBAAgB,WAAW,WAAW,KAAK,CAAC,CAAC;AAAA,IAChF;AAAA,IACA,MAAM,MAAM,QAAgB,WAAmB;AAC7C,aAAO,MAAM,aAAa,OAAO,MAAM,QAAQ,SAAS,CAAC;AAAA,IAC3D;AAAA,IACA,MAAM,OAAO,QAAyB,OAA2B;AAC/D,aAAO,MAAM,aAAa,OAAO,OAAO,QAAQ,WAAW,KAAK,CAAC,CAAC;AAAA,IACpE;AAAA,IACA,MAAM,OAAO;AACX,aAAO,MAAM,OAAO,KAAK;AAAA,IAC3B;AAAA,IACA,MAAM,OAAO,YAAiC;AAC5C,aAAO,MAAM,OAAO,OAAO,UAAU;AAAA,IACvC;AAAA,IACA,MAAM,OAAO,QAAyB;AACpC,aAAO,MAAM,OAAO,OAAO,MAAM;AAAA,IACnC;AAAA,IACA,MAAM,WAAW,QAAgB,WAAmB;AAClD,aAAO,MAAM,OAAO,WAAW,QAAQ,SAAS;AAAA,IAClD;AAAA,EACF,CAAC;AACH;;;AC7DA,SAAS,oCAAoC;AA+B7C,SAAS,cACP,QACA,aACA,eAC4B;AAC5B,QAAM,qBAAqB,IAAI,IAAI,OAAO,IAAI,WAAS,MAAM,aAAa,UAAU,CAAC;AACrF,MAAI,OAAO,KAAK,YAAU,MAAM,uBAAuB,OAAO,sBAAsB,aAAa,KAC5F,OAAO,KAAK,YAAU,MAAM,aAAa,kBAAkB,OAAO,sBAAsB,aAAa,KACrG,YAAY,KAAK,UAAQ,mBAAmB,IAAI,KAAK,UAAU,YAAY,MACxE,KAAK,UAAU,kBAAkB,OAAO,sBAAsB,aAAa,GAAG;AACpF,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,WAAS,MAAM,aAAa,KAAK,kBAAkB,aAAa,EAAG,QAAO;AAC3F,SAAO;AACT;AAEA,SAAS,aACP,QACA,aACA,eAC4B;AAC5B,QAAM,SAAS,OAAO,OAA+C,CAAC,UAAU,cAC9E,aAAa,UAAa,UAAU,sBAAsB,WAAW,SAAS,sBAAsB,WAChG,YACA,UAAU,MAAS;AACzB,MAAI,WAAW,OAAW,QAAO;AAEjC,QAAM,sBAAsB,YAAY,OAAO,UAC7C,KAAK,UAAU,iBAAiB,OAAO,aAAa,UAAU;AAChE,OAAK,OAAO,uBAAuB,OAAO,sBAAsB,kBAC1D,OAAO,aAAa,kBAAkB,OAAO,sBAAsB,iBACpE,oBAAoB,KAAK,WACzB,KAAK,UAAU,kBAAkB,OAAO,sBAAsB,aAAa,GAAG;AACjF,WAAO;AAAA,EACT;AACA,SAAO,OAAO,aAAa,KAAK,kBAAkB,gBAAgB,YAAY;AAChF;AAEO,SAAS,gCACd,QACA,aACA,WACA,eAC6B;AAC7B,QAAM,UAAU,IAAI,QAAQ,QAAQ,WAAS,GAAG,MAAM,UAAU,IAAI,MAAM,aAAa,KAAK,cAAc,EAAE;AAC5G,QAAM,SAAsC,CAAC;AAC7C,aAAW,SAAS,QAAQ,OAAO,GAAG;AACpC,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,mBAAmB,YAAY,OAAO,UAAQ,KAAK,eAAe,MAAM,UAAU;AACxF,UAAM,aAAa,6BAA6B;AAAA,MAC9C,aAAa,iBAAiB,IAAI,UAAQ,KAAK,SAAS;AAAA,MACxD;AAAA,MACA,iBAAiB;AAAA,MACjB,kBAAkB,MAAM;AAAA,MACxB,gBAAgB,MAAM,aAAa,KAAK;AAAA,MACxC,eAAe,MAAM,IAAI,UAAQ,KAAK,qBAAqB;AAAA,IAC7D,CAAC;AACD,QAAI,WAAW,IAAI;AACjB,YAAM,WAAW,MAAM,KAAK,UAAQ,KAAK,aAAa,eAAe,WAAW,aAAa,UAAU;AACvG,YAAM,aAAa,iBAAiB,KAAK,UAAQ,KAAK,UAAU,eAAe,WAAW,WAAW,UAAU;AAC/G,UAAI,UAAU,wBAAwB,UAAa,SAAS,uBAAuB,eAAe;AAChG,eAAO,KAAK;AAAA,UACV,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,YAAY,MAAM;AAAA,UAClB,gBAAgB,MAAM,aAAa,KAAK;AAAA,UACxC,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,eAAO,KAAK;AAAA,UACV,GAAI,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,WAAW,QAAQ;AAAA,UACrE,iBAAiB,WAAW;AAAA,UAC5B,oBAAoB,WAAW;AAAA,UAC/B,sBAAsB,WAAW,aAAa;AAAA,UAC9C,OAAO;AAAA,UACP,YAAY,MAAM;AAAA,UAClB,gBAAgB,MAAM,aAAa,KAAK;AAAA,UACxC,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,aAAO,KAAK;AAAA,QACV,QAAQ,WAAW;AAAA,QACnB,OAAO,WAAW,WAAW,yBACzB,aAAa,OAAO,kBAAkB,aAAa,IACnD,WAAW,WAAW,4BAA4B,WAAW,WAAW,yBACtE,aACA,cAAc,OAAO,kBAAkB,aAAa;AAAA,QAC1D,YAAY,MAAM;AAAA,QAClB,gBAAgB,MAAM,aAAa,KAAK;AAAA,QACxC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAA+D;AAC9F,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,YAAY,MAAM;AAAA,IAClB,cAAc,MAAM;AAAA,IACpB,YAAY,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,2BACP,OACA,UACA,aACA,KACA,eACA,WACS;AACT,SAAO,MAAM,QAAQ,eAAe,eAC/B,MAAM,aAAa,KAAK,kBAAkB,IAAI,cAC9C,MAAM,aAAa,KAAK,UAAU,IAAI,KAAK,SAC3C,wBAAwB,UAAU,MAAM,SAAS,WAAW,aAAa,KACzE,oBAAoB,UAAU,MAAM,SAAS,IAAI,YAAY,aAAa,MACzE,MAAM,wBAAwB,UAAa,MAAM,sBAAsB,mBACvE,MAAM,aAAa,mBAAmB,UAAa,MAAM,aAAa,iBAAiB,kBACxF,gBAAgB,OAAO,oBACvB,MAAM,aAAa,KAAK,iBAAiB,gBAAgB;AAChE;AAaO,SAAS,oCACd,OACgC;AAChC,QAAM,wBAAwB,IAAI,IAAI,MAAM,YAAY,IAAI,UAAQ,KAAK,UAAU,YAAY,CAAC;AAChG,QAAM,aAA6C,CAAC;AACpD,aAAW,gBAAgB,MAAM,eAAe;AAC9C,QAAI,aAAa,UAAU,aACtB,EAAE,aAAa,UAAU,YAAY,aAAa,uBAAuB,MAAO;AAErF,UAAM,kBAAkB,KAAK,IAAI,GAAG,aAAa,OAAO,IAAI,CAAAC,WAASA,OAAM,aAAa,KAAK,QAAQ,CAAC;AACtG,UAAM,SAAS,MAAM,OAAO,OAAO,CAAAA,WACjCA,OAAM,eAAe,aAAa,cAC/BA,OAAM,aAAa,KAAK,mBAAmB,aAAa,kBACxDA,OAAM,aAAa,KAAK,aAAa,eAAe;AACzD,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,sBAAsB,IAAI,MAAM,aAAa,UAAU,KACtD,CAAC;AAAA,MACF;AAAA,MACA,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR,EAAG;AACL,eAAW,KAAK;AAAA,MACd,KAAK,MAAM;AAAA,MACX,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM,aAAa,KAAK;AAAA,MACxC,OAAO,wBAAwB,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;AHpHA,SAAS,wBACP,SACA,WACmC;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,uBAAuB,QAAQ,QAAQC,eAAc,MAAM,SAAS,CAAC;AAAA,EAC/E;AACF;AAEA,SAAS,qBAAqB,OAAwB,WAA4B;AAChF,SAAO,MAAM,cAAc,aACtB,MAAM,YAAY,WAAW,KAC7B,MAAM,YAAY,CAAC,MAAM;AAChC;AAEA,SAAS,4BACP,cACA,SACA,WACA,aACA,WACS;AACT,SAAO,aAAa,cAAc,aAC7B,aAAa,YAAY,WACzB,aAAa,YAAY,eACzB,aAAa,UAAU;AAC9B;AAEA,SAAS,mBACP,cACA,SACA,UACA,YACS;AACT,QAAM,MAAM,SAAS,UAAU,IAAI,aAAa,aAAa;AAC7D,SAAO,aAAa,kBAAkB,QAAQ,KAAK,0BAC9C,KAAK,KAAK,UAAU,aAAa,SACjC,QAAQ,KAAK,eAAe,SAAS,IAAI,UAAU,KACnD,oBAAoB,UAAU,SAAS,IAAI,YAAY,UAAU;AACxE;AAEA,SAAS,4BACP,cACA,SACA,YACS;AACT,SAAO,aAAa,iBAAiB,cAChC,aAAa,kBAAkB,aAAa,QAAQ,OAAO;AAClE;AAEA,eAAe,iBACb,QACA,SAIC;AACD,SAAO;AAAA,IACL,QAAQ,MAAM;AAAA,MACZ;AAAA,MACA,QAAQ,OAAO,YAAU,OAAO,iBAAiBC,0BAAyB;AAAA,MAC1E,WAAS,uBAAuB,UAAU,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,eAAe,MAAM;AAAA,MACnB;AAAA,MACA,QAAQ,OAAO,YAAU,OAAO,iBAAiBC,iCAAgC;AAAA,MACjF,WAAS,8BAA8B,UAAU,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,cACb,QACA,SACA,YACA,SACA,UACA,SACA,WACA,cAC6E;AAC7E,QAAM,iBAAiB,QAAQ,OAAO,YAAU,OAAO,iBAAiBC,2BAA0B,OAAO,iBAAiBA,uBAAsB;AAChJ,QAAM,eAAe,QAAQ,OAAO,YAAU,OAAO,iBAAiBC,sBAAqB;AAC3F,QAAM,sBAAsB,QAAQ,OAAO,YAAU,OAAO,iBAAiBC,oCAAmC,OAAO,iBAAiBA,gCAA+B;AACvK,QAAM,eAAe,uBAAuB,QAAQ,CAAC,CAAC;AACtD,QAAM,SAAS,CAAC,YAA8C;AAAA,IAC5D,WAAW;AAAA,MACT,UAAU;AAAA,MAAc;AAAA,MAAQ;AAAA,IAClC;AAAA,EACF;AACA,MAAI,eAAe,WAAW,KACzB,eAAe,CAAC,GAAG,eAAe,QAAQ,cAC1C,aAAa,WAAW,KACxB,oBAAoB,WAAW,GAAG;AACrC,WAAO,OAAO,eAAe;AAAA,EAC/B;AAEA,QAAM,cAAc,aAAa,CAAC;AAClC,QAAM,qBAAqB,oBAAoB,CAAC;AAChD,QAAM,cAAc,mBAAmB,UAAU,MAAM,4BAA4B,QAAQ,WAAW,CAAC;AACvG,MAAI,CAAC,YAAY,QAAS,QAAO,OAAO,iBAAiB;AACzD,QAAM,qBAAqB,6BAA6B;AAAA,IACtD,MAAM,4BAA4B,QAAQ,kBAAkB;AAAA,EAC9D;AACA,MAAI,CAAC,mBAAmB,QAAS,QAAO,OAAO,wBAAwB;AACvE,QAAM,QAAQ,YAAY;AAC1B,QAAM,eAAe,mBAAmB;AACxC,QAAM,aAAa,mBAAmB;AAEtC,MAAI,CAAC,4BAA4B,QAAQ,MAAM,cAAc,OAAO,EAAG,QAAO,OAAO,8BAA8B;AACnH,MAAI,CAAC,qBAAqB,OAAO,SAAS,EAAG,QAAO,OAAO,uBAAuB;AAClF,MAAI,CAAC,4BAA4B,cAAc,SAAS,WAAW,QAAQ,YAAY,YAAY,UAAU,GAAG;AAC9G,WAAO,OAAO,8BAA8B;AAAA,EAC9C;AACA,QAAM,aAAa,SAAS,UAAU,IAAI,aAAa,aAAa;AACpE,MAAI,QAAQ,SAAS,SAAS,WAAY,QAAO,OAAO,2BAA2B;AACnF,MAAI,eAAe,UAAa,WAAW,SAAS,SAAS,WAAY,QAAO,OAAO,qBAAqB;AAC5G,MAAI,CAAC,wBAAwB,UAAU,SAAS,WAAW,UAAU,EAAG,QAAO,OAAO,2BAA2B;AACjH,MAAI,CAAC,mBAAmB,cAAc,SAAS,UAAU,UAAU,EAAG,QAAO,OAAO,qBAAqB;AACzG,MAAI,CAAC,4BAA4B,cAAc,QAAQ,MAAM,UAAU,EAAG,QAAO,OAAO,sBAAsB;AAE9G,QAAM,UAAU,MAAM,iBAAiB,QAAQ,YAAY;AAC3D,QAAM,6BAA6B,yBAAyB,QAAQ,eAAe,mBAAmB,UAAU;AAChH,QAAM,sBAAsB,yBAAyB,QAAQ,QAAQ,YAAY,UAAU;AAC3F,SAAO;AAAA,IACL,OAAO;AAAA,MACL,OAAO;AAAA,QACL,MAAM;AAAA,QAAO,UAAU,kBAAkB,WAAW;AAAA,QAAG,YAAY,YAAY;AAAA,MACjF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,UAAU,kBAAkB,kBAAkB;AAAA,QAC9C,YAAY,mBAAmB;AAAA,QAC/B,GAAI,+BAA+B,SAAY,CAAC,IAAI,EAAE,gBAAgB,2BAA2B;AAAA,MACnG;AAAA,MACA,uBAAuB;AAAA,QACrB,gBAAgB;AAAA,QAChB,gBAAgB,aAAa;AAAA,QAC7B,YAAY,mBAAmB;AAAA,QAC/B,UAAU,aAAa;AAAA,QACvB,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,gBAAgB,aAAa;AAAA,QAC7B,YAAY,aAAa;AAAA,MAC3B;AAAA,MACA,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEA,eAAe,eACb,QACA,UACA,UACA,OACA,kBACiF;AACjF,QAAM,gBAAgB,IAAI,IAAI,SAAS,IAAI,aAAW,CAAC,QAAQ,YAAY,OAAO,CAAC,CAAC;AACpF,QAAM,gBAAgB,IAAI,IAAI,cAAc,KAAK,CAAC;AAClD,QAAM,UAAU,qBAAqB,SACjC,CAAC,GAAG,IAAI,KAAK,MAAM,OAAO,gBAAgBL,eAAc,MAAM,MAAM,SAAS,CAAC,GAC3E,OAAO,WAAS,cAAc,IAAI,MAAM,UAAU,CAAC,EACnD,IAAI,WAAS,MAAM,MAAM,CAAC,CAAC,EAC3B,OAAO,YAAU,CAAC,mBAAmB,QAAQ,MAAM,SAAS,CAAC,IAChE,CAAC,GAAG,IAAI,IAAI,gBAAgB,CAAC,EAC1B,OAAO,YAAU,CAAC,mBAAmB,QAAQ,MAAM,SAAS,CAAC;AACpE,QAAM,SAAS,oBAAI,IAA4B;AAC/C,QAAM,aAA2C,CAAC;AAClD,aAAW,UAAU,SAAS;AAC5B,UAAM,gBAAgBA,eAAc,MAAM,MAAM;AAChD,UAAM,SAAS,MAAM,OAAO,OAAO,eAAe,EAAE,SAASA,eAAc,MAAM,MAAM,SAAS,EAAE,CAAC;AACnG,UAAM,SAAS,IAAI,QAAQ,QAAQ,iBAAiB;AACpD,eAAW,WAAW,OAAO,OAAO,GAAG;AACrC,YAAM,qBAAqB,QAAQ,QAAQ,CAAC,WAAW;AACrD,cAAM,UAAU,cAAc,IAAI,OAAO,UAAU;AACnD,eAAO,YAAY,SAAY,CAAC,IAAI,CAAC,OAAO;AAAA,MAC9C,CAAC;AACD,iBAAW,WAAW,oBAAoB;AACxC,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACF;AACA,YAAI,OAAO,cAAc,OAAW,YAAW,KAAK,OAAO,SAAS;AACpE,YAAI,OAAO,UAAU,QAAW;AAC9B,gBAAM,WAAW,GAAG,OAAO,MAAM,UAAU,IAAI,OAAO,MAAM,aAAa,UAAU;AACnF,gBAAM,QAAQ,OAAO,IAAI,QAAQ;AACjC,cAAI,UAAU,UAAa,OAAO,MAAM,aAAa,SAAS,QAAQ,MAAM,aAAa,SAAS,OAAO;AACvG,mBAAO,IAAI,UAAU,OAAO,KAAK;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,YAAY,QAAQ,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE;AACpD;AAEA,SAAS,sBACP,WACA,UACA,YACA,OACA,SACA,WACS;AACT,SAAO,UAAU,YAAY,WACxB,UAAU,cAAc,aACxB,UAAU,eAAe,MAAM,cAC/B,UAAU,YAAY,MAAM,QAAQ,cACpC,UAAU,kBAAkB,MAAM,aAAa,KAAK,iBACpD,UAAU,UAAU,MAAM,aAAa,KAAK,SAC5C,UAAU,iBAAiB,MAAM,aAAa,cAC9C,UAAU,UAAU,MAAM,MAAM,cAChC,UAAU,cAAc,MAAM,aAAa,KAAK,aAChD,SAAS,cAAc,WAAW;AACzC;AAEA,eAAe,qBACb,SACA,UACA,QACA,SACA,WACgC;AAChC,QAAM,mBAAmBA,eAAc,MAAM,SAAS;AACtD,QAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,kBAAkB,EAAE,SAAS,iBAAiB,CAAC;AAC1F,QAAM,cAAc,MAAM;AAAA,IACxB,QAAQ;AAAA,IACR,OAAO,OAAO,YAAU,OAAO,iBAAiBM,iCAAgC;AAAA,IAChF,WAASC,+BAA8B,UAAU,KAAK;AAAA,EACxD;AACA,QAAM,wBAAwB,MAAM;AAAA,IAClC,QAAQ;AAAA,IACR,OAAO,OAAO,YAAU,OAAO,iBAAiBC,2CAA0C;AAAA,IAC1F,WAAS,wCAAwC,UAAU,KAAK;AAAA,IAChE;AAAA,EACF;AACA,QAAM,SAAgC,CAAC;AACvC,aAAW,WAAW,aAAa;AACjC,UAAM,aAAa,OAAO,OAAO,eAC/B,QAAQ,KAAK,YAAY,UAAU,QAAQ,cACxC,QAAQ,KAAK,kBAAkB,UAAU,aAAa,KAAK,iBAC3D,QAAQ,KAAK,iBAAiB,UAAU,aAAa,cACrD,QAAQ,KAAK,UAAU,UAAU,MAAM,UAAU;AACtD,QAAI,WAAW,WAAW,EAAG;AAE7B,UAAM,gBAAgB,MAAM,gCAAgC,QAAQ,MAAM,QAAQ,KAAK,SAAS;AAChG,UAAM,eAAe,MAAM,gCAAgC,QAAQ,MAAM,QAAQ,KAAK,QAAQ;AAC9F,UAAM,YAAY,qBAAqB,UAAU,aAAa;AAC9D,UAAM,WAAW,6BAA6B,UAAU,YAAY;AACpE,QAAI,CAAC,UAAU,WAAW,CAAC,SAAS,QAAS;AAK7C,UAAM,WAAW,WAAW,OAAO,CAAAC,WAAS,QAAQ,SAAS,QAAQA,OAAM,aAAa,SAAS,SAC5F,wBAAwB,UAAUA,OAAM,SAAS,WAAW,QAAQ,SAAS,KAAK,KAClF,oBAAoB,UAAUA,OAAM,SAAS,QAAQ,KAAK,eAAe,QAAQ,SAAS,KAAK,KAC/F,QAAQ,SAAS,QAAQ,IAAIA,OAAM,aAAa,KAAK,mBACpDA,OAAM,wBAAwB,UAAaA,OAAM,sBAAsB,QAAQ,SAAS,WACxFA,OAAM,aAAa,mBAAmB,UACrCA,OAAM,aAAa,iBAAiB,QAAQ,SAAS,UACvD,sBAAsB,UAAU,MAAM,SAAS,MAAM,QAAQ,MAAMA,QAAO,SAAS,SAAS,CAAC;AAClG,QAAI,SAAS,WAAW,EAAG;AAC3B,UAAM,QAAQ,SAAS,CAAC;AAExB,UAAM,iBAAiB,yBAAyB,uBAAuB,QAAQ,UAAU;AACzF,UAAM,iBAAqE;AAAA,MACzE,GAAG;AAAA,MACH,GAAI,mBAAmB,SAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IAC3D;AACA,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,QACT,iBAAiB,QAAQ,SAAS;AAAA,QAClC,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,QACR,cAAc,MAAM,aAAa;AAAA,MACnC;AAAA,MACA,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAe,mBACb,SACA,UACA,kBACA,gBAC6B;AAC7B,QAAM,gBAAgB,wBAAwB,SAAS,SAAS,SAAS;AACzE,QAAM,YAAY,MAAM,yBAAyB,eAAe,QAAQ;AACxE,MAAI,UAAU,aAAa,OAAW,QAAO,EAAE,UAAU;AAEzD,QAAM,mBAAmB,CAAC,GAAG,UAAU,SAAS,cAAc,OAAO,CAAC,EAAE,OAAO,aAC7E,QAAQ,SAAS,WAAW,UAAU,MAAM,cACxC,UAAU,MAAM,cAAc,UAAa,QAAQ,KAAK,cAAc,UAAU,MAAM,cACvF,QAAQ,KAAK,OAAO,KAAK,WAAS,MAAM,SAAS,UAAU,MAAM,SAAS,KAC1E,QAAQ,SAAS,SAAS,UAAU,MAAM,aAAa;AAC5D,QAAM,QAAQ,MAAM;AAAA,IAClB,cAAc;AAAA,IACd;AAAA,IACA,UAAU;AAAA,IACV,EAAE,SAAS,UAAU,MAAM,SAAS,WAAW,UAAU,MAAM,UAAU;AAAA,IACzE;AAAA,EACF;AACA,QAAM,SAAS,mBAAmB,SAC9B,MAAM,SACN,MAAM,OAAO,OAAO,WAAS,MAAM,aAAa,KAAK,mBAAmB,cAAc;AAC1F,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,EAClB;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,eAAe;AAAA,MACb;AAAA,MACA;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cAAc,YAAwD;AAC7E,MAAI,EAAE,mBAAmB,aAAa;AACpC,QAAI,WAAW,UAAU,OAAO,IAAI;AAClC,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,WAAO,WAAW,UAAU;AAAA,EAC9B;AACA,QAAM;AAAA,IACJ;AAAA,IAAW;AAAA,IAAY;AAAA,EACzB,IAAI;AACJ,QAAM,YAAY,EAAE,YAAY,cAAc;AAC9C,MAAI,UAAU,OAAO,IAAI;AACvB,WAAO;AAAA,MACL,GAAG,UAAU;AAAA,MACb,GAAG;AAAA,MACH,yBAAyB;AAAA,MACzB,kBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,UAAU,OAAO,mBAAmB,MAAM;AAC5C,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AACA,SAAO;AAAA,IACL,eAAe,UAAU,OAAO;AAAA,IAChC,yBAAyB;AAAA,IACzB,gBAAgB,UAAU,OAAO;AAAA,IACjC,IAAI;AAAA,IACJ,kBAAkB,UAAU;AAAA,IAC5B,GAAG;AAAA,EACL;AACF;AAEO,SAAS,iCACd,SAC4B;AAC5B,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,qBACJ,UACgD;AAChD,YAAM,aAAa,SAAS,eAAe,SACvC,SACAC,sBAAqB,MAAM,SAAS,UAAU;AAClD,YAAM,iBAAiB,SAAS,mBAAmB,SAC/C,SACA,eAAe,MAAM,SAAS,cAAc;AAChD,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA,eAAe,SAAY,SAAY,CAAC,UAAU;AAAA,QAClD;AAAA,MACF;AACA,UAAI,EAAE,mBAAmB,aAAa;AACpC,YAAI,WAAW,UAAU,OAAO,IAAI;AAClC,gBAAM,IAAI,MAAM,mDAAmD;AAAA,QACrE;AACA,eAAO,WAAW,UAAU;AAAA,MAC9B;AACA,UAAI,CAAC,WAAW,UAAU,OAAO,GAAI,QAAO,WAAW,UAAU;AACjE,YAAM;AAAA,QACJ;AAAA,QAAU;AAAA,QAAO;AAAA,MACnB,IAAI,WAAW;AACf,UAAI,aAAa,OAAW,OAAM,IAAI,MAAM,sDAAsD;AAClG,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,oCAAoC;AAAA,UAC9C,aAAa,WAAW;AAAA,UACxB;AAAA,UACA,eAAe,MAAM;AAAA,UACrB,KAAK,OAAO;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB,SAAS,OAAO;AAAA,UAChB,eAAe,WAAW;AAAA,UAC1B,QAAQ,WAAW;AAAA,QACrB,CAAC;AAAA,QACD,YAAY,WAAW;AAAA,QACvB,eAAe,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,MAAM,yBAAyB,OAAoE;AACjG,cAAQ,MAAM,yBAAyB,wBAAwB,SAAS,MAAM,SAAS,GAAG,KAAK,GAAG;AAAA,IACpG;AAAA,IAEA,MAAM,UAAU,OAAiE;AAC/E,aAAO,cAAc,MAAM,mBAAmB,SAAS,KAAK,CAAC;AAAA,IAC/D;AAAA,IAEA,MAAM,WAAW,UAA8E;AAC7F,YAAM,aAAaA,sBAAqB,MAAM,SAAS,UAAU;AACjE,YAAM,iBAAiB,SAAS,mBAAmB,SAC/C,SACA,eAAe,MAAM,SAAS,cAAc;AAChD,YAAM,OAAO,cAAc,MAAM,mBAAmB,SAAS,UAAU,CAAC,UAAU,GAAG,cAAc,CAAC;AACpG,aAAO,KAAK,KAAK,EAAE,GAAG,MAAM,WAAW,IAAI;AAAA,IAC7C;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": ["tuple", "HashZod", "ChainIdZod", "normalizeAddress", "NormalizedAddressZod", "WakeSubscriptionAcceptanceSchema", "STATEMENT_FOLD_VERSION", "HashZod", "HashZod", "ChainIdZod", "NormalizedAddressZod", "PayloadBuilder", "HashZod", "ChainIdZod", "NormalizedAddressZod", "compareApplied", "LegacyHexAddress", "normalizeAddress", "claimKey", "eventKey", "PayloadBuilder", "mismatch", "STATEMENT_FOLD_VERSION", "appliedKey", "HashZod", "normalizeAddress", "WakeSubscriptionAcceptanceSchema", "ChainIdZod", "NormalizedAddressZod", "HashZod", "EncryptedWakeSubscriptionSchema", "NormalizedAddressZod", "PublisherServiceSchema", "WakeGrantObjectSchema", "WakeGrantRevocationSchema", "WakeSubscriptionAcceptanceRevocationSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionRevocationSchema", "XyoAddressZod", "ChainIdZod", "NormalizedAddressZod", "PublisherEncryptionKeyRevocationSchema", "PublisherEncryptionKeySchema", "PublisherServiceRevocationSchema", "PublisherServiceSchema", "SOURCE_WAKE_EVENT_KIND", "PayloadBuilder", "XyoAddressZod", "LegacyHexAddress", "normalizeAddress", "tuple", "XyoAddressZod", "WakeGrantRevocationSchema", "WakeSubscriptionRevocationSchema", "PublisherServiceSchema", "WakeGrantObjectSchema", "EncryptedWakeSubscriptionSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionAcceptanceRevocationSchema", "tuple", "NormalizedAddressZod"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/event-kit-statement-graph",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Statement Graph read-model adapter for Event Kit wake grants",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xyo",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"README.md"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@xyo-network/event-kit-protocol": "~0.1.
|
|
37
|
-
"@xyo-network/event-kit-schemas": "~0.1.
|
|
36
|
+
"@xyo-network/event-kit-protocol": "~0.1.9",
|
|
37
|
+
"@xyo-network/event-kit-schemas": "~0.1.9"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@ariestools/lib-neutral": "~9.1.2",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@ariestools/toolchain": "~9.1.2",
|
|
43
43
|
"@ariestools/tsconfig": "~9.1.2",
|
|
44
44
|
"@opentelemetry/api": "~1.9.1",
|
|
45
|
-
"@xyo-network/event-kit-xl1": "~0.1.
|
|
45
|
+
"@xyo-network/event-kit-xl1": "~0.1.9",
|
|
46
46
|
"@xyo-network/sdk": "~7.4.0",
|
|
47
47
|
"@xyo-network/sdk-protocol": "~7.4.2",
|
|
48
|
-
"@xyo-network/xl1-protocol": "~5.5.
|
|
49
|
-
"@xyo-network/xl1-sdk": "~5.5.
|
|
48
|
+
"@xyo-network/xl1-protocol": "~5.5.1",
|
|
49
|
+
"@xyo-network/xl1-sdk": "~5.5.1",
|
|
50
50
|
"@xyo-network/xl1-statement-graph-engine": "~0.5.3",
|
|
51
51
|
"@xyo-network/xl1-statement-graph-schemas": "~0.5.3",
|
|
52
52
|
"@xyo-network/xl1-statement-graph-sdk": "~0.5.3",
|