footprintjs 10.3.0 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  5. package/dist/esm/lib/capture/absentEntries.js +81 -0
  6. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  7. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  8. package/dist/esm/lib/capture/historyData.d.ts +13 -0
  9. package/dist/esm/lib/capture/historyData.js +96 -0
  10. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  11. package/dist/esm/lib/capture/historyNote.js +57 -0
  12. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  13. package/dist/esm/lib/capture/historyTarget.js +35 -0
  14. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  15. package/dist/esm/lib/capture/historyTypes.js +4 -0
  16. package/dist/esm/lib/capture/nativeCoverage.d.ts +20 -7
  17. package/dist/esm/lib/capture/nativeCoverage.js +50 -12
  18. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  19. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  20. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  21. package/dist/esm/lib/capture/noteShape.js +93 -0
  22. package/dist/esm/lib/capture/readSources.d.ts +49 -0
  23. package/dist/esm/lib/capture/readSources.js +99 -0
  24. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  25. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  26. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  27. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  28. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  29. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  30. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
  31. package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
  32. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  33. package/dist/esm/lib/capture/storedReadSources.js +104 -0
  34. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -2
  35. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  36. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  37. package/dist/esm/lib/engine/types.d.ts +4 -0
  38. package/dist/esm/lib/engine/types.js +1 -1
  39. package/dist/esm/lib/memory/StageContext.d.ts +9 -0
  40. package/dist/esm/lib/memory/StageContext.js +96 -9
  41. package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
  42. package/dist/esm/lib/memory/frameTypes.js +1 -1
  43. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  44. package/dist/esm/lib/memory/logAddress.js +7 -0
  45. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  46. package/dist/esm/lib/memory/runPolicy.js +2 -1
  47. package/dist/esm/lib/pause/record.js +8 -2
  48. package/dist/esm/lib/pause/types.d.ts +2 -0
  49. package/dist/esm/lib/pause/types.js +1 -1
  50. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +19 -3
  51. package/dist/esm/lib/runner/ExecutionRuntime.js +92 -6
  52. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
  53. package/dist/esm/lib/runner/FlowChartExecutor.js +50 -10
  54. package/dist/esm/lib/runner/attach.js +3 -1
  55. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  56. package/dist/esm/lib/runner/captureHistory.js +112 -0
  57. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  58. package/dist/esm/lib/runner/checkpoint.js +3 -1
  59. package/dist/esm/lib/runner/index.d.ts +1 -0
  60. package/dist/esm/lib/runner/index.js +1 -1
  61. package/dist/esm/lib/runner/options.js +42 -3
  62. package/dist/esm/lib/runner/readStoredCapture.d.ts +41 -0
  63. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  64. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  65. package/dist/esm/lib/runner/recordSink.js +48 -13
  66. package/dist/esm/lib/runner/snapshot.js +2 -2
  67. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  68. package/dist/esm/lib/runner/storedCaptureAdmission.js +99 -0
  69. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  70. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  71. package/dist/esm/lib/sinks/fileSink.js +8 -2
  72. package/dist/esm/trace.d.ts +2 -0
  73. package/dist/esm/trace.js +2 -1
  74. package/dist/index.js +1 -1
  75. package/dist/lib/capture/absentEntries.js +86 -0
  76. package/dist/lib/capture/checkpointCapture.js +110 -0
  77. package/dist/lib/capture/historyData.js +104 -0
  78. package/dist/lib/capture/historyNote.js +61 -0
  79. package/dist/lib/capture/historyTarget.js +40 -0
  80. package/dist/lib/capture/historyTypes.js +7 -0
  81. package/dist/lib/capture/nativeCoverage.js +52 -13
  82. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  83. package/dist/lib/capture/noteShape.js +103 -0
  84. package/dist/lib/capture/readSources.js +106 -0
  85. package/dist/lib/capture/sinkSettlement.js +14 -0
  86. package/dist/lib/capture/sourceReadCounts.js +31 -0
  87. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  88. package/dist/lib/capture/storedReadSourceCounts.js +82 -0
  89. package/dist/lib/capture/storedReadSources.js +108 -0
  90. package/dist/lib/engine/handlers/SubflowExecutor.js +14 -2
  91. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  92. package/dist/lib/engine/types.js +1 -1
  93. package/dist/lib/memory/StageContext.js +96 -9
  94. package/dist/lib/memory/frameTypes.js +1 -1
  95. package/dist/lib/memory/logAddress.js +11 -0
  96. package/dist/lib/memory/runPolicy.js +2 -1
  97. package/dist/lib/pause/record.js +8 -2
  98. package/dist/lib/pause/types.js +1 -1
  99. package/dist/lib/runner/ExecutionRuntime.js +91 -5
  100. package/dist/lib/runner/FlowChartExecutor.js +50 -10
  101. package/dist/lib/runner/attach.js +3 -1
  102. package/dist/lib/runner/captureHistory.js +116 -0
  103. package/dist/lib/runner/checkpoint.js +3 -1
  104. package/dist/lib/runner/index.js +1 -1
  105. package/dist/lib/runner/options.js +42 -3
  106. package/dist/lib/runner/readStoredCapture.js +40 -0
  107. package/dist/lib/runner/recordSink.js +50 -15
  108. package/dist/lib/runner/snapshot.js +2 -2
  109. package/dist/lib/runner/storedCaptureAdmission.js +103 -0
  110. package/dist/lib/scope/ScopeFacade.js +2 -2
  111. package/dist/lib/sinks/fileSink.js +8 -2
  112. package/dist/trace.js +4 -2
  113. package/dist/types/index.d.ts +2 -0
  114. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  115. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  116. package/dist/types/lib/capture/historyData.d.ts +13 -0
  117. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  118. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  119. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  120. package/dist/types/lib/capture/nativeCoverage.d.ts +20 -7
  121. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  122. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  123. package/dist/types/lib/capture/readSources.d.ts +49 -0
  124. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  125. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  126. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  127. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
  128. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  129. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  130. package/dist/types/lib/engine/types.d.ts +4 -0
  131. package/dist/types/lib/memory/StageContext.d.ts +9 -0
  132. package/dist/types/lib/memory/frameTypes.d.ts +3 -0
  133. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  134. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  135. package/dist/types/lib/pause/types.d.ts +2 -0
  136. package/dist/types/lib/runner/ExecutionRuntime.d.ts +19 -3
  137. package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
  138. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  139. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  140. package/dist/types/lib/runner/index.d.ts +1 -0
  141. package/dist/types/lib/runner/readStoredCapture.d.ts +41 -0
  142. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  143. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  144. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  145. package/dist/types/trace.d.ts +2 -0
  146. package/package.json +2 -2
@@ -0,0 +1,104 @@
1
+ import { commitValueAtWithBasis } from 'foottrace';
2
+ import { nativeGet, nativeHas, normaliseStateKey } from 'foottrace/paths';
3
+ import { decodeReadSourceSnapshot } from 'foottrace/write';
4
+ import { readSourceStatus, SOURCE_LIMITATIONS } from './readSources.js';
5
+ import { SourceReferenceBudget } from './sourceReferenceBudget.js';
6
+ import { storedReadSourceCounts } from './storedReadSourceCounts.js';
7
+ function scalar(value) {
8
+ return value === null || typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number';
9
+ }
10
+ /** Refuse unrecognized stored fields rather than silently dropping them through a projecting codec. */
11
+ function sameData(input, decoded) {
12
+ if (Object.is(input, decoded))
13
+ return true;
14
+ if (!input || !decoded || typeof input !== 'object' || typeof decoded !== 'object')
15
+ return false;
16
+ const keys = Object.keys(input);
17
+ return (keys.length === Object.keys(decoded).length &&
18
+ keys.every((key) => Object.hasOwn(decoded, key) &&
19
+ sameData(Object.getOwnPropertyDescriptor(input, key)?.value, Object.getOwnPropertyDescriptor(decoded, key)?.value)));
20
+ }
21
+ /** Bounded row references, not causal reconstruction or validation of application computation. */
22
+ function referencesMatch(record, commits, firstCommits, initialState) {
23
+ const paths = new Map();
24
+ const scalarSources = new Map();
25
+ const budget = new SourceReferenceBudget(commits, initialState);
26
+ for (const row of record.occurrences) {
27
+ const path = [...row.stateAddress, row.key];
28
+ if (row.source.kind === 'base' &&
29
+ (!initialState || !nativeHas(initialState, path) || !scalar(nativeGet(initialState, path))))
30
+ return false;
31
+ if (row.source.kind !== 'committed')
32
+ continue;
33
+ const index = row.source.commitIdx;
34
+ const bundle = commits[index];
35
+ const readerCommit = firstCommits.get(row.runtimeStageId);
36
+ // A later continuation must not loosen the boundary for earlier reads. Reused raw contexts stay unknown.
37
+ if (!bundle || readerCommit === undefined || index >= readerCommit)
38
+ return false;
39
+ let written = paths.get(index);
40
+ if (!written) {
41
+ written = new Set(bundle.trace.map((entry) => entry.path));
42
+ paths.set(index, written);
43
+ }
44
+ const key = normaliseStateKey(path);
45
+ if (!written.has(key))
46
+ return false;
47
+ let values = scalarSources.get(index);
48
+ if (!values)
49
+ scalarSources.set(index, (values = new Map()));
50
+ let confirmed = values.get(key);
51
+ if (confirmed === undefined) {
52
+ budget.spend();
53
+ // The public record reader owns set/merge/delta value semantics; no second replay/value rule here.
54
+ const result = commitValueAtWithBasis(commits, index, key, { initialState });
55
+ confirmed = scalar(result.value) && !result.basis.includes('redacted');
56
+ values.set(key, confirmed);
57
+ }
58
+ if (!confirmed)
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ /** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
64
+ export function storedReadSources(value, capture, commitLog, initialState, executionTree) {
65
+ if (!value || typeof value !== 'object')
66
+ return undefined;
67
+ const source = value;
68
+ if (source.version !== 1 ||
69
+ source.runId !== capture.runId ||
70
+ source.persistence !== 'memory-only' ||
71
+ !sameData(source.commits, capture.commits) ||
72
+ !Array.isArray(source.limitations) ||
73
+ source.limitations.length > SOURCE_LIMITATIONS.length ||
74
+ new Set(source.limitations).size !== source.limitations.length ||
75
+ !source.limitations.every((gap) => SOURCE_LIMITATIONS.includes(gap)) ||
76
+ Object.keys(source).some((key) => !['version', 'runId', 'persistence', 'commits', 'status', 'limitations', 'record'].includes(key)))
77
+ return undefined;
78
+ const record = source.record === undefined ? undefined : decodeReadSourceSnapshot(source.record);
79
+ if (source.record !== undefined && (!record || !sameData(source.record, record)))
80
+ return undefined;
81
+ const firstCommits = new Map();
82
+ commitLog.forEach((bundle, index) => {
83
+ if (!firstCommits.has(bundle.runtimeStageId))
84
+ firstCommits.set(bundle.runtimeStageId, index);
85
+ });
86
+ if (record &&
87
+ (!sameData(record.address, capture.logAddress) ||
88
+ !storedReadSourceCounts(record, executionTree, firstCommits) ||
89
+ !referencesMatch(record, commitLog, firstCommits, initialState)))
90
+ return undefined;
91
+ if (source.status !== readSourceStatus(record, source.limitations.length) ||
92
+ capture.channels.readSources !== source.status)
93
+ return undefined;
94
+ return Object.freeze({
95
+ version: 1,
96
+ runId: source.runId,
97
+ persistence: 'memory-only',
98
+ commits: capture.commits,
99
+ status: source.status,
100
+ limitations: Object.freeze([...source.limitations]),
101
+ ...(record && { record }),
102
+ });
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc3RvcmVkUmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsU0FBUyxNQUFNLENBQUMsS0FBYztJQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDaEgsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsT0FBZ0I7SUFDaEQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDakcsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU07UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FDUixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQzNCLFFBQVEsQ0FDTixNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFDbEQsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQ3JELENBQ0osQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELGtHQUFrRztBQUNsRyxTQUFTLGVBQWUsQ0FDdEIsTUFBMEIsRUFDMUIsT0FBZ0MsRUFDaEMsWUFBeUMsRUFDekMsWUFBc0M7SUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQ0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUMxQixDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFM0YsT0FBTyxLQUFLLENBQUM7UUFDZixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVc7WUFBRSxTQUFTO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCx5R0FBeUc7UUFDekcsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakYsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNO1lBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixtR0FBbUc7WUFDbkcsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsT0FBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMvRixTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCw4R0FBOEc7QUFDOUcsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUFjLEVBQ2QsT0FBOEIsRUFDOUIsU0FBa0MsRUFDbEMsWUFBc0MsRUFDdEMsYUFBdUI7SUFFdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDMUQsTUFBTSxNQUFNLEdBQUcsS0FBMEIsQ0FBQztJQUMxQyxJQUNFLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQztRQUNwQixNQUFNLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxLQUFLO1FBQzlCLE1BQU0sQ0FBQyxXQUFXLEtBQUssYUFBYTtRQUNwQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDMUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDbEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTTtRQUNyRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTTtRQUM5RCxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBdUIsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN0QixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDMUc7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakcsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMvQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUNFLE1BQU07UUFDTixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUM1QyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDO1lBQzVELENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLElBQ0UsTUFBTSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDckUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLE1BQU07UUFFOUMsT0FBTyxTQUFTLENBQUM7SUFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLFdBQVcsRUFBRSxhQUFhO1FBQzFCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5vcm1hbGlzZVN0YXRlS2V5IH0gZnJvbSAnZm9vdHRyYWNlL3BhdGhzJztcbmltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IGRlY29kZVJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgRW5naW5lUmVhZFNvdXJjZXMsIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSwgU291cmNlTGltaXRhdGlvbiB9IGZyb20gJy4vcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgcmVhZFNvdXJjZVN0YXR1cywgU09VUkNFX0xJTUlUQVRJT05TIH0gZnJvbSAnLi9yZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgeyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQgfSBmcm9tICcuL3NvdXJjZVJlZmVyZW5jZUJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBzdG9yZWRSZWFkU291cmNlQ291bnRzIH0gZnJvbSAnLi9zdG9yZWRSZWFkU291cmNlQ291bnRzLmpzJztcblxuZnVuY3Rpb24gc2NhbGFyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBSZWZ1c2UgdW5yZWNvZ25pemVkIHN0b3JlZCBmaWVsZHMgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlbSB0aHJvdWdoIGEgcHJvamVjdGluZyBjb2RlYy4gKi9cbmZ1bmN0aW9uIHNhbWVEYXRhKGlucHV0OiB1bmtub3duLCBkZWNvZGVkOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoaW5wdXQsIGRlY29kZWQpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFpbnB1dCB8fCAhZGVjb2RlZCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBkZWNvZGVkICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5wdXQpO1xuICByZXR1cm4gKFxuICAgIGtleXMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhkZWNvZGVkKS5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgT2JqZWN0Lmhhc093bihkZWNvZGVkLCBrZXkpICYmXG4gICAgICAgIHNhbWVEYXRhKFxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5wdXQsIGtleSk/LnZhbHVlLFxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVjb2RlZCwga2V5KT8udmFsdWUsXG4gICAgICAgICksXG4gICAgKVxuICApO1xufVxuXG4vKiogQm91bmRlZCByb3cgcmVmZXJlbmNlcywgbm90IGNhdXNhbCByZWNvbnN0cnVjdGlvbiBvciB2YWxpZGF0aW9uIG9mIGFwcGxpY2F0aW9uIGNvbXB1dGF0aW9uLiAqL1xuZnVuY3Rpb24gcmVmZXJlbmNlc01hdGNoKFxuICByZWNvcmQ6IFJlYWRTb3VyY2VTbmFwc2hvdCxcbiAgY29tbWl0czogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gIGZpcnN0Q29tbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IG5ldyBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4oKTtcbiAgY29uc3Qgc2NhbGFyU291cmNlcyA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8c3RyaW5nLCBib29sZWFuPj4oKTtcbiAgY29uc3QgYnVkZ2V0ID0gbmV3IFNvdXJjZVJlZmVyZW5jZUJ1ZGdldChjb21taXRzLCBpbml0aWFsU3RhdGUpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByZWNvcmQub2NjdXJyZW5jZXMpIHtcbiAgICBjb25zdCBwYXRoID0gWy4uLnJvdy5zdGF0ZUFkZHJlc3MsIHJvdy5rZXldO1xuICAgIGlmIChcbiAgICAgIHJvdy5zb3VyY2Uua2luZCA9PT0gJ2Jhc2UnICYmXG4gICAgICAoIWluaXRpYWxTdGF0ZSB8fCAhbmF0aXZlSGFzKGluaXRpYWxTdGF0ZSwgcGF0aCkgfHwgIXNjYWxhcihuYXRpdmVHZXQoaW5pdGlhbFN0YXRlLCBwYXRoKSkpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuc291cmNlLmtpbmQgIT09ICdjb21taXR0ZWQnKSBjb250aW51ZTtcbiAgICBjb25zdCBpbmRleCA9IHJvdy5zb3VyY2UuY29tbWl0SWR4O1xuICAgIGNvbnN0IGJ1bmRsZSA9IGNvbW1pdHNbaW5kZXhdO1xuICAgIGNvbnN0IHJlYWRlckNvbW1pdCA9IGZpcnN0Q29tbWl0cy5nZXQocm93LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICAvLyBBIGxhdGVyIGNvbnRpbnVhdGlvbiBtdXN0IG5vdCBsb29zZW4gdGhlIGJvdW5kYXJ5IGZvciBlYXJsaWVyIHJlYWRzLiBSZXVzZWQgcmF3IGNvbnRleHRzIHN0YXkgdW5rbm93bi5cbiAgICBpZiAoIWJ1bmRsZSB8fCByZWFkZXJDb21taXQgPT09IHVuZGVmaW5lZCB8fCBpbmRleCA+PSByZWFkZXJDb21taXQpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgd3JpdHRlbiA9IHBhdGhzLmdldChpbmRleCk7XG4gICAgaWYgKCF3cml0dGVuKSB7XG4gICAgICB3cml0dGVuID0gbmV3IFNldChidW5kbGUudHJhY2UubWFwKChlbnRyeSkgPT4gZW50cnkucGF0aCkpO1xuICAgICAgcGF0aHMuc2V0KGluZGV4LCB3cml0dGVuKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkocGF0aCk7XG4gICAgaWYgKCF3cml0dGVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHZhbHVlcyA9IHNjYWxhclNvdXJjZXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoIXZhbHVlcykgc2NhbGFyU291cmNlcy5zZXQoaW5kZXgsICh2YWx1ZXMgPSBuZXcgTWFwKCkpKTtcbiAgICBsZXQgY29uZmlybWVkID0gdmFsdWVzLmdldChrZXkpO1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYnVkZ2V0LnNwZW5kKCk7XG4gICAgICAvLyBUaGUgcHVibGljIHJlY29yZCByZWFkZXIgb3ducyBzZXQvbWVyZ2UvZGVsdGEgdmFsdWUgc2VtYW50aWNzOyBubyBzZWNvbmQgcmVwbGF5L3ZhbHVlIHJ1bGUgaGVyZS5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoY29tbWl0cyBhcyBDb21taXRCdW5kbGVbXSwgaW5kZXgsIGtleSwgeyBpbml0aWFsU3RhdGUgfSk7XG4gICAgICBjb25maXJtZWQgPSBzY2FsYXIocmVzdWx0LnZhbHVlKSAmJiAhcmVzdWx0LmJhc2lzLmluY2x1ZGVzKCdyZWRhY3RlZCcpO1xuICAgICAgdmFsdWVzLnNldChrZXksIGNvbmZpcm1lZCk7XG4gICAgfVxuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBBZnRlciBpbmVydCBKU09OIGFkbWlzc2lvbjogdGhlIHJlY29yZCdzIGNvZGVjIG93bnMgZGVzY3JpcHRvcnM7IHRoZSBlbmdpbmUgYmluZHMgaXRzIHJvb3Qgb2JzZXJ2YXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZXMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjYXB0dXJlOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUsXG4gIGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBleGVjdXRpb25UcmVlPzogdW5rbm93bixcbik6IEVuZ2luZVJlYWRTb3VyY2VzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZSBhcyBFbmdpbmVSZWFkU291cmNlcztcbiAgaWYgKFxuICAgIHNvdXJjZS52ZXJzaW9uICE9PSAxIHx8XG4gICAgc291cmNlLnJ1bklkICE9PSBjYXB0dXJlLnJ1bklkIHx8XG4gICAgc291cmNlLnBlcnNpc3RlbmNlICE9PSAnbWVtb3J5LW9ubHknIHx8XG4gICAgIXNhbWVEYXRhKHNvdXJjZS5jb21taXRzLCBjYXB0dXJlLmNvbW1pdHMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoc291cmNlLmxpbWl0YXRpb25zKSB8fFxuICAgIHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggPiBTT1VSQ0VfTElNSVRBVElPTlMubGVuZ3RoIHx8XG4gICAgbmV3IFNldChzb3VyY2UubGltaXRhdGlvbnMpLnNpemUgIT09IHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggfHxcbiAgICAhc291cmNlLmxpbWl0YXRpb25zLmV2ZXJ5KChnYXApID0+IFNPVVJDRV9MSU1JVEFUSU9OUy5pbmNsdWRlcyhnYXAgYXMgU291cmNlTGltaXRhdGlvbikpIHx8XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5zb21lKFxuICAgICAgKGtleSkgPT4gIVsndmVyc2lvbicsICdydW5JZCcsICdwZXJzaXN0ZW5jZScsICdjb21taXRzJywgJ3N0YXR1cycsICdsaW1pdGF0aW9ucycsICdyZWNvcmQnXS5pbmNsdWRlcyhrZXkpLFxuICAgIClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlY29yZCA9IHNvdXJjZS5yZWNvcmQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRlY29kZVJlYWRTb3VyY2VTbmFwc2hvdChzb3VyY2UucmVjb3JkKTtcbiAgaWYgKHNvdXJjZS5yZWNvcmQgIT09IHVuZGVmaW5lZCAmJiAoIXJlY29yZCB8fCAhc2FtZURhdGEoc291cmNlLnJlY29yZCwgcmVjb3JkKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0Q29tbWl0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGNvbW1pdExvZy5mb3JFYWNoKChidW5kbGUsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFmaXJzdENvbW1pdHMuaGFzKGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCkpIGZpcnN0Q29tbWl0cy5zZXQoYnVuZGxlLnJ1bnRpbWVTdGFnZUlkLCBpbmRleCk7XG4gIH0pO1xuICBpZiAoXG4gICAgcmVjb3JkICYmXG4gICAgKCFzYW1lRGF0YShyZWNvcmQuYWRkcmVzcywgY2FwdHVyZS5sb2dBZGRyZXNzKSB8fFxuICAgICAgIXN0b3JlZFJlYWRTb3VyY2VDb3VudHMocmVjb3JkLCBleGVjdXRpb25UcmVlLCBmaXJzdENvbW1pdHMpIHx8XG4gICAgICAhcmVmZXJlbmNlc01hdGNoKHJlY29yZCwgY29tbWl0TG9nLCBmaXJzdENvbW1pdHMsIGluaXRpYWxTdGF0ZSkpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgc291cmNlLnN0YXR1cyAhPT0gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQsIHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGgpIHx8XG4gICAgY2FwdHVyZS5jaGFubmVscy5yZWFkU291cmNlcyAhPT0gc291cmNlLnN0YXR1c1xuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHZlcnNpb246IDEsXG4gICAgcnVuSWQ6IHNvdXJjZS5ydW5JZCxcbiAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICBjb21taXRzOiBjYXB0dXJlLmNvbW1pdHMsXG4gICAgc3RhdHVzOiBzb3VyY2Uuc3RhdHVzLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5zb3VyY2UubGltaXRhdGlvbnNdKSxcbiAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkIH0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { LOG_PLACEHOLDER } from 'foottrace/write';
16
16
  import { thrownText } from '../../errors/errorInfo.js';
17
+ import { childLogAddress } from '../../memory/logAddress.js';
17
18
  import { isPauseSignal } from '../../pause/types.js';
18
19
  import { commitStageWrites } from './commitStage.js';
19
20
  import { rememberRedactedSubflowState } from './servedSubflowResults.js';
@@ -164,10 +165,20 @@ export class SubflowExecutor {
164
165
  // parent log's address plus this mount's runtimeStageId — opened here, its seed and every commit as they land,
165
166
  // closed at the mount's exit (or its pause, or its failure). Without a sink: undefined, the plain log.
166
167
  const mountRuntimeStageId = parentTraversalContext?.runtimeStageId;
168
+ const parentLogAddress = this.deps.executionRuntime.executionHistory.address;
169
+ // Identity follows the same native log address as storage, even for an in-memory child.
170
+ // A missing native parent/mount identity cannot be replaced with a path/name guess.
171
+ const sourceAddress = policy.readSources ? childLogAddress(parentLogAddress, mountRuntimeStageId) : undefined;
167
172
  const record = mountRuntimeStageId === undefined
168
173
  ? undefined
169
174
  : this.deps.executionRuntime.recordFor?.(mountRuntimeStageId, { subflowId });
170
- const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record);
175
+ const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record, parentTraversalContext?.runId
176
+ ? {
177
+ runId: parentTraversalContext.runId,
178
+ ...(sourceAddress ? { address: sourceAddress } : { unavailable: 'child-source-ownership' }),
179
+ ...(isResumeForThisSubflow && { historyOmitted: true }),
180
+ }
181
+ : undefined);
171
182
  // Seed GlobalStore with the right shape for the path:
172
183
  // • Resume into THIS subflow → seed from the captured pre-pause
173
184
  // scope so resume handlers see history, pausedToolCallId, etc.
@@ -360,6 +371,7 @@ export class SubflowExecutor {
360
371
  globalContext: subflowTreeContext.sharedState,
361
372
  stageContexts: subflowTreeContext.executionTree,
362
373
  history: subflowTreeContext.commitLog,
374
+ ...(subflowTreeContext.readSources && { readSources: subflowTreeContext.readSources }),
363
375
  ...(subflowTreeContext.logAddress === undefined ? {} : { logAddress: subflowTreeContext.logAddress }),
364
376
  // The subflow's own fold base travels with its own log — same
365
377
  // contract as the run-level `RuntimeSnapshot.initialState`.
@@ -416,4 +428,4 @@ export class SubflowExecutor {
416
428
  return subflowOutput;
417
429
  }
418
430
  }
419
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUM3RSxXQUFXLEVBQUUsU0FBUztTQUN2QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXRHLDJFQUEyRTtRQUMzRSxzRUFBc0U7UUFDdEUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEcsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzNCLENBQUM7UUFFRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3ViZmxvd0V4ZWN1dG9yIOKAlCBJc29sYXRpb24gYm91bmRhcnkgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIFJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIENyZWF0ZSBpc29sYXRlZCBFeGVjdXRpb25SdW50aW1lIGZvciBlYWNoIHN1YmZsb3dcbiAqIC0gQXBwbHkgaW5wdXQvb3V0cHV0IG1hcHBpbmcgdmlhIFN1YmZsb3dJbnB1dE1hcHBlclxuICogLSBEZWxlZ2F0ZSB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gKiAtIFRyYWNrIHN1YmZsb3cgcmVzdWx0cyBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAqXG4gKiBFYWNoIHN1YmZsb3cgZ2V0cyBpdHMgb3duIEdsb2JhbFN0b3JlIGZvciBpc29sYXRpb24uXG4gKiBUcmF2ZXJzYWwgdXNlcyB0aGUgU0FNRSA3LXBoYXNlIGFsZ29yaXRobSBhcyB0aGUgdG9wLWxldmVsIHRyYXZlcnNlclxuICogKHZpYSBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSksIHNvIGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBsYXp5IHN1YmZsb3dzLFxuICogYW5kIGFib3J0IHNpZ25hbHMgYWxsIHdvcmsgaW5zaWRlIHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHBvbGljeSwgcmVjb3JkKTtcblxuICAgIC8vIFNlZWQgR2xvYmFsU3RvcmUgd2l0aCB0aGUgcmlnaHQgc2hhcGUgZm9yIHRoZSBwYXRoOlxuICAgIC8vICAg4oCiIFJlc3VtZSBpbnRvIFRISVMgc3ViZmxvdyDihpIgc2VlZCBmcm9tIHRoZSBjYXB0dXJlZCBwcmUtcGF1c2VcbiAgICAvLyAgICAgc2NvcGUgc28gcmVzdW1lIGhhbmRsZXJzIHNlZSBoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuXG4gICAgLy8gICAgIChgbWFwcGVkSW5wdXRgIHN0aWxsIHJlYWNoZXMgdGhlIHN0YWdlcywgYXMgdGhlaXIgcmVhZC1vbmx5IGFyZ3MuKVxuICAgIC8vICAg4oCiIE5vcm1hbCBlbnRyeSDihpIgc2VlZCBmcm9tIHRoZSBpbnB1dE1hcHBlcidzIG1hcHBlZElucHV0LlxuICAgIGNvbnN0IHNlZWRWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gaXNSZXN1bWVGb3JUaGlzU3ViZmxvdyA/IHJlc3VtZUNhcHR1cmUhIDogbWFwcGVkSW5wdXQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlZWRWYWx1ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBzZWVkIGlzIGNvbW1pdHRlZCBhcyB0aGUgc3ViZmxvdydzIGBoaXN0b3J5WzBdYCBieSBpdHMgcm9vdFxuICAgICAgLy8gY29udGV4dCwgbm90IGJ5IGEgZmFjYWRlIOKAlCB0aGF0IGZyYW1lIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHBvbGljeVxuICAgICAgLy8gKHRoZSBydW50aW1lIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGl0KSwgc28gdGhlIHNlZWQgcmV0YWlucyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bGUsIGxhbmRzIGluIHRoZSBtaXJyb3IgYXMgdGhlIHBsYWNlaG9sZGVyLCBhbmQgY29tbWl0cyB1bmRlciB0aGVcbiAgICAgIC8vIHJ1bidzIGRpYWxzIGxpa2UgZXZlcnkgb3RoZXIgd3JpdGUgKEMtRjU6IHVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6XG4gICAgICAvLyAncmVhZHMtcHJlZml4J2AgaXRzIHJvd3MgY2FycnkgYHJlYWRLZXlzOiBbXWApLlxuICAgICAgLy8gVGhlIHNlZWQgaXMgdGhlIG1vdW50J3MgYWN0IHRvbzogaXRzIGJ1bmRsZSDigJQgYGhpc3RvcnlbMF1gIG9mIHRoZVxuICAgICAgLy8gc3ViZmxvdydzIG93biBsb2cg4oCUIGNhcnJpZXMgdGhlIG1vdW50J3Mgc3RhZ2UsIHN0YWdlSWQgYW5kXG4gICAgICAvLyBydW50aW1lU3RhZ2VJZCAoUjEzOyB0aHJvdWdoIDkuMzMuMCBpdCBjYXJyaWVkIHJ1bnRpbWVTdGFnZUlkICcnIGFuZFxuICAgICAgLy8gdGhlIGZpcnN0IHN0YWdlJ3MgbmFtZXMsIHdoaWNoIG9uIGEgcmVzdW1lIHdhcyB0aGUgcmUtZW50cnkgcG9pbnQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZShuZXN0ZWRSdW50aW1lLCBzZWVkVmFsdWVzLCBwYXJlbnRDb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgb3BlbmVkIGFib3ZlOiBhIHNlZWQgdGhhdCBmYWlscyBjbG9zZXMgaXQsIG5ldmVyIGxlYXZlcyBpdCBsb29raW5nIGNyYXNoZWQuXG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LignZmFpbGVkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgLy8gUmVmcmVzaCByb290U3RhZ2VDb250ZXh0IHNvIFdyaXRlQnVmZmVyIHNlZXMgY29tbWl0dGVkIGRhdGEuIE5hbWVkXG4gICAgICAvLyBhZnRlciB0aGUgZmlyc3Qgbm9kZSBhZ2FpbiDigJQgdGhlIHNlZWQgY29udGV4dCBub3cgY2FycmllcyB0aGUgbW91bnQnc1xuICAgICAgLy8gbmFtZXMgKFIxMyksIHdoaWNoIGJlbG9uZyB0byB0aGUgc2VlZCBidW5kbGUgb25seS4gYG5ld1Jvb3RgIGdpdmVzIGl0XG4gICAgICAvLyB0aGUgc2FtZSBwb2xpY3kgYW5kIG1pcnJvci5cbiAgICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUubmV3Um9vdChmaXJzdE5vZGUubmFtZSwgZmlyc3ROb2RlLmlkKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHN1YmZsb3cgcm9vdCBub2RlIOKAlCBzdHJpcCBpc1N1YmZsb3dSb290IHRvIHByZXZlbnQgcmUtZGVsZWdhdGlvbi5cbiAgICAvL1xuICAgIC8vIFBSRVNFUlZFIGBuZXh0YC4gRWFybGllciByZXZpc2lvbnMgc3RyaXBwZWQgYG5leHRgIHdoZW5ldmVyIHRoZVxuICAgIC8vIHN1YmZsb3cgcm9vdCBoYWQgY2hpbGRyZW4sIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYG5leHRgIHdhc1xuICAgIC8vIGFsd2F5cyB0aGUgT1VURVIgbW91bnQncyBjb250aW51YXRpb24gbGVha2luZyBpbnRvIHRoZSBpbm5lclxuICAgIC8vIHRyZWUuIFRoYXQgYXNzdW1wdGlvbiB3YXMgd3Jvbmc6IHRoZSByZXNvbHZlZCBzdWJmbG93IHJvb3Qnc1xuICAgIC8vIGBuZXh0YCBpcyB0aGUgSU5ORVIgam9pbiBzdGFnZSAoZS5nLiwgUGFyYWxsZWwncyBNZXJnZSBhZnRlciBhXG4gICAgLy8gZmFuLW91dCwgVG9UJ3MgUHJ1bmVyKS4gU3RyaXBwaW5nIGl0IGJyb2tlIGNvbXBvc2l0ZSBzdWJmbG93cyDigJRcbiAgICAvLyB0aGUgam9pbiBzdGFnZSBuZXZlciByYW4sIHNvIHRoZSBzdWJmbG93IHJldHVybmVkIHBhcnRpYWwgc3RhdGUuXG4gICAgLy9cbiAgICAvLyBUaGUgb3V0ZXIgbW91bnQncyBwb3N0LXN1YmZsb3cgY29udGludWF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhdGVseVxuICAgIC8vIGJ5IHRoZSBwYXJlbnQgdHJhdmVyc2VyIHZpYSBgcGFyZW50Q29udGV4dC5uZXh0Tm9kZWAgYW5kIGlzIG5ldmVyXG4gICAgLy8gY29uZmxhdGVkIHdpdGggdGhlIGlubmVyIHN1YmZsb3cncyBgbmV4dGAgY2hhaW4uXG4gICAgY29uc3Qgc3ViZmxvd05vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgLi4ubm9kZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IGZhbHNlLFxuICAgIH07XG5cbiAgICAvLyDilIDilIDilIAgRXhlY3V0ZSB2aWEgZmFjdG9yeSB0cmF2ZXJzZXIg4pSA4pSA4pSAXG4gICAgLy8gVGhlIGZhY3RvcnkgY3JlYXRlcyBhIGZ1bGwgRmxvd2NoYXJ0VHJhdmVyc2VyIHdpdGggdGhlIHNhbWUgNy1waGFzZSBhbGdvcml0aG0sXG4gICAgLy8gc2hhcmluZyB0aGUgcGFyZW50J3Mgc3RhZ2VNYXAsIHN1YmZsb3dzIGRpY3QsIGFuZCBuYXJyYXRpdmUgZ2VuZXJhdG9yLlxuICAgIGxldCBzdWJmbG93T3V0cHV0OiBhbnk7XG4gICAgLy8gQm94ZWQ6IGEgc3RhZ2UgbWF5IHRocm93IEFOWSB2YWx1ZSwgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBpbmNsdWRlZCDigJRcbiAgICAvLyBhIGZhbHN5IHRocm93biB2YWx1ZSBtdXN0IHN0aWxsIGZhaWwgdGhlIG1vdW50LlxuICAgIGxldCBzdWJmbG93RXJyb3I6IHsgZXJyb3I6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhdmVyc2VySGFuZGxlOiBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgdHJhdmVyc2VySGFuZGxlID0gdGhpcy50cmF2ZXJzZXJGYWN0b3J5KHtcbiAgICAgICAgLy8gVGhlIFJFQUwgc3ViZmxvdyBncmFwaCDigJQgZXZlcnkgaWQgaW5zaWRlIHRoZSBzdWJmbG93IChsb29wIHRhcmdldHMsXG4gICAgICAgIC8vIGEgcmUtdmlzaXQgb2YgdGhlIHBhdXNlZCBzdGFnZSkgcmVzb2x2ZXMgYWdhaW5zdCBpdCwgcmUtZW50cnkgb3Igbm90LlxuICAgICAgICByb290OiBzdWJmbG93Tm9kZSxcbiAgICAgICAgLy8gV2hlcmUgdGhpcyB0cmF2ZXJzYWwgc3RhcnRzIG9uIGEgcmVzdW1lIHJlLWVudHJ5OyB2aXNpdGVkIG9uY2Ug4oCUXG4gICAgICAgIC8vIGFuZCB0aGUgc2libGluZyBwYXVzZXMgaXQgcmFpc2VzIG9uY2UgdGhhdCBlbnRyeSdzIGNoYWluIGVuZHMuXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LmVudHJ5ICYmIHsgZW50cnk6IHJlc3VtZUhvcC5lbnRyeSB9KSxcbiAgICAgICAgLi4uKHJlc3VtZUhvcD8ucGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IHJlc3VtZUhvcC5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBleGVjdXRpb25SdW50aW1lOiBuZXN0ZWRSdW50aW1lLFxuICAgICAgICByZWFkT25seUNvbnRleHQ6IG1hcHBlZElucHV0LFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCB0aGUgc3ViZmxvdyByb290XG4gICAgICAgIC8vIHN0YWdlJ3MgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIG1vdW50LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuXG4gICAgICBzdWJmbG93T3V0cHV0ID0gYXdhaXQgdHJhdmVyc2VySGFuZGxlLmV4ZWN1dGUoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBQYXVzZVNpZ25hbCBpcyBub3QgYW4gZXJyb3Ig4oCUIHByZXBlbmQgc3ViZmxvdyBJRCBhbmQgcmUtdGhyb3dcbiAgICAgIC8vIGltbWVkaWF0ZWx5LiBObyBlcnJvciBsb2dnaW5nLCBubyBzdWJmbG93UmVzdWx0IHJlY29yZGluZyDigJRcbiAgICAgIC8vIHRoZSBwYXVzZSBpcyBjb250cm9sIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gQkVGT1JFIHJlLXRocm93LCBjYXB0dXJlIHRoZSBuZXN0ZWQgcnVudGltZSdzIHN0YXRlIG9udG8gdGhlXG4gICAgICAvLyBzaWduYWwuIFRoaXMgaXMgdGhlIG9ubHkgY2hhbmNlIOKAlCBvbmNlIHdlIHJlLXRocm93LCB0aGUgb3V0ZXJcbiAgICAgIC8vIHRyYXZlcnNlciB1bndpbmRzIGFuZCB0aGUgbmVzdGVkIHJ1bnRpbWUgaXMgR0MnZC4gT24gcmVzdW1lLCB3ZSdsbFxuICAgICAgLy8gcmUtc2VlZCBhIGZyZXNoIG5lc3RlZCBydW50aW1lIGZyb20gdGhpcyBjYXB0dXJlIHNvIHJlc3VtZSBoYW5kbGVyc1xuICAgICAgLy8gY2FuIHJlYWQgdGhlIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBTVEFURSBvbmx5IOKAlCB0aGUgc3ViZmxvdydzIHdvcmtpbmcgbWVtb3J5IGF0IHBhdXNlIHRpbWUgKGV2ZXJ5XG4gICAgICAvLyBjb21taXR0ZWQgd3JpdGUgdXAgdG8gdGhlIHBhdXNlKSwgcmVhZCBzdHJhaWdodCBvZmYgaXRzIHN0b3JlLiBOb1xuICAgICAgLy8gc25hcHNob3QgaXMgYnVpbHQ6IGEgc25hcHNob3Qgd291bGQgYWxzbyBidWlsZCB0aGUgc3ViZmxvdydzXG4gICAgICAvLyBleGVjdXRpb24gdHJlZSBhbmQgY29weSBpdHMgY29tbWl0IGxvZyDigJQgd29yayBwcm9wb3J0aW9uYWwgdG8gaG93XG4gICAgICAvLyBsb25nIHRoZSBzdWJmbG93IHJhbiDigJQgdGhhdCB0aGUgbGVhbiBjaGVja3BvaW50IG5ldmVyIGNhcnJpZXNcbiAgICAgIC8vIChgcnVubmVyL2NoZWNrcG9pbnQudHNgKS5cbiAgICAgIC8vXG4gICAgICAvLyBDYXB0dXJlIGlzIGtleWVkIGJ5IHRoZSBTQU1FIHBhdGgtcHJlZml4ZWQgYHN1YmZsb3dJZGAgdXNlZCBpblxuICAgICAgLy8gYHN1YmZsb3dQYXRoYCwgc28gcmVzdW1lIGNhbiBsb29rIHVwIFwic2NvcGUgZm9yIHNmLWZvb1wiIGJ5IGlkLlxuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGVycm9yLmNhcHR1cmVTdWJmbG93U2NvcGUoc3ViZmxvd0lkLCBuZXN0ZWRSdW50aW1lLmdsb2JhbFN0b3JlLmdldFN0YXRlKCkpO1xuICAgICAgICBlcnJvci5wcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQpO1xuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ3BhdXNlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHN1YmZsb3dFcnJvciA9IHsgZXJyb3IgfTtcbiAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ3N1YmZsb3dFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwgeyBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIGVuZGVkIOKAlCBiZWZvcmUgdGhlIG1lcmdlLWJhY2ssIHdoaWNoIGNvbW1pdHMgb24gdGhlIFBBUkVOVCdzIGxvZy5cbiAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oc3ViZmxvd0Vycm9yID8gJ2ZhaWxlZCcgOiAnb2snKTtcblxuICAgIC8vIEFsd2F5cyBtZXJnZSBuZXN0ZWQgc3ViZmxvdyByZXN1bHRzIChldmVuIG9uIGVycm9yIOKAlCBwYXJ0aWFsIHJlc3VsdHMgYWlkIGRlYnVnZ2luZylcbiAgICBpZiAodHJhdmVyc2VySGFuZGxlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmF2ZXJzZXJIYW5kbGUuZ2V0U3ViZmxvd1Jlc3VsdHMoKSkge1xuICAgICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEJyZWFrIHByb3BhZ2F0aW9uIChvcHQtaW4gdmlhIFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWspIOKUgOKUgFxuICAgIC8vXG4gICAgLy8gSWYgdGhlIHN1YmZsb3cncyBpbm5lciB0cmF2ZXJzYWwgYnJva2UgKGJlY2F1c2UgYSBzdGFnZSBjYWxsZWRcbiAgICAvLyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgKSBBTkQgdGhlIG1vdW50IGRlY2xhcmVkIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsXG4gICAgLy8gZm9yd2FyZCB0aGUgYnJlYWsgc3RhdGUgdG8gdGhlIFBBUkVOVCdzIGJyZWFrRmxhZy4gVGhlIHBhcmVudFxuICAgIC8vIHRyYXZlcnNlciB3aWxsIHNlZSBgc2hvdWxkQnJlYWtgIG9uIGl0cyBuZXh0IHN0ZXAgYW5kIHN0b3AuXG4gICAgLy9cbiAgICAvLyBXaXRob3V0IHRoaXMsIGlubmVyIGJyZWFrcyBhcmUgbG9jYWxseSBzY29wZWQgdG8gdGhlIHN1YmZsb3cg4oCUIHRoZVxuICAgIC8vIHBhcmVudCBjb250aW51ZXMgYXMgaWYgdGhlIHN1YmZsb3cgcmV0dXJuZWQgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgcnVucyBCRUZPUkUgYG91dHB1dE1hcHBpbmdgIGJlbG93LCBpbnRlbnRpb25hbGx5LiBUaGVcbiAgICAvLyBvdXRwdXRNYXBwZXIgc3RpbGwgZXhlY3V0ZXMsIHNvIHRoZSBzdWJmbG93J3MgcGFydGlhbCByZXN1bHQgc3RpbGxcbiAgICAvLyBsYW5kcyBpbiB0aGUgcGFyZW50IHNjb3BlLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gc3VwcHJlc3Mgb3V0cHV0IG9uXG4gICAgLy8gYnJlYWsgY2hlY2sgdGhlIGJyZWFrIHN0YXRlIGluc2lkZSB0aGVpciBvdXRwdXRNYXBwZXIgYW5kIGVhcmx5LXJldHVybi5cbiAgICAvLyBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgIEpTRG9jIGZvciByYXRpb25hbGUuXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSAmJiBtb3VudE9wdGlvbnM/LnByb3BhZ2F0ZUJyZWFrID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpbm5lckJyZWFrID0gdHJhdmVyc2VySGFuZGxlLmdldEJyZWFrU3RhdGUoKTtcbiAgICAgIGlmIChpbm5lckJyZWFrLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIGJyZWFrRmxhZy5zaG91bGRCcmVhayA9IHRydWU7XG4gICAgICAgIGlmIChpbm5lckJyZWFrLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIGJyZWFrRmxhZy5yZWFzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGJyZWFrRmxhZy5yZWFzb24gPSBpbm5lckJyZWFrLnJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSYWlzZSBhIHBhcmVudC1sZXZlbCBvbkJyZWFrIGV2ZW50IHNvIHJlY29yZGVycyBjYW4gZGlzdGluZ3Vpc2hcbiAgICAgICAgLy8gdGhlIGlubmVyIG9yaWdpbmF0aW5nIGJyZWFrIChmaXJlZCBpbnNpZGUgdGhlIHN1YmZsb3cpIGZyb20gdGhpc1xuICAgICAgICAvLyBwcm9wYWdhdGVkIG9uZSAoZmlyZWQgYXQgdGhlIG1vdW50IGxldmVsIG9uIHRoZSBwYXJlbnQpLlxuICAgICAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uQnJlYWsoc3ViZmxvd05hbWUsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGlubmVyQnJlYWsucmVhc29uLCBzdWJmbG93SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dUcmVlQ29udGV4dCA9IG5lc3RlZFJ1bnRpbWUuZ2V0U25hcHNob3QoKTtcblxuICAgIC8vIOKUgOKUgOKUgCBPdXRwdXQgTWFwcGluZyDilIDilIDilIBcbiAgICBpZiAoIXN1YmZsb3dFcnJvciAmJiBtb3VudE9wdGlvbnM/Lm91dHB1dE1hcHBlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhlIG1lcmdlLWJhY2sgaXMgdGhlIE1PVU5UJ3MgYWN0LCBzbyB0aGUgbW91bnQncyBmcmFtZSBzdGFnZXMgYW5kXG4gICAgICAgIC8vIGNvbW1pdHMgaXQg4oCUIGl0cyBidW5kbGUgY2FycmllcyB0aGUgbW91bnQncyBydW50aW1lU3RhZ2VJZCAoUjEzKS5cbiAgICAgICAgLy8gQSBicmFuY2ggb3IgZm9yay1jaGlsZCBtb3VudCBzdGlsbCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0c1xuICAgICAgICAvLyBwYXJlbnQgd3JpdGVzICh0aGUgcGFyZW50J3MgcnVuIG5hbWVzcGFjZSksIGFzIGJlZm9yZTsgdW50aWwgOS4zMy4wXG4gICAgICAgIC8vIGl0IGNvbW1pdHRlZCBPTiB0aGUgcGFyZW50J3MgZnJhbWUsIHNvIHRoZSBidW5kbGUgbmFtZWQgdGhlIHN0YWdlXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgbW91bnQsIG9yIHRoZSBicmFuY2hpbmcgZGVjaWRlci5cbiAgICAgICAgY29uc3Qgb3V0cHV0Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSB7XG4gICAgICAgICAgb3V0cHV0Q29udGV4dC51c2VBZGRyZXNzT2YocGFyZW50Q29udGV4dC5wYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50U2NvcGUgPSBvdXRwdXRDb250ZXh0LmdldFNjb3BlKCk7XG4gICAgICAgIC8vIEZvciBUeXBlZFNjb3BlIHN1YmZsb3dzLCBzdGFnZSBmdW5jdGlvbnMgcmV0dXJuIHZvaWQg4oCUIGZhbGwgYmFjayB0byBhIHNoYWxsb3cgY2xvbmVcbiAgICAgICAgLy8gb2YgdGhlIHN1YmZsb3cncyBzaGFyZWQgc3RhdGUgc28gb3V0cHV0TWFwcGVyIGNhbiBhY2Nlc3MgYWxsIHNjb3BlIHZhbHVlcyB3cml0dGVuXG4gICAgICAgIC8vIGR1cmluZyB0aGUgc3ViZmxvdy4gV2Ugc2hhbGxvdy1jbG9uZSB0byBhdm9pZCBhbGlhc2luZyB0aGUgbGl2ZSBTaGFyZWRNZW1vcnkgY29udGV4dC5cbiAgICAgICAgLy8gTk9URTogdGhlIGZ1bGwgc2NvcGUgaXMgcGFzc2VkIChub3QganVzdCBkZWNsYXJlZCBvdXRwdXRzKSDigJQgb3V0cHV0TWFwcGVyIG11c3RcbiAgICAgICAgLy8gZXhwbGljaXRseSBzZWxlY3Qgd2hhdCB0byBwcm9wYWdhdGUgdG8gdGhlIHBhcmVudC5cbiAgICAgICAgLy8gUmVkYWN0aW9uOiBgYXBwbHlPdXRwdXRNYXBwaW5nYCB3cml0ZXMgdGhyb3VnaCBgb3V0cHV0Q29udGV4dGAgKGFcbiAgICAgICAgLy8gU3RhZ2VDb250ZXh0LCBub3QgYSBmYWNhZGUpLiBUaGUgY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBhc2tzIHRoZVxuICAgICAgICAvLyBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2hhcmVkIHdpdGggdGhlIHN1YmZsb3cncyBjb250ZXh0cywgc28gYSBrZXlcbiAgICAgICAgLy8gdGhlIHBvbGljeSBuYW1lcyBPUiBhIGtleSBtYXJrZWQgcGVyLWNhbGwgaW5zaWRlIHRoZSBzdWJmbG93IGlzXG4gICAgICAgIC8vIHNjcnViYmVkIGluIHRoZSBQQVJFTlQncyBsb2cgYW5kIG1pcnJvciB0b28gKDkuMTkuMDsgYmVmb3JlLCB0aGlzXG4gICAgICAgIC8vIG1lcmdlLWJhY2sgcmV0YWluZWQgcGxhaW50ZXh0KS5cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlT3V0cHV0ID0gc3ViZmxvd091dHB1dCA/PyB7IC4uLnN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSB9O1xuICAgICAgICBjb25zdCBtYXBwZWRPdXRwdXQgPSBhcHBseU91dHB1dE1hcHBpbmcoXG4gICAgICAgICAgZWZmZWN0aXZlT3V0cHV0LFxuICAgICAgICAgIHBhcmVudFNjb3BlLFxuICAgICAgICAgIG91dHB1dENvbnRleHQsXG4gICAgICAgICAgbW91bnRPcHRpb25zLFxuICAgICAgICAgIHJlZGFjdGlvblJ1bGUsXG4gICAgICAgICk7XG5cbiAgICAgICAgb3V0cHV0Q29udGV4dC5jb21taXQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gQSBtZXJnZS1iYWNrIHRoYXQgZmFpbGVkIHRvIGNvbW1pdCAoYW4gdW5jbG9uZWFibGUgdmFsdWUpIGxlYXZlcyBpdHNcbiAgICAgICAgLy8gd3JpdGVzIHN0YWdlZCBvbiB0aGUgbW91bnQncyBmcmFtZTsgdGhlIG1vdW50J3MgZXhpdCBjb21taXQgYmVsb3dcbiAgICAgICAgLy8gd291bGQgdGhyb3cgdGhlbSBhZ2Fpbiwgb3V0c2lkZSB0aGlzIGNhdGNoLiBUaHJvdWdoIDkuMzMuMCB0aGV5XG4gICAgICAgIC8vIHdlcmUgc3RhZ2VkIG9uIHRoZSBwYXJlbnQncyBmcmFtZSwgd2hpY2ggd2FzIG5vdCBjb21taXR0ZWQgYWdhaW4sXG4gICAgICAgIC8vIHNvIHRoZSBydW4gd2VudCBvbiDigJQgZHJvcCB0aGVtLCBhcyBpdCBkaWQuIEEgbGluZWFyIG1vdW50J3MgZnJhbWVcbiAgICAgICAgLy8gaXMgbGVmdCBhcyBpdCBhbHdheXMgd2FzLlxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkgcGFyZW50Q29udGV4dC5kaXNjYXJkU3RhZ2VkKCk7XG4gICAgICAgIHBhcmVudENvbnRleHQuYWRkRXJyb3IoJ291dHB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBvdXRwdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93UmVzdWx0OiBTdWJmbG93UmVzdWx0ID0ge1xuICAgICAgc3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiBzdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUsXG4gICAgICAgIHN0YWdlQ29udGV4dHM6IHN1YmZsb3dUcmVlQ29udGV4dC5leGVjdXRpb25UcmVlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGhpc3Rvcnk6IHN1YmZsb3dUcmVlQ29udGV4dC5jb21taXRMb2csXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUE4QjtJQUN2RCxJQUFJLEdBQXdDLENBQUM7SUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDbkMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIs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Q0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRyxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUVELGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdkQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgY2hpbGRMb2dBZGRyZXNzIH0gZnJvbSAnLi4vLi4vbWVtb3J5L2xvZ0FkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICAgIHNvdXJjZT86IHtcbiAgICAgICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgICAgIHJlYWRvbmx5IHVuYXZhaWxhYmxlPzogJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnO1xuICAgICAgICByZWFkb25seSBoaXN0b3J5T21pdHRlZD86IGJvb2xlYW47XG4gICAgICB9LFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIC8vIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSwgUDYpOiB3aGVuIHRoZSBydW4gd3JpdGVzIHRvIGEgc2luaywgdGhlIG1vdW50J3Mgb3duIGxvZyBkb2VzIHRvbywgYXQgdGhlXG4gICAgLy8gcGFyZW50IGxvZydzIGFkZHJlc3MgcGx1cyB0aGlzIG1vdW50J3MgcnVudGltZVN0YWdlSWQg4oCUIG9wZW5lZCBoZXJlLCBpdHMgc2VlZCBhbmQgZXZlcnkgY29tbWl0IGFzIHRoZXkgbGFuZCxcbiAgICAvLyBjbG9zZWQgYXQgdGhlIG1vdW50J3MgZXhpdCAob3IgaXRzIHBhdXNlLCBvciBpdHMgZmFpbHVyZSkuIFdpdGhvdXQgYSBzaW5rOiB1bmRlZmluZWQsIHRoZSBwbGFpbiBsb2cuXG4gICAgY29uc3QgbW91bnRSdW50aW1lU3RhZ2VJZCA9IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHBhcmVudExvZ0FkZHJlc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3M7XG4gICAgLy8gSWRlbnRpdHkgZm9sbG93cyB0aGUgc2FtZSBuYXRpdmUgbG9nIGFkZHJlc3MgYXMgc3RvcmFnZSwgZXZlbiBmb3IgYW4gaW4tbWVtb3J5IGNoaWxkLlxuICAgIC8vIEEgbWlzc2luZyBuYXRpdmUgcGFyZW50L21vdW50IGlkZW50aXR5IGNhbm5vdCBiZSByZXBsYWNlZCB3aXRoIGEgcGF0aC9uYW1lIGd1ZXNzLlxuICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBwb2xpY3kucmVhZFNvdXJjZXMgPyBjaGlsZExvZ0FkZHJlc3MocGFyZW50TG9nQWRkcmVzcywgbW91bnRSdW50aW1lU3RhZ2VJZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkID1cbiAgICAgIG1vdW50UnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLnJlY29yZEZvcj8uKG1vdW50UnVudGltZVN0YWdlSWQsIHsgc3ViZmxvd0lkIH0pO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKFxuICAgICAgZmlyc3ROb2RlLm5hbWUsXG4gICAgICBmaXJzdE5vZGUuaWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBwb2xpY3ksXG4gICAgICByZWNvcmQsXG4gICAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW5JZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJ1bklkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgLi4uKHNvdXJjZUFkZHJlc3MgPyB7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSA6IHsgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyBhcyBjb25zdCB9KSxcbiAgICAgICAgICAgIC4uLihpc1Jlc3VtZUZvclRoaXNTdWJmbG93ICYmIHsgaGlzdG9yeU9taXR0ZWQ6IHRydWUgfSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICApO1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgICAgKGBtYXBwZWRJbnB1dGAgc3RpbGwgcmVhY2hlcyB0aGUgc3RhZ2VzLCBhcyB0aGVpciByZWFkLW9ubHkgYXJncy4pXG4gICAgLy8gICDigKIgTm9ybWFsIGVudHJ5IOKGkiBzZWVkIGZyb20gdGhlIGlucHV0TWFwcGVyJ3MgbWFwcGVkSW5wdXQuXG4gICAgY29uc3Qgc2VlZFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID8gcmVzdW1lQ2FwdHVyZSEgOiBtYXBwZWRJbnB1dDtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VlZFZhbHVlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIHNlZWQgaXMgY29tbWl0dGVkIGFzIHRoZSBzdWJmbG93J3MgYGhpc3RvcnlbMF1gIGJ5IGl0cyByb290XG4gICAgICAvLyBjb250ZXh0LCBub3QgYnkgYSBmYWNhZGUg4oCUIHRoYXQgZnJhbWUgYWxyZWFkeSBob2xkcyB0aGUgcnVuJ3MgcG9saWN5XG4gICAgICAvLyAodGhlIHJ1bnRpbWUgd2FzIGNvbnN0cnVjdGVkIHdpdGggaXQpLCBzbyB0aGUgc2VlZCByZXRhaW5zIHVuZGVyIHRoZVxuICAgICAgLy8gcnVsZSwgbGFuZHMgaW4gdGhlIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIsIGFuZCBjb21taXRzIHVuZGVyIHRoZVxuICAgICAgLy8gcnVuJ3MgZGlhbHMgbGlrZSBldmVyeSBvdGhlciB3cml0ZSAoQy1GNTogdW5kZXIgYHdyaXRlUHJvdmVuYW5jZTpcbiAgICAgIC8vICdyZWFkcy1wcmVmaXgnYCBpdHMgcm93cyBjYXJyeSBgcmVhZEtleXM6IFtdYCkuXG4gICAgICAvLyBUaGUgc2VlZCBpcyB0aGUgbW91bnQncyBhY3QgdG9vOiBpdHMgYnVuZGxlIOKAlCBgaGlzdG9yeVswXWAgb2YgdGhlXG4gICAgICAvLyBzdWJmbG93J3Mgb3duIGxvZyDigJQgY2FycmllcyB0aGUgbW91bnQncyBzdGFnZSwgc3RhZ2VJZCBhbmRcbiAgICAgIC8vIHJ1bnRpbWVTdGFnZUlkIChSMTM7IHRocm91Z2ggOS4zMy4wIGl0IGNhcnJpZWQgcnVudGltZVN0YWdlSWQgJycgYW5kXG4gICAgICAvLyB0aGUgZmlyc3Qgc3RhZ2UncyBuYW1lcywgd2hpY2ggb24gYSByZXN1bWUgd2FzIHRoZSByZS1lbnRyeSBwb2ludCkuXG4gICAgICB0cnkge1xuICAgICAgICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlKG5lc3RlZFJ1bnRpbWUsIHNlZWRWYWx1ZXMsIHBhcmVudENvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBvcGVuZWQgYWJvdmU6IGEgc2VlZCB0aGF0IGZhaWxzIGNsb3NlcyBpdCwgbmV2ZXIgbGVhdmVzIGl0IGxvb2tpbmcgY3Jhc2hlZC5cbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdmYWlsZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LiBgbmV3Um9vdGAgZ2l2ZXMgaXRcbiAgICAgIC8vIHRoZSBzYW1lIHBvbGljeSBhbmQgbWlycm9yLlxuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUnVudGltZS5uZXdSb290KGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgc3ViZmxvdyByb290IG5vZGUg4oCUIHN0cmlwIGlzU3ViZmxvd1Jvb3QgdG8gcHJldmVudCByZS1kZWxlZ2F0aW9uLlxuICAgIC8vXG4gICAgLy8gUFJFU0VSVkUgYG5leHRgLiBFYXJsaWVyIHJldmlzaW9ucyBzdHJpcHBlZCBgbmV4dGAgd2hlbmV2ZXIgdGhlXG4gICAgLy8gc3ViZmxvdyByb290IGhhZCBjaGlsZHJlbiwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBgbmV4dGAgd2FzXG4gICAgLy8gYWx3YXlzIHRoZSBPVVRFUiBtb3VudCdzIGNvbnRpbnVhdGlvbiBsZWFraW5nIGludG8gdGhlIGlubmVyXG4gICAgLy8gdHJlZS4gVGhhdCBhc3N1bXB0aW9uIHdhcyB3cm9uZzogdGhlIHJlc29sdmVkIHN1YmZsb3cgcm9vdCdzXG4gICAgLy8gYG5leHRgIGlzIHRoZSBJTk5FUiBqb2luIHN0YWdlIChlLmcuLCBQYXJhbGxlbCdzIE1lcmdlIGFmdGVyIGFcbiAgICAvLyBmYW4tb3V0LCBUb1QncyBQcnVuZXIpLiBTdHJpcHBpbmcgaXQgYnJva2UgY29tcG9zaXRlIHN1YmZsb3dzIOKAlFxuICAgIC8vIHRoZSBqb2luIHN0YWdlIG5ldmVyIHJhbiwgc28gdGhlIHN1YmZsb3cgcmV0dXJuZWQgcGFydGlhbCBzdGF0ZS5cbiAgICAvL1xuICAgIC8vIFRoZSBvdXRlciBtb3VudCdzIHBvc3Qtc3ViZmxvdyBjb250aW51YXRpb24gaXMgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gYnkgdGhlIHBhcmVudCB0cmF2ZXJzZXIgdmlhIGBwYXJlbnRDb250ZXh0Lm5leHROb2RlYCBhbmQgaXMgbmV2ZXJcbiAgICAvLyBjb25mbGF0ZWQgd2l0aCB0aGUgaW5uZXIgc3ViZmxvdydzIGBuZXh0YCBjaGFpbi5cbiAgICBjb25zdCBzdWJmbG93Tm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICAuLi5ub2RlLFxuICAgICAgaXNTdWJmbG93Um9vdDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBFeGVjdXRlIHZpYSBmYWN0b3J5IHRyYXZlcnNlciDilIDilIDilIBcbiAgICAvLyBUaGUgZmFjdG9yeSBjcmVhdGVzIGEgZnVsbCBGbG93Y2hhcnRUcmF2ZXJzZXIgd2l0aCB0aGUgc2FtZSA3LXBoYXNlIGFsZ29yaXRobSxcbiAgICAvLyBzaGFyaW5nIHRoZSBwYXJlbnQncyBzdGFnZU1hcCwgc3ViZmxvd3MgZGljdCwgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0b3IuXG4gICAgbGV0IHN1YmZsb3dPdXRwdXQ6IGFueTtcbiAgICAvLyBCb3hlZDogYSBzdGFnZSBtYXkgdGhyb3cgQU5ZIHZhbHVlLCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGluY2x1ZGVkIOKAlFxuICAgIC8vIGEgZmFsc3kgdGhyb3duIHZhbHVlIG11c3Qgc3RpbGwgZmFpbCB0aGUgbW91bnQuXG4gICAgbGV0IHN1YmZsb3dFcnJvcjogeyBlcnJvcjogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCB0cmF2ZXJzZXJIYW5kbGU6IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0cmF2ZXJzZXJIYW5kbGUgPSB0aGlzLnRyYXZlcnNlckZhY3Rvcnkoe1xuICAgICAgICAvLyBUaGUgUkVBTCBzdWJmbG93IGdyYXBoIOKAlCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgKGxvb3AgdGFyZ2V0cyxcbiAgICAgICAgLy8gYSByZS12aXNpdCBvZiB0aGUgcGF1c2VkIHN0YWdlKSByZXNvbHZlcyBhZ2FpbnN0IGl0LCByZS1lbnRyeSBvciBub3QuXG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICAvLyBXaGVyZSB0aGlzIHRyYXZlcnNhbCBzdGFydHMgb24gYSByZXN1bWUgcmUtZW50cnk7IHZpc2l0ZWQgb25jZSDigJRcbiAgICAgICAgLy8gYW5kIHRoZSBzaWJsaW5nIHBhdXNlcyBpdCByYWlzZXMgb25jZSB0aGF0IGVudHJ5J3MgY2hhaW4gZW5kcy5cbiAgICAgICAgLi4uKHJlc3VtZUhvcD8uZW50cnkgJiYgeyBlbnRyeTogcmVzdW1lSG9wLmVudHJ5IH0pLFxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogcmVzdW1lSG9wLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IG5lc3RlZFJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBzdWJmbG93IHJvb3RcbiAgICAgICAgLy8gc3RhZ2UncyBgcGFyZW50UnVudGltZVN0YWdlSWRgIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgbW91bnQuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgfSk7XG5cbiAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0cmF2ZXJzZXJIYW5kbGUuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIG5vdCBhbiBlcnJvciDigJQgcHJlcGVuZCBzdWJmbG93IElEIGFuZCByZS10aHJvd1xuICAgICAgLy8gaW1tZWRpYXRlbHkuIE5vIGVycm9yIGxvZ2dpbmcsIG5vIHN1YmZsb3dSZXN1bHQgcmVjb3JkaW5nIOKAlFxuICAgICAgLy8gdGhlIHBhdXNlIGlzIGNvbnRyb2wgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBCRUZPUkUgcmUtdGhyb3csIGNhcHR1cmUgdGhlIG5lc3RlZCBydW50aW1lJ3Mgc3RhdGUgb250byB0aGVcbiAgICAgIC8vIHNpZ25hbC4gVGhpcyBpcyB0aGUgb25seSBjaGFuY2Ug4oCUIG9uY2Ugd2UgcmUtdGhyb3csIHRoZSBvdXRlclxuICAgICAgLy8gdHJhdmVyc2VyIHVud2luZHMgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBpcyBHQydkLiBPbiByZXN1bWUsIHdlJ2xsXG4gICAgICAvLyByZS1zZWVkIGEgZnJlc2ggbmVzdGVkIHJ1bnRpbWUgZnJvbSB0aGlzIGNhcHR1cmUgc28gcmVzdW1lIGhhbmRsZXJzXG4gICAgICAvLyBjYW4gcmVhZCB0aGUgcHJlLXBhdXNlIHN1YmZsb3cgc2NvcGUuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIFNUQVRFIG9ubHkg4oCUIHRoZSBzdWJmbG93J3Mgd29ya2luZyBtZW1vcnkgYXQgcGF1c2UgdGltZSAoZXZlcnlcbiAgICAgIC8vIGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgc3RvcmUuIE5vXG4gICAgICAvLyBzbmFwc2hvdCBpcyBidWlsdDogYSBzbmFwc2hvdCB3b3VsZCBhbHNvIGJ1aWxkIHRoZSBzdWJmbG93J3NcbiAgICAgIC8vIGV4ZWN1dGlvbiB0cmVlIGFuZCBjb3B5IGl0cyBjb21taXQgbG9nIOKAlCB3b3JrIHByb3BvcnRpb25hbCB0byBob3dcbiAgICAgIC8vIGxvbmcgdGhlIHN1YmZsb3cgcmFuIOKAlCB0aGF0IHRoZSBsZWFuIGNoZWNrcG9pbnQgbmV2ZXIgY2Fycmllc1xuICAgICAgLy8gKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgIGVycm9yLnByZXBlbmRTdWJmbG93KHN1YmZsb3dJZCk7XG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LigncGF1c2VkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgc3ViZmxvd0Vycm9yID0geyBlcnJvciB9O1xuICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignc3ViZmxvd0Vycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgZW5kZWQg4oCUIGJlZm9yZSB0aGUgbWVyZ2UtYmFjaywgd2hpY2ggY29tbWl0cyBvbiB0aGUgUEFSRU5UJ3MgbG9nLlxuICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LihzdWJmbG93RXJyb3IgPyAnZmFpbGVkJyA6ICdvaycpO1xuXG4gICAgLy8gQWx3YXlzIG1lcmdlIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGV2ZW4gb24gZXJyb3Ig4oCUIHBhcnRpYWwgcmVzdWx0cyBhaWQgZGVidWdnaW5nKVxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYXZlcnNlckhhbmRsZS5nZXRTdWJmbG93UmVzdWx0cygpKSB7XG4gICAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQnJlYWsgcHJvcGFnYXRpb24gKG9wdC1pbiB2aWEgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVhaykg4pSA4pSAXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgc3ViZmxvdydzIGlubmVyIHRyYXZlcnNhbCBicm9rZSAoYmVjYXVzZSBhIHN0YWdlIGNhbGxlZFxuICAgIC8vIGBzY29wZS4kYnJlYWsocmVhc29uKWApIEFORCB0aGUgbW91bnQgZGVjbGFyZWQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCxcbiAgICAvLyBmb3J3YXJkIHRoZSBicmVhayBzdGF0ZSB0byB0aGUgUEFSRU5UJ3MgYnJlYWtGbGFnLiBUaGUgcGFyZW50XG4gICAgLy8gdHJhdmVyc2VyIHdpbGwgc2VlIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgc3RvcC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgaW5uZXIgYnJlYWtzIGFyZSBsb2NhbGx5IHNjb3BlZCB0byB0aGUgc3ViZmxvdyDigJQgdGhlXG4gICAgLy8gcGFyZW50IGNvbnRpbnVlcyBhcyBpZiB0aGUgc3ViZmxvdyByZXR1cm5lZCBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVDogdGhpcyBydW5zIEJFRk9SRSBgb3V0cHV0TWFwcGluZ2AgYmVsb3csIGludGVudGlvbmFsbHkuIFRoZVxuICAgIC8vIG91dHB1dE1hcHBlciBzdGlsbCBleGVjdXRlcywgc28gdGhlIHN1YmZsb3cncyBwYXJ0aWFsIHJlc3VsdCBzdGlsbFxuICAgIC8vIGxhbmRzIGluIHRoZSBwYXJlbnQgc2NvcGUuIENvbnN1bWVycyB3aG8gbmVlZCB0byBzdXBwcmVzcyBvdXRwdXQgb25cbiAgICAvLyBicmVhayBjaGVjayB0aGUgYnJlYWsgc3RhdGUgaW5zaWRlIHRoZWlyIG91dHB1dE1hcHBlciBhbmQgZWFybHktcmV0dXJuLlxuICAgIC8vIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AgSlNEb2MgZm9yIHJhdGlvbmFsZS5cbiAgICBpZiAodHJhdmVyc2VySGFuZGxlICYmIG1vdW50T3B0aW9ucz8ucHJvcGFnYXRlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlubmVyQnJlYWsgPSB0cmF2ZXJzZXJIYW5kbGUuZ2V0QnJlYWtTdGF0ZSgpO1xuICAgICAgaWYgKGlubmVyQnJlYWsuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlubmVyQnJlYWsucmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IGlubmVyQnJlYWsucmVhc29uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhaXNlIGEgcGFyZW50LWxldmVsIG9uQnJlYWsgZXZlbnQgc28gcmVjb3JkZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgICAvLyB0aGUgaW5uZXIgb3JpZ2luYXRpbmcgYnJlYWsgKGZpcmVkIGluc2lkZSB0aGUgc3ViZmxvdykgZnJvbSB0aGlzXG4gICAgICAgIC8vIHByb3BhZ2F0ZWQgb25lIChmaXJlZCBhdCB0aGUgbW91bnQgbGV2ZWwgb24gdGhlIHBhcmVudCkuXG4gICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhzdWJmbG93TmFtZSwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgaW5uZXJCcmVhay5yZWFzb24sIHN1YmZsb3dJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1RyZWVDb250ZXh0ID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgLy8g4pSA4pSA4pSAIE91dHB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIGlmICghc3ViZmxvd0Vycm9yICYmIG1vdW50T3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgbWVyZ2UtYmFjayBpcyB0aGUgTU9VTlQncyBhY3QsIHNvIHRoZSBtb3VudCdzIGZyYW1lIHN0YWdlcyBhbmRcbiAgICAgICAgLy8gY29tbWl0cyBpdCDigJQgaXRzIGJ1bmRsZSBjYXJyaWVzIHRoZSBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIChSMTMpLlxuICAgICAgICAvLyBBIGJyYW5jaCBvciBmb3JrLWNoaWxkIG1vdW50IHN0aWxsIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzXG4gICAgICAgIC8vIHBhcmVudCB3cml0ZXMgKHRoZSBwYXJlbnQncyBydW4gbmFtZXNwYWNlKSwgYXMgYmVmb3JlOyB1bnRpbCA5LjMzLjBcbiAgICAgICAgLy8gaXQgY29tbWl0dGVkIE9OIHRoZSBwYXJlbnQncyBmcmFtZSwgc28gdGhlIGJ1bmRsZSBuYW1lZCB0aGUgc3RhZ2VcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBtb3VudCwgb3IgdGhlIGJyYW5jaGluZyBkZWNpZGVyLlxuICAgICAgICBjb25zdCBvdXRwdXRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LnVzZUFkZHJlc3NPZihwYXJlbnRDb250ZXh0LnBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IG91dHB1dENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gRm9yIFR5cGVkU2NvcGUgc3ViZmxvd3MsIHN0YWdlIGZ1bmN0aW9ucyByZXR1cm4gdm9pZCDigJQgZmFsbCBiYWNrIHRvIGEgc2hhbGxvdyBjbG9uZVxuICAgICAgICAvLyBvZiB0aGUgc3ViZmxvdydzIHNoYXJlZCBzdGF0ZSBzbyBvdXRwdXRNYXBwZXIgY2FuIGFjY2VzcyBhbGwgc2NvcGUgdmFsdWVzIHdyaXR0ZW5cbiAgICAgICAgLy8gZHVyaW5nIHRoZSBzdWJmbG93LiBXZSBzaGFsbG93LWNsb25lIHRvIGF2b2lkIGFsaWFzaW5nIHRoZSBsaXZlIFNoYXJlZE1lbW9yeSBjb250ZXh0LlxuICAgICAgICAvLyBOT1RFOiB0aGUgZnVsbCBzY29wZSBpcyBwYXNzZWQgKG5vdCBqdXN0IGRlY2xhcmVkIG91dHB1dHMpIOKAlCBvdXRwdXRNYXBwZXIgbXVzdFxuICAgICAgICAvLyBleHBsaWNpdGx5IHNlbGVjdCB3aGF0IHRvIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50LlxuICAgICAgICAvLyBSZWRhY3Rpb246IGBhcHBseU91dHB1dE1hcHBpbmdgIHdyaXRlcyB0aHJvdWdoIGBvdXRwdXRDb250ZXh0YCAoYVxuICAgICAgICAvLyBTdGFnZUNvbnRleHQsIG5vdCBhIGZhY2FkZSkuIFRoZSBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGFza3MgdGhlXG4gICAgICAgIC8vIHJ1bidzIHJlZGFjdGlvbiBydWxlIOKAlCBzaGFyZWQgd2l0aCB0aGUgc3ViZmxvdydzIGNvbnRleHRzLCBzbyBhIGtleVxuICAgICAgICAvLyB0aGUgcG9saWN5IG5hbWVzIE9SIGEga2V5IG1hcmtlZCBwZXItY2FsbCBpbnNpZGUgdGhlIHN1YmZsb3cgaXNcbiAgICAgICAgLy8gc2NydWJiZWQgaW4gdGhlIFBBUkVOVCdzIGxvZyBhbmQgbWlycm9yIHRvbyAoOS4xOS4wOyBiZWZvcmUsIHRoaXNcbiAgICAgICAgLy8gbWVyZ2UtYmFjayByZXRhaW5lZCBwbGFpbnRleHQpLlxuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXQgPSBzdWJmbG93T3V0cHV0ID8/IHsgLi4uc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlIH07XG4gICAgICAgIGNvbnN0IG1hcHBlZE91dHB1dCA9IGFwcGx5T3V0cHV0TWFwcGluZyhcbiAgICAgICAgICBlZmZlY3RpdmVPdXRwdXQsXG4gICAgICAgICAgcGFyZW50U2NvcGUsXG4gICAgICAgICAgb3V0cHV0Q29udGV4dCxcbiAgICAgICAgICBtb3VudE9wdGlvbnMsXG4gICAgICAgICAgcmVkYWN0aW9uUnVsZSxcbiAgICAgICAgKTtcblxuICAgICAgICBvdXRwdXRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBBIG1lcmdlLWJhY2sgdGhhdCBmYWlsZWQgdG8gY29tbWl0IChhbiB1bmNsb25lYWJsZSB2YWx1ZSkgbGVhdmVzIGl0c1xuICAgICAgICAvLyB3cml0ZXMgc3RhZ2VkIG9uIHRoZSBtb3VudCdzIGZyYW1lOyB0aGUgbW91bnQncyBleGl0IGNvbW1pdCBiZWxvd1xuICAgICAgICAvLyB3b3VsZCB0aHJvdyB0aGVtIGFnYWluLCBvdXRzaWRlIHRoaXMgY2F0Y2guIFRocm91Z2ggOS4zMy4wIHRoZXlcbiAgICAgICAgLy8gd2VyZSBzdGFnZWQgb24gdGhlIHBhcmVudCdzIGZyYW1lLCB3aGljaCB3YXMgbm90IGNvbW1pdHRlZCBhZ2FpbixcbiAgICAgICAgLy8gc28gdGhlIHJ1biB3ZW50IG9uIOKAlCBkcm9wIHRoZW0sIGFzIGl0IGRpZC4gQSBsaW5lYXIgbW91bnQncyBmcmFtZVxuICAgICAgICAvLyBpcyBsZWZ0IGFzIGl0IGFsd2F5cyB3YXMuXG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSBwYXJlbnRDb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIG91dHB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dSZXN1bHQ6IFN1YmZsb3dSZXN1bHQgPSB7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogc3ViZmxvd1RyZWVDb250ZXh0LmV4ZWN1dGlvblRyZWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogc3ViZmxvd1RyZWVDb250ZXh0LmNvbW1pdExvZyxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiBzdWJmbG93VHJlZUNvbnRleHQucmVhZFNvdXJjZXMgfSksXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
@@ -17,6 +17,7 @@
17
17
  * key and the `#n` twin of one mount point at ONE raw result and are served
18
18
  * as ONE substituted result.
19
19
  */
20
+ import { redactReadSources } from '../../capture/readSources.js';
20
21
  /** The nested mirror's final state, keyed by the raw result it belongs to. */
21
22
  const redactedStates = new WeakMap();
22
23
  /** Remember the served (mirror) state of a subflow result. Absent without a policy. */
@@ -39,12 +40,22 @@ export function servedSubflowResults(results, redact) {
39
40
  let entry = servedByRaw.get(result);
40
41
  if (entry === undefined) {
41
42
  const mirror = redactedStates.get(result);
43
+ const sources = result.treeContext.readSources;
42
44
  entry =
43
- mirror === undefined ? result : { ...result, treeContext: { ...result.treeContext, globalContext: mirror } };
45
+ mirror === undefined && sources === undefined
46
+ ? result
47
+ : {
48
+ ...result,
49
+ treeContext: {
50
+ ...result.treeContext,
51
+ ...(mirror !== undefined && { globalContext: mirror }),
52
+ ...(sources && { readSources: redactReadSources(sources) }),
53
+ },
54
+ };
44
55
  servedByRaw.set(result, entry);
45
56
  }
46
57
  served[key] = entry;
47
58
  }
48
59
  return served;
49
60
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBSUgsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2VydmVkU3ViZmxvd1Jlc3VsdHMg4oCUIHRoZSBPTkUgcGxhY2UgdGhhdCBkZWNpZGVzIHdoaWNoIHN0YXRlIGEgc3ViZmxvdydzXG4gKiByZXN1bHQgc2VydmVzIHVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgKDkuMjAuMCkuXG4gKlxuICogQSBgU3ViZmxvd1Jlc3VsdGAgaXMgYnVpbHQgb25jZSBieSBgU3ViZmxvd0V4ZWN1dG9yYCB3aXRoIHRoZSBzdWJmbG93J3MgcmF3XG4gKiBoZWFwIGFzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCDigJQgdGhlIGxpdmUgdmlldyB0aGUgcGxhaW4gc25hcHNob3RcbiAqIGtlZXBzICh0aGUgcGF1c2UgY2hlY2twb2ludCBrZWVwcyBubyBzdWJmbG93IHJlc3VsdDogZm9ybWF0IDIpLiBXaGVuIHRoZVxuICogcnVuIGtlZXBzIGEgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbmVzdGVkXG4gKiBydW50aW1lIGtlZXBzIG9uZSB0b28gKGVuYWJsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdGhlIHdheSB0aGUgcm9vdCBkb2VzKSxcbiAqIGFuZCBpdHMgZmluYWwgc3RhdGUgaXMgUkVNRU1CRVJFRCBoZXJlIGJlc2lkZSB0aGUgcmVzdWx0IOKAlCBuZXZlciB3cml0dGVuXG4gKiBpbnRvIHRoZSByZXN1bHQsIHNvIHRoZSBwbGFpbiBzbmFwc2hvdCBzdGF5cyBieXRlLWlkZW50aWNhbCwgYW5kIG5ldmVyXG4gKiBzY3J1YmJlZCBhIHNlY29uZCB0aW1lOiB0aGUgbWlycm9yIGFscmVhZHkgaG9sZHMgZXhhY3RseSB3aGF0IHRoZSBzdWJmbG93J3NcbiAqIGxvZyBob2xkcyAoYHN0YXRlQXRgIG92ZXIgYHRyZWVDb250ZXh0Lmhpc3RvcnlgIGZvbGRzIHRvIGl0KS5cbiAqXG4gKiBUaGUgYXNzb2NpYXRpb24gaXMgYnkgb2JqZWN0IGlkZW50aXR5LCBzbyBpdCBzdXJ2aXZlcyB0aGUgdXB3YXJkIG1lcmdlIG9mXG4gKiBuZXN0ZWQgdHJhdmVyc2VycycgcmVzdWx0IG1hcHMgYW5kIGtlZXBzIHRoZSBkdWFsIGtleWluZyBob25lc3Q6IHRoZSBwYXRoXG4gKiBrZXkgYW5kIHRoZSBgI25gIHR3aW4gb2Ygb25lIG1vdW50IHBvaW50IGF0IE9ORSByYXcgcmVzdWx0IGFuZCBhcmUgc2VydmVkXG4gKiBhcyBPTkUgc3Vic3RpdHV0ZWQgcmVzdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBlbnRyeSA9XG4gICAgICAgIG1pcnJvciA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogeyAuLi5yZXN1bHQsIHRyZWVDb250ZXh0OiB7IC4uLnJlc3VsdC50cmVlQ29udGV4dCwgZ2xvYmFsQ29udGV4dDogbWlycm9yIH0gfTtcbiAgICAgIHNlcnZlZEJ5UmF3LnNldChyZXN1bHQsIGVudHJ5KTtcbiAgICB9XG4gICAgc2VydmVkW2tleV0gPSBlbnRyeTtcbiAgfVxuICByZXR1cm4gc2VydmVkO1xufVxuIl19
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakUsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQy9DLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFDM0MsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDO3dCQUNFLEdBQUcsTUFBTTt3QkFDVCxXQUFXLEVBQUU7NEJBQ1gsR0FBRyxNQUFNLENBQUMsV0FBVzs0QkFDckIsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7NEJBQ3RELEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt5QkFDNUQ7cUJBQ0YsQ0FBQztZQUNSLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyDigJQgdGhlIE9ORSBwbGFjZSB0aGF0IGRlY2lkZXMgd2hpY2ggc3RhdGUgYSBzdWJmbG93J3NcbiAqIHJlc3VsdCBzZXJ2ZXMgdW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCAoOS4yMC4wKS5cbiAqXG4gKiBBIGBTdWJmbG93UmVzdWx0YCBpcyBidWlsdCBvbmNlIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHdpdGggdGhlIHN1YmZsb3cncyByYXdcbiAqIGhlYXAgYXMgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIOKAlCB0aGUgbGl2ZSB2aWV3IHRoZSBwbGFpbiBzbmFwc2hvdFxuICoga2VlcHMgKHRoZSBwYXVzZSBjaGVja3BvaW50IGtlZXBzIG5vIHN1YmZsb3cgcmVzdWx0OiBmb3JtYXQgMikuIFdoZW4gdGhlXG4gKiBydW4ga2VlcHMgYSByZWRhY3RlZCBtaXJyb3IsIHRoZSBuZXN0ZWRcbiAqIHJ1bnRpbWUga2VlcHMgb25lIHRvbyAoZW5hYmxlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGUgd2F5IHRoZSByb290IGRvZXMpLFxuICogYW5kIGl0cyBmaW5hbCBzdGF0ZSBpcyBSRU1FTUJFUkVEIGhlcmUgYmVzaWRlIHRoZSByZXN1bHQg4oCUIG5ldmVyIHdyaXR0ZW5cbiAqIGludG8gdGhlIHJlc3VsdCwgc28gdGhlIHBsYWluIHNuYXBzaG90IHN0YXlzIGJ5dGUtaWRlbnRpY2FsLCBhbmQgbmV2ZXJcbiAqIHNjcnViYmVkIGEgc2Vjb25kIHRpbWU6IHRoZSBtaXJyb3IgYWxyZWFkeSBob2xkcyBleGFjdGx5IHdoYXQgdGhlIHN1YmZsb3cnc1xuICogbG9nIGhvbGRzIChgc3RhdGVBdGAgb3ZlciBgdHJlZUNvbnRleHQuaGlzdG9yeWAgZm9sZHMgdG8gaXQpLlxuICpcbiAqIFRoZSBhc3NvY2lhdGlvbiBpcyBieSBvYmplY3QgaWRlbnRpdHksIHNvIGl0IHN1cnZpdmVzIHRoZSB1cHdhcmQgbWVyZ2Ugb2ZcbiAqIG5lc3RlZCB0cmF2ZXJzZXJzJyByZXN1bHQgbWFwcyBhbmQga2VlcHMgdGhlIGR1YWwga2V5aW5nIGhvbmVzdDogdGhlIHBhdGhcbiAqIGtleSBhbmQgdGhlIGAjbmAgdHdpbiBvZiBvbmUgbW91bnQgcG9pbnQgYXQgT05FIHJhdyByZXN1bHQgYW5kIGFyZSBzZXJ2ZWRcbiAqIGFzIE9ORSBzdWJzdGl0dXRlZCByZXN1bHQuXG4gKi9cblxuaW1wb3J0IHsgcmVkYWN0UmVhZFNvdXJjZXMgfSBmcm9tICcuLi8uLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBjb25zdCBzb3VyY2VzID0gcmVzdWx0LnRyZWVDb250ZXh0LnJlYWRTb3VyY2VzO1xuICAgICAgZW50cnkgPVxuICAgICAgICBtaXJyb3IgPT09IHVuZGVmaW5lZCAmJiBzb3VyY2VzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LnRyZWVDb250ZXh0LFxuICAgICAgICAgICAgICAgIC4uLihtaXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IGdsb2JhbENvbnRleHQ6IG1pcnJvciB9KSxcbiAgICAgICAgICAgICAgICAuLi4oc291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiByZWRhY3RSZWFkU291cmNlcyhzb3VyY2VzKSB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICBzZXJ2ZWRCeVJhdy5zZXQocmVzdWx0LCBlbnRyeSk7XG4gICAgfVxuICAgIHNlcnZlZFtrZXldID0gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHNlcnZlZDtcbn1cbiJdfQ==
@@ -346,6 +346,7 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
346
346
  executionTree: unknown;
347
347
  initialState?: Record<string, unknown> | undefined;
348
348
  commitLog: unknown[];
349
+ readSources?: import("../../capture/readSources.js").EngineReadSources | undefined;
349
350
  logAddress?: import("foottrace").LogAddress | undefined;
350
351
  subflowResults?: Record<string, unknown> | undefined;
351
352
  recorders?: {
@@ -261,6 +261,8 @@ export interface SubflowResult {
261
261
  globalContext: Record<string, unknown>;
262
262
  stageContexts: Record<string, unknown>;
263
263
  history: unknown[];
264
+ /** Native source book for this invocation's own log. Memory observation only; no parent receipt applies. */
265
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
264
266
  /** Identity of the local history, not its parent's log. */
265
267
  readonly logAddress?: LogAddress;
266
268
  /**
@@ -361,6 +363,7 @@ export interface IExecutionRuntime {
361
363
  rootStageContext: StageContext;
362
364
  executionHistory: {
363
365
  list(): unknown[];
366
+ readonly address?: LogAddress;
364
367
  };
365
368
  /**
366
369
  * A fresh root frame on this runtime — its store, its log, the run's policy
@@ -376,6 +379,7 @@ export interface IExecutionRuntime {
376
379
  /** The commit log's fold base — see `RuntimeSnapshot.initialState`. */
377
380
  initialState?: Record<string, unknown>;
378
381
  commitLog: unknown[];
382
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
379
383
  readonly logAddress?: LogAddress;
380
384
  /** Dual-keyed by subflow path (last iteration) AND per-execution mount runtimeStageId
381
385
  * (each iteration) — see RuntimeSnapshot.subflowResults / subflow-commit-visibility. */