footprintjs 9.3.0 → 9.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.
- package/AGENTS.md +2 -1
- package/CLAUDE.md +2 -1
- package/dist/advanced.js +1 -1
- package/dist/esm/advanced.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +15 -2
- package/dist/esm/lib/capture/envelope.js +187 -0
- package/dist/esm/lib/capture/index.js +16 -0
- package/dist/esm/lib/capture/policies.js +29 -0
- package/dist/esm/lib/capture/summarize.js +58 -0
- package/dist/esm/lib/engine/handlers/ContinuationResolver.js +23 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +9 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +62 -44
- package/dist/esm/lib/memory/index.js +2 -2
- package/dist/esm/lib/memory/types.js +7 -4
- package/dist/esm/lib/observer-queue/deferredDispatcher.js +226 -0
- package/dist/esm/lib/observer-queue/flushDriver.js +163 -0
- package/dist/esm/lib/observer-queue/index.js +22 -0
- package/dist/esm/lib/observer-queue/mergedQueue.js +91 -0
- package/dist/esm/lib/observer-queue/ring.js +122 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +20 -1
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +15 -2
- package/dist/lib/capture/envelope.js +192 -0
- package/dist/lib/capture/index.js +23 -0
- package/dist/lib/capture/policies.js +30 -0
- package/dist/lib/capture/summarize.js +63 -0
- package/dist/lib/engine/handlers/ContinuationResolver.js +23 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +9 -1
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +63 -45
- package/dist/lib/memory/index.js +3 -2
- package/dist/lib/memory/types.js +10 -5
- package/dist/lib/observer-queue/deferredDispatcher.js +230 -0
- package/dist/lib/observer-queue/flushDriver.js +167 -0
- package/dist/lib/observer-queue/index.js +36 -0
- package/dist/lib/observer-queue/mergedQueue.js +95 -0
- package/dist/lib/observer-queue/ring.js +126 -0
- package/dist/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/lib/runner/FlowChartExecutor.js +20 -1
- package/dist/types/advanced.d.ts +1 -1
- package/dist/types/index.d.ts +13 -0
- package/dist/types/lib/capture/envelope.d.ts +169 -0
- package/dist/types/lib/capture/index.d.ts +16 -0
- package/dist/types/lib/capture/policies.d.ts +42 -0
- package/dist/types/lib/capture/summarize.d.ts +65 -0
- package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +15 -2
- package/dist/types/lib/engine/types.d.ts +3 -0
- package/dist/types/lib/memory/StageContext.d.ts +38 -1
- package/dist/types/lib/memory/index.d.ts +2 -2
- package/dist/types/lib/memory/types.d.ts +33 -22
- package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +169 -0
- package/dist/types/lib/observer-queue/flushDriver.d.ts +124 -0
- package/dist/types/lib/observer-queue/index.d.ts +25 -0
- package/dist/types/lib/observer-queue/mergedQueue.d.ts +85 -0
- package/dist/types/lib/observer-queue/ring.d.ts +99 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +11 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +43 -1
- package/package.json +1 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* capture/envelope.ts — RFC-001 Block 1: capture envelopes + payload summarizer.
|
|
3
|
+
*
|
|
4
|
+
* Pattern: Point-in-time capture. An observer event is snapshotted into a
|
|
5
|
+
* self-contained, immutable envelope at the moment it happens, so
|
|
6
|
+
* DELIVERY can be deferred (RFC-001 "one beat behind") without the
|
|
7
|
+
* payload drifting under later engine mutations.
|
|
8
|
+
* Role: The capture tier of the deferred-observer pipeline
|
|
9
|
+
* (`src/lib/observer-queue/`). Pure module — ZERO engine imports
|
|
10
|
+
* (only `capture/` internals); the engine wiring is RFC-001
|
|
11
|
+
* Blocks 6–10.
|
|
12
|
+
*
|
|
13
|
+
* Capture policies (RFC-001 §5):
|
|
14
|
+
* - `'summary'` — bounded, reference-free summarization via
|
|
15
|
+
* {@link summarizePayload}. Built on the SAME classification path as the
|
|
16
|
+
* retention markers in `summarize.ts` (#14 / #13c-A), extended with
|
|
17
|
+
* bounded structural descent. Structured-clone-safe by construction.
|
|
18
|
+
* - `'clone'` — `structuredClone` at capture time (the capture-tier
|
|
19
|
+
* spelling of retention `'full'` — see the mapping notes in
|
|
20
|
+
* `policies.ts`). If the payload is not clonable (functions, symbols,
|
|
21
|
+
* live handles), capture DEGRADES to `'summary'` and reports through the
|
|
22
|
+
* `warn` hook — a capture must never throw into the producer.
|
|
23
|
+
* - `'ref'` — pass-through of the live reference. The CALLER asserts
|
|
24
|
+
* immutability for the delivery window (safe e.g. for committed-state
|
|
25
|
+
* reads, proven immutable-after-swap in #13/#13b). Exempt from the
|
|
26
|
+
* clone-safety guarantee — see the dev-warn seam below.
|
|
27
|
+
*
|
|
28
|
+
* Dev-warn seam (resolves the isDevMode-would-be-an-engine-import problem):
|
|
29
|
+
* This module must not import `scope/detectCircular` (engine territory).
|
|
30
|
+
* Instead, `capture()` accepts {@link CaptureHooks} with an optional
|
|
31
|
+
* `warn` callback and invokes it on every `'ref'` capture and every
|
|
32
|
+
* `'clone'` degradation. The WIRING layer (Block 6) binds `warn` to an
|
|
33
|
+
* `isDevMode()`-gated, deduplicated console warner; the pure module stays
|
|
34
|
+
* engine-free and silent by default (no hooks ⇒ no warning, zero cost).
|
|
35
|
+
*
|
|
36
|
+
* Summarizer bounds (documented contract, exported as constants):
|
|
37
|
+
* - depth ≤ {@link PAYLOAD_SUMMARY_MAX_DEPTH} (3) — deeper structure
|
|
38
|
+
* collapses to a classified leaf with `depthClipped: true`.
|
|
39
|
+
* - breadth ≤ {@link PAYLOAD_SUMMARY_MAX_ENTRIES} (16) per object/array —
|
|
40
|
+
* the remainder is dropped and flagged `truncated: true` (the honest
|
|
41
|
+
* `size` still reports the real count).
|
|
42
|
+
* - total ≤ {@link PAYLOAD_SUMMARY_MAX_NODES} (128) summary nodes per
|
|
43
|
+
* payload — a global budget so wide×deep payloads stay O(1)-bounded.
|
|
44
|
+
* - string previews ≤ `SUMMARY_PREVIEW_LENGTH` (80) chars.
|
|
45
|
+
* Cycles are detected (ancestor set) and flagged `circular: true`;
|
|
46
|
+
* throwing getters yield a `'unreadable'` leaf; symbol-keyed properties
|
|
47
|
+
* are ignored (same as JSON / `Object.keys`); `Map`/`Set` are leaves with
|
|
48
|
+
* their REAL entry count (no descent — matches `summarize.ts`).
|
|
49
|
+
*/
|
|
50
|
+
import { summarizeWriteValue } from './summarize.js';
|
|
51
|
+
/** Max nesting depth a payload summary descends before clipping. */
|
|
52
|
+
export const PAYLOAD_SUMMARY_MAX_DEPTH = 3;
|
|
53
|
+
/** Max entries summarized per object/array level before truncating. */
|
|
54
|
+
export const PAYLOAD_SUMMARY_MAX_ENTRIES = 16;
|
|
55
|
+
/** Global per-payload budget of summary nodes (wide×deep hard bound). */
|
|
56
|
+
export const PAYLOAD_SUMMARY_MAX_NODES = 128;
|
|
57
|
+
/**
|
|
58
|
+
* Classify one value through the ONE classification path shared with the
|
|
59
|
+
* retention markers. GATE NOTE: Block 1 may not modify `summarize.ts`, so
|
|
60
|
+
* the module-private `classifyValue` is reached through its exported facade
|
|
61
|
+
* and the brand field is dropped by explicit copy — Block 6 may export
|
|
62
|
+
* `classifyValue` directly and inline this hop.
|
|
63
|
+
*/
|
|
64
|
+
function classifyLeaf(value) {
|
|
65
|
+
const marker = summarizeWriteValue(value);
|
|
66
|
+
const leaf = { type: marker.type };
|
|
67
|
+
if (marker.size !== undefined)
|
|
68
|
+
leaf.size = marker.size;
|
|
69
|
+
if (marker.preview !== undefined)
|
|
70
|
+
leaf.preview = marker.preview;
|
|
71
|
+
return leaf;
|
|
72
|
+
}
|
|
73
|
+
/** Read one child property, converting throwing getters into a leaf. */
|
|
74
|
+
function summarizeChild(parent, key, depth, budget, ancestors) {
|
|
75
|
+
let child;
|
|
76
|
+
try {
|
|
77
|
+
child = parent[key];
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return { type: 'unreadable', preview: '[getter threw during capture]' };
|
|
81
|
+
}
|
|
82
|
+
return summarizeNode(child, depth, budget, ancestors);
|
|
83
|
+
}
|
|
84
|
+
function summarizeNode(value, depth, budget, ancestors) {
|
|
85
|
+
budget.nodesLeft -= 1;
|
|
86
|
+
const leaf = classifyLeaf(value);
|
|
87
|
+
// Only plain containers descend. Map/Set stay leaves (real entry count
|
|
88
|
+
// already on `size` — matches summarize.ts); everything else is a leaf.
|
|
89
|
+
const container = (leaf.type === 'object' || leaf.type === 'array') && typeof value === 'object' && value !== null;
|
|
90
|
+
if (!container || value instanceof Map || value instanceof Set)
|
|
91
|
+
return leaf;
|
|
92
|
+
const obj = value;
|
|
93
|
+
if (ancestors.has(obj))
|
|
94
|
+
return { ...leaf, circular: true };
|
|
95
|
+
if (depth >= PAYLOAD_SUMMARY_MAX_DEPTH)
|
|
96
|
+
return { ...leaf, depthClipped: true };
|
|
97
|
+
if (budget.nodesLeft <= 0)
|
|
98
|
+
return { ...leaf, truncated: true };
|
|
99
|
+
ancestors.add(obj);
|
|
100
|
+
try {
|
|
101
|
+
if (Array.isArray(value)) {
|
|
102
|
+
const limit = Math.min(value.length, PAYLOAD_SUMMARY_MAX_ENTRIES);
|
|
103
|
+
const items = [];
|
|
104
|
+
let clipped = value.length > limit;
|
|
105
|
+
for (let i = 0; i < limit; i++) {
|
|
106
|
+
if (budget.nodesLeft <= 0) {
|
|
107
|
+
clipped = true;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
items.push(summarizeChild(value, i, depth + 1, budget, ancestors));
|
|
111
|
+
}
|
|
112
|
+
return clipped ? { ...leaf, items, truncated: true } : { ...leaf, items };
|
|
113
|
+
}
|
|
114
|
+
const keys = Object.keys(obj);
|
|
115
|
+
const limit = Math.min(keys.length, PAYLOAD_SUMMARY_MAX_ENTRIES);
|
|
116
|
+
// Built via entries + fromEntries so hostile keys ('__proto__', ...)
|
|
117
|
+
// become own data properties — never prototype writes.
|
|
118
|
+
const entries = [];
|
|
119
|
+
let clipped = keys.length > limit;
|
|
120
|
+
for (let i = 0; i < limit; i++) {
|
|
121
|
+
if (budget.nodesLeft <= 0) {
|
|
122
|
+
clipped = true;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
entries.push([keys[i], summarizeChild(obj, keys[i], depth + 1, budget, ancestors)]);
|
|
126
|
+
}
|
|
127
|
+
const fields = Object.fromEntries(entries);
|
|
128
|
+
return clipped ? { ...leaf, fields, truncated: true } : { ...leaf, fields };
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
ancestors.delete(obj);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Produce a bounded, reference-free, structured-clone-safe summary of an
|
|
136
|
+
* arbitrary payload. Never throws; never holds a reference into the source
|
|
137
|
+
* value (every node is a fresh object whose fields are primitives). Bounds
|
|
138
|
+
* are documented in the module header.
|
|
139
|
+
*/
|
|
140
|
+
export function summarizePayload(payload) {
|
|
141
|
+
const budget = { nodesLeft: PAYLOAD_SUMMARY_MAX_NODES };
|
|
142
|
+
const root = summarizeNode(payload, 0, budget, new Set());
|
|
143
|
+
return { __payloadSummary: true, ...root };
|
|
144
|
+
}
|
|
145
|
+
/** Materialize the payload per policy — see the module header contract. */
|
|
146
|
+
function capturePayload(request, policy, hooks) {
|
|
147
|
+
if (policy === 'ref') {
|
|
148
|
+
hooks?.warn?.(`[footprintjs capture] 'ref' capture for ${request.channel}.${request.method} passes a LIVE reference ` +
|
|
149
|
+
'through deferred delivery — the caller asserts the payload is immutable until delivered.');
|
|
150
|
+
return request.payload;
|
|
151
|
+
}
|
|
152
|
+
if (policy === 'clone') {
|
|
153
|
+
try {
|
|
154
|
+
return structuredClone(request.payload);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
hooks?.warn?.(`[footprintjs capture] 'clone' capture for ${request.channel}.${request.method} failed ` +
|
|
158
|
+
"(structuredClone threw — unclonable payload); degraded to 'summary'.");
|
|
159
|
+
return summarizePayload(request.payload);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return summarizePayload(request.payload);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Capture one observer event into an immutable {@link CaptureEnvelope}.
|
|
166
|
+
*
|
|
167
|
+
* Guarantees:
|
|
168
|
+
* - Never throws into the producer (`'clone'` degradation, summarizer
|
|
169
|
+
* never-throws contract).
|
|
170
|
+
* - The returned envelope is shallow-frozen — `seq`/`channel`/... cannot
|
|
171
|
+
* be reassigned. Under `'summary'`/`'clone'` the payload holds no live
|
|
172
|
+
* reference into the source; under `'ref'` it intentionally does.
|
|
173
|
+
* - Default policy is `'summary'` (cheapest safe tier).
|
|
174
|
+
*/
|
|
175
|
+
export function capture(request, policy = 'summary', hooks) {
|
|
176
|
+
const capturedAt = hooks?.now !== undefined ? hooks.now() : Date.now();
|
|
177
|
+
return Object.freeze({
|
|
178
|
+
seq: request.seq,
|
|
179
|
+
channel: request.channel,
|
|
180
|
+
method: request.method,
|
|
181
|
+
runtimeStageId: request.runtimeStageId,
|
|
182
|
+
runId: request.runId,
|
|
183
|
+
payload: capturePayload(request, policy, hooks),
|
|
184
|
+
capturedAt,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUVILE9BQU8sRUFBeUIsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWlFNUUsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUUzQyx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRTlDLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUEwRDdDOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQXFCLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN2RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUztRQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUNoRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsU0FBUyxjQUFjLENBQ3JCLE1BQWMsRUFDZCxHQUFvQixFQUNwQixLQUFhLEVBQ2IsTUFBdUIsRUFDdkIsU0FBc0I7SUFFdEIsSUFBSSxLQUFjLENBQUM7SUFDbkIsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFJLE1BQTJDLENBQUMsR0FBRyxDQUFD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QUFPLENBQUMsY0FBYztRQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7UUFDcEIsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztRQUMvQyxVQUFVO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY2FwdHVyZS9lbnZlbG9wZS50cyDigJQgUkZDLTAwMSBCbG9jayAxOiBjYXB0dXJlIGVudmVsb3BlcyArIHBheWxvYWQgc3VtbWFyaXplci5cbiAqXG4gKiBQYXR0ZXJuOiAgUG9pbnQtaW4tdGltZSBjYXB0dXJlLiBBbiBvYnNlcnZlciBldmVudCBpcyBzbmFwc2hvdHRlZCBpbnRvIGFcbiAqICAgICAgICAgICBzZWxmLWNvbnRhaW5lZCwgaW1tdXRhYmxlIGVudmVsb3BlIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVucywgc29cbiAqICAgICAgICAgICBERUxJVkVSWSBjYW4gYmUgZGVmZXJyZWQgKFJGQy0wMDEgXCJvbmUgYmVhdCBiZWhpbmRcIikgd2l0aG91dCB0aGVcbiAqICAgICAgICAgICBwYXlsb2FkIGRyaWZ0aW5nIHVuZGVyIGxhdGVyIGVuZ2luZSBtdXRhdGlvbnMuXG4gKiBSb2xlOiAgICAgVGhlIGNhcHR1cmUgdGllciBvZiB0aGUgZGVmZXJyZWQtb2JzZXJ2ZXIgcGlwZWxpbmVcbiAqICAgICAgICAgICAoYHNyYy9saWIvb2JzZXJ2ZXItcXVldWUvYCkuIFB1cmUgbW9kdWxlIOKAlCBaRVJPIGVuZ2luZSBpbXBvcnRzXG4gKiAgICAgICAgICAgKG9ubHkgYGNhcHR1cmUvYCBpbnRlcm5hbHMpOyB0aGUgZW5naW5lIHdpcmluZyBpcyBSRkMtMDAxXG4gKiAgICAgICAgICAgQmxvY2tzIDbigJMxMC5cbiAqXG4gKiBDYXB0dXJlIHBvbGljaWVzIChSRkMtMDAxIMKnNSk6XG4gKiAgIC0gYCdzdW1tYXJ5J2Ag4oCUIGJvdW5kZWQsIHJlZmVyZW5jZS1mcmVlIHN1bW1hcml6YXRpb24gdmlhXG4gKiAgICAge0BsaW5rIHN1bW1hcml6ZVBheWxvYWR9LiBCdWlsdCBvbiB0aGUgU0FNRSBjbGFzc2lmaWNhdGlvbiBwYXRoIGFzIHRoZVxuICogICAgIHJldGVudGlvbiBtYXJrZXJzIGluIGBzdW1tYXJpemUudHNgICgjMTQgLyAjMTNjLUEpLCBleHRlbmRlZCB3aXRoXG4gKiAgICAgYm91bmRlZCBzdHJ1Y3R1cmFsIGRlc2NlbnQuIFN0cnVjdHVyZWQtY2xvbmUtc2FmZSBieSBjb25zdHJ1Y3Rpb24uXG4gKiAgIC0gYCdjbG9uZSdgICAg4oCUIGBzdHJ1Y3R1cmVkQ2xvbmVgIGF0IGNhcHR1cmUgdGltZSAodGhlIGNhcHR1cmUtdGllclxuICogICAgIHNwZWxsaW5nIG9mIHJldGVudGlvbiBgJ2Z1bGwnYCDigJQgc2VlIHRoZSBtYXBwaW5nIG5vdGVzIGluXG4gKiAgICAgYHBvbGljaWVzLnRzYCkuIElmIHRoZSBwYXlsb2FkIGlzIG5vdCBjbG9uYWJsZSAoZnVuY3Rpb25zLCBzeW1ib2xzLFxuICogICAgIGxpdmUgaGFuZGxlcyksIGNhcHR1cmUgREVHUkFERVMgdG8gYCdzdW1tYXJ5J2AgYW5kIHJlcG9ydHMgdGhyb3VnaCB0aGVcbiAqICAgICBgd2FybmAgaG9vayDigJQgYSBjYXB0dXJlIG11c3QgbmV2ZXIgdGhyb3cgaW50byB0aGUgcHJvZHVjZXIuXG4gKiAgIC0gYCdyZWYnYCAgICAg4oCUIHBhc3MtdGhyb3VnaCBvZiB0aGUgbGl2ZSByZWZlcmVuY2UuIFRoZSBDQUxMRVIgYXNzZXJ0c1xuICogICAgIGltbXV0YWJpbGl0eSBmb3IgdGhlIGRlbGl2ZXJ5IHdpbmRvdyAoc2FmZSBlLmcuIGZvciBjb21taXR0ZWQtc3RhdGVcbiAqICAgICByZWFkcywgcHJvdmVuIGltbXV0YWJsZS1hZnRlci1zd2FwIGluICMxMy8jMTNiKS4gRXhlbXB0IGZyb20gdGhlXG4gKiAgICAgY2xvbmUtc2FmZXR5IGd1YXJhbnRlZSDigJQgc2VlIHRoZSBkZXYtd2FybiBzZWFtIGJlbG93LlxuICpcbiAqIERldi13YXJuIHNlYW0gKHJlc29sdmVzIHRoZSBpc0Rldk1vZGUtd291bGQtYmUtYW4tZW5naW5lLWltcG9ydCBwcm9ibGVtKTpcbiAqICAgVGhpcyBtb2R1bGUgbXVzdCBub3QgaW1wb3J0IGBzY29wZS9kZXRlY3RDaXJjdWxhcmAgKGVuZ2luZSB0ZXJyaXRvcnkpLlxuICogICBJbnN0ZWFkLCBgY2FwdHVyZSgpYCBhY2NlcHRzIHtAbGluayBDYXB0dXJlSG9va3N9IHdpdGggYW4gb3B0aW9uYWxcbiAqICAgYHdhcm5gIGNhbGxiYWNrIGFuZCBpbnZva2VzIGl0IG9uIGV2ZXJ5IGAncmVmJ2AgY2FwdHVyZSBhbmQgZXZlcnlcbiAqICAgYCdjbG9uZSdgIGRlZ3JhZGF0aW9uLiBUaGUgV0lSSU5HIGxheWVyIChCbG9jayA2KSBiaW5kcyBgd2FybmAgdG8gYW5cbiAqICAgYGlzRGV2TW9kZSgpYC1nYXRlZCwgZGVkdXBsaWNhdGVkIGNvbnNvbGUgd2FybmVyOyB0aGUgcHVyZSBtb2R1bGUgc3RheXNcbiAqICAgZW5naW5lLWZyZWUgYW5kIHNpbGVudCBieSBkZWZhdWx0IChubyBob29rcyDih5Igbm8gd2FybmluZywgemVybyBjb3N0KS5cbiAqXG4gKiBTdW1tYXJpemVyIGJvdW5kcyAoZG9jdW1lbnRlZCBjb250cmFjdCwgZXhwb3J0ZWQgYXMgY29uc3RhbnRzKTpcbiAqICAgLSBkZXB0aCAgIOKJpCB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSH0gICAoMykg4oCUIGRlZXBlciBzdHJ1Y3R1cmVcbiAqICAgICBjb2xsYXBzZXMgdG8gYSBjbGFzc2lmaWVkIGxlYWYgd2l0aCBgZGVwdGhDbGlwcGVkOiB0cnVlYC5cbiAqICAgLSBicmVhZHRoIOKJpCB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9FTlRSSUVTfSAoMTYpIHBlciBvYmplY3QvYXJyYXkg4oCUXG4gKiAgICAgdGhlIHJlbWFpbmRlciBpcyBkcm9wcGVkIGFuZCBmbGFnZ2VkIGB0cnVuY2F0ZWQ6IHRydWVgICh0aGUgaG9uZXN0XG4gKiAgICAgYHNpemVgIHN0aWxsIHJlcG9ydHMgdGhlIHJlYWwgY291bnQpLlxuICogICAtIHRvdGFsICAg4omkIHtAbGluayBQQVlMT0FEX1NVTU1BUllfTUFYX05PREVTfSAgICgxMjgpIHN1bW1hcnkgbm9kZXMgcGVyXG4gKiAgICAgcGF5bG9hZCDigJQgYSBnbG9iYWwgYnVkZ2V0IHNvIHdpZGXDl2RlZXAgcGF5bG9hZHMgc3RheSBPKDEpLWJvdW5kZWQuXG4gKiAgIC0gc3RyaW5nIHByZXZpZXdzIOKJpCBgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSGAgKDgwKSBjaGFycy5cbiAqICAgQ3ljbGVzIGFyZSBkZXRlY3RlZCAoYW5jZXN0b3Igc2V0KSBhbmQgZmxhZ2dlZCBgY2lyY3VsYXI6IHRydWVgO1xuICogICB0aHJvd2luZyBnZXR0ZXJzIHlpZWxkIGEgYCd1bnJlYWRhYmxlJ2AgbGVhZjsgc3ltYm9sLWtleWVkIHByb3BlcnRpZXNcbiAqICAgYXJlIGlnbm9yZWQgKHNhbWUgYXMgSlNPTiAvIGBPYmplY3Qua2V5c2ApOyBgTWFwYC9gU2V0YCBhcmUgbGVhdmVzIHdpdGhcbiAqICAgdGhlaXIgUkVBTCBlbnRyeSBjb3VudCAobm8gZGVzY2VudCDigJQgbWF0Y2hlcyBgc3VtbWFyaXplLnRzYCkuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBTdW1tYXJ5VmFsdWVUeXBlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi9zdW1tYXJpemUuanMnO1xuXG4vKiogV2hpY2ggb2JzZXJ2ZXIgY2hhbm5lbCBwcm9kdWNlZCBhIGNhcHR1cmVkIGV2ZW50IChSRkMtMDAxIMKnNSkuICovXG5leHBvcnQgdHlwZSBDYXB0dXJlQ2hhbm5lbCA9ICdzY29wZScgfCAnZmxvdycgfCAnZW1pdCc7XG5cbi8qKlxuICogSG93IGFuIGV2ZW50IHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGludG8gdGhlIGVudmVsb3BlIChSRkMtMDAxIMKnNSkuXG4gKiBTZWUgdGhlIG1vZHVsZSBoZWFkZXIgZm9yIHRoZSBmdWxsIHBlci1wb2xpY3kgY29udHJhY3QuXG4gKi9cbmV4cG9ydCB0eXBlIENhcHR1cmVQb2xpY3kgPSAnc3VtbWFyeScgfCAnY2xvbmUnIHwgJ3JlZic7XG5cbi8qKlxuICogQSBjYXB0dXJlZCBvYnNlcnZlciBldmVudCDigJQgc2VsZi1jb250YWluZWQgYW5kIGltbXV0YWJsZSAoc2hhbGxvdy1mcm96ZW5cbiAqIGF0IGNyZWF0aW9uKS4gYHNlcWAgaXMgdGhlIGFycml2YWwgc3RhbXAgYXNzaWduZWQgYXQgY2FwdHVyZSB1bmRlciB0aGVcbiAqIHNpbmdsZSBKUyB0aHJlYWQ6IGl0IHRvdGFsbHkgb3JkZXJzIGV2ZW50cyBBQ1JPU1MgYWxsIHRocmVlIGNoYW5uZWxzLCBpc1xuICogbW9ub3RvbmljLCBhbmQgaXMgZ2FwLWRldGVjdGFibGUgKGEgZHJvcHBlZCBldmVudCBsZWF2ZXMgYSB2aXNpYmxlIGhvbGVcbiAqIGluIHRoZSBkZWxpdmVyZWQgYHNlcWAgc2VxdWVuY2Ug4oCUIGhvbmVzdCBsb3NzIGFjY291bnRpbmcpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVFbnZlbG9wZSB7XG4gIC8qKiBBcnJpdmFsIHN0YW1wIOKAlCB0b3RhbCBvcmRlciBhY3Jvc3MgY2hhbm5lbHM7IGdhcHMgcmV2ZWFsIGRyb3BzLiAqL1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgLyoqIFByb2R1Y2luZyBvYnNlcnZlciBjaGFubmVsLiAqL1xuICByZWFkb25seSBjaGFubmVsOiBDYXB0dXJlQ2hhbm5lbDtcbiAgLyoqIFByb2R1Y2luZyBob29rIG5hbWUg4oCUIGAnb25Xcml0ZSdgLCBgJ29uU3RhZ2VFeGVjdXRlZCdgLCBgJ29uRW1pdCdgLCAuLi4gKi9cbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBUaGUgZXhlY3V0aW9uIHN0ZXAgdGhhdCBwcm9kdWNlZCB0aGUgZXZlbnQgKGBzdGFnZUlkI2V4ZWN1dGlvbkluZGV4YCkuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcnVuIHRoYXQgcHJvZHVjZWQgdGhlIGV2ZW50IChDb252ZW50aW9uIDQgcGVyLXJ1biBzY29waW5nKS4gKi9cbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFBlciB7QGxpbmsgQ2FwdHVyZVBvbGljeX0g4oCUIE5FVkVSIGEgbGl2ZSBlbmdpbmUgcmVmZXJlbmNlIHVuZGVyXG4gICAqIGAnc3VtbWFyeSdgIC8gYCdjbG9uZSdgOyB1bmRlciBgJ3JlZidgIHRoZSBjYWxsZXIgYXNzZXJ0ZWQgaW1tdXRhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbiAgLyoqIENhcHR1cmUgd2FsbC1jbG9jayAobXMgZXBvY2ggYnkgZGVmYXVsdDsgaW5qZWN0YWJsZSB2aWEgaG9va3Mubm93KS4gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZWRBdDogbnVtYmVyO1xufVxuXG4vKiogVGhlIHJhdyBldmVudCBkZXNjcmlwdGlvbiBoYW5kZWQgdG8ge0BsaW5rIGNhcHR1cmV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlUmVxdWVzdCB7XG4gIC8qKiBBcnJpdmFsIHN0YW1wIOKAlCBhc3NpZ25lZCBieSB0aGUgbWVyZ2VkIHF1ZXVlJ3MgY291bnRlciAoQmxvY2sgMykuICovXG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBjaGFubmVsOiBDYXB0dXJlQ2hhbm5lbDtcbiAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgTElWRSBwYXlsb2FkIOKAlCBgY2FwdHVyZSgpYCBtYXRlcmlhbGl6ZXMgaXQgcGVyIHBvbGljeS4gKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBFbmdpbmUtZnJlZSBzZWFtcyBpbmplY3RlZCBieSB0aGUgd2lyaW5nIGxheWVyIChCbG9jayA2KS4gVGhlIHB1cmUgbW9kdWxlXG4gKiBuZXZlciBpbXBvcnRzIGRldi1tb2RlIG9yIGNsb2NrIGluZnJhc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVIb29rcyB7XG4gIC8qKlxuICAgKiBEaWFnbm9zdGljIHNpbmsg4oCUIGludm9rZWQgb24gZXZlcnkgYCdyZWYnYCBjYXB0dXJlIChjYWxsZXItYXNzZXJ0ZWRcbiAgICogaW1tdXRhYmlsaXR5KSBhbmQgZXZlcnkgYCdjbG9uZSdgIOKGkiBgJ3N1bW1hcnknYCBkZWdyYWRhdGlvbi4gQmxvY2sgNlxuICAgKiBiaW5kcyB0aGlzIHRvIGFuIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCB3YXJuZXIuXG4gICAqL1xuICByZWFkb25seSB3YXJuPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENsb2NrIGZvciBgY2FwdHVyZWRBdGAg4oCUIGRlZmF1bHRzIHRvIGBEYXRlLm5vd2AuIEluamVjdGFibGUgZm9yIHRlc3RzLiAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG59XG5cbi8qKiBNYXggbmVzdGluZyBkZXB0aCBhIHBheWxvYWQgc3VtbWFyeSBkZXNjZW5kcyBiZWZvcmUgY2xpcHBpbmcuICovXG5leHBvcnQgY29uc3QgUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSCA9IDM7XG5cbi8qKiBNYXggZW50cmllcyBzdW1tYXJpemVkIHBlciBvYmplY3QvYXJyYXkgbGV2ZWwgYmVmb3JlIHRydW5jYXRpbmcuICovXG5leHBvcnQgY29uc3QgUEFZTE9BRF9TVU1NQVJZX01BWF9FTlRSSUVTID0gMTY7XG5cbi8qKiBHbG9iYWwgcGVyLXBheWxvYWQgYnVkZ2V0IG9mIHN1bW1hcnkgbm9kZXMgKHdpZGXDl2RlZXAgaGFyZCBib3VuZCkuICovXG5leHBvcnQgY29uc3QgUEFZTE9BRF9TVU1NQVJZX01BWF9OT0RFUyA9IDEyODtcblxuLyoqXG4gKiBMZWFmIGNsYXNzaWZpY2F0aW9uIGZvciBhIHN1bW1hcnkgbm9kZSDigJQgdGhlIGBzdW1tYXJpemUudHNgIGZhbWlseSBwbHVzXG4gKiBgJ3VucmVhZGFibGUnYCBmb3IgcHJvcGVydGllcyB3aG9zZSBnZXR0ZXIgdGhyZXcgZHVyaW5nIGNhcHR1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIFBheWxvYWRTdW1tYXJ5VHlwZSA9IFN1bW1hcnlWYWx1ZVR5cGUgfCAndW5yZWFkYWJsZSc7XG5cbi8qKlxuICogT25lIG5vZGUgb2YgYSBwYXlsb2FkIHN1bW1hcnkgdHJlZS4gRXZlcnkgZmllbGQgaXMgYSBwcmltaXRpdmUsIGEgcGxhaW5cbiAqIG9iamVjdCwgb3IgYSBwbGFpbiBhcnJheSDigJQgc3RydWN0dXJlZC1jbG9uZS1zYWZlIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkU3VtbWFyeU5vZGUge1xuICAvKiogQ2xhc3NpZmljYXRpb24g4oCUIHNhbWUgcnVsZXMgYXMgdGhlIHJldGVudGlvbiBtYXJrZXJzIChvbmUgY29kZSBwYXRoKS4gKi9cbiAgcmVhZG9ubHkgdHlwZTogUGF5bG9hZFN1bW1hcnlUeXBlO1xuICAvKiogSG9uZXN0IHNpemUgcHJveHk6IHN0cmluZyBsZW5ndGgsIGFycmF5IGxlbmd0aCwgb3Iga2V5L2VudHJ5IGNvdW50LiAqL1xuICByZWFkb25seSBzaXplPzogbnVtYmVyO1xuICAvKiogRmlyc3QgYFNVTU1BUllfUFJFVklFV19MRU5HVEhgIGNoYXJzIOKAlCBwcmltaXRpdmVzL3N0cmluZ3Mgb25seS4gKi9cbiAgcmVhZG9ubHkgcHJldmlldz86IHN0cmluZztcbiAgLyoqIFN1bW1hcml6ZWQgb3duIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgKG9iamVjdHMpLiAqL1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkU3VtbWFyeU5vZGU+PjtcbiAgLyoqIFN1bW1hcml6ZWQgbGVhZGluZyBpdGVtcyAoYXJyYXlzKS4gKi9cbiAgcmVhZG9ubHkgaXRlbXM/OiByZWFkb25seSBQYXlsb2FkU3VtbWFyeU5vZGVbXTtcbiAgLyoqIEVudHJpZXMgd2VyZSBvbWl0dGVkIGhlcmUgKGJyZWFkdGggY2FwIG9yIG5vZGUgYnVkZ2V0KS4gKi9cbiAgcmVhZG9ubHkgdHJ1bmNhdGVkPzogYm9vbGVhbjtcbiAgLyoqIFRoaXMgdmFsdWUgaXMgYW4gYW5jZXN0b3Igb2YgaXRzZWxmIOKAlCBkZXNjZW50IHN0b3BwZWQuICovXG4gIHJlYWRvbmx5IGNpcmN1bGFyPzogdHJ1ZTtcbiAgLyoqIHtAbGluayBQQVlMT0FEX1NVTU1BUllfTUFYX0RFUFRIfSByZWFjaGVkIOKAlCBjaGlsZHJlbiBub3QgZGVzY2VuZGVkLiAqL1xuICByZWFkb25seSBkZXB0aENsaXBwZWQ/OiB0cnVlO1xufVxuXG4vKipcbiAqIFJvb3Qgb2YgYSBwYXlsb2FkIHN1bW1hcnkg4oCUIGJyYW5kZWQgc28gY29uc3VtZXJzIChhbmQgdGVzdHMpIGNhbiBkZXRlY3RcbiAqIHRoYXQgYSBwYXlsb2FkIHdhcyBzdW1tYXJpemVkIHJhdGhlciB0aGFuIGNsb25lZC4gU2libGluZyBvZiB0aGVcbiAqIGBfX3JlYWRTdW1tYXJ5YCAvIGBfX3dyaXRlU3VtbWFyeWAgcmV0ZW50aW9uIG1hcmtlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZFN1bW1hcnkgZXh0ZW5kcyBQYXlsb2FkU3VtbWFyeU5vZGUge1xuICAvKiogRGlzY3JpbWluYW50IOKAlCBgJ3N1bW1hcnknYC1wb2xpY3kgZW52ZWxvcGUgcGF5bG9hZHMgY2FycnkgdGhpcy4gKi9cbiAgcmVhZG9ubHkgX19wYXlsb2FkU3VtbWFyeTogdHJ1ZTtcbn1cblxuLyoqIE11dGFibGUgY29uc3RydWN0aW9uIHNoYXBlIGZvciB7QGxpbmsgUGF5bG9hZFN1bW1hcnlOb2RlfS4gKi9cbmludGVyZmFjZSBTdW1tYXJ5Tm9kZURyYWZ0IHtcbiAgdHlwZTogUGF5bG9hZFN1bW1hcnlUeXBlO1xuICBzaXplPzogbnVtYmVyO1xuICBwcmV2aWV3Pzogc3RyaW5nO1xuICBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkU3VtbWFyeU5vZGU+O1xuICBpdGVtcz86IFBheWxvYWRTdW1tYXJ5Tm9kZVtdO1xuICB0cnVuY2F0ZWQ/OiBib29sZWFuO1xuICBjaXJjdWxhcj86IHRydWU7XG4gIGRlcHRoQ2xpcHBlZD86IHRydWU7XG59XG5cbi8qKiBTaGFyZWQgbXV0YWJsZSBub2RlIGJ1ZGdldCBmb3Igb25lIHtAbGluayBzdW1tYXJpemVQYXlsb2FkfSBjYWxsLiAqL1xuaW50ZXJmYWNlIFN1bW1hcml6ZUJ1ZGdldCB7XG4gIG5vZGVzTGVmdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IG9uZSB2YWx1ZSB0aHJvdWdoIHRoZSBPTkUgY2xhc3NpZmljYXRpb24gcGF0aCBzaGFyZWQgd2l0aCB0aGVcbiAqIHJldGVudGlvbiBtYXJrZXJzLiBHQVRFIE5PVEU6IEJsb2NrIDEgbWF5IG5vdCBtb2RpZnkgYHN1bW1hcml6ZS50c2AsIHNvXG4gKiB0aGUgbW9kdWxlLXByaXZhdGUgYGNsYXNzaWZ5VmFsdWVgIGlzIHJlYWNoZWQgdGhyb3VnaCBpdHMgZXhwb3J0ZWQgZmFjYWRlXG4gKiBhbmQgdGhlIGJyYW5kIGZpZWxkIGlzIGRyb3BwZWQgYnkgZXhwbGljaXQgY29weSDigJQgQmxvY2sgNiBtYXkgZXhwb3J0XG4gKiBgY2xhc3NpZnlWYWx1ZWAgZGlyZWN0bHkgYW5kIGlubGluZSB0aGlzIGhvcC5cbiAqL1xuZnVuY3Rpb24gY2xhc3NpZnlMZWFmKHZhbHVlOiB1bmtub3duKTogU3VtbWFyeU5vZGVEcmFmdCB7XG4gIGNvbnN0IG1hcmtlciA9IHN1bW1hcml6ZVdyaXRlVmFsdWUodmFsdWUpO1xuICBjb25zdCBsZWFmOiBTdW1tYXJ5Tm9kZURyYWZ0ID0geyB0eXBlOiBtYXJrZXIudHlwZSB9O1xuICBpZiAobWFya2VyLnNpemUgIT09IHVuZGVmaW5lZCkgbGVhZi5zaXplID0gbWFya2VyLnNpemU7XG4gIGlmIChtYXJrZXIucHJldmlldyAhPT0gdW5kZWZpbmVkKSBsZWFmLnByZXZpZXcgPSBtYXJrZXIucHJldmlldztcbiAgcmV0dXJuIGxlYWY7XG59XG5cbi8qKiBSZWFkIG9uZSBjaGlsZCBwcm9wZXJ0eSwgY29udmVydGluZyB0aHJvd2luZyBnZXR0ZXJzIGludG8gYSBsZWFmLiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplQ2hpbGQoXG4gIHBhcmVudDogb2JqZWN0LFxuICBrZXk6IHN0cmluZyB8IG51bWJlcixcbiAgZGVwdGg6IG51bWJlcixcbiAgYnVkZ2V0OiBTdW1tYXJpemVCdWRnZXQsXG4gIGFuY2VzdG9yczogU2V0PG9iamVjdD4sXG4pOiBQYXlsb2FkU3VtbWFyeU5vZGUge1xuICBsZXQgY2hpbGQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgY2hpbGQgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHVua25vd24+KVtrZXldO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyB0eXBlOiAndW5yZWFkYWJsZScsIHByZXZpZXc6ICdbZ2V0dGVyIHRocmV3IGR1cmluZyBjYXB0dXJlXScgfTtcbiAgfVxuICByZXR1cm4gc3VtbWFyaXplTm9kZShjaGlsZCwgZGVwdGgsIGJ1ZGdldCwgYW5jZXN0b3JzKTtcbn1cblxuZnVuY3Rpb24gc3VtbWFyaXplTm9kZShcbiAgdmFsdWU6IHVua25vd24sXG4gIGRlcHRoOiBudW1iZXIsXG4gIGJ1ZGdldDogU3VtbWFyaXplQnVkZ2V0LFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+LFxuKTogUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgYnVkZ2V0Lm5vZGVzTGVmdCAtPSAxO1xuICBjb25zdCBsZWFmID0gY2xhc3NpZnlMZWFmKHZhbHVlKTtcblxuICAvLyBPbmx5IHBsYWluIGNvbnRhaW5lcnMgZGVzY2VuZC4gTWFwL1NldCBzdGF5IGxlYXZlcyAocmVhbCBlbnRyeSBjb3VudFxuICAvLyBhbHJlYWR5IG9uIGBzaXplYCDigJQgbWF0Y2hlcyBzdW1tYXJpemUudHMpOyBldmVyeXRoaW5nIGVsc2UgaXMgYSBsZWFmLlxuICBjb25zdCBjb250YWluZXIgPSAobGVhZi50eXBlID09PSAnb2JqZWN0JyB8fCBsZWFmLnR5cGUgPT09ICdhcnJheScpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG4gIGlmICghY29udGFpbmVyIHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gbGVhZjtcblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBvYmplY3Q7XG4gIGlmIChhbmNlc3RvcnMuaGFzKG9iaikpIHJldHVybiB7IC4uLmxlYWYsIGNpcmN1bGFyOiB0cnVlIH07XG4gIGlmIChkZXB0aCA+PSBQQVlMT0FEX1NVTU1BUllfTUFYX0RFUFRIKSByZXR1cm4geyAuLi5sZWFmLCBkZXB0aENsaXBwZWQ6IHRydWUgfTtcbiAgaWYgKGJ1ZGdldC5ub2Rlc0xlZnQgPD0gMCkgcmV0dXJuIHsgLi4ubGVhZiwgdHJ1bmNhdGVkOiB0cnVlIH07XG5cbiAgYW5jZXN0b3JzLmFkZChvYmopO1xuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbih2YWx1ZS5sZW5ndGgsIFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFUyk7XG4gICAgICBjb25zdCBpdGVtczogUGF5bG9hZFN1bW1hcnlOb2RlW10gPSBbXTtcbiAgICAgIGxldCBjbGlwcGVkID0gdmFsdWUubGVuZ3RoID4gbGltaXQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHtcbiAgICAgICAgaWYgKGJ1ZGdldC5ub2Rlc0xlZnQgPD0gMCkge1xuICAgICAgICAgIGNsaXBwZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1zLnB1c2goc3VtbWFyaXplQ2hpbGQodmFsdWUsIGksIGRlcHRoICsgMSwgYnVkZ2V0LCBhbmNlc3RvcnMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGlwcGVkID8geyAuLi5sZWFmLCBpdGVtcywgdHJ1bmNhdGVkOiB0cnVlIH0gOiB7IC4uLmxlYWYsIGl0ZW1zIH07XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgY29uc3QgbGltaXQgPSBNYXRoLm1pbihrZXlzLmxlbmd0aCwgUEFZTE9BRF9TVU1NQVJZX01BWF9FTlRSSUVTKTtcbiAgICAvLyBCdWlsdCB2aWEgZW50cmllcyArIGZyb21FbnRyaWVzIHNvIGhvc3RpbGUga2V5cyAoJ19fcHJvdG9fXycsIC4uLilcbiAgICAvLyBiZWNvbWUgb3duIGRhdGEgcHJvcGVydGllcyDigJQgbmV2ZXIgcHJvdG90eXBlIHdyaXRlcy5cbiAgICBjb25zdCBlbnRyaWVzOiBBcnJheTxbc3RyaW5nLCBQYXlsb2FkU3VtbWFyeU5vZGVdPiA9IFtdO1xuICAgIGxldCBjbGlwcGVkID0ga2V5cy5sZW5ndGggPiBsaW1pdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHtcbiAgICAgIGlmIChidWRnZXQubm9kZXNMZWZ0IDw9IDApIHtcbiAgICAgICAgY2xpcHBlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZW50cmllcy5wdXNoKFtrZXlzW2ldLCBzdW1tYXJpemVDaGlsZChvYmosIGtleXNbaV0sIGRlcHRoICsgMSwgYnVkZ2V0LCBhbmNlc3RvcnMpXSk7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbiAgICByZXR1cm4gY2xpcHBlZCA/IHsgLi4ubGVhZiwgZmllbGRzLCB0cnVuY2F0ZWQ6IHRydWUgfSA6IHsgLi4ubGVhZiwgZmllbGRzIH07XG4gIH0gZmluYWxseSB7XG4gICAgYW5jZXN0b3JzLmRlbGV0ZShvYmopO1xuICB9XG59XG5cbi8qKlxuICogUHJvZHVjZSBhIGJvdW5kZWQsIHJlZmVyZW5jZS1mcmVlLCBzdHJ1Y3R1cmVkLWNsb25lLXNhZmUgc3VtbWFyeSBvZiBhblxuICogYXJiaXRyYXJ5IHBheWxvYWQuIE5ldmVyIHRocm93czsgbmV2ZXIgaG9sZHMgYSByZWZlcmVuY2UgaW50byB0aGUgc291cmNlXG4gKiB2YWx1ZSAoZXZlcnkgbm9kZSBpcyBhIGZyZXNoIG9iamVjdCB3aG9zZSBmaWVsZHMgYXJlIHByaW1pdGl2ZXMpLiBCb3VuZHNcbiAqIGFyZSBkb2N1bWVudGVkIGluIHRoZSBtb2R1bGUgaGVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUGF5bG9hZChwYXlsb2FkOiB1bmtub3duKTogUGF5bG9hZFN1bW1hcnkge1xuICBjb25zdCBidWRnZXQ6IFN1bW1hcml6ZUJ1ZGdldCA9IHsgbm9kZXNMZWZ0OiBQQVlMT0FEX1NVTU1BUllfTUFYX05PREVTIH07XG4gIGNvbnN0IHJvb3QgPSBzdW1tYXJpemVOb2RlKHBheWxvYWQsIDAsIGJ1ZGdldCwgbmV3IFNldDxvYmplY3Q+KCkpO1xuICByZXR1cm4geyBfX3BheWxvYWRTdW1tYXJ5OiB0cnVlLCAuLi5yb290IH07XG59XG5cbi8qKiBNYXRlcmlhbGl6ZSB0aGUgcGF5bG9hZCBwZXIgcG9saWN5IOKAlCBzZWUgdGhlIG1vZHVsZSBoZWFkZXIgY29udHJhY3QuICovXG5mdW5jdGlvbiBjYXB0dXJlUGF5bG9hZChyZXF1ZXN0OiBDYXB0dXJlUmVxdWVzdCwgcG9saWN5OiBDYXB0dXJlUG9saWN5LCBob29rcz86IENhcHR1cmVIb29rcyk6IHVua25vd24ge1xuICBpZiAocG9saWN5ID09PSAncmVmJykge1xuICAgIGhvb2tzPy53YXJuPy4oXG4gICAgICBgW2Zvb3RwcmludGpzIGNhcHR1cmVdICdyZWYnIGNhcHR1cmUgZm9yICR7cmVxdWVzdC5jaGFubmVsfS4ke3JlcXVlc3QubWV0aG9kfSBwYXNzZXMgYSBMSVZFIHJlZmVyZW5jZSBgICtcbiAgICAgICAgJ3Rocm91Z2ggZGVmZXJyZWQgZGVsaXZlcnkg4oCUIHRoZSBjYWxsZXIgYXNzZXJ0cyB0aGUgcGF5bG9hZCBpcyBpbW11dGFibGUgdW50aWwgZGVsaXZlcmVkLicsXG4gICAgKTtcbiAgICByZXR1cm4gcmVxdWVzdC5wYXlsb2FkO1xuICB9XG4gIGlmIChwb2xpY3kgPT09ICdjbG9uZScpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShyZXF1ZXN0LnBheWxvYWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgaG9va3M/Lndhcm4/LihcbiAgICAgICAgYFtmb290cHJpbnRqcyBjYXB0dXJlXSAnY2xvbmUnIGNhcHR1cmUgZm9yICR7cmVxdWVzdC5jaGFubmVsfS4ke3JlcXVlc3QubWV0aG9kfSBmYWlsZWQgYCArXG4gICAgICAgICAgXCIoc3RydWN0dXJlZENsb25lIHRocmV3IOKAlCB1bmNsb25hYmxlIHBheWxvYWQpOyBkZWdyYWRlZCB0byAnc3VtbWFyeScuXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHN1bW1hcml6ZVBheWxvYWQocmVxdWVzdC5wYXlsb2FkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1bW1hcml6ZVBheWxvYWQocmVxdWVzdC5wYXlsb2FkKTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlIG9uZSBvYnNlcnZlciBldmVudCBpbnRvIGFuIGltbXV0YWJsZSB7QGxpbmsgQ2FwdHVyZUVudmVsb3BlfS5cbiAqXG4gKiBHdWFyYW50ZWVzOlxuICogICAtIE5ldmVyIHRocm93cyBpbnRvIHRoZSBwcm9kdWNlciAoYCdjbG9uZSdgIGRlZ3JhZGF0aW9uLCBzdW1tYXJpemVyXG4gKiAgICAgbmV2ZXItdGhyb3dzIGNvbnRyYWN0KS5cbiAqICAgLSBUaGUgcmV0dXJuZWQgZW52ZWxvcGUgaXMgc2hhbGxvdy1mcm96ZW4g4oCUIGBzZXFgL2BjaGFubmVsYC8uLi4gY2Fubm90XG4gKiAgICAgYmUgcmVhc3NpZ25lZC4gVW5kZXIgYCdzdW1tYXJ5J2AvYCdjbG9uZSdgIHRoZSBwYXlsb2FkIGhvbGRzIG5vIGxpdmVcbiAqICAgICByZWZlcmVuY2UgaW50byB0aGUgc291cmNlOyB1bmRlciBgJ3JlZidgIGl0IGludGVudGlvbmFsbHkgZG9lcy5cbiAqICAgLSBEZWZhdWx0IHBvbGljeSBpcyBgJ3N1bW1hcnknYCAoY2hlYXBlc3Qgc2FmZSB0aWVyKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmUoXG4gIHJlcXVlc3Q6IENhcHR1cmVSZXF1ZXN0LFxuICBwb2xpY3k6IENhcHR1cmVQb2xpY3kgPSAnc3VtbWFyeScsXG4gIGhvb2tzPzogQ2FwdHVyZUhvb2tzLFxuKTogQ2FwdHVyZUVudmVsb3BlIHtcbiAgY29uc3QgY2FwdHVyZWRBdCA9IGhvb2tzPy5ub3cgIT09IHVuZGVmaW5lZCA/IGhvb2tzLm5vdygpIDogRGF0ZS5ub3coKTtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHNlcTogcmVxdWVzdC5zZXEsXG4gICAgY2hhbm5lbDogcmVxdWVzdC5jaGFubmVsLFxuICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgcnVudGltZVN0YWdlSWQ6IHJlcXVlc3QucnVudGltZVN0YWdlSWQsXG4gICAgcnVuSWQ6IHJlcXVlc3QucnVuSWQsXG4gICAgcGF5bG9hZDogY2FwdHVyZVBheWxvYWQocmVxdWVzdCwgcG9saWN5LCBob29rcyksXG4gICAgY2FwdHVyZWRBdCxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* istanbul ignore file */
|
|
2
|
+
/**
|
|
3
|
+
* capture/ — Shared value-capture / retention primitives (zero deps, leaf
|
|
4
|
+
* module — `memory/` imports it, never the reverse).
|
|
5
|
+
*
|
|
6
|
+
* One home for "what do we keep about a tracked operation's value?":
|
|
7
|
+
* - `RetentionPolicy` — the `'full' | 'summary' | 'off'` family behind the
|
|
8
|
+
* #14 `readTracking` and #13c-A `writeTracking` dials.
|
|
9
|
+
* - `summarizeReadValue` / `summarizeWriteValue` — the parameterized
|
|
10
|
+
* summary-marker builders sharing one classification path.
|
|
11
|
+
*
|
|
12
|
+
* RFC-001 (deferred observer delivery) builds its capture tier on this
|
|
13
|
+
* module — see the mapping notes in `policies.ts`.
|
|
14
|
+
*/
|
|
15
|
+
export { READ_PREVIEW_LENGTH, SUMMARY_PREVIEW_LENGTH, summarizeReadValue, summarizeWriteValue } from './summarize.js';
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMEJBQTBCO0FBQzFCOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbi8qKlxuICogY2FwdHVyZS8g4oCUIFNoYXJlZCB2YWx1ZS1jYXB0dXJlIC8gcmV0ZW50aW9uIHByaW1pdGl2ZXMgKHplcm8gZGVwcywgbGVhZlxuICogbW9kdWxlIOKAlCBgbWVtb3J5L2AgaW1wb3J0cyBpdCwgbmV2ZXIgdGhlIHJldmVyc2UpLlxuICpcbiAqIE9uZSBob21lIGZvciBcIndoYXQgZG8gd2Uga2VlcCBhYm91dCBhIHRyYWNrZWQgb3BlcmF0aW9uJ3MgdmFsdWU/XCI6XG4gKiAgIC0gYFJldGVudGlvblBvbGljeWAg4oCUIHRoZSBgJ2Z1bGwnIHwgJ3N1bW1hcnknIHwgJ29mZidgIGZhbWlseSBiZWhpbmQgdGhlXG4gKiAgICAgIzE0IGByZWFkVHJhY2tpbmdgIGFuZCAjMTNjLUEgYHdyaXRlVHJhY2tpbmdgIGRpYWxzLlxuICogICAtIGBzdW1tYXJpemVSZWFkVmFsdWVgIC8gYHN1bW1hcml6ZVdyaXRlVmFsdWVgIOKAlCB0aGUgcGFyYW1ldGVyaXplZFxuICogICAgIHN1bW1hcnktbWFya2VyIGJ1aWxkZXJzIHNoYXJpbmcgb25lIGNsYXNzaWZpY2F0aW9uIHBhdGguXG4gKlxuICogUkZDLTAwMSAoZGVmZXJyZWQgb2JzZXJ2ZXIgZGVsaXZlcnkpIGJ1aWxkcyBpdHMgY2FwdHVyZSB0aWVyIG9uIHRoaXNcbiAqIG1vZHVsZSDigJQgc2VlIHRoZSBtYXBwaW5nIG5vdGVzIGluIGBwb2xpY2llcy50c2AuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3kgfSBmcm9tICcuL3BvbGljaWVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFN1bW1hcnlWYWx1ZVR5cGUsIFdyaXRlU3VtbWFyeU1hcmtlciB9IGZyb20gJy4vc3VtbWFyaXplLmpzJztcbmV4cG9ydCB7IFJFQURfUFJFVklFV19MRU5HVEgsIFNVTU1BUllfUFJFVklFV19MRU5HVEgsIHN1bW1hcml6ZVJlYWRWYWx1ZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4vc3VtbWFyaXplLmpzJztcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* policies.ts — The retention policy family shared by every snapshot-tracking
|
|
3
|
+
* dial (#14 `readTracking`, #13c-A `writeTracking`).
|
|
4
|
+
*
|
|
5
|
+
* RETENTION answers "what does the engine KEEP in its own snapshot state
|
|
6
|
+
* (`StageSnapshot.stageReads` / `stageWrites`, and therefore the commit
|
|
7
|
+
* observer's mutations payload) after the moment of the operation?" It is
|
|
8
|
+
* distinct from DELIVERY — what an observer receives at event time
|
|
9
|
+
* (`ScopeRecorder.onRead`/`onWrite` always deliver the live value, in every
|
|
10
|
+
* retention mode).
|
|
11
|
+
*
|
|
12
|
+
* ── RFC-001 (deferred observer delivery) mapping ──────────────────────────
|
|
13
|
+
* RFC-001's capture tier uses the vocabulary `'clone' | 'summary' | 'ref'`.
|
|
14
|
+
* When its Block 1 lands it builds on THIS module:
|
|
15
|
+
*
|
|
16
|
+
* - RFC capture `'clone'` ≈ retention `'full'` (alias at the module
|
|
17
|
+
* boundary — same semantics: structuredClone at capture time).
|
|
18
|
+
* - RFC capture `'summary'` ≈ retention `'summary'` (same marker shapes —
|
|
19
|
+
* see `summarize.ts`).
|
|
20
|
+
* - RFC capture `'ref'` is DELIVERY-tier only and is NOT implemented here
|
|
21
|
+
* — reserved. Retention must never hold live references into engine
|
|
22
|
+
* state: retained entries outlive the stage (the execution tree keeps
|
|
23
|
+
* them for the whole run), while a `'ref'` is only safe within the
|
|
24
|
+
* immutability window of the captured value. Holding one in retention
|
|
25
|
+
* would either pin state generations (the #18 leak) or expose
|
|
26
|
+
* later-mutated values as if they were point-in-time captures.
|
|
27
|
+
*/
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcG9saWNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwb2xpY2llcy50cyDigJQgVGhlIHJldGVudGlvbiBwb2xpY3kgZmFtaWx5IHNoYXJlZCBieSBldmVyeSBzbmFwc2hvdC10cmFja2luZ1xuICogZGlhbCAoIzE0IGByZWFkVHJhY2tpbmdgLCAjMTNjLUEgYHdyaXRlVHJhY2tpbmdgKS5cbiAqXG4gKiBSRVRFTlRJT04gYW5zd2VycyBcIndoYXQgZG9lcyB0aGUgZW5naW5lIEtFRVAgaW4gaXRzIG93biBzbmFwc2hvdCBzdGF0ZVxuICogKGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgIC8gYHN0YWdlV3JpdGVzYCwgYW5kIHRoZXJlZm9yZSB0aGUgY29tbWl0XG4gKiBvYnNlcnZlcidzIG11dGF0aW9ucyBwYXlsb2FkKSBhZnRlciB0aGUgbW9tZW50IG9mIHRoZSBvcGVyYXRpb24/XCIgSXQgaXNcbiAqIGRpc3RpbmN0IGZyb20gREVMSVZFUlkg4oCUIHdoYXQgYW4gb2JzZXJ2ZXIgcmVjZWl2ZXMgYXQgZXZlbnQgdGltZVxuICogKGBTY29wZVJlY29yZGVyLm9uUmVhZGAvYG9uV3JpdGVgIGFsd2F5cyBkZWxpdmVyIHRoZSBsaXZlIHZhbHVlLCBpbiBldmVyeVxuICogcmV0ZW50aW9uIG1vZGUpLlxuICpcbiAqIOKUgOKUgCBSRkMtMDAxIChkZWZlcnJlZCBvYnNlcnZlciBkZWxpdmVyeSkgbWFwcGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIFJGQy0wMDEncyBjYXB0dXJlIHRpZXIgdXNlcyB0aGUgdm9jYWJ1bGFyeSBgJ2Nsb25lJyB8ICdzdW1tYXJ5JyB8ICdyZWYnYC5cbiAqIFdoZW4gaXRzIEJsb2NrIDEgbGFuZHMgaXQgYnVpbGRzIG9uIFRISVMgbW9kdWxlOlxuICpcbiAqICAgLSBSRkMgY2FwdHVyZSBgJ2Nsb25lJ2AgICDiiYggcmV0ZW50aW9uIGAnZnVsbCdgIChhbGlhcyBhdCB0aGUgbW9kdWxlXG4gKiAgICAgYm91bmRhcnkg4oCUIHNhbWUgc2VtYW50aWNzOiBzdHJ1Y3R1cmVkQ2xvbmUgYXQgY2FwdHVyZSB0aW1lKS5cbiAqICAgLSBSRkMgY2FwdHVyZSBgJ3N1bW1hcnknYCDiiYggcmV0ZW50aW9uIGAnc3VtbWFyeSdgIChzYW1lIG1hcmtlciBzaGFwZXMg4oCUXG4gKiAgICAgc2VlIGBzdW1tYXJpemUudHNgKS5cbiAqICAgLSBSRkMgY2FwdHVyZSBgJ3JlZidgIGlzIERFTElWRVJZLXRpZXIgb25seSBhbmQgaXMgTk9UIGltcGxlbWVudGVkIGhlcmVcbiAqICAgICDigJQgcmVzZXJ2ZWQuIFJldGVudGlvbiBtdXN0IG5ldmVyIGhvbGQgbGl2ZSByZWZlcmVuY2VzIGludG8gZW5naW5lXG4gKiAgICAgc3RhdGU6IHJldGFpbmVkIGVudHJpZXMgb3V0bGl2ZSB0aGUgc3RhZ2UgKHRoZSBleGVjdXRpb24gdHJlZSBrZWVwc1xuICogICAgIHRoZW0gZm9yIHRoZSB3aG9sZSBydW4pLCB3aGlsZSBhIGAncmVmJ2AgaXMgb25seSBzYWZlIHdpdGhpbiB0aGVcbiAqICAgICBpbW11dGFiaWxpdHkgd2luZG93IG9mIHRoZSBjYXB0dXJlZCB2YWx1ZS4gSG9sZGluZyBvbmUgaW4gcmV0ZW50aW9uXG4gKiAgICAgd291bGQgZWl0aGVyIHBpbiBzdGF0ZSBnZW5lcmF0aW9ucyAodGhlICMxOCBsZWFrKSBvciBleHBvc2VcbiAqICAgICBsYXRlci1tdXRhdGVkIHZhbHVlcyBhcyBpZiB0aGV5IHdlcmUgcG9pbnQtaW4tdGltZSBjYXB0dXJlcy5cbiAqL1xuXG4vKipcbiAqIEhvdyBhIHRyYWNrZWQgb3BlcmF0aW9uJ3MgdmFsdWUgaXMgcmV0YWluZWQgaW4gdGhlIHBlci1zdGFnZSBzbmFwc2hvdCB2aWV3LlxuICpcbiAqIC0gYCdmdWxsJ2Ag4oCUIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoZSB2YWx1ZSBhdCB0aGUgbW9tZW50IG9mIHRoZSBvcGVyYXRpb25cbiAqICAgKHRoZSBoaXN0b3JpY2FsIGRlZmF1bHQgZm9yIGJvdGggZGlhbHM7IHBvaW50LWluLXRpbWUsIGRldGFjaGVkIGNvcHkpLlxuICogLSBgJ3N1bW1hcnknYCDigJQgcmV0YWluIGEgY2hlYXAgbWFya2VyICh0eXBlICsgc2l6ZSBwcm94eSArIHNob3J0IHByZXZpZXcpXG4gKiAgIGluc3RlYWQgb2YgdGhlIHZhbHVlLiBPKDEpLWlzaCBwZXIgb3BlcmF0aW9uOyBubyB2YWx1ZSBjbG9uZS5cbiAqIC0gYCdvZmYnYCDigJQgcmV0YWluIG5vdGhpbmcuIFRoZSBvcGVyYXRpb24gaXRzZWxmIGlzIHVuYWZmZWN0ZWQgKHJlYWRzXG4gKiAgIHN0aWxsIHJldHVybiB2YWx1ZXMsIHdyaXRlcyBzdGlsbCBjb21taXQpOyBvbmx5IHRoZSBzbmFwc2hvdCBib29ra2VlcGluZ1xuICogICBpcyBza2lwcGVkLlxuICpcbiAqIGBSZWFkVHJhY2tpbmdNb2RlYCAoIzE0KSBhbmQgYFdyaXRlVHJhY2tpbmdNb2RlYCAoIzEzYy1BKSBhcmUgcHVibGljXG4gKiBhbGlhc2VzIG9mIHRoaXMgdHlwZSDigJQgc2VlIGBtZW1vcnkvdHlwZXMudHNgLlxuICovXG5leHBvcnQgdHlwZSBSZXRlbnRpb25Qb2xpY3kgPSAnZnVsbCcgfCAnc3VtbWFyeScgfCAnb2ZmJztcbiJdfQ==
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* summarize.ts — Cheap value summarization for `'summary'` retention.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `StageContext` (#14's `summarizeReadValue`) into a shared,
|
|
5
|
+
* brand-parameterized helper so both snapshot-tracking dials (#14
|
|
6
|
+
* `readTracking`, #13c-A `writeTracking`) — and later RFC-001's deferred
|
|
7
|
+
* observer capture tier — produce identical summaries from ONE code path.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately avoids every O(value) operation: no clone, no serialization.
|
|
10
|
+
* See {@link ReadSummaryMarker} for the honest-cost contract.
|
|
11
|
+
*/
|
|
12
|
+
/** Max characters captured in a summary marker's `preview`. */
|
|
13
|
+
export const SUMMARY_PREVIEW_LENGTH = 80;
|
|
14
|
+
/**
|
|
15
|
+
* Compat alias for {@link SUMMARY_PREVIEW_LENGTH} — the name shipped with
|
|
16
|
+
* #14, kept so existing import paths (`memory/types`, the memory barrel)
|
|
17
|
+
* stay valid. Same constant; reads and writes share one preview cap.
|
|
18
|
+
*/
|
|
19
|
+
export const READ_PREVIEW_LENGTH = SUMMARY_PREVIEW_LENGTH;
|
|
20
|
+
/**
|
|
21
|
+
* The one classification path both brands share — every per-type rule
|
|
22
|
+
* (including the Map/Set real-entry-count handling) lives here exactly once.
|
|
23
|
+
*/
|
|
24
|
+
function classifyValue(value) {
|
|
25
|
+
if (value === null)
|
|
26
|
+
return { type: 'null' };
|
|
27
|
+
if (typeof value === 'string') {
|
|
28
|
+
return { type: 'string', size: value.length, preview: value.slice(0, SUMMARY_PREVIEW_LENGTH) };
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(value))
|
|
31
|
+
return { type: 'array', size: value.length };
|
|
32
|
+
if (value instanceof Map || value instanceof Set) {
|
|
33
|
+
// Object.keys() on a Map/Set is always [] — report the real entry count.
|
|
34
|
+
return { type: 'object', size: value.size };
|
|
35
|
+
}
|
|
36
|
+
if (typeof value === 'object') {
|
|
37
|
+
return { type: 'object', size: Object.keys(value).length };
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === 'function')
|
|
40
|
+
return { type: 'function' };
|
|
41
|
+
// number | boolean | bigint | symbol — String() is O(rendered length)
|
|
42
|
+
return { type: typeof value, preview: String(value).slice(0, SUMMARY_PREVIEW_LENGTH) };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Summarize a tracked READ for `readTracking: 'summary'` (#14). Byte-identical
|
|
46
|
+
* output to the pre-extraction `StageContext`-local implementation.
|
|
47
|
+
*/
|
|
48
|
+
export function summarizeReadValue(value) {
|
|
49
|
+
return { __readSummary: true, ...classifyValue(value) };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Summarize a tracked WRITE for `writeTracking: 'summary'` (#13c-A). Sibling
|
|
53
|
+
* of {@link summarizeReadValue} — same classification, distinct brand.
|
|
54
|
+
*/
|
|
55
|
+
export function summarizeWriteValue(value) {
|
|
56
|
+
return { __writeSummary: true, ...classifyValue(value) };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3N1bW1hcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUV6Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsc0JBQXNCLENBQUM7QUFrRDFEOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsRUFBRSxDQUFDO0lBQ2pHLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN2RSxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2pELHlFQUF5RTtRQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQWdDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN4RixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUM3RCxzRUFBc0U7SUFDdEUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEtBQXlCLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztBQUM3RyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdW1tYXJpemUudHMg4oCUIENoZWFwIHZhbHVlIHN1bW1hcml6YXRpb24gZm9yIGAnc3VtbWFyeSdgIHJldGVudGlvbi5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSBgU3RhZ2VDb250ZXh0YCAoIzE0J3MgYHN1bW1hcml6ZVJlYWRWYWx1ZWApIGludG8gYSBzaGFyZWQsXG4gKiBicmFuZC1wYXJhbWV0ZXJpemVkIGhlbHBlciBzbyBib3RoIHNuYXBzaG90LXRyYWNraW5nIGRpYWxzICgjMTRcbiAqIGByZWFkVHJhY2tpbmdgLCAjMTNjLUEgYHdyaXRlVHJhY2tpbmdgKSDigJQgYW5kIGxhdGVyIFJGQy0wMDEncyBkZWZlcnJlZFxuICogb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyIOKAlCBwcm9kdWNlIGlkZW50aWNhbCBzdW1tYXJpZXMgZnJvbSBPTkUgY29kZSBwYXRoLlxuICpcbiAqIERlbGliZXJhdGVseSBhdm9pZHMgZXZlcnkgTyh2YWx1ZSkgb3BlcmF0aW9uOiBubyBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbi5cbiAqIFNlZSB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9IGZvciB0aGUgaG9uZXN0LWNvc3QgY29udHJhY3QuXG4gKi9cblxuLyoqIE1heCBjaGFyYWN0ZXJzIGNhcHR1cmVkIGluIGEgc3VtbWFyeSBtYXJrZXIncyBgcHJldmlld2AuICovXG5leHBvcnQgY29uc3QgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSCA9IDgwO1xuXG4vKipcbiAqIENvbXBhdCBhbGlhcyBmb3Ige0BsaW5rIFNVTU1BUllfUFJFVklFV19MRU5HVEh9IOKAlCB0aGUgbmFtZSBzaGlwcGVkIHdpdGhcbiAqICMxNCwga2VwdCBzbyBleGlzdGluZyBpbXBvcnQgcGF0aHMgKGBtZW1vcnkvdHlwZXNgLCB0aGUgbWVtb3J5IGJhcnJlbClcbiAqIHN0YXkgdmFsaWQuIFNhbWUgY29uc3RhbnQ7IHJlYWRzIGFuZCB3cml0ZXMgc2hhcmUgb25lIHByZXZpZXcgY2FwLlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9QUkVWSUVXX0xFTkdUSCA9IFNVTU1BUllfUFJFVklFV19MRU5HVEg7XG5cbi8qKiBgdHlwZW9mYCByZXN1bHQsIHJlZmluZWQgdG8gJ2FycmF5JyAvICdudWxsJyBmb3Igb2JqZWN0cy4gKi9cbmV4cG9ydCB0eXBlIFN1bW1hcnlWYWx1ZVR5cGUgPVxuICB8ICdzdHJpbmcnXG4gIHwgJ251bWJlcidcbiAgfCAnYm9vbGVhbidcbiAgfCAnYmlnaW50J1xuICB8ICdzeW1ib2wnXG4gIHwgJ2Z1bmN0aW9uJ1xuICB8ICdvYmplY3QnXG4gIHwgJ2FycmF5J1xuICB8ICdudWxsJztcblxuLyoqIEJyYW5kLWZyZWUgc3VtbWFyeSBmaWVsZHMgc2hhcmVkIGJ5IGJvdGggbWFya2VyIHNoYXBlcy4gKi9cbmludGVyZmFjZSBWYWx1ZVN1bW1hcnkge1xuICAvKiogYHR5cGVvZmAgcmVzdWx0LCByZWZpbmVkIHRvICdhcnJheScgLyAnbnVsbCcgZm9yIG9iamVjdHMuICovXG4gIHR5cGU6IFN1bW1hcnlWYWx1ZVR5cGU7XG4gIC8qKiBTaXplIHByb3h5OiBzdHJpbmcgbGVuZ3RoLCBhcnJheSBsZW5ndGgsIG9yIG9iamVjdCBrZXkgY291bnQuICovXG4gIHNpemU/OiBudW1iZXI7XG4gIC8qKiBGaXJzdCB7QGxpbmsgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSH0gY2hhcnMg4oCUIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3Mgb25seS4gKi9cbiAgcHJldmlldz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXJrZXIgcmVjb3JkZWQgaW4gYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgdW5kZXIgYHJlYWRUcmFja2luZzogJ3N1bW1hcnknYC5cbiAqXG4gKiBIb25lc3QgY29zdCBub3RlOiBgc2l6ZWAgaXMgYSBjaGVhcCBwcm94eSAoc3RyaW5nIGxlbmd0aCAvIGFycmF5IGxlbmd0aCAvXG4gKiBvYmplY3Qga2V5IGNvdW50KSwgTk9UIGEgc2VyaWFsaXplZCBieXRlIGNvdW50IOKAlCBjb21wdXRpbmcgcmVhbCBieXRlIHNpemVcbiAqIHdvdWxkIHJlcXVpcmUgYW4gTyh2YWx1ZSkgc2VyaWFsaXphdGlvbiwgd2hpY2ggaXMgZXhhY3RseSB0aGUgY29zdCB0aGVcbiAqIHN1bW1hcnkgbW9kZSByZW1vdmVzLiBgcHJldmlld2AgaXMgb25seSBwcm9kdWNlZCBmb3IgcHJpbWl0aXZlcyBhbmQgc3RyaW5nc1xuICogKGZpcnN0IHtAbGluayBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIfSBjaGFyYWN0ZXJzKTsgb2JqZWN0cyBhbmQgYXJyYXlzIGNhcnJ5XG4gKiBubyBwcmV2aWV3IGZvciB0aGUgc2FtZSByZWFzb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFN1bW1hcnlNYXJrZXIgZXh0ZW5kcyBWYWx1ZVN1bW1hcnkge1xuICAvKiogRGlzY3JpbWluYW50IOKAlCBsZXRzIHNuYXBzaG90IGNvbnN1bWVycyBkZXRlY3QgbWFya2VyIGVudHJpZXMuICovXG4gIF9fcmVhZFN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGVkIGluIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoYW5kIHRoZSBjb21taXQgb2JzZXJ2ZXInc1xuICogbXV0YXRpb25zIHBheWxvYWQpIHVuZGVyIGB3cml0ZVRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTNjLUEpLiBTYW1lIGZpZWxkc1xuICogYW5kIGNvc3QgY29udHJhY3QgYXMge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfTsgZGlzdGluY3QgYnJhbmQgc28gY29uc3VtZXJzXG4gKiBjYW4gdGVsbCB3aGljaCBkaWFsIHByb2R1Y2VkIGFuIGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlU3VtbWFyeU1hcmtlciBleHRlbmRzIFZhbHVlU3VtbWFyeSB7XG4gIC8qKiBEaXNjcmltaW5hbnQg4oCUIGxldHMgc25hcHNob3QgY29uc3VtZXJzIGRldGVjdCBtYXJrZXIgZW50cmllcy4gKi9cbiAgX193cml0ZVN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogVGhlIG9uZSBjbGFzc2lmaWNhdGlvbiBwYXRoIGJvdGggYnJhbmRzIHNoYXJlIOKAlCBldmVyeSBwZXItdHlwZSBydWxlXG4gKiAoaW5jbHVkaW5nIHRoZSBNYXAvU2V0IHJlYWwtZW50cnktY291bnQgaGFuZGxpbmcpIGxpdmVzIGhlcmUgZXhhY3RseSBvbmNlLlxuICovXG5mdW5jdGlvbiBjbGFzc2lmeVZhbHVlKHZhbHVlOiB1bmtub3duKTogVmFsdWVTdW1tYXJ5IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbnVsbCcgfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnc3RyaW5nJywgc2l6ZTogdmFsdWUubGVuZ3RoLCBwcmV2aWV3OiB2YWx1ZS5zbGljZSgwLCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIKSB9O1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHsgdHlwZTogJ2FycmF5Jywgc2l6ZTogdmFsdWUubGVuZ3RoIH07XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgIC8vIE9iamVjdC5rZXlzKCkgb24gYSBNYXAvU2V0IGlzIGFsd2F5cyBbXSDigJQgcmVwb3J0IHRoZSByZWFsIGVudHJ5IGNvdW50LlxuICAgIHJldHVybiB7IHR5cGU6ICdvYmplY3QnLCBzaXplOiB2YWx1ZS5zaXplIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnb2JqZWN0Jywgc2l6ZTogT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxlbmd0aCB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IHR5cGU6ICdmdW5jdGlvbicgfTtcbiAgLy8gbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCDigJQgU3RyaW5nKCkgaXMgTyhyZW5kZXJlZCBsZW5ndGgpXG4gIHJldHVybiB7IHR5cGU6IHR5cGVvZiB2YWx1ZSBhcyBTdW1tYXJ5VmFsdWVUeXBlLCBwcmV2aWV3OiBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIFNVTU1BUllfUFJFVklFV19MRU5HVEgpIH07XG59XG5cbi8qKlxuICogU3VtbWFyaXplIGEgdHJhY2tlZCBSRUFEIGZvciBgcmVhZFRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTQpLiBCeXRlLWlkZW50aWNhbFxuICogb3V0cHV0IHRvIHRoZSBwcmUtZXh0cmFjdGlvbiBgU3RhZ2VDb250ZXh0YC1sb2NhbCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVJlYWRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFJlYWRTdW1tYXJ5TWFya2VyIHtcbiAgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgLi4uY2xhc3NpZnlWYWx1ZSh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBTdW1tYXJpemUgYSB0cmFja2VkIFdSSVRFIGZvciBgd3JpdGVUcmFja2luZzogJ3N1bW1hcnknYCAoIzEzYy1BKS4gU2libGluZ1xuICogb2Yge0BsaW5rIHN1bW1hcml6ZVJlYWRWYWx1ZX0g4oCUIHNhbWUgY2xhc3NpZmljYXRpb24sIGRpc3RpbmN0IGJyYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplV3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFdyaXRlU3VtbWFyeU1hcmtlciB7XG4gIHJldHVybiB7IF9fd3JpdGVTdW1tYXJ5OiB0cnVlLCAuLi5jbGFzc2lmeVZhbHVlKHZhbHVlKSB9O1xufVxuIl19
|
|
@@ -27,6 +27,18 @@ export class ContinuationResolver {
|
|
|
27
27
|
* Key: node.id, Value: visit count (0 = first visit).
|
|
28
28
|
*/
|
|
29
29
|
iterationCounters = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Total fn-bearing dynamic-next hops this traverser has followed.
|
|
32
|
+
*
|
|
33
|
+
* Fresh fn-bearing nodes bypass the per-node-id iteration counter (they
|
|
34
|
+
* are new nodes, often without stable ids — there is no back-edge to
|
|
35
|
+
* count). Without a bound, a stage that keeps returning a function-bearing
|
|
36
|
+
* dynamic `next` runs FOREVER on the flat trampoline (no stack overflow
|
|
37
|
+
* brakes it either). This run-total counter puts such chains under the
|
|
38
|
+
* same `maxIterations` budget (default 1000, tuned via
|
|
39
|
+
* `RunOptions.maxIterations`) that bounds loop edges.
|
|
40
|
+
*/
|
|
41
|
+
dynamicNextHops = 0;
|
|
30
42
|
onIterationUpdate;
|
|
31
43
|
maxIterations;
|
|
32
44
|
constructor(deps, nodeResolver, onIterationUpdate, maxIterations) {
|
|
@@ -52,14 +64,21 @@ export class ContinuationResolver {
|
|
|
52
64
|
* `onLoop` narrative), in the same order.
|
|
53
65
|
*
|
|
54
66
|
* Three dynamicNext patterns:
|
|
55
|
-
* - StageNode with fn → truly dynamic node, returned as-is (no
|
|
56
|
-
* tracking — it is a fresh node, not a back-edge
|
|
67
|
+
* - StageNode with fn → truly dynamic node, returned as-is (no per-node
|
|
68
|
+
* iteration tracking — it is a fresh node, not a back-edge — but the
|
|
69
|
+
* run-total dynamic-hop budget applies; see `dynamicNextHops`).
|
|
57
70
|
* - String ID → reference to an existing node, resolved via NodeResolver.
|
|
58
71
|
* - StageNode without fn → reference by ID, resolved via NodeResolver.
|
|
59
72
|
*/
|
|
60
73
|
resolveTarget(dynamicNext, currentNode, context, branchPath, traversalContext) {
|
|
61
|
-
// Truly dynamic node (has fn) → execute directly, no iteration
|
|
74
|
+
// Truly dynamic node (has fn) → execute directly, no per-node iteration
|
|
75
|
+
// tracking (fresh node, not a back-edge) — but the CHAIN of such hops is
|
|
76
|
+
// bounded by the run-total guard below, mirroring the loop budget.
|
|
62
77
|
if (typeof dynamicNext !== 'string' && dynamicNext.fn) {
|
|
78
|
+
if (this.dynamicNextHops >= this.maxIterations) {
|
|
79
|
+
throw new Error(`Maximum dynamic-next continuations (${this.maxIterations}) exceeded at stage '${currentNode.id ?? currentNode.name}' ` + `(dynamic target '${dynamicNext.name}'). Set maxIterations to increase the limit.`);
|
|
80
|
+
}
|
|
81
|
+
this.dynamicNextHops++;
|
|
63
82
|
context.addLog('dynamicNextDirect', true);
|
|
64
83
|
context.addLog('dynamicNextName', dynamicNext.name);
|
|
65
84
|
context.addFlowDebugMessage('next', `Moving to ${dynamicNext.name} stage (dynamic)`, {
|
|
@@ -120,4 +139,4 @@ export class ContinuationResolver {
|
|
|
120
139
|
return iteration === 0 ? baseName : `${baseName}.${iteration}`;
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQVNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQWEzQyxNQUFNLE9BQU8sb0JBQW9CO0lBV1o7SUFDQTtJQVhuQjs7O09BR0c7SUFDSyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUxQyxpQkFBaUIsQ0FBMkM7SUFDNUQsYUFBYSxDQUFTO0lBRXZDLFlBQ21CLElBQStCLEVBQy9CLFlBQXdDLEVBQ3pELGlCQUEyRCxFQUMzRCxhQUFzQjtRQUhMLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUE0QjtRQUl6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLElBQUksc0JBQXNCLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxXQUE2QyxFQUM3QyxJQUE2QixFQUM3QixPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGFBQWEsQ0FDWCxXQUE2QyxFQUM3QyxXQUFvQyxFQUNwQyxPQUFxQixFQUNyQixVQUE4QixFQUM5QixnQkFBbUM7UUFFbkMseUVBQXlFO1FBQ3pFLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0RCxPQUFPLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXBELE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxXQUFXLENBQUMsSUFBSSxrQkFBa0IsRUFBRTtnQkFDbkYsV0FBVyxFQUFFLFdBQVcsQ0FBQyxJQUFJO2FBQzlCLENBQUMsQ0FBQztZQUVILE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFvQixFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BHLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFELENBQUM7UUFFRCxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFlBQVksR0FBRyx5REFBeUQsQ0FBQztZQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLFVBQVUsWUFBWSxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNsSCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxPQUFPLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUcsQ0FBQztRQUVuRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxZQUFZLEdBQUcsc0NBQXNDLFVBQVUsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsVUFBVSxZQUFZLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ2xILE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRCxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLG1CQUFtQixVQUFVLENBQUMsSUFBSSxlQUFlLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNyRyxXQUFXLEVBQUUsVUFBVSxDQUFDLElBQUk7WUFDNUIsU0FBUyxFQUFFLFNBQVMsR0FBRyxDQUFDO1NBQ3pCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFOUcsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDYiw0QkFBNEIsSUFBSSxDQUFDLGFBQWEsd0JBQXdCLE1BQU0sS0FBSztnQkFDL0UsMENBQTBDLENBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFNBQWlCO1FBQ3RELE9BQU8sU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRpbnVhdGlvblJlc29sdmVyIOKAlCBCYWNrLWVkZ2UgcmVzb2x1dGlvbiArIGl0ZXJhdGlvbiBjb3VudGluZy5cbiAqXG4gKiBSZXNvbHZlcyBkeW5hbWljIGNvbnRpbnVhdGlvbnMgKGxvb3AtYmFja3MsIGR5bmFtaWMgbmV4dCkgYW5kIHRyYWNrc1xuICogcGVyLW5vZGUgaXRlcmF0aW9uIGNvdW50cyBmb3IgY29udGV4dCB0cmVlIG5hbWluZy5cbiAqXG4gKiBTdXBwb3J0cyB0aHJlZSBkeW5hbWljTmV4dCBwYXR0ZXJuczpcbiAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gZXhpc3Rpbmcgbm9kZSAocmVzb2x2ZSB2aWEgTm9kZVJlc29sdmVyKVxuICogLSBTdGFnZU5vZGUgd2l0aCBmbiDihpIgdHJ1bHkgZHluYW1pYyBub2RlIChleGVjdXRlIGRpcmVjdGx5KVxuICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElEIChyZXNvbHZlIHZpYSBOb2RlUmVzb2x2ZXIpXG4gKlxuICogVHdvIGVudHJ5IHBvaW50czpcbiAqIC0gYHJlc29sdmVUYXJnZXRgIOKAlCByZXNvbHZlcyB0aGUgY29udGludWF0aW9uIHRvIGB7IG5vZGUsIGNvbnRleHQgfWAgYW5kXG4gKiAgIGZpcmVzIGV2ZXJ5IHNpZGUgZWZmZWN0IChpdGVyYXRpb24gY291bnRpbmcsIGRlYnVnIGxvZ3MsIGBvbkxvb3BgXG4gKiAgIG5hcnJhdGl2ZSkgV0lUSE9VVCBleGVjdXRpbmcuIFRoZSB0cmF2ZXJzZXIncyB0cmFtcG9saW5lIGRyaXZlciB1c2VzXG4gKiAgIHRoaXMgdG8gZm9sbG93IGxvb3AgZWRnZXMgaXRlcmF0aXZlbHkg4oCUIGZsYXQgc3RhY2ssIHNvIHRoZSBpdGVyYXRpb25cbiAqICAgbGltaXQgKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gKiAtIGByZXNvbHZlYCDigJQgcmVzb2x2ZVRhcmdldCArIGltbWVkaWF0ZSBleGVjdXRpb24gdmlhIHRoZSBwcm92aWRlZFxuICogICBgZXhlY3V0ZU5vZGVgIGNhbGxiYWNrLiBLZXB0IGZvciBkaXJlY3QvYWR2YW5jZWQgY2FsbGVycy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4vTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfSVRFUkFUSU9OUyA9IDEwMDA7XG5cbi8qKlxuICogQSByZXNvbHZlZCBjb250aW51YXRpb24gdGFyZ2V0IOKAlCB0aGUgbm9kZSB0byBleGVjdXRlIG5leHQgcGx1cyB0aGVcbiAqIFN0YWdlQ29udGV4dCB0byBleGVjdXRlIGl0IGluLiBBbGwgc2lkZSBlZmZlY3RzIChpdGVyYXRpb24gY291bnRpbmcsXG4gKiBkZWJ1ZyBsb2dzLCBgb25Mb29wYCBuYXJyYXRpdmUpIGhhdmUgYWxyZWFkeSBmaXJlZCBieSB0aGUgdGltZSB0aGlzXG4gKiBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbnRpbnVhdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogSXRlcmF0aW9uIGNvdW50ZXIgcGVyIG5vZGUgSUQuXG4gICAqIEtleTogbm9kZS5pZCwgVmFsdWU6IHZpc2l0IGNvdW50ICgwID0gZmlyc3QgdmlzaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpdGVyYXRpb25Db3VudGVyczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uSXRlcmF0aW9uVXBkYXRlPzogKG5vZGVJZDogc3RyaW5nLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEl0ZXJhdGlvbnM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBub2RlUmVzb2x2ZXI6IE5vZGVSZXNvbHZlcjxUT3V0LCBUU2NvcGU+LFxuICAgIG9uSXRlcmF0aW9uVXBkYXRlPzogKG5vZGVJZDogc3RyaW5nLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkLFxuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMub25JdGVyYXRpb25VcGRhdGUgPSBvbkl0ZXJhdGlvblVwZGF0ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSBtYXhJdGVyYXRpb25zID8/IERFRkFVTFRfTUFYX0lURVJBVElPTlM7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGR5bmFtaWMgY29udGludWF0aW9uIGFuZCBleGVjdXRlIGl0IGltbWVkaWF0ZWx5LlxuICAgKiBFcXVpdmFsZW50IHRvIGBleGVjdXRlTm9kZSguLi5yZXNvbHZlVGFyZ2V0KC4uLikpYCDigJQgdGhlIHRyYXZlcnNlcidzXG4gICAqIGRyaXZlciBsb29wIGNhbGxzIGByZXNvbHZlVGFyZ2V0YCBkaXJlY3RseSBpbnN0ZWFkIHNvIHRoZSBjb250aW51YXRpb25cbiAgICogYmVjb21lcyBhIGZsYXQgdHJhbXBvbGluZSBob3AgcmF0aGVyIHRoYW4gYSByZXRhaW5lZCByZWN1cnNpdmUgZnJhbWUuXG4gICAqL1xuICBhc3luYyByZXNvbHZlKFxuICAgIGR5bmFtaWNOZXh0OiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlVGFyZ2V0KGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICByZXR1cm4gZXhlY3V0ZU5vZGUodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiB0byBpdHMgdGFyZ2V0IG5vZGUgKyBuZXh0IFN0YWdlQ29udGV4dFxuICAgKiBXSVRIT1VUIGV4ZWN1dGluZyBpdC4gRmlyZXMgdGhlIHNhbWUgc2lkZSBlZmZlY3RzIGByZXNvbHZlYCBhbHdheXMgZGlkXG4gICAqIChpdGVyYXRpb24gY291bnRpbmcgKyBsaW1pdCwgYGR5bmFtaWNOZXh0KmAgbG9ncywgbG9vcCBkZWJ1ZyBtZXNzYWdlLFxuICAgKiBgb25Mb29wYCBuYXJyYXRpdmUpLCBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogVGhyZWUgZHluYW1pY05leHQgcGF0dGVybnM6XG4gICAqIC0gU3RhZ2VOb2RlIHdpdGggZm4g4oaSIHRydWx5IGR5bmFtaWMgbm9kZSwgcmV0dXJuZWQgYXMtaXMgKG5vIGl0ZXJhdGlvblxuICAgKiAgIHRyYWNraW5nIOKAlCBpdCBpcyBhIGZyZXNoIG5vZGUsIG5vdCBhIGJhY2stZWRnZSkuXG4gICAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm9kZSwgcmVzb2x2ZWQgdmlhIE5vZGVSZXNvbHZlci5cbiAgICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElELCByZXNvbHZlZCB2aWEgTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcmVzb2x2ZVRhcmdldChcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VycmVudE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFJlc29sdmVkQ29udGludWF0aW9uPFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIFRydWx5IGR5bmFtaWMgbm9kZSAoaGFzIGZuKSDihpIgZXhlY3V0ZSBkaXJlY3RseSwgbm8gaXRlcmF0aW9uIHRyYWNraW5nLlxuICAgIGlmICh0eXBlb2YgZHluYW1pY05leHQgIT09ICdzdHJpbmcnICYmIGR5bmFtaWNOZXh0LmZuKSB7XG4gICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHREaXJlY3QnLCB0cnVlKTtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dE5hbWUnLCBkeW5hbWljTmV4dC5uYW1lKTtcblxuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke2R5bmFtaWNOZXh0Lm5hbWV9IHN0YWdlIChkeW5hbWljKWAsIHtcbiAgICAgICAgdGFyZ2V0U3RhZ2U6IGR5bmFtaWNOZXh0Lm5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmV4dFN0YWdlQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgZHluYW1pY05leHQubmFtZSwgZHluYW1pY05leHQuaWQpO1xuICAgICAgcmV0dXJuIHsgbm9kZTogZHluYW1pY05leHQsIGNvbnRleHQ6IG5leHRTdGFnZUNvbnRleHQgfTtcbiAgICB9XG5cbiAgICAvLyBSZWZlcmVuY2Ug4oCUIGJ5IHN0cmluZyBJRCBvciBieSBub2RlLXdpdGhvdXQtZm4gSUQuIEEgbm9kZSByZWZlcmVuY2VcbiAgICAvLyB3aXRob3V0IGFuIGlkIGlzIGEgdXNhZ2UgZXJyb3I7IGEgc3RyaW5nIHJlZmVyZW5jZSBpcyBwYXNzZWQgdGhyb3VnaFxuICAgIC8vIHZlcmJhdGltIChhbiB1bmtub3duIGlkIHN1cmZhY2VzIGFzIFwidGFyZ2V0IG5vZGUgbm90IGZvdW5kXCIgYmVsb3cpLlxuICAgIGlmICh0eXBlb2YgZHluYW1pY05leHQgIT09ICdzdHJpbmcnICYmICFkeW5hbWljTmV4dC5pZCkge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gJ2R5bmFtaWNOZXh0IG5vZGUgbXVzdCBoYXZlIGFuIGlkIHdoZW4gdXNlZCBhcyByZWZlcmVuY2UnO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske2N1cnJlbnROb2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgY29uc3QgbmV4dE5vZGVJZCA9IHR5cGVvZiBkeW5hbWljTmV4dCA9PT0gJ3N0cmluZycgPyBkeW5hbWljTmV4dCA6IGR5bmFtaWNOZXh0LmlkITtcblxuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0aGlzLm5vZGVSZXNvbHZlci5maW5kTm9kZUJ5SWQobmV4dE5vZGVJZCk7XG4gICAgaWYgKCF0YXJnZXROb2RlKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgZHluYW1pY05leHQgdGFyZ2V0IG5vZGUgbm90IGZvdW5kOiAke25leHROb2RlSWR9YDtcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtjdXJyZW50Tm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlcmF0aW9uID0gdGhpcy5nZXRBbmRJbmNyZW1lbnRJdGVyYXRpb24obmV4dE5vZGVJZCk7XG4gICAgY29uc3QgaXRlcmF0ZWRTdGFnZU5hbWUgPSB0aGlzLmdldEl0ZXJhdGVkU3RhZ2VOYW1lKHRhcmdldE5vZGUubmFtZSwgaXRlcmF0aW9uKTtcbiAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHRUYXJnZXQnLCBuZXh0Tm9kZUlkKTtcbiAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHRJdGVyYXRpb24nLCBpdGVyYXRpb24pO1xuXG4gICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdsb29wJywgYExvb3BpbmcgYmFjayB0byAke3RhcmdldE5vZGUubmFtZX0gKGl0ZXJhdGlvbiAke2l0ZXJhdGlvbiArIDF9KWAsIHtcbiAgICAgIHRhcmdldFN0YWdlOiB0YXJnZXROb2RlLm5hbWUsXG4gICAgICBpdGVyYXRpb246IGl0ZXJhdGlvbiArIDEsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uTG9vcCh0YXJnZXROb2RlLm5hbWUsIGl0ZXJhdGlvbiArIDEsIHRhcmdldE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgY29uc3QgbmV4dFN0YWdlQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgaXRlcmF0ZWRTdGFnZU5hbWUsIHRhcmdldE5vZGUuaWQpO1xuICAgIHJldHVybiB7IG5vZGU6IHRhcmdldE5vZGUsIGNvbnRleHQ6IG5leHRTdGFnZUNvbnRleHQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5leHQgaXRlcmF0aW9uIG51bWJlciBmb3IgYSBub2RlIGFuZCBpbmNyZW1lbnQuXG4gICAqIFJldHVybnMgMCBmb3IgZmlyc3QgdmlzaXQsIDEgZm9yIHNlY29uZCwgZXRjLlxuICAgKiBUaHJvd3MgaWYgbWF4SXRlcmF0aW9ucyBleGNlZWRlZCAoaW5maW5pdGUgbG9vcCBndWFyZCkuXG4gICAqL1xuICBnZXRBbmRJbmNyZW1lbnRJdGVyYXRpb24obm9kZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLml0ZXJhdGlvbkNvdW50ZXJzLmdldChub2RlSWQpID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPj0gdGhpcy5tYXhJdGVyYXRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYXhpbXVtIGxvb3AgaXRlcmF0aW9ucyAoJHt0aGlzLm1heEl0ZXJhdGlvbnN9KSBleGNlZWRlZCBmb3Igbm9kZSAnJHtub2RlSWR9Jy4gYCArXG4gICAgICAgICAgJ1NldCBtYXhJdGVyYXRpb25zIHRvIGluY3JlYXNlIHRoZSBsaW1pdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5pdGVyYXRpb25Db3VudGVycy5zZXQobm9kZUlkLCBjdXJyZW50ICsgMSk7XG5cbiAgICBpZiAodGhpcy5vbkl0ZXJhdGlvblVwZGF0ZSkge1xuICAgICAgdGhpcy5vbkl0ZXJhdGlvblVwZGF0ZShub2RlSWQsIGN1cnJlbnQgKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBpdGVyYXRlZCBzdGFnZSBuYW1lIGZvciBjb250ZXh0IHRyZWUuXG4gICAqIEZpcnN0IHZpc2l0OiBcImFza0xMTVwiLCBzZWNvbmQ6IFwiYXNrTExNLjFcIiwgdGhpcmQ6IFwiYXNrTExNLjJcIi5cbiAgICovXG4gIGdldEl0ZXJhdGVkU3RhZ2VOYW1lKGJhc2VOYW1lOiBzdHJpbmcsIGl0ZXJhdGlvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlcmF0aW9uID09PSAwID8gYmFzZU5hbWUgOiBgJHtiYXNlTmFtZX0uJHtpdGVyYXRpb259YDtcbiAgfVxufVxuIl19
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQVNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQWEzQyxNQUFNLE9BQU8sb0JBQW9CO0lBd0JaO0lBQ0E7SUF4Qm5COzs7T0FHRztJQUNLLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNEOzs7Ozs7Ozs7O09BVUc7SUFDSyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRVgsaUJBQWlCLENBQTJDO0lBQzVELGFBQWEsQ0FBUztJQUV2QyxZQUNtQixJQUErQixFQUMvQixZQUF3QyxFQUN6RCxpQkFBMkQsRUFDM0QsYUFBc0I7UUFITCxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBNEI7UUFJekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxJQUFJLHNCQUFzQixDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsV0FBNkMsRUFDN0MsSUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsU0FBbUMsRUFDbkMsVUFBOEIsRUFDOUIsV0FBd0MsRUFDeEMsZ0JBQW1DO1FBRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDNUYsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENB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QUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7UUFDdEQsT0FBTyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGludWF0aW9uUmVzb2x2ZXIg4oCUIEJhY2stZWRnZSByZXNvbHV0aW9uICsgaXRlcmF0aW9uIGNvdW50aW5nLlxuICpcbiAqIFJlc29sdmVzIGR5bmFtaWMgY29udGludWF0aW9ucyAobG9vcC1iYWNrcywgZHluYW1pYyBuZXh0KSBhbmQgdHJhY2tzXG4gKiBwZXItbm9kZSBpdGVyYXRpb24gY291bnRzIGZvciBjb250ZXh0IHRyZWUgbmFtaW5nLlxuICpcbiAqIFN1cHBvcnRzIHRocmVlIGR5bmFtaWNOZXh0IHBhdHRlcm5zOlxuICogLSBTdHJpbmcgSUQg4oaSIHJlZmVyZW5jZSB0byBleGlzdGluZyBub2RlIChyZXNvbHZlIHZpYSBOb2RlUmVzb2x2ZXIpXG4gKiAtIFN0YWdlTm9kZSB3aXRoIGZuIOKGkiB0cnVseSBkeW5hbWljIG5vZGUgKGV4ZWN1dGUgZGlyZWN0bHkpXG4gKiAtIFN0YWdlTm9kZSB3aXRob3V0IGZuIOKGkiByZWZlcmVuY2UgYnkgSUQgKHJlc29sdmUgdmlhIE5vZGVSZXNvbHZlcilcbiAqXG4gKiBUd28gZW50cnkgcG9pbnRzOlxuICogLSBgcmVzb2x2ZVRhcmdldGAg4oCUIHJlc29sdmVzIHRoZSBjb250aW51YXRpb24gdG8gYHsgbm9kZSwgY29udGV4dCB9YCBhbmRcbiAqICAgZmlyZXMgZXZlcnkgc2lkZSBlZmZlY3QgKGl0ZXJhdGlvbiBjb3VudGluZywgZGVidWcgbG9ncywgYG9uTG9vcGBcbiAqICAgbmFycmF0aXZlKSBXSVRIT1VUIGV4ZWN1dGluZy4gVGhlIHRyYXZlcnNlcidzIHRyYW1wb2xpbmUgZHJpdmVyIHVzZXNcbiAqICAgdGhpcyB0byBmb2xsb3cgbG9vcCBlZGdlcyBpdGVyYXRpdmVseSDigJQgZmxhdCBzdGFjaywgc28gdGhlIGl0ZXJhdGlvblxuICogICBsaW1pdCAobm90IGNhbGwtc3RhY2sgZGVwdGgpIGlzIHdoYXQgYm91bmRzIGEgbG9vcC5cbiAqIC0gYHJlc29sdmVgIOKAlCByZXNvbHZlVGFyZ2V0ICsgaW1tZWRpYXRlIGV4ZWN1dGlvbiB2aWEgdGhlIHByb3ZpZGVkXG4gKiAgIGBleGVjdXRlTm9kZWAgY2FsbGJhY2suIEtlcHQgZm9yIGRpcmVjdC9hZHZhbmNlZCBjYWxsZXJzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlTm9kZSB9IGZyb20gJy4uL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcyB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTm9kZVJlc29sdmVyIH0gZnJvbSAnLi9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRlTm9kZUZuIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9JVEVSQVRJT05TID0gMTAwMDtcblxuLyoqXG4gKiBBIHJlc29sdmVkIGNvbnRpbnVhdGlvbiB0YXJnZXQg4oCUIHRoZSBub2RlIHRvIGV4ZWN1dGUgbmV4dCBwbHVzIHRoZVxuICogU3RhZ2VDb250ZXh0IHRvIGV4ZWN1dGUgaXQgaW4uIEFsbCBzaWRlIGVmZmVjdHMgKGl0ZXJhdGlvbiBjb3VudGluZyxcbiAqIGRlYnVnIGxvZ3MsIGBvbkxvb3BgIG5hcnJhdGl2ZSkgaGF2ZSBhbHJlYWR5IGZpcmVkIGJ5IHRoZSB0aW1lIHRoaXNcbiAqIGlzIHJldHVybmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQ29udGludWF0aW9uPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgY29udGV4dDogU3RhZ2VDb250ZXh0O1xufVxuXG5leHBvcnQgY2xhc3MgQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBJdGVyYXRpb24gY291bnRlciBwZXIgbm9kZSBJRC5cbiAgICogS2V5OiBub2RlLmlkLCBWYWx1ZTogdmlzaXQgY291bnQgKDAgPSBmaXJzdCB2aXNpdCkuXG4gICAqL1xuICBwcml2YXRlIGl0ZXJhdGlvbkNvdW50ZXJzOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBmbi1iZWFyaW5nIGR5bmFtaWMtbmV4dCBob3BzIHRoaXMgdHJhdmVyc2VyIGhhcyBmb2xsb3dlZC5cbiAgICpcbiAgICogRnJlc2ggZm4tYmVhcmluZyBub2RlcyBieXBhc3MgdGhlIHBlci1ub2RlLWlkIGl0ZXJhdGlvbiBjb3VudGVyICh0aGV5XG4gICAqIGFyZSBuZXcgbm9kZXMsIG9mdGVuIHdpdGhvdXQgc3RhYmxlIGlkcyDigJQgdGhlcmUgaXMgbm8gYmFjay1lZGdlIHRvXG4gICAqIGNvdW50KS4gV2l0aG91dCBhIGJvdW5kLCBhIHN0YWdlIHRoYXQga2VlcHMgcmV0dXJuaW5nIGEgZnVuY3Rpb24tYmVhcmluZ1xuICAgKiBkeW5hbWljIGBuZXh0YCBydW5zIEZPUkVWRVIgb24gdGhlIGZsYXQgdHJhbXBvbGluZSAobm8gc3RhY2sgb3ZlcmZsb3dcbiAgICogYnJha2VzIGl0IGVpdGhlcikuIFRoaXMgcnVuLXRvdGFsIGNvdW50ZXIgcHV0cyBzdWNoIGNoYWlucyB1bmRlciB0aGVcbiAgICogc2FtZSBgbWF4SXRlcmF0aW9uc2AgYnVkZ2V0IChkZWZhdWx0IDEwMDAsIHR1bmVkIHZpYVxuICAgKiBgUnVuT3B0aW9ucy5tYXhJdGVyYXRpb25zYCkgdGhhdCBib3VuZHMgbG9vcCBlZGdlcy5cbiAgICovXG4gIHByaXZhdGUgZHluYW1pY05leHRIb3BzID0gMDtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uSXRlcmF0aW9uVXBkYXRlPzogKG5vZGVJZDogc3RyaW5nLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEl0ZXJhdGlvbnM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBub2RlUmVzb2x2ZXI6IE5vZGVSZXNvbHZlcjxUT3V0LCBUU2NvcGU+LFxuICAgIG9uSXRlcmF0aW9uVXBkYXRlPzogKG5vZGVJZDogc3RyaW5nLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkLFxuICAgIG1heEl0ZXJhdGlvbnM/OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMub25JdGVyYXRpb25VcGRhdGUgPSBvbkl0ZXJhdGlvblVwZGF0ZTtcbiAgICB0aGlzLm1heEl0ZXJhdGlvbnMgPSBtYXhJdGVyYXRpb25zID8/IERFRkFVTFRfTUFYX0lURVJBVElPTlM7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGR5bmFtaWMgY29udGludWF0aW9uIGFuZCBleGVjdXRlIGl0IGltbWVkaWF0ZWx5LlxuICAgKiBFcXVpdmFsZW50IHRvIGBleGVjdXRlTm9kZSguLi5yZXNvbHZlVGFyZ2V0KC4uLikpYCDigJQgdGhlIHRyYXZlcnNlcidzXG4gICAqIGRyaXZlciBsb29wIGNhbGxzIGByZXNvbHZlVGFyZ2V0YCBkaXJlY3RseSBpbnN0ZWFkIHNvIHRoZSBjb250aW51YXRpb25cbiAgICogYmVjb21lcyBhIGZsYXQgdHJhbXBvbGluZSBob3AgcmF0aGVyIHRoYW4gYSByZXRhaW5lZCByZWN1cnNpdmUgZnJhbWUuXG4gICAqL1xuICBhc3luYyByZXNvbHZlKFxuICAgIGR5bmFtaWNOZXh0OiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiB7IHNob3VsZEJyZWFrOiBib29sZWFuIH0sXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGV4ZWN1dGVOb2RlOiBFeGVjdXRlTm9kZUZuPFRPdXQsIFRTY29wZT4sXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlVGFyZ2V0KGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICByZXR1cm4gZXhlY3V0ZU5vZGUodGFyZ2V0Lm5vZGUsIHRhcmdldC5jb250ZXh0LCBicmVha0ZsYWcsIGJyYW5jaFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiB0byBpdHMgdGFyZ2V0IG5vZGUgKyBuZXh0IFN0YWdlQ29udGV4dFxuICAgKiBXSVRIT1VUIGV4ZWN1dGluZyBpdC4gRmlyZXMgdGhlIHNhbWUgc2lkZSBlZmZlY3RzIGByZXNvbHZlYCBhbHdheXMgZGlkXG4gICAqIChpdGVyYXRpb24gY291bnRpbmcgKyBsaW1pdCwgYGR5bmFtaWNOZXh0KmAgbG9ncywgbG9vcCBkZWJ1ZyBtZXNzYWdlLFxuICAgKiBgb25Mb29wYCBuYXJyYXRpdmUpLCBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogVGhyZWUgZHluYW1pY05leHQgcGF0dGVybnM6XG4gICAqIC0gU3RhZ2VOb2RlIHdpdGggZm4g4oaSIHRydWx5IGR5bmFtaWMgbm9kZSwgcmV0dXJuZWQgYXMtaXMgKG5vIHBlci1ub2RlXG4gICAqICAgaXRlcmF0aW9uIHRyYWNraW5nIOKAlCBpdCBpcyBhIGZyZXNoIG5vZGUsIG5vdCBhIGJhY2stZWRnZSDigJQgYnV0IHRoZVxuICAgKiAgIHJ1bi10b3RhbCBkeW5hbWljLWhvcCBidWRnZXQgYXBwbGllczsgc2VlIGBkeW5hbWljTmV4dEhvcHNgKS5cbiAgICogLSBTdHJpbmcgSUQg4oaSIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBub2RlLCByZXNvbHZlZCB2aWEgTm9kZVJlc29sdmVyLlxuICAgKiAtIFN0YWdlTm9kZSB3aXRob3V0IGZuIOKGkiByZWZlcmVuY2UgYnkgSUQsIHJlc29sdmVkIHZpYSBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICByZXNvbHZlVGFyZ2V0KFxuICAgIGR5bmFtaWNOZXh0OiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjdXJyZW50Tm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUmVzb2x2ZWRDb250aW51YXRpb248VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gVHJ1bHkgZHluYW1pYyBub2RlIChoYXMgZm4pIOKGkiBleGVjdXRlIGRpcmVjdGx5LCBubyBwZXItbm9kZSBpdGVyYXRpb25cbiAgICAvLyB0cmFja2luZyAoZnJlc2ggbm9kZSwgbm90IGEgYmFjay1lZGdlKSDigJQgYnV0IHRoZSBDSEFJTiBvZiBzdWNoIGhvcHMgaXNcbiAgICAvLyBib3VuZGVkIGJ5IHRoZSBydW4tdG90YWwgZ3VhcmQgYmVsb3csIG1pcnJvcmluZyB0aGUgbG9vcCBidWRnZXQuXG4gICAgaWYgKHR5cGVvZiBkeW5hbWljTmV4dCAhPT0gJ3N0cmluZycgJiYgZHluYW1pY05leHQuZm4pIHtcbiAgICAgIGlmICh0aGlzLmR5bmFtaWNOZXh0SG9wcyA+PSB0aGlzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNYXhpbXVtIGR5bmFtaWMtbmV4dCBjb250aW51YXRpb25zICgke3RoaXMubWF4SXRlcmF0aW9uc30pIGV4Y2VlZGVkIGF0IHN0YWdlICcke1xuICAgICAgICAgICAgY3VycmVudE5vZGUuaWQgPz8gY3VycmVudE5vZGUubmFtZVxuICAgICAgICAgIH0nIGAgKyBgKGR5bmFtaWMgdGFyZ2V0ICcke2R5bmFtaWNOZXh0Lm5hbWV9JykuIFNldCBtYXhJdGVyYXRpb25zIHRvIGluY3JlYXNlIHRoZSBsaW1pdC5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5keW5hbWljTmV4dEhvcHMrKztcblxuICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0RGlyZWN0JywgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHROYW1lJywgZHluYW1pY05leHQubmFtZSk7XG5cbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtkeW5hbWljTmV4dC5uYW1lfSBzdGFnZSAoZHluYW1pYylgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBkeW5hbWljTmV4dC5uYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGR5bmFtaWNOZXh0Lm5hbWUsIGR5bmFtaWNOZXh0LmlkKTtcbiAgICAgIHJldHVybiB7IG5vZGU6IGR5bmFtaWNOZXh0LCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gICAgfVxuXG4gICAgLy8gUmVmZXJlbmNlIOKAlCBieSBzdHJpbmcgSUQgb3IgYnkgbm9kZS13aXRob3V0LWZuIElELiBBIG5vZGUgcmVmZXJlbmNlXG4gICAgLy8gd2l0aG91dCBhbiBpZCBpcyBhIHVzYWdlIGVycm9yOyBhIHN0cmluZyByZWZlcmVuY2UgaXMgcGFzc2VkIHRocm91Z2hcbiAgICAvLyB2ZXJiYXRpbSAoYW4gdW5rbm93biBpZCBzdXJmYWNlcyBhcyBcInRhcmdldCBub2RlIG5vdCBmb3VuZFwiIGJlbG93KS5cbiAgICBpZiAodHlwZW9mIGR5bmFtaWNOZXh0ICE9PSAnc3RyaW5nJyAmJiAhZHluYW1pY05leHQuaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdkeW5hbWljTmV4dCBub2RlIG11c3QgaGF2ZSBhbiBpZCB3aGVuIHVzZWQgYXMgcmVmZXJlbmNlJztcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtjdXJyZW50Tm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IG5leHROb2RlSWQgPSB0eXBlb2YgZHluYW1pY05leHQgPT09ICdzdHJpbmcnID8gZHluYW1pY05leHQgOiBkeW5hbWljTmV4dC5pZCE7XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIuZmluZE5vZGVCeUlkKG5leHROb2RlSWQpO1xuICAgIGlmICghdGFyZ2V0Tm9kZSkge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYGR5bmFtaWNOZXh0IHRhcmdldCBub2RlIG5vdCBmb3VuZDogJHtuZXh0Tm9kZUlkfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7Y3VycmVudE5vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZXJhdGlvbiA9IHRoaXMuZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5leHROb2RlSWQpO1xuICAgIGNvbnN0IGl0ZXJhdGVkU3RhZ2VOYW1lID0gdGhpcy5nZXRJdGVyYXRlZFN0YWdlTmFtZSh0YXJnZXROb2RlLm5hbWUsIGl0ZXJhdGlvbik7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0VGFyZ2V0JywgbmV4dE5vZGVJZCk7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0SXRlcmF0aW9uJywgaXRlcmF0aW9uKTtcblxuICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbG9vcCcsIGBMb29waW5nIGJhY2sgdG8gJHt0YXJnZXROb2RlLm5hbWV9IChpdGVyYXRpb24gJHtpdGVyYXRpb24gKyAxfSlgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogdGFyZ2V0Tm9kZS5uYW1lLFxuICAgICAgaXRlcmF0aW9uOiBpdGVyYXRpb24gKyAxLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkxvb3AodGFyZ2V0Tm9kZS5uYW1lLCBpdGVyYXRpb24gKyAxLCB0YXJnZXROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGl0ZXJhdGVkU3RhZ2VOYW1lLCB0YXJnZXROb2RlLmlkKTtcbiAgICByZXR1cm4geyBub2RlOiB0YXJnZXROb2RlLCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBuZXh0IGl0ZXJhdGlvbiBudW1iZXIgZm9yIGEgbm9kZSBhbmQgaW5jcmVtZW50LlxuICAgKiBSZXR1cm5zIDAgZm9yIGZpcnN0IHZpc2l0LCAxIGZvciBzZWNvbmQsIGV0Yy5cbiAgICogVGhyb3dzIGlmIG1heEl0ZXJhdGlvbnMgZXhjZWVkZWQgKGluZmluaXRlIGxvb3AgZ3VhcmQpLlxuICAgKi9cbiAgZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5vZGVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pdGVyYXRpb25Db3VudGVycy5nZXQobm9kZUlkKSA/PyAwO1xuICAgIGlmIChjdXJyZW50ID49IHRoaXMubWF4SXRlcmF0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgKCR7dGhpcy5tYXhJdGVyYXRpb25zfSkgZXhjZWVkZWQgZm9yIG5vZGUgJyR7bm9kZUlkfScuIGAgK1xuICAgICAgICAgICdTZXQgbWF4SXRlcmF0aW9ucyB0byBpbmNyZWFzZSB0aGUgbGltaXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuaXRlcmF0aW9uQ291bnRlcnMuc2V0KG5vZGVJZCwgY3VycmVudCArIDEpO1xuXG4gICAgaWYgKHRoaXMub25JdGVyYXRpb25VcGRhdGUpIHtcbiAgICAgIHRoaXMub25JdGVyYXRpb25VcGRhdGUobm9kZUlkLCBjdXJyZW50ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaXRlcmF0ZWQgc3RhZ2UgbmFtZSBmb3IgY29udGV4dCB0cmVlLlxuICAgKiBGaXJzdCB2aXNpdDogXCJhc2tMTE1cIiwgc2Vjb25kOiBcImFza0xMTS4xXCIsIHRoaXJkOiBcImFza0xMTS4yXCIuXG4gICAqL1xuICBnZXRJdGVyYXRlZFN0YWdlTmFtZShiYXNlTmFtZTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbiA9PT0gMCA/IGJhc2VOYW1lIDogYCR7YmFzZU5hbWV9LiR7aXRlcmF0aW9ufWA7XG4gIH1cbn1cbiJdfQ==
|