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,372 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* logModel.ts — the read model of ONE commit log: the writer rule and the value rule of `keyPaths.ts`,
|
|
4
|
-
* answered at a cost proportional to the answer, not to the log (F3, 9.33.0).
|
|
5
|
-
*
|
|
6
|
-
* WHY THIS FILE EXISTS. The rules are simple to state and expensive to apply naively: a key's writers
|
|
7
|
-
* include the commits AROUND it whose change reached it, and deciding that needs the value at the key
|
|
8
|
-
* before and after such a commit — a fold of its top-level key. Folding once per KEY made a causal walk
|
|
9
|
-
* over nested keys cubic in the log (every key re-scanned the log and re-folded its root). Here:
|
|
10
|
-
*
|
|
11
|
-
* - the log is indexed ONCE (`keyPaths · buildWriterIndex`, a path trie): a key's candidates cost
|
|
12
|
-
* O(depth + matches) — its node, its ancestors, its subtree — and the rows under a top-level key are
|
|
13
|
-
* reached through the index, never a scan;
|
|
14
|
-
* - each top-level key is folded ONCE (`verbs · foldKey`, copy-on-write), keeping its value before and
|
|
15
|
-
* after every commit a verdict can ask about: a commit with a row on a path that has written paths
|
|
16
|
-
* below it (it can be AROUND a written key), and a commit that writes THROUGH a string-valued
|
|
17
|
-
* container (`nativeSet` replaces the string, and the characters a key read from it vanish — the one
|
|
18
|
-
* way a row BESIDE a key moves it). A key's verdict is then two `nativeGet`s and a `deepEqual`;
|
|
19
|
-
* - the last writer before a point is found LAZILY: the last write on or inside the key, then only the
|
|
20
|
-
* around-candidates after it — most questions need no verdict at all.
|
|
21
|
-
*
|
|
22
|
-
* One shape keeps a per-key fold (memoised per key): a key that was never written, under a container that
|
|
23
|
-
* was only ever written WHOLE (its node has no written children, so no generation is kept there).
|
|
24
|
-
*
|
|
25
|
-
* A model of a FROZEN log (every engine log since F3: `EventLog · record` freezes each bundle and
|
|
26
|
-
* `getSnapshot` freezes the array) is memoised on the log — the record cannot change under it. A log that
|
|
27
|
-
* is not frozen (hand-built, parsed from JSON) gets a fresh model per question.
|
|
28
|
-
*/
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.LogModel = exports.leavesStringAbove = exports.writesAtOrInside = exports.memoisedModel = exports.logModel = void 0;
|
|
31
|
-
const equality_js_1 = require("./equality.js");
|
|
32
|
-
const keyPaths_js_1 = require("./keyPaths.js");
|
|
33
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
34
|
-
const paths_js_1 = require("./paths.js");
|
|
35
|
-
const verbs_js_1 = require("./verbs.js");
|
|
36
|
-
const MODELS = new WeakMap();
|
|
37
|
-
/** Is the log immutable — the array and every bundle and trace frozen (an engine snapshot's log)? */
|
|
38
|
-
function isFrozenLog(log) {
|
|
39
|
-
if (!Object.isFrozen(log))
|
|
40
|
-
return false;
|
|
41
|
-
// The shape `EventLog · record` leaves: the bundle, its payloads and its rows. A hand-built log
|
|
42
|
-
// frozen less deeply than that could change after a query, so it is never memoised.
|
|
43
|
-
for (const bundle of log) {
|
|
44
|
-
if (!Object.isFrozen(bundle) || !Object.isFrozen(bundle.trace))
|
|
45
|
-
return false;
|
|
46
|
-
if (!Object.isFrozen(bundle.overwrite) || !Object.isFrozen(bundle.updates))
|
|
47
|
-
return false;
|
|
48
|
-
if (!bundle.trace.every((row) => Object.isFrozen(row)))
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
}
|
|
53
|
-
/** The read model of `log` — memoised when the log is frozen, fresh otherwise. */
|
|
54
|
-
function logModel(log) {
|
|
55
|
-
const memo = MODELS.get(log);
|
|
56
|
-
if (memo !== undefined)
|
|
57
|
-
return memo;
|
|
58
|
-
const model = new LogModel(log);
|
|
59
|
-
if (isFrozenLog(log))
|
|
60
|
-
MODELS.set(log, model);
|
|
61
|
-
return model;
|
|
62
|
-
}
|
|
63
|
-
exports.logModel = logModel;
|
|
64
|
-
/** The memoised model of a frozen log (built on first ask), or undefined for a log that is not frozen. */
|
|
65
|
-
function memoisedModel(log) {
|
|
66
|
-
return MODELS.get(log) ?? (isFrozenLog(log) ? logModel(log) : undefined);
|
|
67
|
-
}
|
|
68
|
-
exports.memoisedModel = memoisedModel;
|
|
69
|
-
/** Does the commit hold a non-`delete` row on `key` or inside it? (A `delete` cannot replace a string container.) */
|
|
70
|
-
function writesAtOrInside(bundle, key) {
|
|
71
|
-
for (const t of bundle.trace) {
|
|
72
|
-
if (t.verb === 'delete')
|
|
73
|
-
continue;
|
|
74
|
-
const r = (0, keyPaths_js_1.relation)(t.path, key);
|
|
75
|
-
if (r === 'exact' || r === 'inside')
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
exports.writesAtOrInside = writesAtOrInside;
|
|
81
|
-
/**
|
|
82
|
-
* Can this commit leave a STRING-valued container above `key` — a row around the key whose recorded value
|
|
83
|
-
* holds a string at the row's path or anywhere between it and the key? Only then can a later write beside the
|
|
84
|
-
* key move it (`nativeSet` replaces the string). A conservative, payload-only check: no fold.
|
|
85
|
-
*/
|
|
86
|
-
function leavesStringAbove(bundle, key) {
|
|
87
|
-
const keySegs = key.split(paths_js_1.DELIM);
|
|
88
|
-
for (const t of bundle.trace) {
|
|
89
|
-
if (t.verb === 'delete' || (0, keyPaths_js_1.relation)(t.path, key) !== 'around')
|
|
90
|
-
continue;
|
|
91
|
-
const segs = t.path.split(paths_js_1.DELIM);
|
|
92
|
-
let value = (0, pathOps_js_1.nativeGet)(t.verb === 'merge' ? bundle.updates : bundle.overwrite, segs);
|
|
93
|
-
for (let depth = segs.length; depth < keySegs.length; depth++) {
|
|
94
|
-
if (typeof value === 'string')
|
|
95
|
-
return true;
|
|
96
|
-
if (value === null || typeof value !== 'object')
|
|
97
|
-
break;
|
|
98
|
-
value = (0, pathOps_js_1.nativeGet)(value, [keySegs[depth]]);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
exports.leavesStringAbove = leavesStringAbove;
|
|
104
|
-
class LogModel {
|
|
105
|
-
log;
|
|
106
|
-
index;
|
|
107
|
-
roots = new Map();
|
|
108
|
-
histories = new Map();
|
|
109
|
-
changesByKey = new Map();
|
|
110
|
-
writersByKey = new Map();
|
|
111
|
-
constructor(log) {
|
|
112
|
-
this.log = log;
|
|
113
|
-
this.index = (0, keyPaths_js_1.buildWriterIndex)(log);
|
|
114
|
-
for (const bundle of log)
|
|
115
|
-
keyPaths_js_1.queryWork.units += bundle.trace.length;
|
|
116
|
-
}
|
|
117
|
-
// ── rows ─────────────────────────────────────────────────────────────────
|
|
118
|
-
rootRows(root) {
|
|
119
|
-
let entry = this.roots.get(root);
|
|
120
|
-
if (entry !== undefined)
|
|
121
|
-
return entry;
|
|
122
|
-
const node = this.index.roots.get(root);
|
|
123
|
-
const rows = [];
|
|
124
|
-
let refused;
|
|
125
|
-
let refusedAt = Number.POSITIVE_INFINITY;
|
|
126
|
-
if (node !== undefined) {
|
|
127
|
-
for (const c of (0, keyPaths_js_1.subtreePositions)(node)) {
|
|
128
|
-
const trace = this.log[c].trace;
|
|
129
|
-
keyPaths_js_1.queryWork.units += trace.length;
|
|
130
|
-
for (let row = 0; row < trace.length && refused === undefined; row++) {
|
|
131
|
-
const { path, verb } = trace[row];
|
|
132
|
-
if (path !== root && (0, keyPaths_js_1.relation)(path, root) !== 'inside')
|
|
133
|
-
continue;
|
|
134
|
-
if (!(0, verbs_js_1.isVerb)(verb)) {
|
|
135
|
-
refused = new verbs_js_1.UnknownVerbError(verb, { path, row, commit: c });
|
|
136
|
-
refusedAt = c;
|
|
137
|
-
// the refused commit and everything after it are left out: an answer that reaches them is refused
|
|
138
|
-
while (rows.length > 0 && rows[rows.length - 1].commitIdx === c)
|
|
139
|
-
rows.pop();
|
|
140
|
-
}
|
|
141
|
-
else
|
|
142
|
-
rows.push({ verb, bundle: this.log[c], commitIdx: c, path });
|
|
143
|
-
}
|
|
144
|
-
if (refused !== undefined)
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
entry = { rows, ...(refused !== undefined && { refused }), refusedAt };
|
|
149
|
-
this.roots.set(root, entry);
|
|
150
|
-
return entry;
|
|
151
|
-
}
|
|
152
|
-
/** Refuse an answer that reaches a row whose verb the law does not know (one in commits `after` < c ≤ `end`). */
|
|
153
|
-
refuseThrough(root, end, after = -1) {
|
|
154
|
-
const rr = this.rootRows(root);
|
|
155
|
-
if (rr.refused !== undefined && rr.refusedAt <= end && rr.refusedAt > after)
|
|
156
|
-
throw rr.refused;
|
|
157
|
-
return rr;
|
|
158
|
-
}
|
|
159
|
-
/** Every row under `key`'s top-level key up to `end`, with its relation to `key` — through the index. */
|
|
160
|
-
rowsUnderRoot(key, end) {
|
|
161
|
-
const rr = this.refuseThrough((0, keyPaths_js_1.rootOf)(key), end);
|
|
162
|
-
const out = [];
|
|
163
|
-
for (const t of rr.rows) {
|
|
164
|
-
if (t.commitIdx > end)
|
|
165
|
-
break;
|
|
166
|
-
const r = (0, keyPaths_js_1.relation)(t.path, key);
|
|
167
|
-
out.push(r === undefined ? t : { ...t, relation: r });
|
|
168
|
-
}
|
|
169
|
-
return out;
|
|
170
|
-
}
|
|
171
|
-
// ── the root fold, once per top-level key ───────────────────────────────
|
|
172
|
-
history(root) {
|
|
173
|
-
let h = this.histories.get(root);
|
|
174
|
-
if (h !== undefined)
|
|
175
|
-
return h;
|
|
176
|
-
const kept = new Map();
|
|
177
|
-
const replaced = new Map();
|
|
178
|
-
const rr = this.rootRows(root);
|
|
179
|
-
keyPaths_js_1.queryWork.units += rr.rows.length;
|
|
180
|
-
(0, verbs_js_1.foldKey)(rr.rows, [root], {
|
|
181
|
-
generations: {
|
|
182
|
-
at: (c, state) => {
|
|
183
|
-
let keep = false;
|
|
184
|
-
keyPaths_js_1.queryWork.units += this.log[c].trace.length;
|
|
185
|
-
for (const t of this.log[c].trace) {
|
|
186
|
-
if (t.path !== root && (0, keyPaths_js_1.relation)(t.path, root) !== 'inside')
|
|
187
|
-
continue;
|
|
188
|
-
if (((0, keyPaths_js_1.nodeAt)(this.index, t.path)?.children.size ?? 0) > 0)
|
|
189
|
-
keep = true;
|
|
190
|
-
const segs = t.path.split(paths_js_1.DELIM);
|
|
191
|
-
for (let j = 1; j < segs.length; j++) {
|
|
192
|
-
if (typeof (0, pathOps_js_1.nativeGet)(state, segs.slice(0, j)) !== 'string')
|
|
193
|
-
continue;
|
|
194
|
-
const container = (0, keyPaths_js_1.nodeAt)(this.index, segs.slice(0, j).join(paths_js_1.DELIM));
|
|
195
|
-
if (container !== undefined) {
|
|
196
|
-
const list = replaced.get(container) ?? [];
|
|
197
|
-
if (list[list.length - 1] !== c)
|
|
198
|
-
list.push(c);
|
|
199
|
-
replaced.set(container, list);
|
|
200
|
-
}
|
|
201
|
-
keep = true;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return keep;
|
|
205
|
-
},
|
|
206
|
-
keep: (c, before, after) => {
|
|
207
|
-
kept.set(c, { before, after });
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
});
|
|
211
|
-
h = { kept, keptAt: [...kept.keys()].sort((a, b) => a - b), replaced };
|
|
212
|
-
this.histories.set(root, h);
|
|
213
|
-
return h;
|
|
214
|
-
}
|
|
215
|
-
/** A key never written, under a container only ever written whole: no generation is kept for it. */
|
|
216
|
-
needsOwnFold(key, ancestors) {
|
|
217
|
-
return (0, keyPaths_js_1.nodeAt)(this.index, key) === undefined && ancestors[ancestors.length - 1].children.size === 0;
|
|
218
|
-
}
|
|
219
|
-
/** Every commit across which the value at `key` changed — one fold for this key (the fallback shape). */
|
|
220
|
-
ownChanges(key) {
|
|
221
|
-
let changes = this.changesByKey.get(key);
|
|
222
|
-
if (changes !== undefined)
|
|
223
|
-
return changes;
|
|
224
|
-
const segs = key.split(paths_js_1.DELIM);
|
|
225
|
-
const verdict = new Map();
|
|
226
|
-
let commit = -1;
|
|
227
|
-
let start;
|
|
228
|
-
keyPaths_js_1.queryWork.units += this.rootRows(segs[0]).rows.length;
|
|
229
|
-
(0, verbs_js_1.foldKey)(this.rootRows(segs[0]).rows, segs, {
|
|
230
|
-
everyRow: true,
|
|
231
|
-
observe: (touch, before, after) => {
|
|
232
|
-
if (touch.commitIdx !== commit) {
|
|
233
|
-
commit = touch.commitIdx;
|
|
234
|
-
start = before;
|
|
235
|
-
}
|
|
236
|
-
verdict.set(commit, !(0, equality_js_1.deepEqual)(start, after, 'copies'));
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
changes = [...verdict].filter(([, changed]) => changed).map(([c]) => c);
|
|
240
|
-
this.changesByKey.set(key, changes);
|
|
241
|
-
return changes;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* The commits in the OPEN range (`after`, `before`) with no row on or inside `key` across which the value
|
|
245
|
-
* at `key` changed — the AROUND half of the writer rule (and the string-container case beside it).
|
|
246
|
-
*/
|
|
247
|
-
changedAround(key, after, before) {
|
|
248
|
-
const ancestors = (0, keyPaths_js_1.ancestorNodes)(this.index, key);
|
|
249
|
-
if (ancestors.length === 0 || ancestors.every((a) => a.positions.length === 0))
|
|
250
|
-
return [];
|
|
251
|
-
const root = ancestors[0].path;
|
|
252
|
-
// The answer reads the rows of the window: refuse it when one of them is a verb the law does not know.
|
|
253
|
-
this.refuseThrough(root, before - 1, after);
|
|
254
|
-
if (this.needsOwnFold(key, ancestors))
|
|
255
|
-
return (0, keyPaths_js_1.between)(this.ownChanges(key), after, before);
|
|
256
|
-
const h = this.history(root);
|
|
257
|
-
const candidates = (0, keyPaths_js_1.ascendingUnion)([
|
|
258
|
-
...ancestors.map((a) => (0, keyPaths_js_1.between)(a.positions, after, before)),
|
|
259
|
-
...ancestors.map((a) => (0, keyPaths_js_1.between)(h.replaced.get(a) ?? [], after, before)),
|
|
260
|
-
]);
|
|
261
|
-
const rest = key.split(paths_js_1.DELIM).slice(1);
|
|
262
|
-
keyPaths_js_1.queryWork.units += candidates.length;
|
|
263
|
-
return candidates.filter((c) => {
|
|
264
|
-
const g = h.kept.get(c);
|
|
265
|
-
return g !== undefined && !(0, equality_js_1.deepEqual)((0, pathOps_js_1.nativeGet)(g.before, rest), (0, pathOps_js_1.nativeGet)(g.after, rest), 'copies');
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
// ── the writer rule ──────────────────────────────────────────────────────
|
|
269
|
-
/** Every commit that WROTE `key`, ascending (memoised per key). */
|
|
270
|
-
writersOf(key) {
|
|
271
|
-
let writers = this.writersByKey.get(key);
|
|
272
|
-
if (writers !== undefined)
|
|
273
|
-
return writers;
|
|
274
|
-
const node = (0, keyPaths_js_1.nodeAt)(this.index, key);
|
|
275
|
-
const atOrInside = node === undefined ? [] : (0, keyPaths_js_1.subtreePositions)(node);
|
|
276
|
-
const around = this.changedAround(key, -1, Number.POSITIVE_INFINITY);
|
|
277
|
-
writers = around.length === 0 ? atOrInside.slice() : (0, keyPaths_js_1.ascendingUnion)([atOrInside, around]);
|
|
278
|
-
this.writersByKey.set(key, writers);
|
|
279
|
-
return writers;
|
|
280
|
-
}
|
|
281
|
-
/** The ARRAY position of the last commit before `before` that wrote `key`, or -1. */
|
|
282
|
-
lastWriterBefore(key, before) {
|
|
283
|
-
keyPaths_js_1.queryWork.units += 1;
|
|
284
|
-
const node = (0, keyPaths_js_1.nodeAt)(this.index, key);
|
|
285
|
-
const lastAI = node === undefined ? -1 : (0, keyPaths_js_1.lastBefore)((0, keyPaths_js_1.subtreePositions)(node), before);
|
|
286
|
-
const ancestors = (0, keyPaths_js_1.ancestorNodes)(this.index, key);
|
|
287
|
-
keyPaths_js_1.queryWork.units += ancestors.length; // the scans over them below
|
|
288
|
-
if (ancestors.length === 0)
|
|
289
|
-
return lastAI;
|
|
290
|
-
// A row around the key in the last write's OWN commit counts when it can leave a string container above
|
|
291
|
-
// the key (a later write beside the key then replaces it).
|
|
292
|
-
const aroundInWindow = ancestors.some((a) => (0, keyPaths_js_1.between)(a.positions, lastAI, before).length > 0) ||
|
|
293
|
-
(lastAI !== -1 && leavesStringAbove(this.log[lastAI], key));
|
|
294
|
-
// A `delete` cannot replace a string container, so a character read through one can still move after it.
|
|
295
|
-
const deleteOnly = lastAI !== -1 && !writesAtOrInside(this.log[lastAI], key);
|
|
296
|
-
if (!aroundInWindow && !(deleteOnly && ancestors.some((a) => a.positions.length > 0)))
|
|
297
|
-
return lastAI;
|
|
298
|
-
const changed = this.changedAround(key, lastAI, before);
|
|
299
|
-
return changed.length > 0 ? changed[changed.length - 1] : lastAI;
|
|
300
|
-
}
|
|
301
|
-
// ── the value rule ───────────────────────────────────────────────────────
|
|
302
|
-
/**
|
|
303
|
-
* The value of `key` after commit `idx` (inclusive). The fold of the rows under its top-level key — but
|
|
304
|
-
* when its last total row up to `idx` is a `set` ON the key and nothing around it was written since, only
|
|
305
|
-
* the rows on and inside the key from that `set` on can move it, and only they are folded.
|
|
306
|
-
*/
|
|
307
|
-
valueAt(key, idx) {
|
|
308
|
-
const segs = key.split(paths_js_1.DELIM);
|
|
309
|
-
this.refuseThrough(segs[0], idx);
|
|
310
|
-
const node = (0, keyPaths_js_1.nodeAt)(this.index, key);
|
|
311
|
-
const ancestors = (0, keyPaths_js_1.ancestorNodes)(this.index, key);
|
|
312
|
-
if (node === undefined && ancestors.length === 0)
|
|
313
|
-
return undefined;
|
|
314
|
-
if (node !== undefined) {
|
|
315
|
-
const anchor = (0, keyPaths_js_1.lastBefore)(node.totals, idx + 1);
|
|
316
|
-
if (anchor !== -1 &&
|
|
317
|
-
lastTotalIsSet(this.log[anchor], key) &&
|
|
318
|
-
ancestors.every((a) => (0, keyPaths_js_1.between)(a.positions, anchor - 1, idx + 1).length === 0)) {
|
|
319
|
-
const rows = [];
|
|
320
|
-
for (const c of (0, keyPaths_js_1.between)((0, keyPaths_js_1.subtreePositions)(node), anchor - 1, idx + 1)) {
|
|
321
|
-
const trace = this.log[c].trace;
|
|
322
|
-
for (let row = 0; row < trace.length; row++) {
|
|
323
|
-
const r = (0, keyPaths_js_1.relation)(trace[row].path, key);
|
|
324
|
-
if (r === 'exact' || r === 'inside') {
|
|
325
|
-
rows.push({
|
|
326
|
-
verb: trace[row].verb,
|
|
327
|
-
bundle: this.log[c],
|
|
328
|
-
commitIdx: c,
|
|
329
|
-
path: trace[row].path,
|
|
330
|
-
relation: r,
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
keyPaths_js_1.queryWork.units += rows.length;
|
|
336
|
-
return (0, verbs_js_1.foldKey)(rows, segs);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
const rows = this.rowsUnderRoot(key, idx);
|
|
340
|
-
keyPaths_js_1.queryWork.units += rows.length;
|
|
341
|
-
if (!rows.some((row) => row.relation !== undefined))
|
|
342
|
-
return undefined;
|
|
343
|
-
// A memoised model folds from the last generation it keeps at or before `idx` — the rows after it only.
|
|
344
|
-
if (MODELS.get(this.log) === this) {
|
|
345
|
-
const h = this.history(segs[0]);
|
|
346
|
-
const kept = (0, keyPaths_js_1.lastBefore)(h.keptAt, idx + 1);
|
|
347
|
-
if (kept !== -1) {
|
|
348
|
-
const after = rows.filter((row) => row.commitIdx > kept);
|
|
349
|
-
// Folded FROM the kept generation, the answer can BE it (no row after it) or share its parts, and
|
|
350
|
-
// the memo answers every later question: detach it, as the value rule promises (until 9.44.2 an
|
|
351
|
-
// edit of one answer changed the next).
|
|
352
|
-
return detached((0, verbs_js_1.foldKey)(after, segs, { anchored: true, start: h.kept.get(kept)?.after }));
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
return (0, verbs_js_1.foldKey)(rows, segs, { anchored: true });
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
exports.LogModel = LogModel;
|
|
359
|
-
/** A value the caller owns: a container is cloned, a primitive is itself. */
|
|
360
|
-
function detached(value) {
|
|
361
|
-
return value !== null && typeof value === 'object' ? structuredClone(value) : value;
|
|
362
|
-
}
|
|
363
|
-
/** Is the last `set` / `delete` row ON `key` in this commit a `set`? */
|
|
364
|
-
function lastTotalIsSet(bundle, key) {
|
|
365
|
-
for (let i = bundle.trace.length - 1; i >= 0; i--) {
|
|
366
|
-
const t = bundle.trace[i];
|
|
367
|
-
if (t.path === key && (t.verb === 'set' || t.verb === 'delete'))
|
|
368
|
-
return t.verb === 'set';
|
|
369
|
-
}
|
|
370
|
-
return false;
|
|
371
|
-
}
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHOzs7QUFHSCwrQ0FBMEM7QUFDMUMsK0NBYXVCO0FBQ3ZCLDZDQUF5QztBQUN6Qyx5Q0FBbUM7QUFFbkMseUNBQTJFO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixRQUFRLENBQUMsR0FBNEI7SUFDbkQsTUFB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QzdFLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEdBQVc7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyLCAnY29waWVzJykpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaGFuZ2VzID0gWy4uLnZlcmRpY3RdLmZpbHRlcigoWywgY2hhbmdlZF0pID0+IGNoYW5nZWQpLm1hcCgoW2NdKSA9PiBjKTtcbiAgICB0aGlzLmNoYW5nZXNCeUtleS5zZXQoa2V5LCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyBpbiB0aGUgT1BFTiByYW5nZSAoYGFmdGVyYCwgYGJlZm9yZWApIHdpdGggbm8gcm93IG9uIG9yIGluc2lkZSBga2V5YCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlXG4gICAqIGF0IGBrZXlgIGNoYW5nZWQg4oCUIHRoZSBBUk9VTkQgaGFsZiBvZiB0aGUgd3JpdGVyIHJ1bGUgKGFuZCB0aGUgc3RyaW5nLWNvbnRhaW5lciBjYXNlIGJlc2lkZSBpdCkuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWRBcm91bmQoa2V5OiBzdHJpbmcsIGFmdGVyOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCB8fCBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA9PT0gMCkpIHJldHVybiBbXTtcbiAgICBjb25zdCByb290ID0gYW5jZXN0b3JzWzBdLnBhdGg7XG4gICAgLy8gVGhlIGFuc3dlciByZWFkcyB0aGUgcm93cyBvZiB0aGUgd2luZG93OiByZWZ1c2UgaXQgd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93LlxuICAgIHRoaXMucmVmdXNlVGhyb3VnaChyb290LCBiZWZvcmUgLSAxLCBhZnRlcik7XG4gICAgaWYgKHRoaXMubmVlZHNPd25Gb2xkKGtleSwgYW5jZXN0b3JzKSkgcmV0dXJuIGJldHdlZW4odGhpcy5vd25DaGFuZ2VzKGtleSksIGFmdGVyLCBiZWZvcmUpO1xuICAgIGNvbnN0IGggPSB0aGlzLmhpc3Rvcnkocm9vdCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGFzY2VuZGluZ1VuaW9uKFtcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFmdGVyLCBiZWZvcmUpKSxcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oaC5yZXBsYWNlZC5nZXQoYSkgPz8gW10sIGFmdGVyLCBiZWZvcmUpKSxcbiAgICBdKTtcbiAgICBjb25zdCByZXN0ID0ga2V5LnNwbGl0KERFTElNKS5zbGljZSgxKTtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiB7XG4gICAgICBjb25zdCBnID0gaC5rZXB0LmdldChjKTtcbiAgICAgIHJldHVybiBnICE9PSB1bmRlZmluZWQgJiYgIWRlZXBFcXVhbChuYXRpdmVHZXQoZy5iZWZvcmUsIHJlc3QpLCBuYXRpdmVHZXQoZy5hZnRlciwgcmVzdCksICdjb3BpZXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgd3JpdGVyIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCB0aGF0IFdST1RFIGBrZXlgLCBhc2NlbmRpbmcgKG1lbW9pc2VkIHBlciBrZXkpLiAqL1xuICB3cml0ZXJzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgbGV0IHdyaXRlcnMgPSB0aGlzLndyaXRlcnNCeUtleS5nZXQoa2V5KTtcbiAgICBpZiAod3JpdGVycyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd3JpdGVycztcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgYXRPckluc2lkZSA9IG5vZGUgPT09IHVuZGVmaW5lZCA/IFtdIDogc3VidHJlZVBvc2l0aW9ucyhub2RlKTtcbiAgICBjb25zdCBhcm91bmQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCAtMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB3cml0ZXJzID0gYXJvdW5kLmxlbmd0aCA9PT0gMCA/IGF0T3JJbnNpZGUuc2xpY2UoKSA6IGFzY2VuZGluZ1VuaW9uKFthdE9ySW5zaWRlLCBhcm91bmRdKTtcbiAgICB0aGlzLndyaXRlcnNCeUtleS5zZXQoa2V5LCB3cml0ZXJzKTtcbiAgICByZXR1cm4gd3JpdGVycztcbiAgfVxuXG4gIC8qKiBUaGUgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSBgYmVmb3JlYCB0aGF0IHdyb3RlIGBrZXlgLCBvciAtMS4gKi9cbiAgbGFzdFdyaXRlckJlZm9yZShrZXk6IHN0cmluZywgYmVmb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBsYXN0QUkgPSBub2RlID09PSB1bmRlZmluZWQgPyAtMSA6IGxhc3RCZWZvcmUoc3VidHJlZVBvc2l0aW9ucyhub2RlKSwgYmVmb3JlKTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IGFuY2VzdG9ycy5sZW5ndGg7IC8vIHRoZSBzY2FucyBvdmVyIHRoZW0gYmVsb3dcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGxhc3RBSTtcbiAgICAvLyBBIHJvdyBhcm91bmQgdGhlIGtleSBpbiB0aGUgbGFzdCB3cml0ZSdzIE9XTiBjb21taXQgY291bnRzIHdoZW4gaXQgY2FuIGxlYXZlIGEgc3RyaW5nIGNvbnRhaW5lciBhYm92ZVxuICAgIC8vIHRoZSBrZXkgKGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZSBrZXkgdGhlbiByZXBsYWNlcyBpdCkuXG4gICAgY29uc3QgYXJvdW5kSW5XaW5kb3cgPVxuICAgICAgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGxhc3RBSSwgYmVmb3JlKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGxhc3RBSSAhPT0gLTEgJiYgbGVhdmVzU3RyaW5nQWJvdmUodGhpcy5sb2dbbGFzdEFJXSwga2V5KSk7XG4gICAgLy8gQSBgZGVsZXRlYCBjYW5ub3QgcmVwbGFjZSBhIHN0cmluZyBjb250YWluZXIsIHNvIGEgY2hhcmFjdGVyIHJlYWQgdGhyb3VnaCBvbmUgY2FuIHN0aWxsIG1vdmUgYWZ0ZXIgaXQuXG4gICAgY29uc3QgZGVsZXRlT25seSA9IGxhc3RBSSAhPT0gLTEgJiYgIXdyaXRlc0F0T3JJbnNpZGUodGhpcy5sb2dbbGFzdEFJXSwga2V5KTtcbiAgICBpZiAoIWFyb3VuZEluV2luZG93ICYmICEoZGVsZXRlT25seSAmJiBhbmNlc3RvcnMuc29tZSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID4gMCkpKSByZXR1cm4gbGFzdEFJO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCBsYXN0QUksIGJlZm9yZSk7XG4gICAgcmV0dXJuIGNoYW5nZWQubGVuZ3RoID4gMCA/IGNoYW5nZWRbY2hhbmdlZC5sZW5ndGggLSAxXSA6IGxhc3RBSTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgdmFsdWUgcnVsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIGBrZXlgIGFmdGVyIGNvbW1pdCBgaWR4YCAoaW5jbHVzaXZlKS4gVGhlIGZvbGQgb2YgdGhlIHJvd3MgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXkg4oCUIGJ1dFxuICAgKiB3aGVuIGl0cyBsYXN0IHRvdGFsIHJvdyB1cCB0byBgaWR4YCBpcyBhIGBzZXRgIE9OIHRoZSBrZXkgYW5kIG5vdGhpbmcgYXJvdW5kIGl0IHdhcyB3cml0dGVuIHNpbmNlLCBvbmx5XG4gICAqIHRoZSByb3dzIG9uIGFuZCBpbnNpZGUgdGhlIGtleSBmcm9tIHRoYXQgYHNldGAgb24gY2FuIG1vdmUgaXQsIGFuZCBvbmx5IHRoZXkgYXJlIGZvbGRlZC5cbiAgICovXG4gIHZhbHVlQXQoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHNlZ3NbMF0sIGlkeCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gbGFzdEJlZm9yZShub2RlLnRvdGFscywgaWR4ICsgMSk7XG4gICAgICBpZiAoXG4gICAgICAgIGFuY2hvciAhPT0gLTEgJiZcbiAgICAgICAgbGFzdFRvdGFsSXNTZXQodGhpcy5sb2dbYW5jaG9yXSwga2V5KSAmJlxuICAgICAgICBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFuY2hvciAtIDEsIGlkeCArIDEpLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3dzOiBUb3VjaFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBiZXR3ZWVuKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGFuY2hvciAtIDEsIGlkeCArIDEpKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmVsYXRpb24odHJhY2Vbcm93XS5wYXRoLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHIgPT09ICdleGFjdCcgfHwgciA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2ZXJiOiB0cmFjZVtyb3ddLnZlcmIgYXMgVG91Y2hbJ3ZlcmInXSxcbiAgICAgICAgICAgICAgICBidW5kbGU6IHRoaXMubG9nW2NdLFxuICAgICAgICAgICAgICAgIGNvbW1pdElkeDogYyBhcyBDb21taXRJZHgsXG4gICAgICAgICAgICAgICAgcGF0aDogdHJhY2Vbcm93XS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZm9sZEtleShyb3dzLCBzZWdzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1VuZGVyUm9vdChrZXksIGlkeCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgIGlmICghcm93cy5zb21lKChyb3cpID0+IHJvdy5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBBIG1lbW9pc2VkIG1vZGVsIGZvbGRzIGZyb20gdGhlIGxhc3QgZ2VuZXJhdGlvbiBpdCBrZWVwcyBhdCBvciBiZWZvcmUgYGlkeGAg4oCUIHRoZSByb3dzIGFmdGVyIGl0IG9ubHkuXG4gICAgaWYgKE1PREVMUy5nZXQodGhpcy5sb2cpID09PSB0aGlzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5oaXN0b3J5KHNlZ3NbMF0pO1xuICAgICAgY29uc3Qga2VwdCA9IGxhc3RCZWZvcmUoaC5rZXB0QXQsIGlkeCArIDEpO1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmNvbW1pdElkeCA+IGtlcHQpO1xuICAgICAgICAvLyBGb2xkZWQgRlJPTSB0aGUga2VwdCBnZW5lcmF0aW9uLCB0aGUgYW5zd2VyIGNhbiBCRSBpdCAobm8gcm93IGFmdGVyIGl0KSBvciBzaGFyZSBpdHMgcGFydHMsIGFuZFxuICAgICAgICAvLyB0aGUgbWVtbyBhbnN3ZXJzIGV2ZXJ5IGxhdGVyIHF1ZXN0aW9uOiBkZXRhY2ggaXQsIGFzIHRoZSB2YWx1ZSBydWxlIHByb21pc2VzICh1bnRpbCA5LjQ0LjIgYW5cbiAgICAgICAgLy8gZWRpdCBvZiBvbmUgYW5zd2VyIGNoYW5nZWQgdGhlIG5leHQpLlxuICAgICAgICByZXR1cm4gZGV0YWNoZWQoZm9sZEtleShhZnRlciwgc2VncywgeyBhbmNob3JlZDogdHJ1ZSwgc3RhcnQ6IGgua2VwdC5nZXQoa2VwdCk/LmFmdGVyIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogQSB2YWx1ZSB0aGUgY2FsbGVyIG93bnM6IGEgY29udGFpbmVyIGlzIGNsb25lZCwgYSBwcmltaXRpdmUgaXMgaXRzZWxmLiAqL1xuZnVuY3Rpb24gZGV0YWNoZWQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKiBJcyB0aGUgbGFzdCBgc2V0YCAvIGBkZWxldGVgIHJvdyBPTiBga2V5YCBpbiB0aGlzIGNvbW1pdCBhIGBzZXRgPyAqL1xuZnVuY3Rpb24gbGFzdFRvdGFsSXNTZXQoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBidW5kbGUudHJhY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0ID0gYnVuZGxlLnRyYWNlW2ldO1xuICAgIGlmICh0LnBhdGggPT09IGtleSAmJiAodC52ZXJiID09PSAnc2V0JyB8fCB0LnZlcmIgPT09ICdkZWxldGUnKSkgcmV0dXJuIHQudmVyYiA9PT0gJ3NldCc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
|
package/dist/lib/memory/merge.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
|
|
4
|
-
* nothing): `deepSmartMerge`, the one merge law every replay, fold and reader
|
|
5
|
-
* of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
|
|
6
|
-
* moved.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.deepSmartMerge = void 0;
|
|
10
|
-
/**
|
|
11
|
-
* Deep union merge helper.
|
|
12
|
-
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
13
|
-
* - Arrays (empty): replace — src `[]` clears the destination array.
|
|
14
|
-
* Rationale: writing `scope.tags = []` means "clear tags", not "append nothing".
|
|
15
|
-
* Without this rule, an empty-array write silently becomes a no-op which is
|
|
16
|
-
* impossible to distinguish from a bug.
|
|
17
|
-
* - Objects: recursive merge of own enumerable string keys, including special keys;
|
|
18
|
-
* inherited destination values and setters never participate.
|
|
19
|
-
* - Primitives: source wins
|
|
20
|
-
*
|
|
21
|
-
* Terminates on a CYCLIC `src` (9.18.1, same law as {@link deepEqual}: a
|
|
22
|
-
* state value survives `structuredClone`, which preserves cycles). A `src`
|
|
23
|
-
* object re-entered while it is still being merged higher up the stack hands
|
|
24
|
-
* back the output being built for it, so the merged value mirrors the cycle
|
|
25
|
-
* instead of unrolling it forever. Only the ancestors on the stack are
|
|
26
|
-
* guarded — a shared (acyclic) `src` reference met again at a different
|
|
27
|
-
* `dst` merges against THAT `dst`, exactly as before.
|
|
28
|
-
*/
|
|
29
|
-
function deepSmartMerge(dst, src) {
|
|
30
|
-
return mergeGuarded(dst, src, undefined);
|
|
31
|
-
}
|
|
32
|
-
exports.deepSmartMerge = deepSmartMerge;
|
|
33
|
-
function mergeGuarded(dst, src, inFlight) {
|
|
34
|
-
if (src === null || typeof src !== 'object')
|
|
35
|
-
return src;
|
|
36
|
-
if (Array.isArray(src)) {
|
|
37
|
-
if (src.length === 0)
|
|
38
|
-
return []; // empty src = clear, not no-op
|
|
39
|
-
if (Array.isArray(dst))
|
|
40
|
-
return [...new Set([...dst, ...src])];
|
|
41
|
-
return [...src];
|
|
42
|
-
}
|
|
43
|
-
if (inFlight?.has(src))
|
|
44
|
-
return inFlight.get(src); // cycle — re-enter the value being built
|
|
45
|
-
const out = { ...(dst && typeof dst === 'object' ? dst : {}) };
|
|
46
|
-
(inFlight ??= new WeakMap()).set(src, out);
|
|
47
|
-
for (const k of Object.keys(src)) {
|
|
48
|
-
const owns = Object.prototype.hasOwnProperty.call(out, k);
|
|
49
|
-
const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
|
|
50
|
-
// Spread made own slots writable data properties. Missing slots can be
|
|
51
|
-
// assigned too, unless an inherited key (notably __proto__) intercepts
|
|
52
|
-
// the write. Keep that key as DATA, rather than dropping it or invoking
|
|
53
|
-
// a setter; Reflect.has tests existence without reading an inherited getter.
|
|
54
|
-
if (!owns && Reflect.has(out, k)) {
|
|
55
|
-
Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
out[k] = value;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
inFlight.delete(src);
|
|
62
|
-
return out;
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFnQixjQUFjLENBQUMsR0FBUSxFQUFFLEdBQVE7SUFDL0MsT0FBTyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRkQsd0NBRUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxHQUFRLEVBQUUsR0FBUSxFQUFFLFFBQTBDO0lBQ2xGLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtRQUNoRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztJQUUzRixNQUFNLEdBQUcsR0FBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEUsQ0FBQyxRQUFRLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBtZXJnZS50cyDigJQgdGhlIHVuaW9uIG1lcmdlIHRoZSBgbWVyZ2VgIHZlcmIgYXBwbGllcy4gQSBsZWFmIChMMCwgaW1wb3J0c1xuICogbm90aGluZyk6IGBkZWVwU21hcnRNZXJnZWAsIHRoZSBvbmUgbWVyZ2UgbGF3IGV2ZXJ5IHJlcGxheSwgZm9sZCBhbmQgcmVhZGVyXG4gKiBvZiBhIHJlY29yZGVkIGBtZXJnZWAgcm93IHJ1bnMuIFJlLWV4cG9ydGVkIGZyb20gYHV0aWxzLnRzYCwgc28gbm8gaW1wb3J0ZXJcbiAqIG1vdmVkLlxuICovXG5cbi8qKlxuICogRGVlcCB1bmlvbiBtZXJnZSBoZWxwZXIuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogdW5pb24gd2l0aG91dCBkdXBsaWNhdGVzIChlbmNvdW50ZXIgb3JkZXIgcHJlc2VydmVkKVxuICogLSBBcnJheXMgKGVtcHR5KTogICAgIHJlcGxhY2Ug4oCUIHNyYyBgW11gIGNsZWFycyB0aGUgZGVzdGluYXRpb24gYXJyYXkuXG4gKiAgIFJhdGlvbmFsZTogd3JpdGluZyBgc2NvcGUudGFncyA9IFtdYCBtZWFucyBcImNsZWFyIHRhZ3NcIiwgbm90IFwiYXBwZW5kIG5vdGhpbmdcIi5cbiAqICAgV2l0aG91dCB0aGlzIHJ1bGUsIGFuIGVtcHR5LWFycmF5IHdyaXRlIHNpbGVudGx5IGJlY29tZXMgYSBuby1vcCB3aGljaCBpc1xuICogICBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZyb20gYSBidWcuXG4gKiAtIE9iamVjdHM6IHJlY3Vyc2l2ZSBtZXJnZSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5cywgaW5jbHVkaW5nIHNwZWNpYWwga2V5cztcbiAqICAgaW5oZXJpdGVkIGRlc3RpbmF0aW9uIHZhbHVlcyBhbmQgc2V0dGVycyBuZXZlciBwYXJ0aWNpcGF0ZS5cbiAqIC0gUHJpbWl0aXZlczogc291cmNlIHdpbnNcbiAqXG4gKiBUZXJtaW5hdGVzIG9uIGEgQ1lDTElDIGBzcmNgICg5LjE4LjEsIHNhbWUgbGF3IGFzIHtAbGluayBkZWVwRXF1YWx9OiBhXG4gKiBzdGF0ZSB2YWx1ZSBzdXJ2aXZlcyBgc3RydWN0dXJlZENsb25lYCwgd2hpY2ggcHJlc2VydmVzIGN5Y2xlcykuIEEgYHNyY2BcbiAqIG9iamVjdCByZS1lbnRlcmVkIHdoaWxlIGl0IGlzIHN0aWxsIGJlaW5nIG1lcmdlZCBoaWdoZXIgdXAgdGhlIHN0YWNrIGhhbmRzXG4gKiBiYWNrIHRoZSBvdXRwdXQgYmVpbmcgYnVpbHQgZm9yIGl0LCBzbyB0aGUgbWVyZ2VkIHZhbHVlIG1pcnJvcnMgdGhlIGN5Y2xlXG4gKiBpbnN0ZWFkIG9mIHVucm9sbGluZyBpdCBmb3JldmVyLiBPbmx5IHRoZSBhbmNlc3RvcnMgb24gdGhlIHN0YWNrIGFyZVxuICogZ3VhcmRlZCDigJQgYSBzaGFyZWQgKGFjeWNsaWMpIGBzcmNgIHJlZmVyZW5jZSBtZXQgYWdhaW4gYXQgYSBkaWZmZXJlbnRcbiAqIGBkc3RgIG1lcmdlcyBhZ2FpbnN0IFRIQVQgYGRzdGAsIGV4YWN0bHkgYXMgYmVmb3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFNtYXJ0TWVyZ2UoZHN0OiBhbnksIHNyYzogYW55KTogYW55IHtcbiAgcmV0dXJuIG1lcmdlR3VhcmRlZChkc3QsIHNyYywgdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VHdWFyZGVkKGRzdDogYW55LCBzcmM6IGFueSwgaW5GbGlnaHQ6IFdlYWtNYXA8b2JqZWN0LCBhbnk+IHwgdW5kZWZpbmVkKTogYW55IHtcbiAgaWYgKHNyYyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JykgcmV0dXJuIHNyYztcblxuICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKSB7XG4gICAgaWYgKHNyYy5sZW5ndGggPT09IDApIHJldHVybiBbXTsgLy8gZW1wdHkgc3JjID0gY2xlYXIsIG5vdCBuby1vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRzdCkpIHJldHVybiBbLi4ubmV3IFNldChbLi4uZHN0LCAuLi5zcmNdKV07XG4gICAgcmV0dXJuIFsuLi5zcmNdO1xuICB9XG5cbiAgaWYgKGluRmxpZ2h0Py5oYXMoc3JjKSkgcmV0dXJuIGluRmxpZ2h0LmdldChzcmMpOyAvLyBjeWNsZSDigJQgcmUtZW50ZXIgdGhlIHZhbHVlIGJlaW5nIGJ1aWx0XG5cbiAgY29uc3Qgb3V0OiBhbnkgPSB7IC4uLihkc3QgJiYgdHlwZW9mIGRzdCA9PT0gJ29iamVjdCcgPyBkc3QgOiB7fSkgfTtcbiAgKGluRmxpZ2h0ID8/PSBuZXcgV2Vha01hcCgpKS5zZXQoc3JjLCBvdXQpO1xuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGNvbnN0IG93bnMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0LCBrKTtcbiAgICBjb25zdCB2YWx1ZSA9IG1lcmdlR3VhcmRlZChvd25zID8gb3V0W2tdIDogdW5kZWZpbmVkLCBzcmNba10sIGluRmxpZ2h0KTtcbiAgICAvLyBTcHJlYWQgbWFkZSBvd24gc2xvdHMgd3JpdGFibGUgZGF0YSBwcm9wZXJ0aWVzLiBNaXNzaW5nIHNsb3RzIGNhbiBiZVxuICAgIC8vIGFzc2lnbmVkIHRvbywgdW5sZXNzIGFuIGluaGVyaXRlZCBrZXkgKG5vdGFibHkgX19wcm90b19fKSBpbnRlcmNlcHRzXG4gICAgLy8gdGhlIHdyaXRlLiBLZWVwIHRoYXQga2V5IGFzIERBVEEsIHJhdGhlciB0aGFuIGRyb3BwaW5nIGl0IG9yIGludm9raW5nXG4gICAgLy8gYSBzZXR0ZXI7IFJlZmxlY3QuaGFzIHRlc3RzIGV4aXN0ZW5jZSB3aXRob3V0IHJlYWRpbmcgYW4gaW5oZXJpdGVkIGdldHRlci5cbiAgICBpZiAoIW93bnMgJiYgUmVmbGVjdC5oYXMob3V0LCBrKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG91dCwgaywgeyB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIGluRmxpZ2h0LmRlbGV0ZShzcmMpO1xuICByZXR1cm4gb3V0O1xufVxuIl19
|