footprintjs 9.48.2 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* slice/serialize.ts — JSON-safe and LLM-safe projections of a slice.
|
|
3
|
-
*
|
|
4
|
-
* WHY (the failure this prevents): `VariableSlice.root` is an in-memory DAG.
|
|
5
|
-
* Nodes are SHARED — a diamond ancestor is one object reached through many
|
|
6
|
-
* paths, and each node appears in both `parents` and `parentEdges[].parent`.
|
|
7
|
-
* `JSON.stringify` knows nothing about sharing: it re-serializes every shared
|
|
8
|
-
* subtree per path, which explodes combinatorially on diamond-heavy slices.
|
|
9
|
-
* The two consumers that would naively stringify are exactly the ones this
|
|
10
|
-
* library exists for — wire transfer (persist / send a slice) and LLM tools
|
|
11
|
-
* (bounded context). Each gets a purpose-built projection:
|
|
12
|
-
*
|
|
13
|
-
* - {@link sliceToJSON} — flat, id-referenced, LINEAR in node count.
|
|
14
|
-
* - {@link formatSlice} — one bounded human/LLM-readable string that also
|
|
15
|
-
* renders the honesty envelope (missing reason, reads coverage, truncation)
|
|
16
|
-
* a raw `formatCausalChain` doesn't know about.
|
|
17
|
-
*
|
|
18
|
-
* The FORWARD half has exactly the same hazard and the same two projections:
|
|
19
|
-
* {@link forwardSliceToJSON} / {@link formatForwardSlice}. A forward DAG
|
|
20
|
-
* shares nodes just as readily — two values read by one stage feed the same
|
|
21
|
-
* child write — so a forward root must never be stringified either.
|
|
22
|
-
*
|
|
23
|
-
* {@link KeyTimeline} is the deliberate exception, stated so nobody adds a
|
|
24
|
-
* pointless twin: it is a FLAT list of plain fields holding no live
|
|
25
|
-
* references and no sharing, so `JSON.stringify(timeline)` is already
|
|
26
|
-
* correct and linear. What it still needs is the bounded LLM projection —
|
|
27
|
-
* {@link formatTimeline} — because "the whole life of a key" is unbounded in
|
|
28
|
-
* a long run.
|
|
29
|
-
*/
|
|
30
|
-
import { flattenCausalDAG, formatCausalChain } from '../memory/backtrack.js';
|
|
31
|
-
/**
|
|
32
|
-
* Flat, JSON-safe projection: every DAG node exactly once (keyed by
|
|
33
|
-
* runtimeStageId), edges as id references. Linear in node count — safe to
|
|
34
|
-
* persist, send, or feed to structured consumers. Lossless for everything
|
|
35
|
-
* except the in-memory object graph itself (rebuild adjacency from `edges`).
|
|
36
|
-
*/
|
|
37
|
-
export function sliceToJSON(slice) {
|
|
38
|
-
const out = {
|
|
39
|
-
key: slice.key,
|
|
40
|
-
...(slice.before !== undefined && { before: slice.before }),
|
|
41
|
-
...(slice.missing !== undefined && { missing: slice.missing }),
|
|
42
|
-
keysReadKind: slice.keysReadKind,
|
|
43
|
-
...(slice.readsCoverage !== undefined && { readsCoverage: slice.readsCoverage }),
|
|
44
|
-
};
|
|
45
|
-
if (!slice.root)
|
|
46
|
-
return out;
|
|
47
|
-
out.writerId = slice.root.runtimeStageId;
|
|
48
|
-
const nodes = {};
|
|
49
|
-
const edges = [];
|
|
50
|
-
for (const node of flattenCausalDAG(slice.root)) {
|
|
51
|
-
nodes[node.runtimeStageId] = {
|
|
52
|
-
stageId: node.stageId,
|
|
53
|
-
stageName: node.stageName,
|
|
54
|
-
keysWritten: node.keysWritten,
|
|
55
|
-
depth: node.depth,
|
|
56
|
-
...(node.incompleteSources !== undefined && { incompleteSources: node.incompleteSources }),
|
|
57
|
-
...(node.preRunReads !== undefined && { preRunReads: node.preRunReads }),
|
|
58
|
-
};
|
|
59
|
-
for (const edge of node.parentEdges) {
|
|
60
|
-
edges.push({
|
|
61
|
-
from: node.runtimeStageId,
|
|
62
|
-
to: edge.parent.runtimeStageId,
|
|
63
|
-
kind: edge.kind,
|
|
64
|
-
...(edge.key !== undefined && { key: edge.key }),
|
|
65
|
-
weight: edge.weight,
|
|
66
|
-
...(edge.basis !== undefined && { basis: edge.basis }),
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
out.nodes = nodes;
|
|
71
|
-
out.edges = edges;
|
|
72
|
-
if (slice.root.truncated)
|
|
73
|
-
out.truncated = slice.root.truncated;
|
|
74
|
-
if (slice.notes !== undefined)
|
|
75
|
-
out.notes = slice.notes;
|
|
76
|
-
return out;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* One bounded string for LLM triage tools (the `traceToolpack` consumption
|
|
80
|
-
* pattern: tools return plain strings, never recursive objects). Wraps
|
|
81
|
-
* `formatCausalChain` (which is budget-bounded by causalChain's
|
|
82
|
-
* maxDepth/maxNodes and renders shared nodes once as `↳ … (see above)`),
|
|
83
|
-
* and adds the honesty envelope the raw chain doesn't carry:
|
|
84
|
-
*
|
|
85
|
-
* - missing slices render their reason ("value came from initial state /
|
|
86
|
-
* frozen args / a closure — the commit log cannot see those"),
|
|
87
|
-
* - a reads-less provider (`readTracking: 'off'` signature) renders an
|
|
88
|
-
* explicit "⚠ reads were not recorded" instead of silently showing an
|
|
89
|
-
* anchor with no dependencies,
|
|
90
|
-
* - truncation footers pass through from formatCausalChain.
|
|
91
|
-
*/
|
|
92
|
-
export function formatSlice(slice) {
|
|
93
|
-
const lines = [];
|
|
94
|
-
const anchor = slice.before !== undefined ? ` (before commit ${slice.before})` : '';
|
|
95
|
-
lines.push(`SLICE for '${slice.key}'${anchor} — reads via: ${slice.keysReadKind}`);
|
|
96
|
-
if (slice.missing === 'empty-log') {
|
|
97
|
-
lines.push('no slice: the commit log is empty (nothing has executed).');
|
|
98
|
-
return lines.join('\n');
|
|
99
|
-
}
|
|
100
|
-
if (slice.missing === 'never-written') {
|
|
101
|
-
lines.push(`no slice: '${slice.key}' was never written in range — the value came from ` +
|
|
102
|
-
'initial state, frozen run input (args), or a closure; the commit log cannot see those.');
|
|
103
|
-
return lines.join('\n');
|
|
104
|
-
}
|
|
105
|
-
const cov = slice.readsCoverage;
|
|
106
|
-
if (cov && cov.steps > 1 && cov.stepsWithReads === 0) {
|
|
107
|
-
lines.push("⚠ reads were not recorded (readTracking may be 'off') — dependencies below are " + 'unknowable, NOT absent.');
|
|
108
|
-
}
|
|
109
|
-
if (slice.root)
|
|
110
|
-
lines.push(formatCausalChain(slice.root));
|
|
111
|
-
return [...lines, ...noteLines(slice.notes ?? [])].join('\n');
|
|
112
|
-
}
|
|
113
|
-
// ── Forward projections ───────────────────────────────────────────────────
|
|
114
|
-
/** How many reads one node lists before the renderer says "… and N more". */
|
|
115
|
-
const READS_RENDERED = 5;
|
|
116
|
-
/** BFS over the forward DAG, each node exactly once (shared nodes included). */
|
|
117
|
-
function flattenForwardDAG(root) {
|
|
118
|
-
const out = [];
|
|
119
|
-
const seen = new Set();
|
|
120
|
-
const queue = [root];
|
|
121
|
-
while (queue.length > 0) {
|
|
122
|
-
const node = queue.shift();
|
|
123
|
-
if (seen.has(node))
|
|
124
|
-
continue;
|
|
125
|
-
seen.add(node);
|
|
126
|
-
out.push(node);
|
|
127
|
-
for (const edge of node.fedEdges)
|
|
128
|
-
if (!seen.has(edge.child))
|
|
129
|
-
queue.push(edge.child);
|
|
130
|
-
}
|
|
131
|
-
return out;
|
|
132
|
-
}
|
|
133
|
-
/** `⚠ …` lines for the honesty envelope — same rendering for both doors. */
|
|
134
|
-
function noteLines(notes) {
|
|
135
|
-
return notes.map((n) => `⚠ ${n.detail}`);
|
|
136
|
-
}
|
|
137
|
-
/** One node's headline: who wrote the value, and how long it lived. */
|
|
138
|
-
function nodeHeadline(node) {
|
|
139
|
-
const life = node.nextWriteIdx !== undefined ? `live until commit ${node.nextWriteIdx}` : 'live to the end of the run';
|
|
140
|
-
if (node.origin === 'pre-run') {
|
|
141
|
-
return `'${node.key}' from BEFORE the run (initial state / input / closure) — ${life}`;
|
|
142
|
-
}
|
|
143
|
-
return `'${node.key}' ${node.verb ?? 'set'} by ${node.stageName} (${node.runtimeStageId}) @${node.commitIdx} — ${life}`;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Flat, JSON-safe projection of a {@link ForwardSlice} — the forward twin of
|
|
147
|
-
* {@link sliceToJSON}, linear in node count.
|
|
148
|
-
*
|
|
149
|
-
* Node ids are OPAQUE (`n0`, `n1`, … in BFS order) rather than
|
|
150
|
-
* `runtimeStageId` as in `SliceJSON`, for a structural reason: a forward
|
|
151
|
-
* node is a (key, write) pair, so ONE stage that wrote two keys owns two
|
|
152
|
-
* nodes and a runtimeStageId cannot key the map. Never parse the ids — join
|
|
153
|
-
* on `runtimeStageId` / `commitIdx` / `key`, which every node carries.
|
|
154
|
-
*/
|
|
155
|
-
export function forwardSliceToJSON(slice) {
|
|
156
|
-
const out = {
|
|
157
|
-
key: slice.key,
|
|
158
|
-
...(slice.before !== undefined && { before: slice.before }),
|
|
159
|
-
...(slice.missing !== undefined && { missing: slice.missing }),
|
|
160
|
-
keysReadKind: slice.keysReadKind,
|
|
161
|
-
...(slice.readsCoverage !== undefined && { readsCoverage: slice.readsCoverage }),
|
|
162
|
-
notes: slice.notes,
|
|
163
|
-
};
|
|
164
|
-
if (!slice.root)
|
|
165
|
-
return out;
|
|
166
|
-
const flat = flattenForwardDAG(slice.root);
|
|
167
|
-
const ids = new Map();
|
|
168
|
-
flat.forEach((node, i) => ids.set(node, `n${i}`));
|
|
169
|
-
out.rootId = ids.get(slice.root);
|
|
170
|
-
out.nodes = flat.map((node) => ({
|
|
171
|
-
id: ids.get(node),
|
|
172
|
-
key: node.key,
|
|
173
|
-
origin: node.origin,
|
|
174
|
-
...(node.runtimeStageId !== undefined && { runtimeStageId: node.runtimeStageId }),
|
|
175
|
-
...(node.stageId !== undefined && { stageId: node.stageId }),
|
|
176
|
-
...(node.stageName !== undefined && { stageName: node.stageName }),
|
|
177
|
-
...(node.commitIdx !== undefined && { commitIdx: node.commitIdx }),
|
|
178
|
-
...(node.verb !== undefined && { verb: node.verb }),
|
|
179
|
-
...(node.nextWriteIdx !== undefined && { nextWriteIdx: node.nextWriteIdx }),
|
|
180
|
-
depth: node.depth,
|
|
181
|
-
reads: node.reads,
|
|
182
|
-
...(node.incompleteSources !== undefined && { incompleteSources: node.incompleteSources }),
|
|
183
|
-
}));
|
|
184
|
-
out.edges = flat.flatMap((node) => node.fedEdges.map((edge) => ({ from: ids.get(node), to: ids.get(edge.child), basis: edge.basis })));
|
|
185
|
-
if (slice.root.truncated)
|
|
186
|
-
out.truncated = slice.root.truncated;
|
|
187
|
-
if (slice.notes !== undefined)
|
|
188
|
-
out.notes = slice.notes;
|
|
189
|
-
return out;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* One bounded string for LLM triage tools — the forward twin of
|
|
193
|
-
* {@link formatSlice}. Shared nodes render once (`↳ … (see above)`, the same
|
|
194
|
-
* convention `formatCausalChain` uses), read lists are capped, and every
|
|
195
|
-
* honesty note renders as a `⚠` line — including the one that says a `fed`
|
|
196
|
-
* edge is conservative, which is why edges print `[exact]` / `[conservative]`
|
|
197
|
-
* rather than looking alike.
|
|
198
|
-
*/
|
|
199
|
-
export function formatForwardSlice(slice) {
|
|
200
|
-
const lines = [];
|
|
201
|
-
const anchor = slice.before !== undefined ? ` (as of before commit ${slice.before})` : '';
|
|
202
|
-
lines.push(`FORWARD SLICE for '${slice.key}'${anchor} — reads via: ${slice.keysReadKind}`);
|
|
203
|
-
if (slice.missing === 'empty-log') {
|
|
204
|
-
lines.push('no forward slice: the commit log is empty (nothing has executed).');
|
|
205
|
-
return [...lines, ...noteLines(slice.notes)].join('\n');
|
|
206
|
-
}
|
|
207
|
-
if (slice.missing === 'never-written') {
|
|
208
|
-
lines.push(`no forward slice: '${slice.key}' was never written and never read in this log.`);
|
|
209
|
-
return [...lines, ...noteLines(slice.notes)].join('\n');
|
|
210
|
-
}
|
|
211
|
-
const seen = new Set();
|
|
212
|
-
const walk = (node, indent, lead = '') => {
|
|
213
|
-
const pad = ' '.repeat(indent);
|
|
214
|
-
const head = `${pad}${lead}${nodeHeadline(node)}`;
|
|
215
|
-
if (seen.has(node)) {
|
|
216
|
-
lines.push(`${head} ↳ (see above)`);
|
|
217
|
-
return;
|
|
218
|
-
}
|
|
219
|
-
seen.add(node);
|
|
220
|
-
lines.push(head);
|
|
221
|
-
if (node.incompleteSources && node.incompleteSources.length > 0) {
|
|
222
|
-
lines.push(`${pad} ⚠ its writer also consumed ${node.incompleteSources.join('/')} — untracked`);
|
|
223
|
-
}
|
|
224
|
-
if (node.reads.length === 0) {
|
|
225
|
-
lines.push(`${pad} (no recorded read of this value)`);
|
|
226
|
-
}
|
|
227
|
-
for (const read of node.reads.slice(0, READS_RENDERED)) {
|
|
228
|
-
lines.push(`${pad} read by ${read.stageName} (${read.runtimeStageId}) @${read.commitIdx}`);
|
|
229
|
-
}
|
|
230
|
-
if (node.reads.length > READS_RENDERED) {
|
|
231
|
-
lines.push(`${pad} … and ${node.reads.length - READS_RENDERED} more reads`);
|
|
232
|
-
}
|
|
233
|
-
for (const edge of node.fedEdges) {
|
|
234
|
-
walk(edge.child, indent + 1, `→ fed ${edge.basis === 'per-write' ? '[exact]' : '[conservative]'} `);
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
if (slice.root)
|
|
238
|
-
walk(slice.root, 0);
|
|
239
|
-
return [...lines, ...noteLines(slice.notes)].join('\n');
|
|
240
|
-
}
|
|
241
|
-
/** How many moments {@link formatTimeline} renders before it says "… and N more". */
|
|
242
|
-
const MOMENTS_RENDERED = 60;
|
|
243
|
-
/**
|
|
244
|
-
* One bounded string for a {@link KeyTimeline} — the LLM/human projection.
|
|
245
|
-
* (The timeline's JSON needs no helper: it is already flat and JSON-safe —
|
|
246
|
-
* see the file header.) Truncation is stated, never silent.
|
|
247
|
-
*/
|
|
248
|
-
export function formatTimeline(timeline) {
|
|
249
|
-
const lines = [];
|
|
250
|
-
const bound = timeline.before !== undefined ? ` (before commit ${timeline.before})` : '';
|
|
251
|
-
lines.push(`TIMELINE for '${timeline.key}'${bound} — reads via: ${timeline.keysReadKind}`);
|
|
252
|
-
if (timeline.missing === 'empty-log') {
|
|
253
|
-
lines.push('no timeline: the commit log is empty (nothing has executed).');
|
|
254
|
-
return [...lines, ...noteLines(timeline.notes)].join('\n');
|
|
255
|
-
}
|
|
256
|
-
if (timeline.missing === 'never-written') {
|
|
257
|
-
lines.push(`no timeline: '${timeline.key}' was never written and never read in this log.`);
|
|
258
|
-
return [...lines, ...noteLines(timeline.notes)].join('\n');
|
|
259
|
-
}
|
|
260
|
-
const moments = timeline.moments ?? [];
|
|
261
|
-
if (moments.length === 0)
|
|
262
|
-
lines.push('(no recorded moment for this key)');
|
|
263
|
-
for (const moment of moments.slice(0, MOMENTS_RENDERED)) {
|
|
264
|
-
const where = `${moment.stageName} (${moment.runtimeStageId})`;
|
|
265
|
-
if (moment.kind === 'write') {
|
|
266
|
-
lines.push(`@${moment.commitIdx} write ${moment.verb ?? 'set'} — ${where}`);
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
const from = moment.fromWriteIdx !== undefined ? `value from commit ${moment.fromWriteIdx}` : 'value from BEFORE the run';
|
|
270
|
-
lines.push(`@${moment.commitIdx} read — ${where} (${from})`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
if (moments.length > MOMENTS_RENDERED) {
|
|
274
|
-
lines.push(`… and ${moments.length - MOMENTS_RENDERED} more moments (bounded output)`);
|
|
275
|
-
}
|
|
276
|
-
return [...lines, ...noteLines(timeline.notes)].join('\n');
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zbGljZS9zZXJpYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVc3RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBb0I7SUFDOUMsTUFBTSxHQUFHLEdBQWM7UUFDckIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ2pGLENBQUM7SUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUU1QixHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztJQUNsRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hELEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7WUFD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Q0QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLGdDQUFnQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2xpY2Uvc2VyaWFsaXplLnRzIOKAlCBKU09OLXNhZmUgYW5kIExMTS1zYWZlIHByb2plY3Rpb25zIG9mIGEgc2xpY2UuXG4gKlxuICogV0hZICh0aGUgZmFpbHVyZSB0aGlzIHByZXZlbnRzKTogYFZhcmlhYmxlU2xpY2Uucm9vdGAgaXMgYW4gaW4tbWVtb3J5IERBRy5cbiAqIE5vZGVzIGFyZSBTSEFSRUQg4oCUIGEgZGlhbW9uZCBhbmNlc3RvciBpcyBvbmUgb2JqZWN0IHJlYWNoZWQgdGhyb3VnaCBtYW55XG4gKiBwYXRocywgYW5kIGVhY2ggbm9kZSBhcHBlYXJzIGluIGJvdGggYHBhcmVudHNgIGFuZCBgcGFyZW50RWRnZXNbXS5wYXJlbnRgLlxuICogYEpTT04uc3RyaW5naWZ5YCBrbm93cyBub3RoaW5nIGFib3V0IHNoYXJpbmc6IGl0IHJlLXNlcmlhbGl6ZXMgZXZlcnkgc2hhcmVkXG4gKiBzdWJ0cmVlIHBlciBwYXRoLCB3aGljaCBleHBsb2RlcyBjb21iaW5hdG9yaWFsbHkgb24gZGlhbW9uZC1oZWF2eSBzbGljZXMuXG4gKiBUaGUgdHdvIGNvbnN1bWVycyB0aGF0IHdvdWxkIG5haXZlbHkgc3RyaW5naWZ5IGFyZSBleGFjdGx5IHRoZSBvbmVzIHRoaXNcbiAqIGxpYnJhcnkgZXhpc3RzIGZvciDigJQgd2lyZSB0cmFuc2ZlciAocGVyc2lzdCAvIHNlbmQgYSBzbGljZSkgYW5kIExMTSB0b29sc1xuICogKGJvdW5kZWQgY29udGV4dCkuIEVhY2ggZ2V0cyBhIHB1cnBvc2UtYnVpbHQgcHJvamVjdGlvbjpcbiAqXG4gKiAtIHtAbGluayBzbGljZVRvSlNPTn0gICDigJQgZmxhdCwgaWQtcmVmZXJlbmNlZCwgTElORUFSIGluIG5vZGUgY291bnQuXG4gKiAtIHtAbGluayBmb3JtYXRTbGljZX0gICDigJQgb25lIGJvdW5kZWQgaHVtYW4vTExNLXJlYWRhYmxlIHN0cmluZyB0aGF0IGFsc29cbiAqICAgcmVuZGVycyB0aGUgaG9uZXN0eSBlbnZlbG9wZSAobWlzc2luZyByZWFzb24sIHJlYWRzIGNvdmVyYWdlLCB0cnVuY2F0aW9uKVxuICogICBhIHJhdyBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGRvZXNuJ3Qga25vdyBhYm91dC5cbiAqXG4gKiBUaGUgRk9SV0FSRCBoYWxmIGhhcyBleGFjdGx5IHRoZSBzYW1lIGhhemFyZCBhbmQgdGhlIHNhbWUgdHdvIHByb2plY3Rpb25zOlxuICoge0BsaW5rIGZvcndhcmRTbGljZVRvSlNPTn0gLyB7QGxpbmsgZm9ybWF0Rm9yd2FyZFNsaWNlfS4gQSBmb3J3YXJkIERBR1xuICogc2hhcmVzIG5vZGVzIGp1c3QgYXMgcmVhZGlseSDigJQgdHdvIHZhbHVlcyByZWFkIGJ5IG9uZSBzdGFnZSBmZWVkIHRoZSBzYW1lXG4gKiBjaGlsZCB3cml0ZSDigJQgc28gYSBmb3J3YXJkIHJvb3QgbXVzdCBuZXZlciBiZSBzdHJpbmdpZmllZCBlaXRoZXIuXG4gKlxuICoge0BsaW5rIEtleVRpbWVsaW5lfSBpcyB0aGUgZGVsaWJlcmF0ZSBleGNlcHRpb24sIHN0YXRlZCBzbyBub2JvZHkgYWRkcyBhXG4gKiBwb2ludGxlc3MgdHdpbjogaXQgaXMgYSBGTEFUIGxpc3Qgb2YgcGxhaW4gZmllbGRzIGhvbGRpbmcgbm8gbGl2ZVxuICogcmVmZXJlbmNlcyBhbmQgbm8gc2hhcmluZywgc28gYEpTT04uc3RyaW5naWZ5KHRpbWVsaW5lKWAgaXMgYWxyZWFkeVxuICogY29ycmVjdCBhbmQgbGluZWFyLiBXaGF0IGl0IHN0aWxsIG5lZWRzIGlzIHRoZSBib3VuZGVkIExMTSBwcm9qZWN0aW9uIOKAlFxuICoge0BsaW5rIGZvcm1hdFRpbWVsaW5lfSDigJQgYmVjYXVzZSBcInRoZSB3aG9sZSBsaWZlIG9mIGEga2V5XCIgaXMgdW5ib3VuZGVkIGluXG4gKiBhIGxvbmcgcnVuLlxuICovXG5cbmltcG9ydCB7IGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnLi4vbWVtb3J5L2JhY2t0cmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZvcndhcmROb2RlLFxuICBGb3J3YXJkU2xpY2UsXG4gIEZvcndhcmRTbGljZUpTT04sXG4gIEhvbmVzdHlOb3RlLFxuICBLZXlUaW1lbGluZSxcbiAgU2xpY2VKU09OLFxuICBWYXJpYWJsZVNsaWNlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBGbGF0LCBKU09OLXNhZmUgcHJvamVjdGlvbjogZXZlcnkgREFHIG5vZGUgZXhhY3RseSBvbmNlIChrZXllZCBieVxuICogcnVudGltZVN0YWdlSWQpLCBlZGdlcyBhcyBpZCByZWZlcmVuY2VzLiBMaW5lYXIgaW4gbm9kZSBjb3VudCDigJQgc2FmZSB0b1xuICogcGVyc2lzdCwgc2VuZCwgb3IgZmVlZCB0byBzdHJ1Y3R1cmVkIGNvbnN1bWVycy4gTG9zc2xlc3MgZm9yIGV2ZXJ5dGhpbmdcbiAqIGV4Y2VwdCB0aGUgaW4tbWVtb3J5IG9iamVjdCBncmFwaCBpdHNlbGYgKHJlYnVpbGQgYWRqYWNlbmN5IGZyb20gYGVkZ2VzYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZVRvSlNPTihzbGljZTogVmFyaWFibGVTbGljZSk6IFNsaWNlSlNPTiB7XG4gIGNvbnN0IG91dDogU2xpY2VKU09OID0ge1xuICAgIGtleTogc2xpY2Uua2V5LFxuICAgIC4uLihzbGljZS5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogc2xpY2UuYmVmb3JlIH0pLFxuICAgIC4uLihzbGljZS5taXNzaW5nICE9PSB1bmRlZmluZWQgJiYgeyBtaXNzaW5nOiBzbGljZS5taXNzaW5nIH0pLFxuICAgIGtleXNSZWFkS2luZDogc2xpY2Uua2V5c1JlYWRLaW5kLFxuICAgIC4uLihzbGljZS5yZWFkc0NvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzbGljZS5yZWFkc0NvdmVyYWdlIH0pLFxuICB9O1xuICBpZiAoIXNsaWNlLnJvb3QpIHJldHVybiBvdXQ7XG5cbiAgb3V0LndyaXRlcklkID0gc2xpY2Uucm9vdC5ydW50aW1lU3RhZ2VJZDtcbiAgY29uc3Qgbm9kZXM6IE5vbk51bGxhYmxlPFNsaWNlSlNPTlsnbm9kZXMnXT4gPSB7fTtcbiAgY29uc3QgZWRnZXM6IE5vbk51bGxhYmxlPFNsaWNlSlNPTlsnZWRnZXMnXT4gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIGZsYXR0ZW5DYXVzYWxEQUcoc2xpY2Uucm9vdCkpIHtcbiAgICBub2Rlc1tub2RlLnJ1bnRpbWVTdGFnZUlkXSA9IHtcbiAgICAgIHN0YWdlSWQ6IG5vZGUuc3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5zdGFnZU5hbWUsXG4gICAgICBrZXlzV3JpdHRlbjogbm9kZS5rZXlzV3JpdHRlbixcbiAgICAgIGRlcHRoOiBub2RlLmRlcHRoLFxuICAgICAgLi4uKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgIT09IHVuZGVmaW5lZCAmJiB7IGluY29tcGxldGVTb3VyY2VzOiBub2RlLmluY29tcGxldGVTb3VyY2VzIH0pLFxuICAgICAgLi4uKG5vZGUucHJlUnVuUmVhZHMgIT09IHVuZGVmaW5lZCAmJiB7IHByZVJ1blJlYWRzOiBub2RlLnByZVJ1blJlYWRzIH0pLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUucGFyZW50RWRnZXMpIHtcbiAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICBmcm9tOiBub2RlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICB0bzogZWRnZS5wYXJlbnQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGtpbmQ6IGVkZ2Uua2luZCxcbiAgICAgICAgLi4uKGVkZ2Uua2V5ICE9PSB1bmRlZmluZWQgJiYgeyBrZXk6IGVkZ2Uua2V5IH0pLFxuICAgICAgICB3ZWlnaHQ6IGVkZ2Uud2VpZ2h0LFxuICAgICAgICAuLi4oZWRnZS5iYXNpcyAhPT0gdW5kZWZpbmVkICYmIHsgYmFzaXM6IGVkZ2UuYmFzaXMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgb3V0Lm5vZGVzID0gbm9kZXM7XG4gIG91dC5lZGdlcyA9IGVkZ2VzO1xuICBpZiAoc2xpY2Uucm9vdC50cnVuY2F0ZWQpIG91dC50cnVuY2F0ZWQgPSBzbGljZS5yb290LnRydW5jYXRlZDtcbiAgaWYgKHNsaWNlLm5vdGVzICE9PSB1bmRlZmluZWQpIG91dC5ub3RlcyA9IHNsaWNlLm5vdGVzO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBib3VuZGVkIHN0cmluZyBmb3IgTExNIHRyaWFnZSB0b29scyAodGhlIGB0cmFjZVRvb2xwYWNrYCBjb25zdW1wdGlvblxuICogcGF0dGVybjogdG9vbHMgcmV0dXJuIHBsYWluIHN0cmluZ3MsIG5ldmVyIHJlY3Vyc2l2ZSBvYmplY3RzKS4gV3JhcHNcbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgKHdoaWNoIGlzIGJ1ZGdldC1ib3VuZGVkIGJ5IGNhdXNhbENoYWluJ3NcbiAqIG1heERlcHRoL21heE5vZGVzIGFuZCByZW5kZXJzIHNoYXJlZCBub2RlcyBvbmNlIGFzIGDihrMg4oCmIChzZWUgYWJvdmUpYCksXG4gKiBhbmQgYWRkcyB0aGUgaG9uZXN0eSBlbnZlbG9wZSB0aGUgcmF3IGNoYWluIGRvZXNuJ3QgY2Fycnk6XG4gKlxuICogLSBtaXNzaW5nIHNsaWNlcyByZW5kZXIgdGhlaXIgcmVhc29uIChcInZhbHVlIGNhbWUgZnJvbSBpbml0aWFsIHN0YXRlIC9cbiAqICAgZnJvemVuIGFyZ3MgLyBhIGNsb3N1cmUg4oCUIHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2VcIiksXG4gKiAtIGEgcmVhZHMtbGVzcyBwcm92aWRlciAoYHJlYWRUcmFja2luZzogJ29mZidgIHNpZ25hdHVyZSkgcmVuZGVycyBhblxuICogICBleHBsaWNpdCBcIuKaoCByZWFkcyB3ZXJlIG5vdCByZWNvcmRlZFwiIGluc3RlYWQgb2Ygc2lsZW50bHkgc2hvd2luZyBhblxuICogICBhbmNob3Igd2l0aCBubyBkZXBlbmRlbmNpZXMsXG4gKiAtIHRydW5jYXRpb24gZm9vdGVycyBwYXNzIHRocm91Z2ggZnJvbSBmb3JtYXRDYXVzYWxDaGFpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNsaWNlKHNsaWNlOiBWYXJpYWJsZVNsaWNlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFuY2hvciA9IHNsaWNlLmJlZm9yZSAhPT0gdW5kZWZpbmVkID8gYCAoYmVmb3JlIGNvbW1pdCAke3NsaWNlLmJlZm9yZX0pYCA6ICcnO1xuICBsaW5lcy5wdXNoKGBTTElDRSBmb3IgJyR7c2xpY2Uua2V5fScke2FuY2hvcn0g4oCUIHJlYWRzIHZpYTogJHtzbGljZS5rZXlzUmVhZEtpbmR9YCk7XG5cbiAgaWYgKHNsaWNlLm1pc3NpbmcgPT09ICdlbXB0eS1sb2cnKSB7XG4gICAgbGluZXMucHVzaCgnbm8gc2xpY2U6IHRoZSBjb21taXQgbG9nIGlzIGVtcHR5IChub3RoaW5nIGhhcyBleGVjdXRlZCkuJyk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG4gIGlmIChzbGljZS5taXNzaW5nID09PSAnbmV2ZXItd3JpdHRlbicpIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYG5vIHNsaWNlOiAnJHtzbGljZS5rZXl9JyB3YXMgbmV2ZXIgd3JpdHRlbiBpbiByYW5nZSDigJQgdGhlIHZhbHVlIGNhbWUgZnJvbSBgICtcbiAgICAgICAgJ2luaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgKGFyZ3MpLCBvciBhIGNsb3N1cmU7IHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2UuJyxcbiAgICApO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IGNvdiA9IHNsaWNlLnJlYWRzQ292ZXJhZ2U7XG4gIGlmIChjb3YgJiYgY292LnN0ZXBzID4gMSAmJiBjb3Yuc3RlcHNXaXRoUmVhZHMgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgXCLimqAgcmVhZHMgd2VyZSBub3QgcmVjb3JkZWQgKHJlYWRUcmFja2luZyBtYXkgYmUgJ29mZicpIOKAlCBkZXBlbmRlbmNpZXMgYmVsb3cgYXJlIFwiICsgJ3Vua25vd2FibGUsIE5PVCBhYnNlbnQuJyxcbiAgICApO1xuICB9XG4gIGlmIChzbGljZS5yb290KSBsaW5lcy5wdXNoKGZvcm1hdENhdXNhbENoYWluKHNsaWNlLnJvb3QpKTtcbiAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzID8/IFtdKV0uam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBGb3J3YXJkIHByb2plY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogSG93IG1hbnkgcmVhZHMgb25lIG5vZGUgbGlzdHMgYmVmb3JlIHRoZSByZW5kZXJlciBzYXlzIFwi4oCmIGFuZCBOIG1vcmVcIi4gKi9cbmNvbnN0IFJFQURTX1JFTkRFUkVEID0gNTtcblxuLyoqIEJGUyBvdmVyIHRoZSBmb3J3YXJkIERBRywgZWFjaCBub2RlIGV4YWN0bHkgb25jZSAoc2hhcmVkIG5vZGVzIGluY2x1ZGVkKS4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5Gb3J3YXJkREFHKHJvb3Q6IEZvcndhcmROb2RlKTogRm9yd2FyZE5vZGVbXSB7XG4gIGNvbnN0IG91dDogRm9yd2FyZE5vZGVbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxGb3J3YXJkTm9kZT4oKTtcbiAgY29uc3QgcXVldWU6IEZvcndhcmROb2RlW10gPSBbcm9vdF07XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgb3V0LnB1c2gobm9kZSk7XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUuZmVkRWRnZXMpIGlmICghc2Vlbi5oYXMoZWRnZS5jaGlsZCkpIHF1ZXVlLnB1c2goZWRnZS5jaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIGDimqAg4oCmYCBsaW5lcyBmb3IgdGhlIGhvbmVzdHkgZW52ZWxvcGUg4oCUIHNhbWUgcmVuZGVyaW5nIGZvciBib3RoIGRvb3JzLiAqL1xuZnVuY3Rpb24gbm90ZUxpbmVzKG5vdGVzOiBIb25lc3R5Tm90ZVtdKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm90ZXMubWFwKChuKSA9PiBg4pqgICR7bi5kZXRhaWx9YCk7XG59XG5cbi8qKiBPbmUgbm9kZSdzIGhlYWRsaW5lOiB3aG8gd3JvdGUgdGhlIHZhbHVlLCBhbmQgaG93IGxvbmcgaXQgbGl2ZWQuICovXG5mdW5jdGlvbiBub2RlSGVhZGxpbmUobm9kZTogRm9yd2FyZE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaWZlID1cbiAgICBub2RlLm5leHRXcml0ZUlkeCAhPT0gdW5kZWZpbmVkID8gYGxpdmUgdW50aWwgY29tbWl0ICR7bm9kZS5uZXh0V3JpdGVJZHh9YCA6ICdsaXZlIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bic7XG4gIGlmIChub2RlLm9yaWdpbiA9PT0gJ3ByZS1ydW4nKSB7XG4gICAgcmV0dXJuIGAnJHtub2RlLmtleX0nIGZyb20gQkVGT1JFIHRoZSBydW4gKGluaXRpYWwgc3RhdGUgLyBpbnB1dCAvIGNsb3N1cmUpIOKAlCAke2xpZmV9YDtcbiAgfVxuICByZXR1cm4gYCcke25vZGUua2V5fScgJHtub2RlLnZlcmIgPz8gJ3NldCd9IGJ5ICR7bm9kZS5zdGFnZU5hbWV9ICgke25vZGUucnVudGltZVN0YWdlSWR9KSBAJHtcbiAgICBub2RlLmNvbW1pdElkeFxuICB9IOKAlCAke2xpZmV9YDtcbn1cblxuLyoqXG4gKiBGbGF0LCBKU09OLXNhZmUgcHJvamVjdGlvbiBvZiBhIHtAbGluayBGb3J3YXJkU2xpY2V9IOKAlCB0aGUgZm9yd2FyZCB0d2luIG9mXG4gKiB7QGxpbmsgc2xpY2VUb0pTT059LCBsaW5lYXIgaW4gbm9kZSBjb3VudC5cbiAqXG4gKiBOb2RlIGlkcyBhcmUgT1BBUVVFIChgbjBgLCBgbjFgLCDigKYgaW4gQkZTIG9yZGVyKSByYXRoZXIgdGhhblxuICogYHJ1bnRpbWVTdGFnZUlkYCBhcyBpbiBgU2xpY2VKU09OYCwgZm9yIGEgc3RydWN0dXJhbCByZWFzb246IGEgZm9yd2FyZFxuICogbm9kZSBpcyBhIChrZXksIHdyaXRlKSBwYWlyLCBzbyBPTkUgc3RhZ2UgdGhhdCB3cm90ZSB0d28ga2V5cyBvd25zIHR3b1xuICogbm9kZXMgYW5kIGEgcnVudGltZVN0YWdlSWQgY2Fubm90IGtleSB0aGUgbWFwLiBOZXZlciBwYXJzZSB0aGUgaWRzIOKAlCBqb2luXG4gKiBvbiBgcnVudGltZVN0YWdlSWRgIC8gYGNvbW1pdElkeGAgLyBga2V5YCwgd2hpY2ggZXZlcnkgbm9kZSBjYXJyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFNsaWNlVG9KU09OKHNsaWNlOiBGb3J3YXJkU2xpY2UpOiBGb3J3YXJkU2xpY2VKU09OIHtcbiAgY29uc3Qgb3V0OiBGb3J3YXJkU2xpY2VKU09OID0ge1xuICAgIGtleTogc2xpY2Uua2V5LFxuICAgIC4uLihzbGljZS5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogc2xpY2UuYmVmb3JlIH0pLFxuICAgIC4uLihzbGljZS5taXNzaW5nICE9PSB1bmRlZmluZWQgJiYgeyBtaXNzaW5nOiBzbGljZS5taXNzaW5nIH0pLFxuICAgIGtleXNSZWFkS2luZDogc2xpY2Uua2V5c1JlYWRLaW5kLFxuICAgIC4uLihzbGljZS5yZWFkc0NvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzbGljZS5yZWFkc0NvdmVyYWdlIH0pLFxuICAgIG5vdGVzOiBzbGljZS5ub3RlcyxcbiAgfTtcbiAgaWYgKCFzbGljZS5yb290KSByZXR1cm4gb3V0O1xuXG4gIGNvbnN0IGZsYXQgPSBmbGF0dGVuRm9yd2FyZERBRyhzbGljZS5yb290KTtcbiAgY29uc3QgaWRzID0gbmV3IE1hcDxGb3J3YXJkTm9kZSwgc3RyaW5nPigpO1xuICBmbGF0LmZvckVhY2goKG5vZGUsIGkpID0+IGlkcy5zZXQobm9kZSwgYG4ke2l9YCkpO1xuXG4gIG91dC5yb290SWQgPSBpZHMuZ2V0KHNsaWNlLnJvb3QpO1xuICBvdXQubm9kZXMgPSBmbGF0Lm1hcCgobm9kZSkgPT4gKHtcbiAgICBpZDogaWRzLmdldChub2RlKSEsXG4gICAga2V5OiBub2RlLmtleSxcbiAgICBvcmlnaW46IG5vZGUub3JpZ2luLFxuICAgIC4uLihub2RlLnJ1bnRpbWVTdGFnZUlkICE9PSB1bmRlZmluZWQgJiYgeyBydW50aW1lU3RhZ2VJZDogbm9kZS5ydW50aW1lU3RhZ2VJZCB9KSxcbiAgICAuLi4obm9kZS5zdGFnZUlkICE9PSB1bmRlZmluZWQgJiYgeyBzdGFnZUlkOiBub2RlLnN0YWdlSWQgfSksXG4gICAgLi4uKG5vZGUuc3RhZ2VOYW1lICE9PSB1bmRlZmluZWQgJiYgeyBzdGFnZU5hbWU6IG5vZGUuc3RhZ2VOYW1lIH0pLFxuICAgIC4uLihub2RlLmNvbW1pdElkeCAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWl0SWR4OiBub2RlLmNvbW1pdElkeCB9KSxcbiAgICAuLi4obm9kZS52ZXJiICE9PSB1bmRlZmluZWQgJiYgeyB2ZXJiOiBub2RlLnZlcmIgfSksXG4gICAgLi4uKG5vZGUubmV4dFdyaXRlSWR4ICE9PSB1bmRlZmluZWQgJiYgeyBuZXh0V3JpdGVJZHg6IG5vZGUubmV4dFdyaXRlSWR4IH0pLFxuICAgIGRlcHRoOiBub2RlLmRlcHRoLFxuICAgIHJlYWRzOiBub2RlLnJlYWRzLFxuICAgIC4uLihub2RlLmluY29tcGxldGVTb3VyY2VzICE9PSB1bmRlZmluZWQgJiYgeyBpbmNvbXBsZXRlU291cmNlczogbm9kZS5pbmNvbXBsZXRlU291cmNlcyB9KSxcbiAgfSkpO1xuICBvdXQuZWRnZXMgPSBmbGF0LmZsYXRNYXAoKG5vZGUpID0+XG4gICAgbm9kZS5mZWRFZGdlcy5tYXAoKGVkZ2UpID0+ICh7IGZyb206IGlkcy5nZXQobm9kZSkhLCB0bzogaWRzLmdldChlZGdlLmNoaWxkKSEsIGJhc2lzOiBlZGdlLmJhc2lzIH0pKSxcbiAgKTtcbiAgaWYgKHNsaWNlLnJvb3QudHJ1bmNhdGVkKSBvdXQudHJ1bmNhdGVkID0gc2xpY2Uucm9vdC50cnVuY2F0ZWQ7XG4gIGlmIChzbGljZS5ub3RlcyAhPT0gdW5kZWZpbmVkKSBvdXQubm90ZXMgPSBzbGljZS5ub3RlcztcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBPbmUgYm91bmRlZCBzdHJpbmcgZm9yIExMTSB0cmlhZ2UgdG9vbHMg4oCUIHRoZSBmb3J3YXJkIHR3aW4gb2ZcbiAqIHtAbGluayBmb3JtYXRTbGljZX0uIFNoYXJlZCBub2RlcyByZW5kZXIgb25jZSAoYOKGsyDigKYgKHNlZSBhYm92ZSlgLCB0aGUgc2FtZVxuICogY29udmVudGlvbiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHVzZXMpLCByZWFkIGxpc3RzIGFyZSBjYXBwZWQsIGFuZCBldmVyeVxuICogaG9uZXN0eSBub3RlIHJlbmRlcnMgYXMgYSBg4pqgYCBsaW5lIOKAlCBpbmNsdWRpbmcgdGhlIG9uZSB0aGF0IHNheXMgYSBgZmVkYFxuICogZWRnZSBpcyBjb25zZXJ2YXRpdmUsIHdoaWNoIGlzIHdoeSBlZGdlcyBwcmludCBgW2V4YWN0XWAgLyBgW2NvbnNlcnZhdGl2ZV1gXG4gKiByYXRoZXIgdGhhbiBsb29raW5nIGFsaWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Rm9yd2FyZFNsaWNlKHNsaWNlOiBGb3J3YXJkU2xpY2UpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYW5jaG9yID0gc2xpY2UuYmVmb3JlICE9PSB1bmRlZmluZWQgPyBgIChhcyBvZiBiZWZvcmUgY29tbWl0ICR7c2xpY2UuYmVmb3JlfSlgIDogJyc7XG4gIGxpbmVzLnB1c2goYEZPUldBUkQgU0xJQ0UgZm9yICcke3NsaWNlLmtleX0nJHthbmNob3J9IOKAlCByZWFkcyB2aWE6ICR7c2xpY2Uua2V5c1JlYWRLaW5kfWApO1xuXG4gIGlmIChzbGljZS5taXNzaW5nID09PSAnZW1wdHktbG9nJykge1xuICAgIGxpbmVzLnB1c2goJ25vIGZvcndhcmQgc2xpY2U6IHRoZSBjb21taXQgbG9nIGlzIGVtcHR5IChub3RoaW5nIGhhcyBleGVjdXRlZCkuJyk7XG4gICAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzKV0uam9pbignXFxuJyk7XG4gIH1cbiAgaWYgKHNsaWNlLm1pc3NpbmcgPT09ICduZXZlci13cml0dGVuJykge1xuICAgIGxpbmVzLnB1c2goYG5vIGZvcndhcmQgc2xpY2U6ICcke3NsaWNlLmtleX0nIHdhcyBuZXZlciB3cml0dGVuIGFuZCBuZXZlciByZWFkIGluIHRoaXMgbG9nLmApO1xuICAgIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyhzbGljZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8Rm9yd2FyZE5vZGU+KCk7XG4gIGNvbnN0IHdhbGsgPSAobm9kZTogRm9yd2FyZE5vZGUsIGluZGVudDogbnVtYmVyLCBsZWFkID0gJycpOiB2b2lkID0+IHtcbiAgICBjb25zdCBwYWQgPSAnICAnLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGhlYWQgPSBgJHtwYWR9JHtsZWFkfSR7bm9kZUhlYWRsaW5lKG5vZGUpfWA7XG4gICAgaWYgKHNlZW4uaGFzKG5vZGUpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke2hlYWR9IOKGsyAoc2VlIGFib3ZlKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBsaW5lcy5wdXNoKGhlYWQpO1xuICAgIGlmIChub2RlLmluY29tcGxldGVTb3VyY2VzICYmIG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgJHtwYWR9ICDimqAgaXRzIHdyaXRlciBhbHNvIGNvbnN1bWVkICR7bm9kZS5pbmNvbXBsZXRlU291cmNlcy5qb2luKCcvJyl9IOKAlCB1bnRyYWNrZWRgKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke3BhZH0gIChubyByZWNvcmRlZCByZWFkIG9mIHRoaXMgdmFsdWUpYCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVhZCBvZiBub2RlLnJlYWRzLnNsaWNlKDAsIFJFQURTX1JFTkRFUkVEKSkge1xuICAgICAgbGluZXMucHVzaChgJHtwYWR9ICByZWFkIGJ5ICR7cmVhZC5zdGFnZU5hbWV9ICgke3JlYWQucnVudGltZVN0YWdlSWR9KSBAJHtyZWFkLmNvbW1pdElkeH1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVhZHMubGVuZ3RoID4gUkVBRFNfUkVOREVSRUQpIHtcbiAgICAgIGxpbmVzLnB1c2goYCR7cGFkfSAg4oCmIGFuZCAke25vZGUucmVhZHMubGVuZ3RoIC0gUkVBRFNfUkVOREVSRUR9IG1vcmUgcmVhZHNgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUuZmVkRWRnZXMpIHtcbiAgICAgIHdhbGsoZWRnZS5jaGlsZCwgaW5kZW50ICsgMSwgYOKGkiBmZWQgJHtlZGdlLmJhc2lzID09PSAncGVyLXdyaXRlJyA/ICdbZXhhY3RdJyA6ICdbY29uc2VydmF0aXZlXSd9IGApO1xuICAgIH1cbiAgfTtcbiAgaWYgKHNsaWNlLnJvb3QpIHdhbGsoc2xpY2Uucm9vdCwgMCk7XG5cbiAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzKV0uam9pbignXFxuJyk7XG59XG5cbi8qKiBIb3cgbWFueSBtb21lbnRzIHtAbGluayBmb3JtYXRUaW1lbGluZX0gcmVuZGVycyBiZWZvcmUgaXQgc2F5cyBcIuKApiBhbmQgTiBtb3JlXCIuICovXG5jb25zdCBNT01FTlRTX1JFTkRFUkVEID0gNjA7XG5cbi8qKlxuICogT25lIGJvdW5kZWQgc3RyaW5nIGZvciBhIHtAbGluayBLZXlUaW1lbGluZX0g4oCUIHRoZSBMTE0vaHVtYW4gcHJvamVjdGlvbi5cbiAqIChUaGUgdGltZWxpbmUncyBKU09OIG5lZWRzIG5vIGhlbHBlcjogaXQgaXMgYWxyZWFkeSBmbGF0IGFuZCBKU09OLXNhZmUg4oCUXG4gKiBzZWUgdGhlIGZpbGUgaGVhZGVyLikgVHJ1bmNhdGlvbiBpcyBzdGF0ZWQsIG5ldmVyIHNpbGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWVsaW5lKHRpbWVsaW5lOiBLZXlUaW1lbGluZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBib3VuZCA9IHRpbWVsaW5lLmJlZm9yZSAhPT0gdW5kZWZpbmVkID8gYCAoYmVmb3JlIGNvbW1pdCAke3RpbWVsaW5lLmJlZm9yZX0pYCA6ICcnO1xuICBsaW5lcy5wdXNoKGBUSU1FTElORSBmb3IgJyR7dGltZWxpbmUua2V5fScke2JvdW5kfSDigJQgcmVhZHMgdmlhOiAke3RpbWVsaW5lLmtleXNSZWFkS2luZH1gKTtcblxuICBpZiAodGltZWxpbmUubWlzc2luZyA9PT0gJ2VtcHR5LWxvZycpIHtcbiAgICBsaW5lcy5wdXNoKCdubyB0aW1lbGluZTogdGhlIGNvbW1pdCBsb2cgaXMgZW1wdHkgKG5vdGhpbmcgaGFzIGV4ZWN1dGVkKS4nKTtcbiAgICByZXR1cm4gWy4uLmxpbmVzLCAuLi5ub3RlTGluZXModGltZWxpbmUubm90ZXMpXS5qb2luKCdcXG4nKTtcbiAgfVxuICBpZiAodGltZWxpbmUubWlzc2luZyA9PT0gJ25ldmVyLXdyaXR0ZW4nKSB7XG4gICAgbGluZXMucHVzaChgbm8gdGltZWxpbmU6ICcke3RpbWVsaW5lLmtleX0nIHdhcyBuZXZlciB3cml0dGVuIGFuZCBuZXZlciByZWFkIGluIHRoaXMgbG9nLmApO1xuICAgIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyh0aW1lbGluZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgY29uc3QgbW9tZW50cyA9IHRpbWVsaW5lLm1vbWVudHMgPz8gW107XG4gIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMCkgbGluZXMucHVzaCgnKG5vIHJlY29yZGVkIG1vbWVudCBmb3IgdGhpcyBrZXkpJyk7XG4gIGZvciAoY29uc3QgbW9tZW50IG9mIG1vbWVudHMuc2xpY2UoMCwgTU9NRU5UU19SRU5ERVJFRCkpIHtcbiAgICBjb25zdCB3aGVyZSA9IGAke21vbWVudC5zdGFnZU5hbWV9ICgke21vbWVudC5ydW50aW1lU3RhZ2VJZH0pYDtcbiAgICBpZiAobW9tZW50LmtpbmQgPT09ICd3cml0ZScpIHtcbiAgICAgIGxpbmVzLnB1c2goYEAke21vbWVudC5jb21taXRJZHh9IHdyaXRlICR7bW9tZW50LnZlcmIgPz8gJ3NldCd9IOKAlCAke3doZXJlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmcm9tID1cbiAgICAgICAgbW9tZW50LmZyb21Xcml0ZUlkeCAhPT0gdW5kZWZpbmVkID8gYHZhbHVlIGZyb20gY29tbWl0ICR7bW9tZW50LmZyb21Xcml0ZUlkeH1gIDogJ3ZhbHVlIGZyb20gQkVGT1JFIHRoZSBydW4nO1xuICAgICAgbGluZXMucHVzaChgQCR7bW9tZW50LmNvbW1pdElkeH0gcmVhZCAg4oCUICR7d2hlcmV9ICgke2Zyb219KWApO1xuICAgIH1cbiAgfVxuICBpZiAobW9tZW50cy5sZW5ndGggPiBNT01FTlRTX1JFTkRFUkVEKSB7XG4gICAgbGluZXMucHVzaChg4oCmIGFuZCAke21vbWVudHMubGVuZ3RoIC0gTU9NRU5UU19SRU5ERVJFRH0gbW9yZSBtb21lbnRzIChib3VuZGVkIG91dHB1dClgKTtcbiAgfVxuXG4gIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyh0aW1lbGluZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xufVxuIl19
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* slice/sliceForKey.ts — the variable-first backward slice query.
|
|
3
|
-
*
|
|
4
|
-
* "Why is `key` what it is?" — the ONE question every triage surface asks:
|
|
5
|
-
* a human clicking a key in explainable-ui, an LLM calling a `backtrack`
|
|
6
|
-
* tool mid-conversation, an offline autopsy agent over a stored run.
|
|
7
|
-
*
|
|
8
|
-
* WHY this is deliberately a composition and not a new algorithm:
|
|
9
|
-
* `findLastWriter` already answers "who made the value what it is" and
|
|
10
|
-
* `causalChain` already answers "what influenced that step" (thin backward
|
|
11
|
-
* slicing, Weiser 1984). What was missing is the shared CONTRACT — without
|
|
12
|
-
* it, every surface hand-rolls the anchor step differently and their answers
|
|
13
|
-
* disagree. The value of this function is that they can't.
|
|
14
|
-
*/
|
|
15
|
-
import { type CausalChainOptions, type KeysReadLookup } from '../memory/backtrack.js';
|
|
16
|
-
import type { CommitBundle } from '../memory/types.js';
|
|
17
|
-
import type { KeysReadSource, StateKey, VariableSlice } from './types.js';
|
|
18
|
-
/**
|
|
19
|
-
* Normalise a consumer-facing {@link StateKey} to the engine's canonical
|
|
20
|
-
* string form (the `TraceEntry.path` space). Path arrays go through the same
|
|
21
|
-
* normaliser the engine writes with — the delimiter never leaks into the
|
|
22
|
-
* public contract.
|
|
23
|
-
*/
|
|
24
|
-
export declare function normaliseStateKey(key: StateKey): string;
|
|
25
|
-
/** Options for {@link sliceForKey} — causalChain's options plus anchoring. */
|
|
26
|
-
export interface SliceForKeyOptions extends CausalChainOptions {
|
|
27
|
-
/**
|
|
28
|
-
* Exclusive commit-array-index upper bound: slice the value as it stood
|
|
29
|
-
* BEFORE this idx (time-travel triage — "why was it X at step 12?").
|
|
30
|
-
* Same contract as `findLastWriter`'s `beforeIdx`. Omit for the current
|
|
31
|
-
* value. Chained-triage idiom: to slice at an {@link ElementBirth}, pass
|
|
32
|
-
* `before: birth.commitIdx + 1` (birth idx is inclusive, this bound is
|
|
33
|
-
* exclusive — the +1 makes the birth commit itself the anchor).
|
|
34
|
-
*/
|
|
35
|
-
before?: number;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Backward slice for one state key: anchor at the key's last writer, then
|
|
39
|
-
* walk read→write (and optional control) dependencies transitively.
|
|
40
|
-
*
|
|
41
|
-
* Honest-absence contract: a missing slice is a RESULT, not an error —
|
|
42
|
-
* `missing: 'never-written'` tells a triage tool (or its LLM caller) that
|
|
43
|
-
* the value came from initial state / frozen args / a closure, which is
|
|
44
|
-
* itself diagnostic information. See {@link VariableSlice} — including its
|
|
45
|
-
* SERIALIZATION WARNING before you stringify the result.
|
|
46
|
-
*/
|
|
47
|
-
export declare function sliceForKey(commitLog: CommitBundle[], key: StateKey, keysRead: KeysReadSource | KeysReadLookup, options?: SliceForKeyOptions): VariableSlice;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* slice/sliceForKey.ts — the variable-first backward slice query.
|
|
3
|
-
*
|
|
4
|
-
* "Why is `key` what it is?" — the ONE question every triage surface asks:
|
|
5
|
-
* a human clicking a key in explainable-ui, an LLM calling a `backtrack`
|
|
6
|
-
* tool mid-conversation, an offline autopsy agent over a stored run.
|
|
7
|
-
*
|
|
8
|
-
* WHY this is deliberately a composition and not a new algorithm:
|
|
9
|
-
* `findLastWriter` already answers "who made the value what it is" and
|
|
10
|
-
* `causalChain` already answers "what influenced that step" (thin backward
|
|
11
|
-
* slicing, Weiser 1984). What was missing is the shared CONTRACT — without
|
|
12
|
-
* it, every surface hand-rolls the anchor step differently and their answers
|
|
13
|
-
* disagree. The value of this function is that they can't.
|
|
14
|
-
*/
|
|
15
|
-
import { causalChain } from '../memory/backtrack.js';
|
|
16
|
-
import { commitValueAtWithBasis, findLastWriterWithBasis } from '../memory/commitLogUtils.js';
|
|
17
|
-
import { normalisePath } from '../memory/utils.js';
|
|
18
|
-
import { fromInitialStateNote, nestedRowsNote, redactedValueNote } from './keyIndex.js';
|
|
19
|
-
import { resolveKeysReadSource } from './keysReadSources.js';
|
|
20
|
-
/**
|
|
21
|
-
* Normalise a consumer-facing {@link StateKey} to the engine's canonical
|
|
22
|
-
* string form (the `TraceEntry.path` space). Path arrays go through the same
|
|
23
|
-
* normaliser the engine writes with — the delimiter never leaks into the
|
|
24
|
-
* public contract.
|
|
25
|
-
*/
|
|
26
|
-
export function normaliseStateKey(key) {
|
|
27
|
-
return typeof key === 'string' ? key : normalisePath([...key]);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Backward slice for one state key: anchor at the key's last writer, then
|
|
31
|
-
* walk read→write (and optional control) dependencies transitively.
|
|
32
|
-
*
|
|
33
|
-
* Honest-absence contract: a missing slice is a RESULT, not an error —
|
|
34
|
-
* `missing: 'never-written'` tells a triage tool (or its LLM caller) that
|
|
35
|
-
* the value came from initial state / frozen args / a closure, which is
|
|
36
|
-
* itself diagnostic information. See {@link VariableSlice} — including its
|
|
37
|
-
* SERIALIZATION WARNING before you stringify the result.
|
|
38
|
-
*/
|
|
39
|
-
export function sliceForKey(commitLog, key, keysRead, options) {
|
|
40
|
-
const source = resolveKeysReadSource(keysRead);
|
|
41
|
-
const normalisedKey = normaliseStateKey(key);
|
|
42
|
-
const base = {
|
|
43
|
-
key: normalisedKey,
|
|
44
|
-
...(options?.before !== undefined && { before: options.before }),
|
|
45
|
-
keysReadKind: source.kind,
|
|
46
|
-
...(source.coverage !== undefined && { readsCoverage: source.coverage }),
|
|
47
|
-
};
|
|
48
|
-
if (commitLog.length === 0)
|
|
49
|
-
return { ...base, missing: 'empty-log' };
|
|
50
|
-
const { writer, basis } = findLastWriterWithBasis(commitLog, normalisedKey, options?.before);
|
|
51
|
-
// F4b: what the value at the slice's point rests on, from the value twin — a redaction, the pre-run base.
|
|
52
|
-
const end = Math.min(options?.before ?? commitLog.length, commitLog.length) - 1;
|
|
53
|
-
const value = end >= 0 ? commitValueAtWithBasis(commitLog, end, normalisedKey).basis : [];
|
|
54
|
-
if (!writer) {
|
|
55
|
-
// 'never-written' already says the value came from before the run; a redaction that hid the write does not.
|
|
56
|
-
return {
|
|
57
|
-
...base,
|
|
58
|
-
missing: 'never-written',
|
|
59
|
-
...(value.includes('redacted') && { notes: [redactedValueNote(normalisedKey)] }),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// A writer that reached the key only through rows inside it made part of the value — say so.
|
|
63
|
-
const notes = basis.includes('nested-rows') ? [nestedRowsNote(normalisedKey, [commitLog.indexOf(writer)])] : [];
|
|
64
|
-
if (value.includes('from-initial-state'))
|
|
65
|
-
notes.push(fromInitialStateNote(normalisedKey));
|
|
66
|
-
if (value.includes('redacted'))
|
|
67
|
-
notes.push(redactedValueNote(normalisedKey));
|
|
68
|
-
// INVARIANT: `writer` came FROM this commitLog, so its runtimeStageId is
|
|
69
|
-
// always present in causalChain's index — causalChain cannot return
|
|
70
|
-
// undefined here (it only does for ids absent from the log). The non-null
|
|
71
|
-
// assertion keeps the VariableSlice contract airtight: `missing` is the
|
|
72
|
-
// ONLY absent-root state. Options pass straight through (controlDeps /
|
|
73
|
-
// weigh / maxDepth / maxNodes keep their causalChain semantics).
|
|
74
|
-
//
|
|
75
|
-
// edgeAttribution defaults to 'per-write' HERE (unlike causalChain's
|
|
76
|
-
// 'stage' default): a variable-first slice knows exactly which written key
|
|
77
|
-
// anchors the question, and per-write attribution is strictly-safe — logs
|
|
78
|
-
// without `TraceEntry.readKeys` (the writeProvenance dial off) fall back
|
|
79
|
-
// to stage-level expansion per node, byte-identically. Consumers can force
|
|
80
|
-
// 'stage' via options.
|
|
81
|
-
const root = causalChain(commitLog, writer.runtimeStageId, source.lookup, {
|
|
82
|
-
...options,
|
|
83
|
-
edgeAttribution: options?.edgeAttribution ?? 'per-write',
|
|
84
|
-
rootLinkKeys: options?.rootLinkKeys ?? [normalisedKey],
|
|
85
|
-
});
|
|
86
|
-
return { ...base, writer, root, ...(notes.length > 0 && { notes }) };
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQWE7SUFDN0MsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFlRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixTQUF5QixFQUN6QixHQUFhLEVBQ2IsUUFBeUMsRUFDekMsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQTZFO1FBQ3JGLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDekUsQ0FBQztJQUVGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUVyRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdGLDBHQUEwRztJQUMxRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osNEdBQTRHO1FBQzVHLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxPQUFPLEVBQUUsZUFBZTtZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRixDQUFDO0lBQ0osQ0FBQztJQUNELDZGQUE2RjtJQUM3RixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEgsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFGLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ3hFLEdBQUcsT0FBTztRQUNWLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLFdBQVc7UUFDeEQsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBRSxDQUFDO0lBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL3NsaWNlRm9yS2V5LnRzIOKAlCB0aGUgdmFyaWFibGUtZmlyc3QgYmFja3dhcmQgc2xpY2UgcXVlcnkuXG4gKlxuICogXCJXaHkgaXMgYGtleWAgd2hhdCBpdCBpcz9cIiDigJQgdGhlIE9ORSBxdWVzdGlvbiBldmVyeSB0cmlhZ2Ugc3VyZmFjZSBhc2tzOlxuICogYSBodW1hbiBjbGlja2luZyBhIGtleSBpbiBleHBsYWluYWJsZS11aSwgYW4gTExNIGNhbGxpbmcgYSBgYmFja3RyYWNrYFxuICogdG9vbCBtaWQtY29udmVyc2F0aW9uLCBhbiBvZmZsaW5lIGF1dG9wc3kgYWdlbnQgb3ZlciBhIHN0b3JlZCBydW4uXG4gKlxuICogV0hZIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IGEgY29tcG9zaXRpb24gYW5kIG5vdCBhIG5ldyBhbGdvcml0aG06XG4gKiBgZmluZExhc3RXcml0ZXJgIGFscmVhZHkgYW5zd2VycyBcIndobyBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGlzXCIgYW5kXG4gKiBgY2F1c2FsQ2hhaW5gIGFscmVhZHkgYW5zd2VycyBcIndoYXQgaW5mbHVlbmNlZCB0aGF0IHN0ZXBcIiAodGhpbiBiYWNrd2FyZFxuICogc2xpY2luZywgV2Vpc2VyIDE5ODQpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzaGFyZWQgQ09OVFJBQ1Qg4oCUIHdpdGhvdXRcbiAqIGl0LCBldmVyeSBzdXJmYWNlIGhhbmQtcm9sbHMgdGhlIGFuY2hvciBzdGVwIGRpZmZlcmVudGx5IGFuZCB0aGVpciBhbnN3ZXJzXG4gKiBkaXNhZ3JlZS4gVGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB0aGV5IGNhbid0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2F1c2FsQ2hhaW5PcHRpb25zLCB0eXBlIEtleXNSZWFkTG9va3VwLCBjYXVzYWxDaGFpbiB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHsgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyBmcm9tSW5pdGlhbFN0YXRlTm90ZSwgbmVzdGVkUm93c05vdGUsIHJlZGFjdGVkVmFsdWVOb3RlIH0gZnJvbSAnLi9rZXlJbmRleC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEtleXNSZWFkU291cmNlLCBTdGF0ZUtleSwgVmFyaWFibGVTbGljZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE5vcm1hbGlzZSBhIGNvbnN1bWVyLWZhY2luZyB7QGxpbmsgU3RhdGVLZXl9IHRvIHRoZSBlbmdpbmUncyBjYW5vbmljYWxcbiAqIHN0cmluZyBmb3JtICh0aGUgYFRyYWNlRW50cnkucGF0aGAgc3BhY2UpLiBQYXRoIGFycmF5cyBnbyB0aHJvdWdoIHRoZSBzYW1lXG4gKiBub3JtYWxpc2VyIHRoZSBlbmdpbmUgd3JpdGVzIHdpdGgg4oCUIHRoZSBkZWxpbWl0ZXIgbmV2ZXIgbGVha3MgaW50byB0aGVcbiAqIHB1YmxpYyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVN0YXRlS2V5KGtleTogU3RhdGVLZXkpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBub3JtYWxpc2VQYXRoKFsuLi5rZXldKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzbGljZUZvcktleX0g4oCUIGNhdXNhbENoYWluJ3Mgb3B0aW9ucyBwbHVzIGFuY2hvcmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VGb3JLZXlPcHRpb25zIGV4dGVuZHMgQ2F1c2FsQ2hhaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIEV4Y2x1c2l2ZSBjb21taXQtYXJyYXktaW5kZXggdXBwZXIgYm91bmQ6IHNsaWNlIHRoZSB2YWx1ZSBhcyBpdCBzdG9vZFxuICAgKiBCRUZPUkUgdGhpcyBpZHggKHRpbWUtdHJhdmVsIHRyaWFnZSDigJQgXCJ3aHkgd2FzIGl0IFggYXQgc3RlcCAxMj9cIikuXG4gICAqIFNhbWUgY29udHJhY3QgYXMgYGZpbmRMYXN0V3JpdGVyYCdzIGBiZWZvcmVJZHhgLiBPbWl0IGZvciB0aGUgY3VycmVudFxuICAgKiB2YWx1ZS4gQ2hhaW5lZC10cmlhZ2UgaWRpb206IHRvIHNsaWNlIGF0IGFuIHtAbGluayBFbGVtZW50QmlydGh9LCBwYXNzXG4gICAqIGBiZWZvcmU6IGJpcnRoLmNvbW1pdElkeCArIDFgIChiaXJ0aCBpZHggaXMgaW5jbHVzaXZlLCB0aGlzIGJvdW5kIGlzXG4gICAqIGV4Y2x1c2l2ZSDigJQgdGhlICsxIG1ha2VzIHRoZSBiaXJ0aCBjb21taXQgaXRzZWxmIHRoZSBhbmNob3IpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIHNsaWNlIGZvciBvbmUgc3RhdGUga2V5OiBhbmNob3IgYXQgdGhlIGtleSdzIGxhc3Qgd3JpdGVyLCB0aGVuXG4gKiB3YWxrIHJlYWTihpJ3cml0ZSAoYW5kIG9wdGlvbmFsIGNvbnRyb2wpIGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuXG4gKlxuICogSG9uZXN0LWFic2VuY2UgY29udHJhY3Q6IGEgbWlzc2luZyBzbGljZSBpcyBhIFJFU1VMVCwgbm90IGFuIGVycm9yIOKAlFxuICogYG1pc3Npbmc6ICduZXZlci13cml0dGVuJ2AgdGVsbHMgYSB0cmlhZ2UgdG9vbCAob3IgaXRzIExMTSBjYWxsZXIpIHRoYXRcbiAqIHRoZSB2YWx1ZSBjYW1lIGZyb20gaW5pdGlhbCBzdGF0ZSAvIGZyb3plbiBhcmdzIC8gYSBjbG9zdXJlLCB3aGljaCBpc1xuICogaXRzZWxmIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIFNlZSB7QGxpbmsgVmFyaWFibGVTbGljZX0g4oCUIGluY2x1ZGluZyBpdHNcbiAqIFNFUklBTElaQVRJT04gV0FSTklORyBiZWZvcmUgeW91IHN0cmluZ2lmeSB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VGb3JLZXkoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIGtleXNSZWFkOiBLZXlzUmVhZFNvdXJjZSB8IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogU2xpY2VGb3JLZXlPcHRpb25zLFxuKTogVmFyaWFibGVTbGljZSB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVLZXlzUmVhZFNvdXJjZShrZXlzUmVhZCk7XG4gIGNvbnN0IG5vcm1hbGlzZWRLZXkgPSBub3JtYWxpc2VTdGF0ZUtleShrZXkpO1xuICBjb25zdCBiYXNlOiBQaWNrPFZhcmlhYmxlU2xpY2UsICdrZXknIHwgJ2JlZm9yZScgfCAna2V5c1JlYWRLaW5kJyB8ICdyZWFkc0NvdmVyYWdlJz4gPSB7XG4gICAga2V5OiBub3JtYWxpc2VkS2V5LFxuICAgIC4uLihvcHRpb25zPy5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogb3B0aW9ucy5iZWZvcmUgfSksXG4gICAga2V5c1JlYWRLaW5kOiBzb3VyY2Uua2luZCxcbiAgICAuLi4oc291cmNlLmNvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzb3VyY2UuY292ZXJhZ2UgfSksXG4gIH07XG5cbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICdlbXB0eS1sb2cnIH07XG5cbiAgY29uc3QgeyB3cml0ZXIsIGJhc2lzIH0gPSBmaW5kTGFzdFdyaXRlcldpdGhCYXNpcyhjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIG9wdGlvbnM/LmJlZm9yZSk7XG4gIC8vIEY0Yjogd2hhdCB0aGUgdmFsdWUgYXQgdGhlIHNsaWNlJ3MgcG9pbnQgcmVzdHMgb24sIGZyb20gdGhlIHZhbHVlIHR3aW4g4oCUIGEgcmVkYWN0aW9uLCB0aGUgcHJlLXJ1biBiYXNlLlxuICBjb25zdCBlbmQgPSBNYXRoLm1pbihvcHRpb25zPy5iZWZvcmUgPz8gY29tbWl0TG9nLmxlbmd0aCwgY29tbWl0TG9nLmxlbmd0aCkgLSAxO1xuICBjb25zdCB2YWx1ZSA9IGVuZCA+PSAwID8gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSkuYmFzaXMgOiBbXTtcbiAgaWYgKCF3cml0ZXIpIHtcbiAgICAvLyAnbmV2ZXItd3JpdHRlbicgYWxyZWFkeSBzYXlzIHRoZSB2YWx1ZSBjYW1lIGZyb20gYmVmb3JlIHRoZSBydW47IGEgcmVkYWN0aW9uIHRoYXQgaGlkIHRoZSB3cml0ZSBkb2VzIG5vdC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIG1pc3Npbmc6ICduZXZlci13cml0dGVuJyxcbiAgICAgIC4uLih2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSAmJiB7IG5vdGVzOiBbcmVkYWN0ZWRWYWx1ZU5vdGUobm9ybWFsaXNlZEtleSldIH0pLFxuICAgIH07XG4gIH1cbiAgLy8gQSB3cml0ZXIgdGhhdCByZWFjaGVkIHRoZSBrZXkgb25seSB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0IG1hZGUgcGFydCBvZiB0aGUgdmFsdWUg4oCUIHNheSBzby5cbiAgY29uc3Qgbm90ZXMgPSBiYXNpcy5pbmNsdWRlcygnbmVzdGVkLXJvd3MnKSA/IFtuZXN0ZWRSb3dzTm90ZShub3JtYWxpc2VkS2V5LCBbY29tbWl0TG9nLmluZGV4T2Yod3JpdGVyKV0pXSA6IFtdO1xuICBpZiAodmFsdWUuaW5jbHVkZXMoJ2Zyb20taW5pdGlhbC1zdGF0ZScpKSBub3Rlcy5wdXNoKGZyb21Jbml0aWFsU3RhdGVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdyZWRhY3RlZCcpKSBub3Rlcy5wdXNoKHJlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcblxuICAvLyBJTlZBUklBTlQ6IGB3cml0ZXJgIGNhbWUgRlJPTSB0aGlzIGNvbW1pdExvZywgc28gaXRzIHJ1bnRpbWVTdGFnZUlkIGlzXG4gIC8vIGFsd2F5cyBwcmVzZW50IGluIGNhdXNhbENoYWluJ3MgaW5kZXgg4oCUIGNhdXNhbENoYWluIGNhbm5vdCByZXR1cm5cbiAgLy8gdW5kZWZpbmVkIGhlcmUgKGl0IG9ubHkgZG9lcyBmb3IgaWRzIGFic2VudCBmcm9tIHRoZSBsb2cpLiBUaGUgbm9uLW51bGxcbiAgLy8gYXNzZXJ0aW9uIGtlZXBzIHRoZSBWYXJpYWJsZVNsaWNlIGNvbnRyYWN0IGFpcnRpZ2h0OiBgbWlzc2luZ2AgaXMgdGhlXG4gIC8vIE9OTFkgYWJzZW50LXJvb3Qgc3RhdGUuIE9wdGlvbnMgcGFzcyBzdHJhaWdodCB0aHJvdWdoIChjb250cm9sRGVwcyAvXG4gIC8vIHdlaWdoIC8gbWF4RGVwdGggLyBtYXhOb2RlcyBrZWVwIHRoZWlyIGNhdXNhbENoYWluIHNlbWFudGljcykuXG4gIC8vXG4gIC8vIGVkZ2VBdHRyaWJ1dGlvbiBkZWZhdWx0cyB0byAncGVyLXdyaXRlJyBIRVJFICh1bmxpa2UgY2F1c2FsQ2hhaW4nc1xuICAvLyAnc3RhZ2UnIGRlZmF1bHQpOiBhIHZhcmlhYmxlLWZpcnN0IHNsaWNlIGtub3dzIGV4YWN0bHkgd2hpY2ggd3JpdHRlbiBrZXlcbiAgLy8gYW5jaG9ycyB0aGUgcXVlc3Rpb24sIGFuZCBwZXItd3JpdGUgYXR0cmlidXRpb24gaXMgc3RyaWN0bHktc2FmZSDigJQgbG9nc1xuICAvLyB3aXRob3V0IGBUcmFjZUVudHJ5LnJlYWRLZXlzYCAodGhlIHdyaXRlUHJvdmVuYW5jZSBkaWFsIG9mZikgZmFsbCBiYWNrXG4gIC8vIHRvIHN0YWdlLWxldmVsIGV4cGFuc2lvbiBwZXIgbm9kZSwgYnl0ZS1pZGVudGljYWxseS4gQ29uc3VtZXJzIGNhbiBmb3JjZVxuICAvLyAnc3RhZ2UnIHZpYSBvcHRpb25zLlxuICBjb25zdCByb290ID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCB3cml0ZXIucnVudGltZVN0YWdlSWQsIHNvdXJjZS5sb29rdXAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVkZ2VBdHRyaWJ1dGlvbjogb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID8/ICdwZXItd3JpdGUnLFxuICAgIHJvb3RMaW5rS2V5czogb3B0aW9ucz8ucm9vdExpbmtLZXlzID8/IFtub3JtYWxpc2VkS2V5XSxcbiAgfSkhO1xuICByZXR1cm4geyAuLi5iYXNlLCB3cml0ZXIsIHJvb3QsIC4uLihub3Rlcy5sZW5ndGggPiAwICYmIHsgbm90ZXMgfSkgfTtcbn1cbiJdfQ==
|