footprintjs 10.0.1 → 10.2.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 +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
* - **Accumulate**: progressive quality up to slider position
|
|
12
12
|
* - **Aggregate**: overall pipeline quality score
|
|
13
13
|
*
|
|
14
|
+
* Attempts (10.1): a stage whose retry series GAVE UP (exhausted, declined,
|
|
15
|
+
* no time left) or TIMED OUT is a quality drop at that stage — `drop:
|
|
16
|
+
* 'attempts'`, with the series' `attempts` summary and a factor naming why.
|
|
17
|
+
* A series that gave up never reached `onStageEnd` (the stage failed), so the
|
|
18
|
+
* recorder scores it itself: `0`, the floor, with the keys its last attempt
|
|
19
|
+
* read — which is what `qualityTrace()` walks to pair the drop with its
|
|
20
|
+
* causal parents. A series that timed out and recovered keeps the scoring
|
|
21
|
+
* function's score and gains the flag. Attempts reach a recorder on the FLOW
|
|
22
|
+
* channel (`onAttempt`): attach with `attachCombinedRecorder` to see them —
|
|
23
|
+
* `attachScopeRecorder` scores exactly as before.
|
|
24
|
+
*
|
|
14
25
|
* @example
|
|
15
26
|
* ```typescript
|
|
16
27
|
* const quality = new QualityRecorder((runtimeStageId, context) => {
|
|
@@ -33,6 +44,7 @@
|
|
|
33
44
|
*/
|
|
34
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
46
|
exports.QualityRecorder = void 0;
|
|
47
|
+
const attemptSeries_js_1 = require("./attemptSeries.js");
|
|
36
48
|
const KeyedStore_js_1 = require("./KeyedStore.js");
|
|
37
49
|
class QualityRecorder {
|
|
38
50
|
static _counter = 0;
|
|
@@ -41,46 +53,95 @@ class QualityRecorder {
|
|
|
41
53
|
/** 1:1 per-step storage (Convention 1 — composed, not inherited). */
|
|
42
54
|
store = new KeyedStore_js_1.KeyedStore();
|
|
43
55
|
scoringFn;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Each execution in flight, by its OWN runtimeStageId (10.1) — every event owns its attribution, so parallel
|
|
58
|
+
* siblings never score under each other's id or with each other's keys (until 10.0 one shared "current stage"
|
|
59
|
+
* buffer did). A retried execution's entry restarts with each attempt: a series that gave up is scored with the
|
|
60
|
+
* keys its last attempt touched. Released at the stage's end, or when a drop consumes it.
|
|
61
|
+
*/
|
|
62
|
+
inFlight = new Map();
|
|
63
|
+
/** Per-series tallies of the series that retried, gave up or timed out. */
|
|
64
|
+
attemptBook = new attemptSeries_js_1.AttemptSeriesBook();
|
|
50
65
|
constructor(scoringFn, options) {
|
|
51
66
|
this.scoringFn = scoringFn;
|
|
52
67
|
this.id = options?.id ?? `quality-${++QualityRecorder._counter}`;
|
|
53
68
|
this.preferredOperation = options?.preferredOperation ?? 'accumulate';
|
|
54
69
|
}
|
|
55
70
|
onStageStart(event) {
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
71
|
+
this.inFlight.set(event.runtimeStageId, {
|
|
72
|
+
stageId: event.stageId,
|
|
73
|
+
stageName: event.stageName,
|
|
74
|
+
keysRead: [],
|
|
75
|
+
keysWritten: [],
|
|
76
|
+
});
|
|
61
77
|
}
|
|
62
78
|
onRead(event) {
|
|
63
79
|
if (event.key)
|
|
64
|
-
this.
|
|
80
|
+
this.inFlight.get(event.runtimeStageId)?.keysRead.push(event.key);
|
|
65
81
|
}
|
|
66
82
|
onWrite(event) {
|
|
67
|
-
this.
|
|
83
|
+
this.inFlight.get(event.runtimeStageId)?.keysWritten.push(event.key);
|
|
68
84
|
}
|
|
69
85
|
onStageEnd(event) {
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
stageId:
|
|
73
|
-
|
|
74
|
-
|
|
86
|
+
const id = event.runtimeStageId;
|
|
87
|
+
const step = this.inFlight.get(id) ?? {
|
|
88
|
+
stageId: event.stageId,
|
|
89
|
+
stageName: event.stageName,
|
|
90
|
+
keysRead: [],
|
|
91
|
+
keysWritten: [],
|
|
92
|
+
};
|
|
93
|
+
this.inFlight.delete(id);
|
|
94
|
+
const { score, factors } = this.scoringFn(id, {
|
|
95
|
+
stageName: step.stageName,
|
|
96
|
+
stageId: step.stageId,
|
|
97
|
+
keysRead: step.keysRead,
|
|
98
|
+
keysWritten: step.keysWritten,
|
|
75
99
|
duration: event.duration,
|
|
76
100
|
});
|
|
77
|
-
this.store.set(
|
|
78
|
-
stageName:
|
|
79
|
-
stageId:
|
|
101
|
+
this.store.set(id, {
|
|
102
|
+
stageName: step.stageName,
|
|
103
|
+
stageId: step.stageId,
|
|
80
104
|
score: Math.max(0, Math.min(1, score)),
|
|
81
105
|
factors: factors ?? [],
|
|
82
|
-
keysRead: [...
|
|
83
|
-
keysWritten: [...
|
|
106
|
+
keysRead: [...step.keysRead],
|
|
107
|
+
keysWritten: [...step.keysWritten],
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* A series that ended after giving up or timing out is a drop at its stage. `onAttempt` for the last attempt
|
|
112
|
+
* fires after that attempt's `onStageEnd` (when it returned), so a recovered series amends the scored entry; a
|
|
113
|
+
* series that gave up has none, and is scored here.
|
|
114
|
+
*/
|
|
115
|
+
onAttempt(event) {
|
|
116
|
+
const { record } = event;
|
|
117
|
+
const state = this.attemptBook.add(record);
|
|
118
|
+
const summary = state?.summary;
|
|
119
|
+
if (!summary || (summary.timeout === 0 && !(0, attemptSeries_js_1.gaveUp)(record)))
|
|
120
|
+
return;
|
|
121
|
+
const factor = (0, attemptSeries_js_1.gaveUp)(record)
|
|
122
|
+
? `attempts: gave up (${[record.reason, record.category].filter(Boolean).join(', ')}) after ${record.attempt} of ${record.of ?? record.attempt}`
|
|
123
|
+
: `attempts: ${summary.timeout} of ${summary.count} timed out`;
|
|
124
|
+
const scored = this.store.get(record.series);
|
|
125
|
+
if (scored) {
|
|
126
|
+
this.store.set(record.series, {
|
|
127
|
+
...scored,
|
|
128
|
+
factors: [...scored.factors, factor],
|
|
129
|
+
drop: 'attempts',
|
|
130
|
+
attempts: summary,
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const step = this.inFlight.get(record.series);
|
|
135
|
+
this.inFlight.delete(record.series);
|
|
136
|
+
this.store.set(record.series, {
|
|
137
|
+
stageName: event.stageName,
|
|
138
|
+
stageId: event.stageId,
|
|
139
|
+
score: 0,
|
|
140
|
+
factors: [factor],
|
|
141
|
+
keysRead: step ? [...step.keysRead] : [],
|
|
142
|
+
keysWritten: step ? [...step.keysWritten] : [],
|
|
143
|
+
drop: 'attempts',
|
|
144
|
+
attempts: summary,
|
|
84
145
|
});
|
|
85
146
|
}
|
|
86
147
|
// ── Per-step query API (delegates to the composed store) ───────────────
|
|
@@ -153,12 +214,9 @@ class QualityRecorder {
|
|
|
153
214
|
}
|
|
154
215
|
clear() {
|
|
155
216
|
this.store.clear();
|
|
156
|
-
this.
|
|
157
|
-
this.
|
|
158
|
-
this.currentStageName = '';
|
|
159
|
-
this.currentKeysRead = [];
|
|
160
|
-
this.currentKeysWritten = [];
|
|
217
|
+
this.inFlight.clear();
|
|
218
|
+
this.attemptBook.clear();
|
|
161
219
|
}
|
|
162
220
|
}
|
|
163
221
|
exports.QualityRecorder = QualityRecorder;
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHOzs7QUFHSCxtREFBNkM7QUEyQzdDLE1BQWEsZUFBZTtJQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVuQixFQUFFLENBQVM7SUFDWCxrQkFBa0IsQ0FBb0I7SUFDL0MscUVBQXFFO0lBQ3BELEtBQUssR0FBRyxJQUFJLDBCQUFVLEVBQWdCLENBQUM7SUFDdkMsU0FBUyxDQUFtQjtJQUU3QywrQ0FBK0M7SUFDdkMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0lBQzNCLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDcEIsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLGVBQWUsR0FBYSxFQUFFLENBQUM7SUFDL0Isa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBRTFDLFlBQVksU0FBMkIsRUFBRSxPQUFnQztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxFQUFFLGtCQUFrQixJQUFJLFlBQVksQ0FBQztJQUN4RSxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWlCO1FBQzVCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ2xELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxH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RDtZQUMxRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLElBQUksRUFBRTtnQkFDSixZQUFZLEVBQUUsT0FBTztnQkFDckIsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsY0FBYztnQkFDNUMsS0FBSzthQUNOO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDOztBQWxKSCwwQ0FtSkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1YWxpdHlSZWNvcmRlciDigJQgcGVyLXN0ZXAgcXVhbGl0eSBzY29yaW5nIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIENvbGxlY3RzIHF1YWxpdHkgc2NvcmVzIGR1cmluZyB0cmF2ZXJzYWwgKGFjY3VtdWxhdGUgcGF0dGVybikuXG4gKiBBZnRlciBleGVjdXRpb24sIHVzZSBxdWFsaXR5VHJhY2UoKSB0byBiYWNrdHJhY2sgZnJvbSBhbnkgbG93LXNjb3Jpbmcgc3RlcC5cbiAqXG4gKiBDb21wb3NlcyBhIGBLZXllZFN0b3JlPFF1YWxpdHlFbnRyeT5gIGZvciBPKDEpIGxvb2t1cCBhbmQgc3RhbmRhcmQgb3BlcmF0aW9uc1xuICogKENvbnZlbnRpb24gMSDigJQgb25lIHB1cnBvc2UgcGVyIHJlY29yZGVyKTpcbiAqICAgLSAqKlRyYW5zbGF0ZSoqOiBgZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKWAg4oCUIHF1YWxpdHkgYXQgdGhpcyBzdGVwXG4gKiAgIC0gKipBY2N1bXVsYXRlKio6IHByb2dyZXNzaXZlIHF1YWxpdHkgdXAgdG8gc2xpZGVyIHBvc2l0aW9uXG4gKiAgIC0gKipBZ2dyZWdhdGUqKjogb3ZlcmFsbCBwaXBlbGluZSBxdWFsaXR5IHNjb3JlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1YWxpdHkgPSBuZXcgUXVhbGl0eVJlY29yZGVyKChydW50aW1lU3RhZ2VJZCwgY29udGV4dCkgPT4ge1xuICogICAvLyBDdXN0b20gc2NvcmluZyBmdW5jdGlvbiDigJQgcmV0dXJuIHsgc2NvcmU6IDAuMOKAkzEuMCwgZmFjdG9ycz8gfVxuICogICBpZiAoY29udGV4dC5zdGFnZU5hbWUuaW5jbHVkZXMoJ2xsbScpKSByZXR1cm4geyBzY29yZTogMC43LCBmYWN0b3JzOiBbJ2xsbSBzdGFnZSddIH07XG4gKiAgIHJldHVybiB7IHNjb3JlOiAxLjAgfTtcbiAqIH0pO1xuICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihxdWFsaXR5KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIC8vIFBlci1zdGVwIHNjb3JlXG4gKiBxdWFsaXR5LmdldEJ5S2V5KCdjYWxsLWxsbSM1Jyk7ICAvLyB7IHNjb3JlOiAwLjcsIHN0YWdlTmFtZTogJ0NhbGxMTE0nLCBmYWN0b3JzOiBbLi4uXSB9XG4gKlxuICogLy8gT3ZlcmFsbCBxdWFsaXR5XG4gKiBxdWFsaXR5LmdldE92ZXJhbGxTY29yZSgpOyAgLy8gMC44NVxuICpcbiAqIC8vIExvd2VzdC1zY29yaW5nIHN0ZXBcbiAqIHF1YWxpdHkuZ2V0TG93ZXN0KCk7ICAvLyB7IHJ1bnRpbWVTdGFnZUlkOiAnY2FsbC1sbG0jNScsIGVudHJ5OiB7IHNjb3JlOiAwLjcsIC4uLiB9IH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBTY29wZVJlY29yZGVyLCBTdGFnZUV2ZW50LCBXcml0ZUV2ZW50IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vS2V5ZWRTdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9SZWNvcmRlck9wZXJhdGlvbi5qcyc7XG5cbi8qKiBQZXItc3RlcCBxdWFsaXR5IGRhdGEgc3RvcmVkIGJ5IFF1YWxpdHlSZWNvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eUVudHJ5IHtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFF1YWxpdHkgc2NvcmUgZm9yIHRoaXMgc3RlcCAoMC4wID0gd29yc3QsIDEuMCA9IGJlc3QpLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICAvKiogV2hhdCBjb250cmlidXRlZCB0byB0aGlzIHNjb3JlLiAqL1xuICBmYWN0b3JzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgcmVhZCBkdXJpbmcgdGhpcyBzdGVwIChmb3IgYmFja3RyYWNraW5nKS4gKi9cbiAga2V5c1JlYWQ6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3cml0dGVuIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG59XG5cbi8qKlxuICogU2NvcmluZyBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHN0YWdlLlxuICogUmVjZWl2ZXMgdGhlIHJ1bnRpbWVTdGFnZUlkLCBzdGFnZSBldmVudCwgYW5kIGEgc3VtbWFyeSBvZiByZWFkcy93cml0ZXMuXG4gKiBSZXR1cm4gYSBzY29yZSAoMC4w4oCTMS4wKSBhbmQgb3B0aW9uYWwgZmFjdG9ycyBleHBsYWluaW5nIHRoZSBzY29yZS5cbiAqL1xuZXhwb3J0IHR5cGUgUXVhbGl0eVNjb3JpbmdGbiA9IChcbiAgcnVudGltZVN0YWdlSWQ6IHN0cmluZyxcbiAgY29udGV4dDoge1xuICAgIHN0YWdlTmFtZTogc3RyaW5nO1xuICAgIHN0YWdlSWQ6IHN0cmluZztcbiAgICBrZXlzUmVhZDogc3RyaW5nW107XG4gICAga2V5c1dyaXR0ZW46IHN0cmluZ1tdO1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICB9LFxuKSA9PiB7IHNjb3JlOiBudW1iZXI7IGZhY3RvcnM/OiBzdHJpbmdbXSB9O1xuXG4vKiogT3B0aW9ucyBmb3IgUXVhbGl0eVJlY29yZGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWFsaXR5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgSUQuIERlZmF1bHRzIHRvIGF1dG8taW5jcmVtZW50LiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCBVSSBvcGVyYXRpb24uIERlZmF1bHRzIHRvICdhY2N1bXVsYXRlJyAocHJvZ3Jlc3NpdmUgcXVhbGl0eSkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86IFJlY29yZGVyT3BlcmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUXVhbGl0eVJlY29yZGVyIGltcGxlbWVudHMgU2NvcGVSZWNvcmRlciB7XG4gIHByaXZhdGUgc3RhdGljIF9jb3VudGVyID0gMDtcblxuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBwcmVmZXJyZWRPcGVyYXRpb246IFJlY29yZGVyT3BlcmF0aW9uO1xuICAvKiogMToxIHBlci1zdGVwIHN0b3JhZ2UgKENvbnZlbnRpb24gMSDigJQgY29tcG9zZWQsIG5vdCBpbmhlcml0ZWQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlID0gbmV3IEtleWVkU3RvcmU8UXVhbGl0eUVudHJ5PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjb3JpbmdGbjogUXVhbGl0eVNjb3JpbmdGbjtcblxuICAvLyBQZXItc3RhZ2UgYnVmZmVycyAocmVzZXQgb24gZWFjaCBzdGFnZVN0YXJ0KVxuICBwcml2YXRlIGN1cnJlbnRSdW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRTdGFnZUlkID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFN0YWdlTmFtZSA9ICcnO1xuICBwcml2YXRlIGN1cnJlbnRLZXlzUmVhZDogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBjdXJyZW50S2V5c1dyaXR0ZW46IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcmluZ0ZuOiBRdWFsaXR5U2NvcmluZ0ZuLCBvcHRpb25zPzogUXVhbGl0eVJlY29yZGVyT3B0aW9ucykge1xuICAgIHRoaXMuc2NvcmluZ0ZuID0gc2NvcmluZ0ZuO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zPy5pZCA/PyBgcXVhbGl0eS0keysrUXVhbGl0eVJlY29yZGVyLl9jb3VudGVyfWA7XG4gICAgdGhpcy5wcmVmZXJyZWRPcGVyYXRpb24gPSBvcHRpb25zPy5wcmVmZXJyZWRPcGVyYXRpb24gPz8gJ2FjY3VtdWxhdGUnO1xuICB9XG5cbiAgb25TdGFnZVN0YXJ0KGV2ZW50OiBTdGFnZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50UnVudGltZVN0YWdlSWQgPSBldmVudC5ydW50aW1lU3RhZ2VJZDtcbiAgICB0aGlzLmN1cnJlbnRTdGFnZUlkID0gZXZlbnQuc3RhZ2VJZDtcbiAgICB0aGlzLmN1cnJlbnRTdGFnZU5hbWUgPSBldmVudC5zdGFnZU5hbWU7XG4gICAgdGhpcy5jdXJyZW50S2V5c1JlYWQgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRLZXlzV3JpdHRlbiA9IFtdO1xuICB9XG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5KSB0aGlzLmN1cnJlbnRLZXlzUmVhZC5wdXNoKGV2ZW50LmtleSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50S2V5c1dyaXR0ZW4ucHVzaChldmVudC5rZXkpO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2NvcmUsIGZhY3RvcnMgfSA9IHRoaXMuc2NvcmluZ0ZuKHRoaXMuY3VycmVudFJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuY3VycmVudFN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuY3VycmVudFN0YWdlSWQsXG4gICAgICBrZXlzUmVhZDogdGhpcy5jdXJyZW50S2V5c1JlYWQsXG4gICAgICBrZXlzV3JpdHRlbjogdGhpcy5jdXJyZW50S2V5c1dyaXR0ZW4sXG4gICAgICBkdXJhdGlvbjogZXZlbnQuZHVyYXRpb24sXG4gICAgfSk7XG5cbiAgICB0aGlzLnN0b3JlLnNldCh0aGlzLmN1cnJlbnRSdW50aW1lU3RhZ2VJZCwge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLmN1cnJlbnRTdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLmN1cnJlbnRTdGFnZUlkLFxuICAgICAgc2NvcmU6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHNjb3JlKSksXG4gICAgICBmYWN0b3JzOiBmYWN0b3JzID8/IFtdLFxuICAgICAga2V5c1JlYWQ6IFsuLi50aGlzLmN1cnJlbnRLZXlzUmVhZF0sXG4gICAgICBrZXlzV3JpdHRlbjogWy4uLnRoaXMuY3VycmVudEtleXNXcml0dGVuXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQZXItc3RlcCBxdWVyeSBBUEkgKGRlbGVnYXRlcyB0byB0aGUgY29tcG9zZWQgc3RvcmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUcmFuc2xhdGU6IHF1YWxpdHkgZW50cnkgZm9yIGEgc3BlY2lmaWMgcnVudGltZVN0YWdlSWQuICovXG4gIGdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBRdWFsaXR5RW50cnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogQWxsIHBlci1zdGVwIHF1YWxpdHkgZW50cmllcyBhcyBhIHJlYWQtb25seSBNYXAgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgZ2V0TWFwKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgUXVhbGl0eUVudHJ5PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0TWFwKCk7XG4gIH1cblxuICAvKiogQWxsIHBlci1zdGVwIHF1YWxpdHkgZW50cmllcyAoaW5zZXJ0aW9uLW9yZGVyZWQpLiAqL1xuICB2YWx1ZXMoKTogUXVhbGl0eUVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnZhbHVlcygpO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBzY29yZWQgc3RlcHMuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKiBBZ2dyZWdhdGU6IHJlZHVjZSBBTEwgc2NvcmVkIHN0ZXBzIHRvIGEgc2luZ2xlIHZhbHVlLiAqL1xuICBhZ2dyZWdhdGU8Uj4oZm46IChhY2M6IFIsIGVudHJ5OiBRdWFsaXR5RW50cnksIGtleTogc3RyaW5nKSA9PiBSLCBpbml0aWFsOiBSKTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWdncmVnYXRlKGZuLCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKiBBY2N1bXVsYXRlOiByZWR1Y2Ugc2NvcmVkIHN0ZXBzIHVwIHRvIGEgc2xpZGVyIHBvc2l0aW9uLiAqL1xuICBhY2N1bXVsYXRlPFI+KGZuOiAoYWNjOiBSLCBlbnRyeTogUXVhbGl0eUVudHJ5LCBrZXk6IHN0cmluZykgPT4gUiwgaW5pdGlhbDogUiwga2V5cz86IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBSIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5hY2N1bXVsYXRlKGZuLCBpbml0aWFsLCBrZXlzKTtcbiAgfVxuXG4gIC8qKiBPdmVyYWxsIHF1YWxpdHkgc2NvcmUg4oCUIGF2ZXJhZ2Ugb2YgYWxsIHN0ZXAgc2NvcmVzLiAqL1xuICBnZXRPdmVyYWxsU2NvcmUoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zdG9yZS5zaXplID09PSAwKSByZXR1cm4gMS4wO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5zdG9yZS5hZ2dyZWdhdGUoKHN1bSwgZSkgPT4gc3VtICsgZS5zY29yZSwgMCk7XG4gICAgcmV0dXJuIHRvdGFsIC8gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqIEZpbmQgdGhlIGxvd2VzdC1zY29yaW5nIHN0ZXAuICovXG4gIGdldExvd2VzdCgpOiB7IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7IGVudHJ5OiBRdWFsaXR5RW50cnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGxvd2VzdDogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBlbnRyeTogUXVhbGl0eUVudHJ5IH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5zdG9yZS5nZXRNYXAoKSkge1xuICAgICAgaWYgKCFsb3dlc3QgfHwgZW50cnkuc2NvcmUgPCBsb3dlc3QuZW50cnkuc2NvcmUpIHtcbiAgICAgICAgbG93ZXN0ID0geyBydW50aW1lU3RhZ2VJZDoga2V5LCBlbnRyeSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG93ZXN0O1xuICB9XG5cbiAgLyoqIFByb2dyZXNzaXZlIHF1YWxpdHkgc2NvcmUgdXAgdG8gYSBzbGlkZXIgcG9zaXRpb24uICovXG4gIGdldFNjb3JlVXBUbyh2aXNpYmxlS2V5czogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IG51bWJlciB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuc3RvcmUuYWNjdW11bGF0ZShcbiAgICAgIChzdW0sIGUpID0+IHtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgcmV0dXJuIHN1bSArIGUuc2NvcmU7XG4gICAgICB9LFxuICAgICAgMCxcbiAgICAgIHZpc2libGVLZXlzLFxuICAgICk7XG4gICAgcmV0dXJuIGNvdW50ID09PSAwID8gMS4wIDogdG90YWwgLyBjb3VudDtcbiAgfVxuXG4gIHRvU25hcHNob3QoKSB7XG4gICAgY29uc3Qgc3RlcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5zdG9yZS5nZXRNYXAoKSkge1xuICAgICAgc3RlcHNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ1F1YWxpdHknLFxuICAgICAgZGVzY3JpcHRpb246ICdRdWFsaXR5IHNjb3JlcyBwZXIgZXhlY3V0aW9uIHN0ZXAgd2l0aCBiYWNrdHJhY2tpbmcgc3VwcG9ydCcsXG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHRoaXMucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgZGF0YToge1xuICAgICAgICBudW1lcmljRmllbGQ6ICdzY29yZScsXG4gICAgICAgIG92ZXJhbGxTY29yZTogdGhpcy5nZXRPdmVyYWxsU2NvcmUoKSxcbiAgICAgICAgbG93ZXN0U3RlcDogdGhpcy5nZXRMb3dlc3QoKT8ucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5jbGVhcigpO1xuICAgIHRoaXMuY3VycmVudFJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gICAgdGhpcy5jdXJyZW50U3RhZ2VJZCA9ICcnO1xuICAgIHRoaXMuY3VycmVudFN0YWdlTmFtZSA9ICcnO1xuICAgIHRoaXMuY3VycmVudEtleXNSZWFkID0gW107XG4gICAgdGhpcy5jdXJyZW50S2V5c1dyaXR0ZW4gPSBbXTtcbiAgfVxufVxuIl19
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVhbGl0eVJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7OztBQUtILHlEQUErRDtBQUMvRCxtREFBNkM7QUF1RDdDLE1BQWEsZUFBZTtJQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVuQixFQUFFLENBQVM7SUFDWCxrQkFBa0IsQ0FBb0I7SUFDL0MscUVBQXFFO0lBQ3BELEtBQUssR0FBRyxJQUFJLDBCQUFVLEVBQWdCLENBQUM7SUFDdkMsU0FBUyxDQUFtQjtJQUU3Qzs7Ozs7T0FLRztJQUNjLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUN4RCwyRUFBMkU7SUFDMUQsV0FBVyxHQUFHLElBQUksb0NBQWlCLEVBQUUsQ0FBQztJQUV2RCxZQUFZLFNBQTJCLEVBQUUsT0FBZ0M7UUFDdkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUM7SUFDeEUsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFpQjtRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDMUIsUUFBUSxFQUFFLEVBQUU7WUFDWixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFDO0lB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QUFDLGVBQWUsRUFBRTtnQkFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxjQUFjO2dCQUM1QyxLQUFLO2FBQ047U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDOztBQWxNSCwwQ0FtTUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1YWxpdHlSZWNvcmRlciDigJQgcGVyLXN0ZXAgcXVhbGl0eSBzY29yaW5nIGtleWVkIGJ5IHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIENvbGxlY3RzIHF1YWxpdHkgc2NvcmVzIGR1cmluZyB0cmF2ZXJzYWwgKGFjY3VtdWxhdGUgcGF0dGVybikuXG4gKiBBZnRlciBleGVjdXRpb24sIHVzZSBxdWFsaXR5VHJhY2UoKSB0byBiYWNrdHJhY2sgZnJvbSBhbnkgbG93LXNjb3Jpbmcgc3RlcC5cbiAqXG4gKiBDb21wb3NlcyBhIGBLZXllZFN0b3JlPFF1YWxpdHlFbnRyeT5gIGZvciBPKDEpIGxvb2t1cCBhbmQgc3RhbmRhcmQgb3BlcmF0aW9uc1xuICogKENvbnZlbnRpb24gMSDigJQgb25lIHB1cnBvc2UgcGVyIHJlY29yZGVyKTpcbiAqICAgLSAqKlRyYW5zbGF0ZSoqOiBgZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKWAg4oCUIHF1YWxpdHkgYXQgdGhpcyBzdGVwXG4gKiAgIC0gKipBY2N1bXVsYXRlKio6IHByb2dyZXNzaXZlIHF1YWxpdHkgdXAgdG8gc2xpZGVyIHBvc2l0aW9uXG4gKiAgIC0gKipBZ2dyZWdhdGUqKjogb3ZlcmFsbCBwaXBlbGluZSBxdWFsaXR5IHNjb3JlXG4gKlxuICogQXR0ZW1wdHMgKDEwLjEpOiBhIHN0YWdlIHdob3NlIHJldHJ5IHNlcmllcyBHQVZFIFVQIChleGhhdXN0ZWQsIGRlY2xpbmVkLFxuICogbm8gdGltZSBsZWZ0KSBvciBUSU1FRCBPVVQgaXMgYSBxdWFsaXR5IGRyb3AgYXQgdGhhdCBzdGFnZSDigJQgYGRyb3A6XG4gKiAnYXR0ZW1wdHMnYCwgd2l0aCB0aGUgc2VyaWVzJyBgYXR0ZW1wdHNgIHN1bW1hcnkgYW5kIGEgZmFjdG9yIG5hbWluZyB3aHkuXG4gKiBBIHNlcmllcyB0aGF0IGdhdmUgdXAgbmV2ZXIgcmVhY2hlZCBgb25TdGFnZUVuZGAgKHRoZSBzdGFnZSBmYWlsZWQpLCBzbyB0aGVcbiAqIHJlY29yZGVyIHNjb3JlcyBpdCBpdHNlbGY6IGAwYCwgdGhlIGZsb29yLCB3aXRoIHRoZSBrZXlzIGl0cyBsYXN0IGF0dGVtcHRcbiAqIHJlYWQg4oCUIHdoaWNoIGlzIHdoYXQgYHF1YWxpdHlUcmFjZSgpYCB3YWxrcyB0byBwYWlyIHRoZSBkcm9wIHdpdGggaXRzXG4gKiBjYXVzYWwgcGFyZW50cy4gQSBzZXJpZXMgdGhhdCB0aW1lZCBvdXQgYW5kIHJlY292ZXJlZCBrZWVwcyB0aGUgc2NvcmluZ1xuICogZnVuY3Rpb24ncyBzY29yZSBhbmQgZ2FpbnMgdGhlIGZsYWcuIEF0dGVtcHRzIHJlYWNoIGEgcmVjb3JkZXIgb24gdGhlIEZMT1dcbiAqIGNoYW5uZWwgKGBvbkF0dGVtcHRgKTogYXR0YWNoIHdpdGggYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRvIHNlZSB0aGVtIOKAlFxuICogYGF0dGFjaFNjb3BlUmVjb3JkZXJgIHNjb3JlcyBleGFjdGx5IGFzIGJlZm9yZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVhbGl0eSA9IG5ldyBRdWFsaXR5UmVjb3JkZXIoKHJ1bnRpbWVTdGFnZUlkLCBjb250ZXh0KSA9PiB7XG4gKiAgIC8vIEN1c3RvbSBzY29yaW5nIGZ1bmN0aW9uIOKAlCByZXR1cm4geyBzY29yZTogMC4w4oCTMS4wLCBmYWN0b3JzPyB9XG4gKiAgIGlmIChjb250ZXh0LnN0YWdlTmFtZS5pbmNsdWRlcygnbGxtJykpIHJldHVybiB7IHNjb3JlOiAwLjcsIGZhY3RvcnM6IFsnbGxtIHN0YWdlJ10gfTtcbiAqICAgcmV0dXJuIHsgc2NvcmU6IDEuMCB9O1xuICogfSk7XG4gKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKHF1YWxpdHkpO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKCk7XG4gKlxuICogLy8gUGVyLXN0ZXAgc2NvcmVcbiAqIHF1YWxpdHkuZ2V0QnlLZXkoJ2NhbGwtbGxtIzUnKTsgIC8vIHsgc2NvcmU6IDAuNywgc3RhZ2VOYW1lOiAnQ2FsbExMTScsIGZhY3RvcnM6IFsuLi5dIH1cbiAqXG4gKiAvLyBPdmVyYWxsIHF1YWxpdHlcbiAqIHF1YWxpdHkuZ2V0T3ZlcmFsbFNjb3JlKCk7ICAvLyAwLjg1XG4gKlxuICogLy8gTG93ZXN0LXNjb3Jpbmcgc3RlcFxuICogcXVhbGl0eS5nZXRMb3dlc3QoKTsgIC8vIHsgcnVudGltZVN0YWdlSWQ6ICdjYWxsLWxsbSM1JywgZW50cnk6IHsgc2NvcmU6IDAuNywgLi4uIH0gfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93QXR0ZW1wdEV2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRFdmVudCwgU2NvcGVSZWNvcmRlciwgU3RhZ2VFdmVudCwgV3JpdGVFdmVudCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IEF0dGVtcHRTZXJpZXNCb29rLCBnYXZlVXAgfSBmcm9tICcuL2F0dGVtcHRTZXJpZXMuanMnO1xuaW1wb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vS2V5ZWRTdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9SZWNvcmRlck9wZXJhdGlvbi5qcyc7XG5cbi8qKiBQZXItc3RlcCBxdWFsaXR5IGRhdGEgc3RvcmVkIGJ5IFF1YWxpdHlSZWNvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eUVudHJ5IHtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkZW50aWZpZXIuICovXG4gIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFF1YWxpdHkgc2NvcmUgZm9yIHRoaXMgc3RlcCAoMC4wID0gd29yc3QsIDEuMCA9IGJlc3QpLiAqL1xuICBzY29yZTogbnVtYmVyO1xuICAvKiogV2hhdCBjb250cmlidXRlZCB0byB0aGlzIHNjb3JlLiAqL1xuICBmYWN0b3JzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgcmVhZCBkdXJpbmcgdGhpcyBzdGVwIChmb3IgYmFja3RyYWNraW5nKS4gKi9cbiAga2V5c1JlYWQ6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3cml0dGVuIGR1cmluZyB0aGlzIHN0ZXAgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gIC8qKiBQcmVzZW50IHdoZW4gdGhlIHN0ZXAncyByZXRyeSBzZXJpZXMgZ2F2ZSB1cCBvciB0aW1lZCBvdXQg4oCUIGEgcXVhbGl0eSBkcm9wIGJ5IGF0dGVtcHRzICgxMC4xKS4gKi9cbiAgZHJvcD86ICdhdHRlbXB0cyc7XG4gIC8qKiBXaXRoIGBkcm9wYDogdGhlIHNlcmllcyBhdCBhIGdsYW5jZS4gKi9cbiAgYXR0ZW1wdHM/OiBBdHRlbXB0U3VtbWFyeTtcbn1cblxuLyoqXG4gKiBTY29yaW5nIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggc3RhZ2UuXG4gKiBSZWNlaXZlcyB0aGUgcnVudGltZVN0YWdlSWQsIHN0YWdlIGV2ZW50LCBhbmQgYSBzdW1tYXJ5IG9mIHJlYWRzL3dyaXRlcy5cbiAqIFJldHVybiBhIHNjb3JlICgwLjDigJMxLjApIGFuZCBvcHRpb25hbCBmYWN0b3JzIGV4cGxhaW5pbmcgdGhlIHNjb3JlLlxuICovXG5leHBvcnQgdHlwZSBRdWFsaXR5U2NvcmluZ0ZuID0gKFxuICBydW50aW1lU3RhZ2VJZDogc3RyaW5nLFxuICBjb250ZXh0OiB7XG4gICAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gICAgc3RhZ2VJZDogc3RyaW5nO1xuICAgIGtleXNSZWFkOiBzdHJpbmdbXTtcbiAgICBrZXlzV3JpdHRlbjogc3RyaW5nW107XG4gICAgZHVyYXRpb24/OiBudW1iZXI7XG4gIH0sXG4pID0+IHsgc2NvcmU6IG51bWJlcjsgZmFjdG9ycz86IHN0cmluZ1tdIH07XG5cbi8qKiBPbmUgZXhlY3V0aW9uIGJldHdlZW4gaXRzIGBvblN0YWdlU3RhcnRgIGFuZCBpdHMgYG9uU3RhZ2VFbmRgIChvciB0aGUgZHJvcCB0aGF0IHNjb3JlcyBpdCkuICovXG5pbnRlcmZhY2UgSW5GbGlnaHQge1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBrZXlzUmVhZDogc3RyaW5nW107XG4gIHJlYWRvbmx5IGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIFF1YWxpdHlSZWNvcmRlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVhbGl0eVJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIElELiBEZWZhdWx0cyB0byBhdXRvLWluY3JlbWVudC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBQcmVmZXJyZWQgVUkgb3BlcmF0aW9uLiBEZWZhdWx0cyB0byAnYWNjdW11bGF0ZScgKHByb2dyZXNzaXZlIHF1YWxpdHkpLiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiBSZWNvcmRlck9wZXJhdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFF1YWxpdHlSZWNvcmRlciBpbXBsZW1lbnRzIFNjb3BlUmVjb3JkZXIge1xuICBwcml2YXRlIHN0YXRpYyBfY291bnRlciA9IDA7XG5cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJlZmVycmVkT3BlcmF0aW9uOiBSZWNvcmRlck9wZXJhdGlvbjtcbiAgLyoqIDE6MSBwZXItc3RlcCBzdG9yYWdlIChDb252ZW50aW9uIDEg4oCUIGNvbXBvc2VkLCBub3QgaW5oZXJpdGVkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBLZXllZFN0b3JlPFF1YWxpdHlFbnRyeT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY29yaW5nRm46IFF1YWxpdHlTY29yaW5nRm47XG5cbiAgLyoqXG4gICAqIEVhY2ggZXhlY3V0aW9uIGluIGZsaWdodCwgYnkgaXRzIE9XTiBydW50aW1lU3RhZ2VJZCAoMTAuMSkg4oCUIGV2ZXJ5IGV2ZW50IG93bnMgaXRzIGF0dHJpYnV0aW9uLCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBuZXZlciBzY29yZSB1bmRlciBlYWNoIG90aGVyJ3MgaWQgb3Igd2l0aCBlYWNoIG90aGVyJ3Mga2V5cyAodW50aWwgMTAuMCBvbmUgc2hhcmVkIFwiY3VycmVudCBzdGFnZVwiXG4gICAqIGJ1ZmZlciBkaWQpLiBBIHJldHJpZWQgZXhlY3V0aW9uJ3MgZW50cnkgcmVzdGFydHMgd2l0aCBlYWNoIGF0dGVtcHQ6IGEgc2VyaWVzIHRoYXQgZ2F2ZSB1cCBpcyBzY29yZWQgd2l0aCB0aGVcbiAgICoga2V5cyBpdHMgbGFzdCBhdHRlbXB0IHRvdWNoZWQuIFJlbGVhc2VkIGF0IHRoZSBzdGFnZSdzIGVuZCwgb3Igd2hlbiBhIGRyb3AgY29uc3VtZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIEluRmxpZ2h0PigpO1xuICAvKiogUGVyLXNlcmllcyB0YWxsaWVzIG9mIHRoZSBzZXJpZXMgdGhhdCByZXRyaWVkLCBnYXZlIHVwIG9yIHRpbWVkIG91dC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0Qm9vayA9IG5ldyBBdHRlbXB0U2VyaWVzQm9vaygpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3JpbmdGbjogUXVhbGl0eVNjb3JpbmdGbiwgb3B0aW9ucz86IFF1YWxpdHlSZWNvcmRlck9wdGlvbnMpIHtcbiAgICB0aGlzLnNjb3JpbmdGbiA9IHNjb3JpbmdGbjtcbiAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgPz8gYHF1YWxpdHktJHsrK1F1YWxpdHlSZWNvcmRlci5fY291bnRlcn1gO1xuICAgIHRoaXMucHJlZmVycmVkT3BlcmF0aW9uID0gb3B0aW9ucz8ucHJlZmVycmVkT3BlcmF0aW9uID8/ICdhY2N1bXVsYXRlJztcbiAgfVxuXG4gIG9uU3RhZ2VTdGFydChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5GbGlnaHQuc2V0KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7XG4gICAgICBzdGFnZUlkOiBldmVudC5zdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBrZXlzUmVhZDogW10sXG4gICAgICBrZXlzV3JpdHRlbjogW10sXG4gICAgfSk7XG4gIH1cblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkpIHRoaXMuaW5GbGlnaHQuZ2V0KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKT8ua2V5c1JlYWQucHVzaChldmVudC5rZXkpO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaW5GbGlnaHQuZ2V0KGV2ZW50LnJ1bnRpbWVTdGFnZUlkKT8ua2V5c1dyaXR0ZW4ucHVzaChldmVudC5rZXkpO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gZXZlbnQucnVudGltZVN0YWdlSWQ7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuaW5GbGlnaHQuZ2V0KGlkKSA/PyB7XG4gICAgICBzdGFnZUlkOiBldmVudC5zdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBrZXlzUmVhZDogW10sXG4gICAgICBrZXlzV3JpdHRlbjogW10sXG4gICAgfTtcbiAgICB0aGlzLmluRmxpZ2h0LmRlbGV0ZShpZCk7XG4gICAgY29uc3QgeyBzY29yZSwgZmFjdG9ycyB9ID0gdGhpcy5zY29yaW5nRm4oaWQsIHtcbiAgICAgIHN0YWdlTmFtZTogc3RlcC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBzdGVwLnN0YWdlSWQsXG4gICAgICBrZXlzUmVhZDogc3RlcC5rZXlzUmVhZCxcbiAgICAgIGtleXNXcml0dGVuOiBzdGVwLmtleXNXcml0dGVuLFxuICAgICAgZHVyYXRpb246IGV2ZW50LmR1cmF0aW9uLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zdG9yZS5zZXQoaWQsIHtcbiAgICAgIHN0YWdlTmFtZTogc3RlcC5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiBzdGVwLnN0YWdlSWQsXG4gICAgICBzY29yZTogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgc2NvcmUpKSxcbiAgICAgIGZhY3RvcnM6IGZhY3RvcnMgPz8gW10sXG4gICAgICBrZXlzUmVhZDogWy4uLnN0ZXAua2V5c1JlYWRdLFxuICAgICAga2V5c1dyaXR0ZW46IFsuLi5zdGVwLmtleXNXcml0dGVuXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNlcmllcyB0aGF0IGVuZGVkIGFmdGVyIGdpdmluZyB1cCBvciB0aW1pbmcgb3V0IGlzIGEgZHJvcCBhdCBpdHMgc3RhZ2UuIGBvbkF0dGVtcHRgIGZvciB0aGUgbGFzdCBhdHRlbXB0XG4gICAqIGZpcmVzIGFmdGVyIHRoYXQgYXR0ZW1wdCdzIGBvblN0YWdlRW5kYCAod2hlbiBpdCByZXR1cm5lZCksIHNvIGEgcmVjb3ZlcmVkIHNlcmllcyBhbWVuZHMgdGhlIHNjb3JlZCBlbnRyeTsgYVxuICAgKiBzZXJpZXMgdGhhdCBnYXZlIHVwIGhhcyBub25lLCBhbmQgaXMgc2NvcmVkIGhlcmUuXG4gICAqL1xuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gZXZlbnQ7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmF0dGVtcHRCb29rLmFkZChyZWNvcmQpO1xuICAgIGNvbnN0IHN1bW1hcnkgPSBzdGF0ZT8uc3VtbWFyeTtcbiAgICBpZiAoIXN1bW1hcnkgfHwgKHN1bW1hcnkudGltZW91dCA9PT0gMCAmJiAhZ2F2ZVVwKHJlY29yZCkpKSByZXR1cm47XG4gICAgY29uc3QgZmFjdG9yID0gZ2F2ZVVwKHJlY29yZClcbiAgICAgID8gYGF0dGVtcHRzOiBnYXZlIHVwICgke1tyZWNvcmQucmVhc29uLCByZWNvcmQuY2F0ZWdvcnldLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpfSkgYWZ0ZXIgJHtcbiAgICAgICAgICByZWNvcmQuYXR0ZW1wdFxuICAgICAgICB9IG9mICR7cmVjb3JkLm9mID8/IHJlY29yZC5hdHRlbXB0fWBcbiAgICAgIDogYGF0dGVtcHRzOiAke3N1bW1hcnkudGltZW91dH0gb2YgJHtzdW1tYXJ5LmNvdW50fSB0aW1lZCBvdXRgO1xuICAgIGNvbnN0IHNjb3JlZCA9IHRoaXMuc3RvcmUuZ2V0KHJlY29yZC5zZXJpZXMpO1xuICAgIGlmIChzY29yZWQpIHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0KHJlY29yZC5zZXJpZXMsIHtcbiAgICAgICAgLi4uc2NvcmVkLFxuICAgICAgICBmYWN0b3JzOiBbLi4uc2NvcmVkLmZhY3RvcnMsIGZhY3Rvcl0sXG4gICAgICAgIGRyb3A6ICdhdHRlbXB0cycsXG4gICAgICAgIGF0dGVtcHRzOiBzdW1tYXJ5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmluRmxpZ2h0LmdldChyZWNvcmQuc2VyaWVzKTtcbiAgICB0aGlzLmluRmxpZ2h0LmRlbGV0ZShyZWNvcmQuc2VyaWVzKTtcbiAgICB0aGlzLnN0b3JlLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IGV2ZW50LnN0YWdlSWQsXG4gICAgICBzY29yZTogMCxcbiAgICAgIGZhY3RvcnM6IFtmYWN0b3JdLFxuICAgICAga2V5c1JlYWQ6IHN0ZXAgPyBbLi4uc3RlcC5rZXlzUmVhZF0gOiBbXSxcbiAgICAgIGtleXNXcml0dGVuOiBzdGVwID8gWy4uLnN0ZXAua2V5c1dyaXR0ZW5dIDogW10sXG4gICAgICBkcm9wOiAnYXR0ZW1wdHMnLFxuICAgICAgYXR0ZW1wdHM6IHN1bW1hcnksXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXN0ZXAgcXVlcnkgQVBJIChkZWxlZ2F0ZXMgdG8gdGhlIGNvbXBvc2VkIHN0b3JlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVHJhbnNsYXRlOiBxdWFsaXR5IGVudHJ5IGZvciBhIHNwZWNpZmljIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBnZXRCeUtleShydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogUXVhbGl0eUVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBwZXItc3RlcCBxdWFsaXR5IGVudHJpZXMgYXMgYSByZWFkLW9ubHkgTWFwIChpbnNlcnRpb24tb3JkZXJlZCkuICovXG4gIGdldE1hcCgpOiBSZWFkb25seU1hcDxzdHJpbmcsIFF1YWxpdHlFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldE1hcCgpO1xuICB9XG5cbiAgLyoqIEFsbCBwZXItc3RlcCBxdWFsaXR5IGVudHJpZXMgKGluc2VydGlvbi1vcmRlcmVkKS4gKi9cbiAgdmFsdWVzKCk6IFF1YWxpdHlFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKiBOdW1iZXIgb2Ygc2NvcmVkIHN0ZXBzLiAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNpemU7XG4gIH1cblxuICAvKiogQWdncmVnYXRlOiByZWR1Y2UgQUxMIHNjb3JlZCBzdGVwcyB0byBhIHNpbmdsZSB2YWx1ZS4gKi9cbiAgYWdncmVnYXRlPFI+KGZuOiAoYWNjOiBSLCBlbnRyeTogUXVhbGl0eUVudHJ5LCBrZXk6IHN0cmluZykgPT4gUiwgaW5pdGlhbDogUik6IFIge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmFnZ3JlZ2F0ZShmbiwgaW5pdGlhbCk7XG4gIH1cblxuICAvKiogQWNjdW11bGF0ZTogcmVkdWNlIHNjb3JlZCBzdGVwcyB1cCB0byBhIHNsaWRlciBwb3NpdGlvbi4gKi9cbiAgYWNjdW11bGF0ZTxSPihmbjogKGFjYzogUiwgZW50cnk6IFF1YWxpdHlFbnRyeSwga2V5OiBzdHJpbmcpID0+IFIsIGluaXRpYWw6IFIsIGtleXM/OiBSZWFkb25seVNldDxzdHJpbmc+KTogUiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuYWNjdW11bGF0ZShmbiwgaW5pdGlhbCwga2V5cyk7XG4gIH1cblxuICAvKiogT3ZlcmFsbCBxdWFsaXR5IHNjb3JlIOKAlCBhdmVyYWdlIG9mIGFsbCBzdGVwIHNjb3Jlcy4gKi9cbiAgZ2V0T3ZlcmFsbFNjb3JlKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc3RvcmUuc2l6ZSA9PT0gMCkgcmV0dXJuIDEuMDtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuc3RvcmUuYWdncmVnYXRlKChzdW0sIGUpID0+IHN1bSArIGUuc2NvcmUsIDApO1xuICAgIHJldHVybiB0b3RhbCAvIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKiBGaW5kIHRoZSBsb3dlc3Qtc2NvcmluZyBzdGVwLiAqL1xuICBnZXRMb3dlc3QoKTogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBlbnRyeTogUXVhbGl0eUVudHJ5IH0gfCB1bmRlZmluZWQge1xuICAgIGxldCBsb3dlc3Q6IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgZW50cnk6IFF1YWxpdHlFbnRyeSB9IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuc3RvcmUuZ2V0TWFwKCkpIHtcbiAgICAgIGlmICghbG93ZXN0IHx8IGVudHJ5LnNjb3JlIDwgbG93ZXN0LmVudHJ5LnNjb3JlKSB7XG4gICAgICAgIGxvd2VzdCA9IHsgcnVudGltZVN0YWdlSWQ6IGtleSwgZW50cnkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvd2VzdDtcbiAgfVxuXG4gIC8qKiBQcm9ncmVzc2l2ZSBxdWFsaXR5IHNjb3JlIHVwIHRvIGEgc2xpZGVyIHBvc2l0aW9uLiAqL1xuICBnZXRTY29yZVVwVG8odmlzaWJsZUtleXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnN0b3JlLmFjY3VtdWxhdGUoXG4gICAgICAoc3VtLCBlKSA9PiB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIHJldHVybiBzdW0gKyBlLnNjb3JlO1xuICAgICAgfSxcbiAgICAgIDAsXG4gICAgICB2aXNpYmxlS2V5cyxcbiAgICApO1xuICAgIHJldHVybiBjb3VudCA9PT0gMCA/IDEuMCA6IHRvdGFsIC8gY291bnQ7XG4gIH1cblxuICB0b1NuYXBzaG90KCkge1xuICAgIGNvbnN0IHN0ZXBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc3RvcmUuZ2V0TWFwKCkpIHtcbiAgICAgIHN0ZXBzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdRdWFsaXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUXVhbGl0eSBzY29yZXMgcGVyIGV4ZWN1dGlvbiBzdGVwIHdpdGggYmFja3RyYWNraW5nIHN1cHBvcnQnLFxuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiB0aGlzLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbnVtZXJpY0ZpZWxkOiAnc2NvcmUnLFxuICAgICAgICBvdmVyYWxsU2NvcmU6IHRoaXMuZ2V0T3ZlcmFsbFNjb3JlKCksXG4gICAgICAgIGxvd2VzdFN0ZXA6IHRoaXMuZ2V0TG93ZXN0KCk/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBzdGVwcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgICB0aGlzLmluRmxpZ2h0LmNsZWFyKCk7XG4gICAgdGhpcy5hdHRlbXB0Qm9vay5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -16,10 +16,16 @@
|
|
|
16
16
|
* three primitive channels, one live graph, queryable at any moment during
|
|
17
17
|
* or after a run.
|
|
18
18
|
*
|
|
19
|
-
* What it records —
|
|
19
|
+
* What it records — FOUR node kinds for complete composition coverage:
|
|
20
20
|
* 1. 'subflow' — via onSubflowEntry (a mounted subflow boundary)
|
|
21
21
|
* 2. 'fork-branch' — via onFork (one node per child, synthesized)
|
|
22
22
|
* 3. 'decision-branch' — via onDecision (the chosen branch, synthesized)
|
|
23
|
+
* 4. 'attempt-series' — via onAttempt (10.1): a stage execution that
|
|
24
|
+
* RETRIED, GAVE UP or TIMED OUT (`recorder/attemptSeries.ts · isRetryEvidence`), with its
|
|
25
|
+
* `attemptSummary` and its ordered `attempts`. A retry is a loop, so each
|
|
26
|
+
* retry decision is a self-edge of kind 'retry' on the node — the way
|
|
27
|
+
* onLoop draws 'loop-iteration'. A stage that ran once (with or without a
|
|
28
|
+
* policy) is no node, as before.
|
|
23
29
|
*
|
|
24
30
|
* When a fork-branch or decision-branch target IS ALSO a subflow, the
|
|
25
31
|
* subsequent onSubflowEntry creates a subflow CHILD of the synthetic node.
|
|
@@ -51,6 +57,7 @@
|
|
|
51
57
|
*/
|
|
52
58
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
59
|
exports.TopologyRecorder = exports.topologyRecorder = void 0;
|
|
60
|
+
const attemptSeries_js_1 = require("./attemptSeries.js");
|
|
54
61
|
let _counter = 0;
|
|
55
62
|
/**
|
|
56
63
|
* Factory — matches the `narrative()` / `metrics()` style.
|
|
@@ -90,6 +97,10 @@ class TopologyRecorder {
|
|
|
90
97
|
* TopologyRecorder is supposed to expose.
|
|
91
98
|
*/
|
|
92
99
|
previousSubflowInScope = new Map();
|
|
100
|
+
/** Open subflow node id by its path-prefixed subflowId — where a stage's attempt series hangs. */
|
|
101
|
+
openSubflowByPath = new Map();
|
|
102
|
+
/** Per-series tallies of the series that are evidence (retried, gave up or timed out). */
|
|
103
|
+
attemptBook = new attemptSeries_js_1.AttemptSeriesBook();
|
|
93
104
|
constructor(options = {}) {
|
|
94
105
|
this.id = options.id ?? `topology-${++_counter}`;
|
|
95
106
|
}
|
|
@@ -176,11 +187,15 @@ class TopologyRecorder {
|
|
|
176
187
|
}
|
|
177
188
|
}
|
|
178
189
|
this.subflowStack.push(nodeId);
|
|
190
|
+
this.openSubflowByPath.set(subflowId, nodeId);
|
|
179
191
|
}
|
|
180
192
|
onSubflowExit(event) {
|
|
181
193
|
const nodeId = this.subflowStack.pop();
|
|
182
194
|
if (!nodeId)
|
|
183
195
|
return;
|
|
196
|
+
if (event.subflowId && this.openSubflowByPath.get(event.subflowId) === nodeId) {
|
|
197
|
+
this.openSubflowByPath.delete(event.subflowId);
|
|
198
|
+
}
|
|
184
199
|
const node = this.nodesById.get(nodeId);
|
|
185
200
|
const exitedAt = event.traversalContext?.runtimeStageId ?? '';
|
|
186
201
|
if (node) {
|
|
@@ -271,6 +286,63 @@ class TopologyRecorder {
|
|
|
271
286
|
at: event.traversalContext?.runtimeStageId ?? '',
|
|
272
287
|
});
|
|
273
288
|
}
|
|
289
|
+
onAttempt(event) {
|
|
290
|
+
const state = this.attemptBook.add(event.record);
|
|
291
|
+
if (!state)
|
|
292
|
+
return;
|
|
293
|
+
const nodeId = `attempts-${state.series}`;
|
|
294
|
+
const existing = this.nodesById.get(nodeId);
|
|
295
|
+
const placed = existing ?? this.placeSeries(event, nodeId);
|
|
296
|
+
const node = {
|
|
297
|
+
...placed,
|
|
298
|
+
attempts: state.attempts,
|
|
299
|
+
...(state.summary !== undefined ? { attemptSummary: state.summary } : {}),
|
|
300
|
+
};
|
|
301
|
+
if (!existing)
|
|
302
|
+
this.nodeOrder.push(nodeId);
|
|
303
|
+
this.nodesById.set(nodeId, node);
|
|
304
|
+
if (event.record.next === 'retry') {
|
|
305
|
+
this.edges.push({ from: nodeId, to: nodeId, kind: 'retry', at: state.series });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* A new series node, under its parent: the pending fork-branch / decision-
|
|
310
|
+
* branch of the same name (a fork child or a chosen branch that is a plain
|
|
311
|
+
* stage), else the open subflow the stage runs in (read off its
|
|
312
|
+
* runtimeStageId — the stack top can be a parallel sibling), else the top
|
|
313
|
+
* level. One edge from
|
|
314
|
+
* the parent, as for every composition child.
|
|
315
|
+
*/
|
|
316
|
+
placeSeries(event, nodeId) {
|
|
317
|
+
const at = event.record.series;
|
|
318
|
+
let parentId;
|
|
319
|
+
const pendingFork = this.pendingForkByName.get(event.stageName);
|
|
320
|
+
if (pendingFork) {
|
|
321
|
+
parentId = pendingFork.nodeId;
|
|
322
|
+
this.pendingForkByName.delete(event.stageName);
|
|
323
|
+
}
|
|
324
|
+
else if (this.pendingDecision && this.pendingDecision.name === event.stageName) {
|
|
325
|
+
parentId = this.pendingDecision.nodeId;
|
|
326
|
+
this.pendingDecision = undefined;
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
const path = (0, attemptSeries_js_1.subflowOfAttempt)(event);
|
|
330
|
+
parentId = path !== undefined ? this.openSubflowByPath.get(path) : undefined;
|
|
331
|
+
}
|
|
332
|
+
const incomingKind = parentId ? 'next' : 'root';
|
|
333
|
+
if (parentId)
|
|
334
|
+
this.edges.push({ from: parentId, to: nodeId, kind: 'next', at });
|
|
335
|
+
return {
|
|
336
|
+
id: nodeId,
|
|
337
|
+
kind: 'attempt-series',
|
|
338
|
+
name: event.stageName,
|
|
339
|
+
parentId,
|
|
340
|
+
depth: parentId ? this.nodesById.get(parentId).depth + 1 : 0,
|
|
341
|
+
incomingKind,
|
|
342
|
+
enteredAt: at,
|
|
343
|
+
metadata: { stageId: event.stageId },
|
|
344
|
+
};
|
|
345
|
+
}
|
|
274
346
|
/** Called by the executor before each `run()` — resets all state. */
|
|
275
347
|
clear() {
|
|
276
348
|
this.nodesById.clear();
|
|
@@ -279,6 +351,8 @@ class TopologyRecorder {
|
|
|
279
351
|
this.subflowStack.length = 0;
|
|
280
352
|
this.pendingForkByName.clear();
|
|
281
353
|
this.previousSubflowInScope.clear();
|
|
354
|
+
this.openSubflowByPath.clear();
|
|
355
|
+
this.attemptBook.clear();
|
|
282
356
|
this.pendingDecision = undefined;
|
|
283
357
|
}
|
|
284
358
|
// ── Query API ─────────────────────────────────────────────────────────
|
|
@@ -324,4 +398,4 @@ class TopologyRecorder {
|
|
|
324
398
|
}
|
|
325
399
|
}
|
|
326
400
|
exports.TopologyRecorder = TopologyRecorder;
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpREc7OztBQTJFSCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxVQUFtQyxFQUFFO0lBQ3BFLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRkQsNENBRUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFDbEIsRUFBRSxDQUFTO0lBRUgsU0FBUyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQzVDLFNBQVMsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxHQUFtQixFQUFFLENBQUM7SUFDNUMsK0VBQStFO0lBQzlELFlBQVksR0FBYSxFQUFFLENBQUM7SUFFN0M7OENBQzBDO0lBQ3pCLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQ3JFLDRFQUE0RTtJQUNwRSxlQUFlLENBQW1DO0lBQzFEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNjLHNCQUFzQixHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO0lBRWxHLFlBQVksVUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsY0FBYyxDQUFDLEtBQXVCO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLENBQUMsNkJBQTZCO1FBRXJELE1BQU0sU0FBUyxH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QUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsVUFBVTtRQUNSLE9BQU87WUFDTCxJQUFJLEVBQUUsVUFBVTtZQUNoQixXQUFXLEVBQUUseUVBQXlFO1lBQ3RGLGtCQUFrQixFQUFFLFdBQW9CO1lBQ3hDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO1NBQ3pCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF4UkQsNENBd1JDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb3BvbG9neVJlY29yZGVyIOKAlCBjb21wb3NpdGlvbiBncmFwaCBidWlsdCBkdXJpbmcgdHJhdmVyc2FsLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgZm9vdHByaW50anMgZmlyZXMgYXRvbWljIGZsb3cgZXZlbnRzIChvblN1YmZsb3dFbnRyeSwgb25Gb3JrLCBvbkRlY2lzaW9uLFxuICogICBvbkxvb3ApIGJ1dCB0aGUgYWNjdW11bGF0ZWQgKnNoYXBlKiBvZiBhIHJ1biDigJQgd2hvIG5lc3RzIGluc2lkZSB3aG9tLFxuICogICB3aGljaCBub2RlcyBhcmUgcGFyYWxsZWwgc2libGluZ3MgdnMgYnJhbmNoZXMgb2YgYSBkZWNpc2lvbiDigJQgaXMgb25seVxuICogICB2aXNpYmxlIHBvc3QtcnVuIHZpYSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgdHJlZS13YWxraW5nLlxuICpcbiAqICAgU3RyZWFtaW5nIGNvbnN1bWVycyAobGl2ZSBVSXMsIGluLWZsaWdodCBkZWJ1Z2dlcnMpIHNlZSBvbmx5IHRoZSBldmVudFxuICogICBzdHJlYW0uIEV2ZXJ5IHN1Y2ggY29uc3VtZXIgaGFzIHRvIHJlYnVpbGQgc3ViZmxvdy1zdGFjayArIGZvcmstbWFwICtcbiAqICAgZGVjaXNpb24tdHJhY2tlciBmcm9tIHNjcmF0Y2gsIHVzdWFsbHkgc2xpZ2h0bHkgd3JvbmcgaW4gZGlmZmVyZW50IHdheXMuXG4gKlxuICogICBUb3BvbG9neVJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBhY2N1bXVsYXRvcjogb25lIHN1YnNjcmlwdGlvbiB0byB0aGVcbiAqICAgdGhyZWUgcHJpbWl0aXZlIGNoYW5uZWxzLCBvbmUgbGl2ZSBncmFwaCwgcXVlcnlhYmxlIGF0IGFueSBtb21lbnQgZHVyaW5nXG4gKiAgIG9yIGFmdGVyIGEgcnVuLlxuICpcbiAqIFdoYXQgaXQgcmVjb3JkcyDigJQgVEhSRUUgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcblxuLyoqIFRoZSBraW5kIG9mIGNvbXBvc2l0aW9uIHVuaXQgYSBub2RlIHJlcHJlc2VudHMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neU5vZGVLaW5kID0gJ3N1YmZsb3cnIHwgJ2ZvcmstYnJhbmNoJyB8ICdkZWNpc2lvbi1icmFuY2gnO1xuXG4vKiogSG93IHRoZSB0cmF2ZXJzYWwgcmVhY2hlZCB0aGlzIG5vZGUg4oCUIGRyaXZlcyBjb25zdW1lciBsYXlvdXQgZGVjaXNpb25zLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lJbmNvbWluZ0tpbmQgPSAncm9vdCcgfCAnbmV4dCcgfCAnZm9yay1icmFuY2gnIHwgJ2RlY2lzaW9uLWJyYW5jaCcgfCAnbG9vcC1pdGVyYXRpb24nO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb24uICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogQSB0cmF2ZXJzYWwgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byBub2Rlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3lFZGdlIHtcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nO1xuICByZWFkb25seSB0bzogc3RyaW5nO1xuICByZWFkb25seSBraW5kOiBFeGNsdWRlPFRvcG9sb2d5SW5jb21pbmdLaW5kLCAncm9vdCc+O1xuICByZWFkb25seSBhdDogc3RyaW5nO1xufVxuXG4vKiogU25hcHNob3Qgb2YgdGhlIGNvbXBvc2l0aW9uIGdyYXBoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neSB7XG4gIHJlYWRvbmx5IG5vZGVzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5Tm9kZT47XG4gIHJlYWRvbmx5IGVkZ2VzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5RWRnZT47XG4gIC8qKiBDdXJyZW50bHktYWN0aXZlIHN1YmZsb3cgKHRvcCBvZiB0aGUgc3ViZmxvdyBzdGFjaykuIEZvcmstYnJhbmNoIGFuZFxuICAgKiAgZGVjaXNpb24tYnJhbmNoIG5vZGVzIGFyZSBpbnN0YW50YW5lb3VzIOKAlCB0aGV5IGRvbid0IGFmZmVjdCBhY3RpdmVOb2RlSWQuICovXG4gIHJlYWRvbmx5IGFjdGl2ZU5vZGVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZpcnN0IG5vZGUgaW5zZXJ0ZWQuIG51bGwgYmVmb3JlIGFueSBjb21wb3NpdGlvbiBldmVudCBmaXJlcy4gKi9cbiAgcmVhZG9ubHkgcm9vdElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGB0b3BvbG9neS1OYCAoYXV0by1pbmNyZW1lbnRlZCkuICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG4vLyBDb3JyZWxhdGlvbiBzdGF0ZTogbWFwcyBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBjaGlsZCBuYW1lIHRvIGl0cyBzeW50aGV0aWNcbi8vIG5vZGUgaWQsIHNvIGEgc3Vic2VxdWVudCBvblN1YmZsb3dFbnRyeSBtYXRjaGluZyB0aGF0IG5hbWUgY2FuIGJlIG5lc3RlZFxuLy8gdW5kZXIgdGhlIHN5bnRoZXRpYyBub2RlIChyYXRoZXIgdGhhbiBjcmVhdGluZyBhIHBlZXIpLlxuaW50ZXJmYWNlIFBlbmRpbmdDaGlsZCB7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBhdDogc3RyaW5nO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGBuYXJyYXRpdmUoKWAgLyBgbWV0cmljcygpYCBzdHlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcG9sb2d5UmVjb3JkZXIob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSk6IFRvcG9sb2d5UmVjb3JkZXIge1xuICByZXR1cm4gbmV3IFRvcG9sb2d5UmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIG1haW50YWlucyBhIGxpdmVcbiAqIGNvbXBvc2l0aW9uIGdyYXBoLiBBdHRhY2ggdmlhIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyKWAg4oCUXG4gKiBmb290cHJpbnRqcyBkZXRlY3RzIHRoZSBgRmxvd1JlY29yZGVyYCBtZXRob2Qgc2hhcGUgYW5kIHJvdXRlcyBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3BvbG9neVJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVzQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBUb3BvbG9neU5vZGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVkZ2VzOiBUb3BvbG9neUVkZ2VbXSA9IFtdO1xuICAvKiogU3RhY2sgb2YgYWN0aXZlIFNVQkZMT1cgbm9kZSBpZHMuIEZvcmsvZGVjaXNpb24tYnJhbmNoIG5vZGVzIG5ldmVyIHB1c2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBNYXAgb2YgY2hpbGROYW1lIOKGkiBwZW5kaW5nIGZvcmstYnJhbmNoIHN5bnRoZXRpYyBub2RlLCBjb25zdW1lZCBieVxuICAgKiAgdGhlIG5leHQgbWF0Y2hpbmcgYG9uU3ViZmxvd0VudHJ5YC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRm9ya0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nQ2hpbGQ+KCk7XG4gIC8qKiBQZW5kaW5nIGRlY2lzaW9uLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnkgYSBtYXRjaGluZyBlbnRyeS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nRGVjaXNpb24/OiB7IG5hbWU6IHN0cmluZyB9ICYgUGVuZGluZ0NoaWxkO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHN1YmZsb3cgdGhhdCBqdXN0IGZpbmlzaGVkLCBrZXllZCBieSBzY29wZSAocGFyZW50SWQsXG4gICAqIG9yICcnIGZvciByb290KS4gV2hlbiBhIG5ldyBzdWJmbG93IGVudGVycyBpbiB0aGUgc2FtZSBzY29wZSB2aWFcbiAgICogdGhlIG5vcm1hbCBuZXh0LWNoYWluZWQgcGF0aCAobm90IGZvcmsvZGVjaXNpb24pLCB3ZSBlbWl0IGEgYG5leHRgXG4gICAqIGVkZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3ViZmxvdyB0byB0aGUgbmV3IG9uZSDigJQgbWF0Y2hpbmcgaG93IHRoZVxuICAgKiBidWlsZGVyIGFjdHVhbGx5IHdpcmVkIHRoZW06IGAuYWRkU3ViRmxvd0NoYXJ0TmV4dChBKS5hZGRTdWJGbG93Q2hhcnROZXh0KEIpYFxuICAgKiBtZWFucyBBIOKGkiBCLCBvbmUgYWZ0ZXIgdGhlIG90aGVyLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIGNvbnN1bWVycyBvbmx5IHNlZSBwYXJlbnTihpJjaGlsZCBlZGdlcyAoQSwgQiwgQyBhbGxcbiAgICogY2hpbGRyZW4gb2YgdGhlaXIgY29tbW9uIGFuY2VzdG9yKSB3aXRoIG5vIHJlY29yZCBvZiB0aGUgYWN0dWFsXG4gICAqIEEg4oaSIEIg4oaSIEMgc2VxdWVudGlhbCBjaGFpbiB0aGF0IHJhbiDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gICAqIFRvcG9sb2d5UmVjb3JkZXIgaXMgc3VwcG9zZWQgdG8gZXhwb3NlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c1N1YmZsb3dJblNjb3BlID0gbmV3IE1hcDxzdHJpbmcsIHsgbm9kZUlkOiBzdHJpbmc7IGV4aXRlZEF0OiBzdHJpbmcgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gYHRvcG9sb2d5LSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IGV2ZW50LnN1YmZsb3dJZDtcbiAgICBpZiAoIXN1YmZsb3dJZCkgcmV0dXJuOyAvLyBOZWVkIGEgc3RhYmxlIGlkIHRvIHRyYWNrLlxuXG4gICAgY29uc3QgZW50ZXJlZEF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcmVudDogcHJlZmVyIGEgcGVuZGluZyBmb3JrL2RlY2lzaW9uIG1hdGNoIGJ5IG5hbWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHRvcC1vZi1zdWJmbG93LXN0YWNrLlxuICAgIGxldCBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuXG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAocGVuZGluZ0ZvcmspIHtcbiAgICAgIHBhcmVudElkID0gcGVuZGluZ0Zvcmsubm9kZUlkO1xuICAgICAgaW5jb21pbmdLaW5kID0gJ25leHQnOyAvLyBDaGlsZCBPRiBhIGZvcmstYnJhbmNoIG5vZGU7IHRoZSBmb3JrIHNlbWFudGljXG4gICAgICAvLyBpcyBjYXB0dXJlZCBieSB0aGUgZm9yay1icmFuY2gncyBvd24gaW5jb21pbmdLaW5kLlxuICAgICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmdEZWNpc2lvbiAmJiB0aGlzLnBlbmRpbmdEZWNpc2lvbi5uYW1lID09PSBldmVudC5uYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JztcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgaW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgfVxuXG4gICAgLy8gRGlzYW1iaWd1YXRlIHJlLWVudHJ5IChlLmcuLCBsb29wIGJvZHkgcmUtZW50ZXJzIHRoZSBzYW1lIHN1YmZsb3cpLlxuICAgIGxldCBub2RlSWQgPSBzdWJmbG93SWQ7XG4gICAgaWYgKHRoaXMubm9kZXNCeUlkLmhhcyhub2RlSWQpKSB7XG4gICAgICBsZXQgbiA9IDE7XG4gICAgICB3aGlsZSAodGhpcy5ub2Rlc0J5SWQuaGFzKGAke3N1YmZsb3dJZH0jJHtufWApKSBuKys7XG4gICAgICBub2RlSWQgPSBgJHtzdWJmbG93SWR9IyR7bn1gO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHRoID0gcGFyZW50SWQgPyB0aGlzLm5vZGVzQnlJZC5nZXQocGFyZW50SWQpIS5kZXB0aCArIDEgOiAwO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbiB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdzdWJmbG93JyxcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoLFxuICAgICAgaW5jb21pbmdLaW5kLFxuICAgICAgZW50ZXJlZEF0LFxuICAgICAgbWV0YWRhdGEsXG4gICAgfTtcbiAgICB0aGlzLm5vZGVzQnlJZC5zZXQobm9kZUlkLCBub2RlKTtcbiAgICB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG5cbiAgICBpZiAocGFyZW50SWQgJiYgaW5jb21pbmdLaW5kICE9PSAncm9vdCcpIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgIGZyb206IHBhcmVudElkLFxuICAgICAgICB0bzogbm9kZUlkLFxuICAgICAgICBraW5kOiBpbmNvbWluZ0tpbmQsXG4gICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOZXh0LWNoYWluZWQgZWRnZSBmcm9tIHRoZSBQUkVWSU9VUyBzdWJmbG93IGluIHRoaXMgc2NvcGUuXG4gICAgLy9cbiAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKS5hZGRTdWJGbG93Q2hhcnROZXh0KEMpYFxuICAgIC8vIHJ1bnMgYXM6IEEgZW50ZXJzIOKGkiBBIGV4aXRzIOKGkiBCIGVudGVycyDihpIgQiBleGl0cyDihpIgQyBlbnRlcnMuIEF0XG4gICAgLy8gQidzIGVudHJ5IHRoZSBzdGFjayBoYXMgcmV0dXJuZWQgdG8gdGhlIHNjb3BlIGl0IHdhcyBpbiBiZWZvcmUgQVxuICAgIC8vIGVudGVyZWQgKHJvb3QsIG9yIHRoZSBzaGFyZWQgYW5jZXN0b3IpLiBXaXRob3V0IHRoaXMgZWRnZSB3ZSdkXG4gICAgLy8gc2VlIG5vZGVzIHtBLCBCLCBDfSBidXQgbm8gcmVjb3JkIHRoYXQgQSByYW4gQkVGT1JFIEIgd2hpY2ggcmFuXG4gICAgLy8gQkVGT1JFIEMg4oCUIGFuZCBkb3duc3RyZWFtIGNvbnN1bWVycyB3b3VsZCBoYXZlIHRvIHJlY29uc3RydWN0XG4gICAgLy8gc2VxdWVudGlhbCBvcmRlcmluZyB0aGVtc2VsdmVzLlxuICAgIC8vXG4gICAgLy8gT25seSBlbWl0IG9uIHRoZSByZWd1bGFyLWVudHJ5IHBhdGguIEZvcmsvZGVjaXNpb24gZW50cmllcyBoYXZlXG4gICAgLy8gdGhlaXIgb3duIGVkZ2UgbWVjaGFuaWNzIChwYXJlbnTihpJmb3JrLWJyYW5jaCwgcGFyZW504oaSZGVjaXNpb24tXG4gICAgLy8gYnJhbmNoKSB0aGF0IGNhcnJ5IHRoZSBicmFuY2hpbmcgc2VtYW50aWNzLlxuICAgIGlmIChpbmNvbWluZ0tpbmQgPT09ICduZXh0JyB8fCBpbmNvbWluZ0tpbmQgPT09ICdyb290Jykge1xuICAgICAgY29uc3Qgc2NvcGVLZXkgPSBwYXJlbnRJZCA/PyAnJztcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmdldChzY29wZUtleSk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiBwcmV2aW91cy5ub2RlSWQsXG4gICAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAgICBraW5kOiAnbmV4dCcsXG4gICAgICAgICAgYXQ6IGVudGVyZWRBdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5kZWxldGUoc2NvcGVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1N0YWNrLnB1c2gobm9kZUlkKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlSWQgPSB0aGlzLnN1YmZsb3dTdGFjay5wb3AoKTtcbiAgICBpZiAoIW5vZGVJZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgdGhlIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIGBydW4oKWAg4oCUIHJlc2V0cyBhbGwgc3RhdGUuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMubm9kZXNCeUlkLmNsZWFyKCk7XG4gICAgdGhpcy5ub2RlT3JkZXIubGVuZ3RoID0gMDtcbiAgICB0aGlzLmVkZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmNsZWFyKCk7XG4gICAgdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
401
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7OztBQVlILHlEQUF5RTtBQTJFekUsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRWpCOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRTtJQUNwRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUZELDRDQUVDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWdCO0lBQ2xCLEVBQUUsQ0FBUztJQUVILFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUM1QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBQzVDLCtFQUErRTtJQUM5RCxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBRTdDOzhDQUMwQztJQUN6QixpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRSw0RUFBNEU7SUFDcEUsZUFBZSxDQUFtQztJQUMxRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDYyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUNsRyxrR0FBa0c7SUFDakYsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDL0QsMEZBQTBGO0lBQ3pFLFdBQVcsR0FBRyxJQUFJLG9DQUFpQixFQUFFLENBQUM7SUFFdkQsWUFBWSxVQUFtQyxFQUFFO1FBQy9DLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELHlFQUF5RTtJ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SSxDQUFDLFdBQVcsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBeFZELDRDQXdWQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9wb2xvZ3lSZWNvcmRlciDigJQgY29tcG9zaXRpb24gZ3JhcGggYnVpbHQgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIGZvb3RwcmludGpzIGZpcmVzIGF0b21pYyBmbG93IGV2ZW50cyAob25TdWJmbG93RW50cnksIG9uRm9yaywgb25EZWNpc2lvbixcbiAqICAgb25Mb29wKSBidXQgdGhlIGFjY3VtdWxhdGVkICpzaGFwZSogb2YgYSBydW4g4oCUIHdobyBuZXN0cyBpbnNpZGUgd2hvbSxcbiAqICAgd2hpY2ggbm9kZXMgYXJlIHBhcmFsbGVsIHNpYmxpbmdzIHZzIGJyYW5jaGVzIG9mIGEgZGVjaXNpb24g4oCUIGlzIG9ubHlcbiAqICAgdmlzaWJsZSBwb3N0LXJ1biB2aWEgYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgIHRyZWUtd2Fsa2luZy5cbiAqXG4gKiAgIFN0cmVhbWluZyBjb25zdW1lcnMgKGxpdmUgVUlzLCBpbi1mbGlnaHQgZGVidWdnZXJzKSBzZWUgb25seSB0aGUgZXZlbnRcbiAqICAgc3RyZWFtLiBFdmVyeSBzdWNoIGNvbnN1bWVyIGhhcyB0byByZWJ1aWxkIHN1YmZsb3ctc3RhY2sgKyBmb3JrLW1hcCArXG4gKiAgIGRlY2lzaW9uLXRyYWNrZXIgZnJvbSBzY3JhdGNoLCB1c3VhbGx5IHNsaWdodGx5IHdyb25nIGluIGRpZmZlcmVudCB3YXlzLlxuICpcbiAqICAgVG9wb2xvZ3lSZWNvcmRlciBpcyB0aGUgc3RhbmRhcmQgYWNjdW11bGF0b3I6IG9uZSBzdWJzY3JpcHRpb24gdG8gdGhlXG4gKiAgIHRocmVlIHByaW1pdGl2ZSBjaGFubmVscywgb25lIGxpdmUgZ3JhcGgsIHF1ZXJ5YWJsZSBhdCBhbnkgbW9tZW50IGR1cmluZ1xuICogICBvciBhZnRlciBhIHJ1bi5cbiAqXG4gKiBXaGF0IGl0IHJlY29yZHMg4oCUIEZPVVIgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKiAgIDQuICdhdHRlbXB0LXNlcmllcycgICDigJQgdmlhIG9uQXR0ZW1wdCAoMTAuMSk6IGEgc3RhZ2UgZXhlY3V0aW9uIHRoYXRcbiAqICAgICAgUkVUUklFRCwgR0FWRSBVUCBvciBUSU1FRCBPVVQgKGByZWNvcmRlci9hdHRlbXB0U2VyaWVzLnRzIMK3IGlzUmV0cnlFdmlkZW5jZWApLCB3aXRoIGl0c1xuICogICAgICBgYXR0ZW1wdFN1bW1hcnlgIGFuZCBpdHMgb3JkZXJlZCBgYXR0ZW1wdHNgLiBBIHJldHJ5IGlzIGEgbG9vcCwgc28gZWFjaFxuICogICAgICByZXRyeSBkZWNpc2lvbiBpcyBhIHNlbGYtZWRnZSBvZiBraW5kICdyZXRyeScgb24gdGhlIG5vZGUg4oCUIHRoZSB3YXlcbiAqICAgICAgb25Mb29wIGRyYXdzICdsb29wLWl0ZXJhdGlvbicuIEEgc3RhZ2UgdGhhdCByYW4gb25jZSAod2l0aCBvciB3aXRob3V0IGFcbiAqICAgICAgcG9saWN5KSBpcyBubyBub2RlLCBhcyBiZWZvcmUuXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlZiB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0U2VyaWVzQm9vaywgc3ViZmxvd09mQXR0ZW1wdCB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5cbi8qKiBUaGUga2luZCBvZiBjb21wb3NpdGlvbiB1bml0IGEgbm9kZSByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lOb2RlS2luZCA9ICdzdWJmbG93JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdhdHRlbXB0LXNlcmllcyc7XG5cbi8qKiBIb3cgdGhlIHRyYXZlcnNhbCByZWFjaGVkIHRoaXMgbm9kZSDigJQgZHJpdmVzIGNvbnN1bWVyIGxheW91dCBkZWNpc2lvbnMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neUluY29taW5nS2luZCA9ICdyb290JyB8ICduZXh0JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdsb29wLWl0ZXJhdGlvbicgfCAncmV0cnknO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb247IHN0YWdlSWQgZm9yIGFuIGF0dGVtcHQgc2VyaWVzLiAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIGtpbmQ9J2F0dGVtcHQtc2VyaWVzJyBvbmx5OiB0aGUgc2VyaWVzIGF0IGEgZ2xhbmNlIOKAlCBlcXVhbCB0byB0aGUgc3RhZ2Unc1xuICAgKiBgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0U3VtbWFyeWAuIEFic2VudCB3aGlsZSB0aGUgc2VyaWVzIGlzIGluIGZsaWdodCAob3JcbiAgICogd2hlbiB0aGUgcnVuJ3Mgc2lnbmFsIGN1dCBpdHMgd2FpdDogbm8gcmVjb3JkIHNheXMgaG93IGl0IGVuZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBraW5kPSdhdHRlbXB0LXNlcmllcycgb25seTogdGhlIHNlcmllcycgYXR0ZW1wdHMsIGluIG9yZGVyLiAqL1xuICByZWFkb25seSBhdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbn1cblxuLyoqIEEgdHJhdmVyc2FsIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gbm9kZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5RWRnZSB7XG4gIHJlYWRvbmx5IGZyb206IHN0cmluZztcbiAgcmVhZG9ubHkgdG86IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogRXhjbHVkZTxUb3BvbG9neUluY29taW5nS2luZCwgJ3Jvb3QnPjtcbiAgcmVhZG9ubHkgYXQ6IHN0cmluZztcbn1cblxuLyoqIFNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3kge1xuICByZWFkb25seSBub2RlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neU5vZGU+O1xuICByZWFkb25seSBlZGdlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neUVkZ2U+O1xuICAvKiogQ3VycmVudGx5LWFjdGl2ZSBzdWJmbG93ICh0b3Agb2YgdGhlIHN1YmZsb3cgc3RhY2spLiBGb3JrLWJyYW5jaCBhbmRcbiAgICogIGRlY2lzaW9uLWJyYW5jaCBub2RlcyBhcmUgaW5zdGFudGFuZW91cyDigJQgdGhleSBkb24ndCBhZmZlY3QgYWN0aXZlTm9kZUlkLiAqL1xuICByZWFkb25seSBhY3RpdmVOb2RlSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGaXJzdCBub2RlIGluc2VydGVkLiBudWxsIGJlZm9yZSBhbnkgY29tcG9zaXRpb24gZXZlbnQgZmlyZXMuICovXG4gIHJlYWRvbmx5IHJvb3RJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgdG9wb2xvZ3ktTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLy8gQ29ycmVsYXRpb24gc3RhdGU6IG1hcHMgYSBwZW5kaW5nIGZvcmsvZGVjaXNpb24gY2hpbGQgbmFtZSB0byBpdHMgc3ludGhldGljXG4vLyBub2RlIGlkLCBzbyBhIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgbWF0Y2hpbmcgdGhhdCBuYW1lIGNhbiBiZSBuZXN0ZWRcbi8vIHVuZGVyIHRoZSBzeW50aGV0aWMgbm9kZSAocmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBwZWVyKS5cbmludGVyZmFjZSBQZW5kaW5nQ2hpbGQge1xuICBub2RlSWQ6IHN0cmluZztcbiAgYXQ6IHN0cmluZztcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgbmFycmF0aXZlKClgIC8gYG1ldHJpY3MoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3BvbG9neVJlY29yZGVyKG9wdGlvbnM6IFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zID0ge30pOiBUb3BvbG9neVJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBUb3BvbG9neVJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBtYWludGFpbnMgYSBsaXZlXG4gKiBjb21wb3NpdGlvbiBncmFwaC4gQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlFxuICogZm9vdHByaW50anMgZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVG9wb2xvZ3lSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub2Rlc0J5SWQgPSBuZXcgTWFwPHN0cmluZywgVG9wb2xvZ3lOb2RlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBlZGdlczogVG9wb2xvZ3lFZGdlW10gPSBbXTtcbiAgLyoqIFN0YWNrIG9mIGFjdGl2ZSBTVUJGTE9XIG5vZGUgaWRzLiBGb3JrL2RlY2lzaW9uLWJyYW5jaCBub2RlcyBuZXZlciBwdXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICAvKiogTWFwIG9mIGNoaWxkTmFtZSDihpIgcGVuZGluZyBmb3JrLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnlcbiAgICogIHRoZSBuZXh0IG1hdGNoaW5nIGBvblN1YmZsb3dFbnRyeWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0ZvcmtCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0NoaWxkPigpO1xuICAvKiogUGVuZGluZyBkZWNpc2lvbi1icmFuY2ggc3ludGhldGljIG5vZGUsIGNvbnN1bWVkIGJ5IGEgbWF0Y2hpbmcgZW50cnkuICovXG4gIHByaXZhdGUgcGVuZGluZ0RlY2lzaW9uPzogeyBuYW1lOiBzdHJpbmcgfSAmIFBlbmRpbmdDaGlsZDtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyBzdWJmbG93IHRoYXQganVzdCBmaW5pc2hlZCwga2V5ZWQgYnkgc2NvcGUgKHBhcmVudElkLFxuICAgKiBvciAnJyBmb3Igcm9vdCkuIFdoZW4gYSBuZXcgc3ViZmxvdyBlbnRlcnMgaW4gdGhlIHNhbWUgc2NvcGUgdmlhXG4gICAqIHRoZSBub3JtYWwgbmV4dC1jaGFpbmVkIHBhdGggKG5vdCBmb3JrL2RlY2lzaW9uKSwgd2UgZW1pdCBhIGBuZXh0YFxuICAgKiBlZGdlIGZyb20gdGhlIHByZXZpb3VzIHN1YmZsb3cgdG8gdGhlIG5ldyBvbmUg4oCUIG1hdGNoaW5nIGhvdyB0aGVcbiAgICogYnVpbGRlciBhY3R1YWxseSB3aXJlZCB0aGVtOiBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKWBcbiAgICogbWVhbnMgQSDihpIgQiwgb25lIGFmdGVyIHRoZSBvdGhlci5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzLCBjb25zdW1lcnMgb25seSBzZWUgcGFyZW504oaSY2hpbGQgZWRnZXMgKEEsIEIsIEMgYWxsXG4gICAqIGNoaWxkcmVuIG9mIHRoZWlyIGNvbW1vbiBhbmNlc3Rvcikgd2l0aCBubyByZWNvcmQgb2YgdGhlIGFjdHVhbFxuICAgKiBBIOKGkiBCIOKGkiBDIHNlcXVlbnRpYWwgY2hhaW4gdGhhdCByYW4g4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICAgKiBUb3BvbG9neVJlY29yZGVyIGlzIHN1cHBvc2VkIHRvIGV4cG9zZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNTdWJmbG93SW5TY29wZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG5vZGVJZDogc3RyaW5nOyBleGl0ZWRBdDogc3RyaW5nIH0+KCk7XG4gIC8qKiBPcGVuIHN1YmZsb3cgbm9kZSBpZCBieSBpdHMgcGF0aC1wcmVmaXhlZCBzdWJmbG93SWQg4oCUIHdoZXJlIGEgc3RhZ2UncyBhdHRlbXB0IHNlcmllcyBoYW5ncy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuU3ViZmxvd0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBQZXItc2VyaWVzIHRhbGxpZXMgb2YgdGhlIHNlcmllcyB0aGF0IGFyZSBldmlkZW5jZSAocmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHRCb29rID0gbmV3IEF0dGVtcHRTZXJpZXNCb29rKCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGB0b3BvbG9neS0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBldmVudC5zdWJmbG93SWQ7XG4gICAgaWYgKCFzdWJmbG93SWQpIHJldHVybjsgLy8gTmVlZCBhIHN0YWJsZSBpZCB0byB0cmFjay5cblxuICAgIGNvbnN0IGVudGVyZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBwYXJlbnQ6IHByZWZlciBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBtYXRjaCBieSBuYW1lLFxuICAgIC8vIG90aGVyd2lzZSB0aGUgY3VycmVudCB0b3Atb2Ytc3ViZmxvdy1zdGFjay5cbiAgICBsZXQgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5jb21pbmdLaW5kOiBUb3BvbG9neUluY29taW5nS2luZDtcblxuICAgIGNvbnN0IHBlbmRpbmdGb3JrID0gdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKHBlbmRpbmdGb3JrKSB7XG4gICAgICBwYXJlbnRJZCA9IHBlbmRpbmdGb3JrLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JzsgLy8gQ2hpbGQgT0YgYSBmb3JrLWJyYW5jaCBub2RlOyB0aGUgZm9yayBzZW1hbnRpY1xuICAgICAgLy8gaXMgY2FwdHVyZWQgYnkgdGhlIGZvcmstYnJhbmNoJ3Mgb3duIGluY29taW5nS2luZC5cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQubmFtZSkge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnBlbmRpbmdEZWNpc2lvbi5ub2RlSWQ7XG4gICAgICBpbmNvbWluZ0tpbmQgPSAnbmV4dCc7XG4gICAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGluY29taW5nS2luZCA9IHBhcmVudElkID8gJ25leHQnIDogJ3Jvb3QnO1xuICAgIH1cblxuICAgIC8vIERpc2FtYmlndWF0ZSByZS1lbnRyeSAoZS5nLiwgbG9vcCBib2R5IHJlLWVudGVycyB0aGUgc2FtZSBzdWJmbG93KS5cbiAgICBsZXQgbm9kZUlkID0gc3ViZmxvd0lkO1xuICAgIGlmICh0aGlzLm5vZGVzQnlJZC5oYXMobm9kZUlkKSkge1xuICAgICAgbGV0IG4gPSAxO1xuICAgICAgd2hpbGUgKHRoaXMubm9kZXNCeUlkLmhhcyhgJHtzdWJmbG93SWR9IyR7bn1gKSkgbisrO1xuICAgICAgbm9kZUlkID0gYCR7c3ViZmxvd0lkfSMke259YDtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aCA9IHBhcmVudElkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KHBhcmVudElkKSEuZGVwdGggKyAxIDogMDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGV2ZW50LmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24gfSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIGlkOiBub2RlSWQsXG4gICAgICBraW5kOiAnc3ViZmxvdycsXG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBkZXB0aCxcbiAgICAgIGluY29taW5nS2luZCxcbiAgICAgIGVudGVyZWRBdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuXG4gICAgaWYgKHBhcmVudElkICYmIGluY29taW5nS2luZCAhPT0gJ3Jvb3QnKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goe1xuICAgICAgICBmcm9tOiBwYXJlbnRJZCxcbiAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAga2luZDogaW5jb21pbmdLaW5kLFxuICAgICAgICBhdDogZW50ZXJlZEF0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTmV4dC1jaGFpbmVkIGVkZ2UgZnJvbSB0aGUgUFJFVklPVVMgc3ViZmxvdyBpbiB0aGlzIHNjb3BlLlxuICAgIC8vXG4gICAgLy8gYC5hZGRTdWJGbG93Q2hhcnROZXh0KEEpLmFkZFN1YkZsb3dDaGFydE5leHQoQikuYWRkU3ViRmxvd0NoYXJ0TmV4dChDKWBcbiAgICAvLyBydW5zIGFzOiBBIGVudGVycyDihpIgQSBleGl0cyDihpIgQiBlbnRlcnMg4oaSIEIgZXhpdHMg4oaSIEMgZW50ZXJzLiBBdFxuICAgIC8vIEIncyBlbnRyeSB0aGUgc3RhY2sgaGFzIHJldHVybmVkIHRvIHRoZSBzY29wZSBpdCB3YXMgaW4gYmVmb3JlIEFcbiAgICAvLyBlbnRlcmVkIChyb290LCBvciB0aGUgc2hhcmVkIGFuY2VzdG9yKS4gV2l0aG91dCB0aGlzIGVkZ2Ugd2UnZFxuICAgIC8vIHNlZSBub2RlcyB7QSwgQiwgQ30gYnV0IG5vIHJlY29yZCB0aGF0IEEgcmFuIEJFRk9SRSBCIHdoaWNoIHJhblxuICAgIC8vIEJFRk9SRSBDIOKAlCBhbmQgZG93bnN0cmVhbSBjb25zdW1lcnMgd291bGQgaGF2ZSB0byByZWNvbnN0cnVjdFxuICAgIC8vIHNlcXVlbnRpYWwgb3JkZXJpbmcgdGhlbXNlbHZlcy5cbiAgICAvL1xuICAgIC8vIE9ubHkgZW1pdCBvbiB0aGUgcmVndWxhci1lbnRyeSBwYXRoLiBGb3JrL2RlY2lzaW9uIGVudHJpZXMgaGF2ZVxuICAgIC8vIHRoZWlyIG93biBlZGdlIG1lY2hhbmljcyAocGFyZW504oaSZm9yay1icmFuY2gsIHBhcmVudOKGkmRlY2lzaW9uLVxuICAgIC8vIGJyYW5jaCkgdGhhdCBjYXJyeSB0aGUgYnJhbmNoaW5nIHNlbWFudGljcy5cbiAgICBpZiAoaW5jb21pbmdLaW5kID09PSAnbmV4dCcgfHwgaW5jb21pbmdLaW5kID09PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gcGFyZW50SWQgPz8gJyc7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5nZXQoc2NvcGVLZXkpO1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgICAgZnJvbTogcHJldmlvdXMubm9kZUlkLFxuICAgICAgICAgIHRvOiBub2RlSWQsXG4gICAgICAgICAga2luZDogJ25leHQnLFxuICAgICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXZpb3VzU3ViZmxvd0luU2NvcGUuZGVsZXRlKHNjb3BlS2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dTdGFjay5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5vcGVuU3ViZmxvd0J5UGF0aC5zZXQoc3ViZmxvd0lkLCBub2RlSWQpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrLnBvcCgpO1xuICAgIGlmICghbm9kZUlkKSByZXR1cm47XG4gICAgaWYgKGV2ZW50LnN1YmZsb3dJZCAmJiB0aGlzLm9wZW5TdWJmbG93QnlQYXRoLmdldChldmVudC5zdWJmbG93SWQpID09PSBub2RlSWQpIHtcbiAgICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguZGVsZXRlKGV2ZW50LnN1YmZsb3dJZCk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5hdHRlbXB0Qm9vay5hZGQoZXZlbnQucmVjb3JkKTtcbiAgICBpZiAoIXN0YXRlKSByZXR1cm47XG4gICAgY29uc3Qgbm9kZUlkID0gYGF0dGVtcHRzLSR7c3RhdGUuc2VyaWVzfWA7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBwbGFjZWQgPSBleGlzdGluZyA/PyB0aGlzLnBsYWNlU2VyaWVzKGV2ZW50LCBub2RlSWQpO1xuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIC4uLnBsYWNlZCxcbiAgICAgIGF0dGVtcHRzOiBzdGF0ZS5hdHRlbXB0cyxcbiAgICAgIC4uLihzdGF0ZS5zdW1tYXJ5ICE9PSB1bmRlZmluZWQgPyB7IGF0dGVtcHRTdW1tYXJ5OiBzdGF0ZS5zdW1tYXJ5IH0gOiB7fSksXG4gICAgfTtcbiAgICBpZiAoIWV4aXN0aW5nKSB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgaWYgKGV2ZW50LnJlY29yZC5uZXh0ID09PSAncmV0cnknKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBub2RlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdyZXRyeScsIGF0OiBzdGF0ZS5zZXJpZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlcmllcyBub2RlLCB1bmRlciBpdHMgcGFyZW50OiB0aGUgcGVuZGluZyBmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLVxuICAgKiBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZSAoYSBmb3JrIGNoaWxkIG9yIGEgY2hvc2VuIGJyYW5jaCB0aGF0IGlzIGEgcGxhaW5cbiAgICogc3RhZ2UpLCBlbHNlIHRoZSBvcGVuIHN1YmZsb3cgdGhlIHN0YWdlIHJ1bnMgaW4gKHJlYWQgb2ZmIGl0c1xuICAgKiBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN0YWNrIHRvcCBjYW4gYmUgYSBwYXJhbGxlbCBzaWJsaW5nKSwgZWxzZSB0aGUgdG9wXG4gICAqIGxldmVsLiBPbmUgZWRnZSBmcm9tXG4gICAqIHRoZSBwYXJlbnQsIGFzIGZvciBldmVyeSBjb21wb3NpdGlvbiBjaGlsZC5cbiAgICovXG4gIHByaXZhdGUgcGxhY2VTZXJpZXMoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQsIG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlIHtcbiAgICBjb25zdCBhdCA9IGV2ZW50LnJlY29yZC5zZXJpZXM7XG4gICAgbGV0IHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5zdGFnZU5hbWUpO1xuICAgIGlmIChwZW5kaW5nRm9yaykge1xuICAgICAgcGFyZW50SWQgPSBwZW5kaW5nRm9yay5ub2RlSWQ7XG4gICAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmRlbGV0ZShldmVudC5zdGFnZU5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQuc3RhZ2VOYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXRoID0gc3ViZmxvd09mQXR0ZW1wdChldmVudCk7XG4gICAgICBwYXJlbnRJZCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHRoaXMub3BlblN1YmZsb3dCeVBhdGguZ2V0KHBhdGgpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgaWYgKHBhcmVudElkKSB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBwYXJlbnRJZCwgdG86IG5vZGVJZCwga2luZDogJ25leHQnLCBhdCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdhdHRlbXB0LXNlcmllcycsXG4gICAgICBuYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoOiBwYXJlbnRJZCA/IHRoaXMubm9kZXNCeUlkLmdldChwYXJlbnRJZCkhLmRlcHRoICsgMSA6IDAsXG4gICAgICBpbmNvbWluZ0tpbmQsXG4gICAgICBlbnRlcmVkQXQ6IGF0LFxuICAgICAgbWV0YWRhdGE6IHsgc3RhZ2VJZDogZXZlbnQuc3RhZ2VJZCB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IHRoZSBleGVjdXRvciBiZWZvcmUgZWFjaCBgcnVuKClgIOKAlCByZXNldHMgYWxsIHN0YXRlLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVzQnlJZC5jbGVhcigpO1xuICAgIHRoaXMubm9kZU9yZGVyLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5lZGdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5jbGVhcigpO1xuICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5jbGVhcigpO1xuICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguY2xlYXIoKTtcbiAgICB0aGlzLmF0dGVtcHRCb29rLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
|