footprintjs 9.48.0 → 9.48.1
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/CLAUDE.md +1 -0
- package/dist/esm/lib/memory/SharedMemory.js +8 -2
- package/dist/esm/lib/memory/pathOps.d.ts +11 -13
- package/dist/esm/lib/memory/pathOps.js +12 -14
- package/dist/esm/lib/memory/utils.d.ts +10 -1
- package/dist/esm/lib/memory/utils.js +38 -11
- package/dist/lib/memory/SharedMemory.js +7 -1
- package/dist/lib/memory/pathOps.js +12 -14
- package/dist/lib/memory/utils.js +39 -11
- package/dist/types/lib/memory/pathOps.d.ts +11 -13
- package/dist/types/lib/memory/utils.d.ts +10 -1
- package/package.json +4 -1
package/CLAUDE.md
CHANGED
|
@@ -53,6 +53,7 @@ Entry points: `footprintjs` (public API) · `/recorders` (factories) · `/trace`
|
|
|
53
53
|
- **Closed seams that look open**: ExecutionEnv (fixed type); decide() operators (evaluator.ts:19 module-private); METHOD_ROUTES; the executeNodeStep phase chain; emit dispatcher (rides scope channel).
|
|
54
54
|
|
|
55
55
|
## Change-impact map
|
|
56
|
+
- **Nested diagnostic writes** → `memory/utils.ts · isDeniedWritePath` checks the entire address/path/field before either nested writer creates containers; `SharedMemory` asks it before copying a generation. It uses the existing `pathOps · isDeniedSegment` rule. A denied selector is a no-op; allowed payloads may still contain those names as data. Missing properties are created as own data properties without invoking inherited setters, and updates never merge inherited final values. Diagnostic updates keep their duplicate-preserving array concatenation and shallow object merge, not the record's union-merge law. The planned extraction keeps this one implementation on `foottrace/paths`, not `/write`.
|
|
56
57
|
- **Trace verbs** (`set|merge|append|delete`, `memory/types.ts · TraceEntry.verb`) → ONE law, `memory/verbs.ts` (L1) — F2 deleted the three replicas. `applyVerb` is the ONLY function with an arm per verb (a fifth verb in the union stops compiling there; `TRAITS` — `isTotal` / `recordsTail` — says what a verb IS, pinned against the step), `placeVerb` puts its value or removes the key (`ABSENT`), and two loops fold it: `foldRows` folds ONE bundle's rows into a state with the clone DISCIPLINE as a parameter (`'private'` = the PUBLIC `applySmartMerge`, which keeps its 9.28.0 contract: base deep-cloned, fully detached result — 9.29.0; `'pathCopy'` = the engine's `nextGeneration` — live commit + redacted mirror — and the folds' `applySmartMergeInto` — `stateAt`, `EventLog.materialise`; `'byReference'` = `dryFold`, the admitted record's comparison fold — 9.30.0), and `foldKey` folds ONE path's rows across a log — `commitLogUtils · commitValueAt` (anchored at the last total row) and `slice/elementProvenance · arrayProvenance` (an OBSERVER of that fold: it keeps the births and has no verb switch); causalChain/findLastWriter only match paths. A bundle's merge delta is detached ONCE per bundle (`RecordedPayload`): `deepSmartMerge` dedups an array union BY REFERENCE, so the merge rows of one bundle must see the same objects (a per-row clone made `commitValueAt` double the elements — the 9.29.0 reader bug, fixed here); `foldKey` narrows that copy to its one path. **An unknown verb is REFUSED** (`UnknownVerbError`, public on `/trace`; R2) by `foldRows` (so `applySmartMerge`), `commitValueAt`, `arrayProvenance` — they used to fold it as a `merge`; `time-travel/bundles · bundleRefusal` asks the same `isVerb` and makes it a GAP instead. Pinned: the three old replicas live on as the CONTROL in test/lib/memory/property/verb-law-differential.property.test.ts (kept for the packet's lifetime). The delta encoder keeps VOCABULARY only since 9.30.0 (it picks a verb; its values come from `dryFold` of the stage's 'full' rows — `TransactionBuffer · fullRowsValue`; `replayPathVerbs`/`replayFamilyVerbs` deleted). NOT a second loop (9.22.1): `verbs.ts · supersededByNextSet` — the ONE repeated-path skip (CONSECUTIVE same-path `set` rows: only the last is applied), asked by `foldRows` before its step; its commit-side twin is the last-materialised-path memo in `toChangeOnlyPayload`. Rows are never dropped from the log; a non-consecutive skip is WRONG (a descendant op in between coerces/shells the container) — pinned by test/lib/memory/scenario/repeated-path-byte-identity.test.ts. Since 9.23.0 the clone in that memo loop (and every `structuredClone` in `toDeltaPayload`) is THE clone — the patch trees hold references until commit; no verb switch was touched.
|
|
57
58
|
- **Write address** → ONE constant, `runAddress.ts · RUN_NAMESPACE` (an L4 leaf, C4), read by `runAddress` / `useAddressOf` and by `RedactionRule · verdictOfRead` / `retainState`; the frame's `RecordFrame` holds the address (C3). `SharedMemory` and the nested writers take the address as data and refuse a non-array; `TransactionBuffer` takes it too (C2, 9.45.0). `test/architecture/write-address.test.ts` refuses the namespace below L4, as a literal or a property — no exceptions since C4.
|
|
58
59
|
- **StageContext.commit / dials** → ONE owner since 9.35.0 (F5): `memory/runPolicy.ts` — a frozen `RunPolicy` (the four dials + the `RedactionRule` + the mirror flag) built ONCE by `FlowChartExecutor · createTraverser` (run AND resume), handed to `ExecutionRuntime`, held BY REFERENCE by every `StageContext` (`inheritRun` in createNext/createChild) and by its `RecordFrame` as its encoding (`useEncoding`, through `StageContext · adoptPolicy`, the one place a frame's policy changes) and passed by `SubflowExecutor · executeSubflow` to the nested runtime BEFORE the seed. A fifth dial = the policy type + its consumer. The old per-dial `use*`/`get*` and `enableRedactedMirror` were removed in 9.36.0 (no compat shims — owner ruling). `commit()`'s FIRST act (9.23.0) is `materialiseWrites` — the `writeTracking` retained form is taken there, once per key, from `_pendingWrites` (bare references + the write-time verdict); anything that reads `_stageWrites` goes through `retainedWrites()` (a non-consuming fold, so a mid-run snapshot is honest), and `discardStaged` drops the pending map with the rest.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* wrote), not O(state).
|
|
20
20
|
*/
|
|
21
21
|
import { mergeContextWins, ownedRootOf, ownSpine } from './pathOps.js';
|
|
22
|
-
import { getNestedValue, getRunAndGlobalPaths, nextGeneration, setNestedValue, updateNestedValue } from './utils.js';
|
|
22
|
+
import { getNestedValue, getRunAndGlobalPaths, isDeniedWritePath, nextGeneration, setNestedValue, updateNestedValue, } from './utils.js';
|
|
23
23
|
export class SharedMemory {
|
|
24
24
|
context = {};
|
|
25
25
|
_defaultValues;
|
|
@@ -41,12 +41,16 @@ export class SharedMemory {
|
|
|
41
41
|
/** Updates a value at `address` + `path` using merge semantics, as a new generation (path copy + swap). */
|
|
42
42
|
updateValue(address, path, key, value) {
|
|
43
43
|
const next = this.ownedPathTo(address, path, key);
|
|
44
|
+
if (next === undefined)
|
|
45
|
+
return;
|
|
44
46
|
updateNestedValue(next, address, path, key, value, this.getDefaultValues());
|
|
45
47
|
this.context = next;
|
|
46
48
|
}
|
|
47
49
|
/** Sets a value at `address` + `path` using overwrite semantics, as a new generation (path copy + swap). */
|
|
48
50
|
setValue(address, path, key, value) {
|
|
49
51
|
const next = this.ownedPathTo(address, path, key);
|
|
52
|
+
if (next === undefined)
|
|
53
|
+
return;
|
|
50
54
|
setNestedValue(next, address, path, key, value, this.getDefaultValues());
|
|
51
55
|
this.context = next;
|
|
52
56
|
}
|
|
@@ -55,6 +59,8 @@ export class SharedMemory {
|
|
|
55
59
|
* `key` are owned — the in-place helpers above then edit only copies.
|
|
56
60
|
*/
|
|
57
61
|
ownedPathTo(address, path, key) {
|
|
62
|
+
if (isDeniedWritePath(address, path, key))
|
|
63
|
+
return undefined;
|
|
58
64
|
const owned = new WeakSet();
|
|
59
65
|
const root = ownedRootOf(this.context, owned);
|
|
60
66
|
const { runPath, globalPath } = getRunAndGlobalPaths(address, path);
|
|
@@ -79,4 +85,4 @@ export class SharedMemory {
|
|
|
79
85
|
this.context = nextGeneration(this.context, updates, overwrite, trace);
|
|
80
86
|
}
|
|
81
87
|
}
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUNMLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0sWUFBWSxDQUFDO0FBRXBCLE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLEtBQUssU0FBUztZQUFFLE9BQU87UUFDL0IsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUMvQixjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxJQUFJLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsT0FBMkIsRUFBRSxJQUFlLEVBQUUsR0FBWTtRQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxVQUFVLENBQUMsU0FBc0IsRUFBRSxPQUFvQixFQUFFLEtBQW1CO1FBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZE1lbW9yeSDigJQgVGhlIHNoYXJlZCBzdGF0ZSBjb250YWluZXIgZm9yIGFsbCBmbG93Y2hhcnQgZXhlY3V0aW9uXG4gKlxuICogTGlrZSBhIHJ1bnRpbWUgaGVhcCB3aXRoIG5hbWVzcGFjZSBpc29sYXRpb246XG4gKiAtIEEgdmFsdWUgaXMgd3JpdHRlbiBhdCBhbiBBRERSRVNTIOKAlCBhIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWRcbiAqICAgKEMyOiB0aGUgZW5naW5lJ3MgZnJhbWUgZGVjaWRlcyBpdCwgYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2ApIOKAlCBhbmQgcmVhZFxuICogICB0aGVyZSBmaXJzdCwgdGhlbiBhdCB0aGUgcm9vdFxuICogLSBEZWZhdWx0IHZhbHVlcyBzZWVkIHRoZSByb290LCBhbmQgdGhlIGNvbnRhaW5lciBhdCBhbiBhZGRyZXNzIHdoZW4gYVxuICogICB3cml0ZSBjcmVhdGVzIGl0XG4gKiAtIEFjY2VwdHMgY29tbWl0IGJ1bmRsZXMgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlclxuICpcbiAqIENPUFktT04tV1JJVEUgKDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCk6XG4gKiBgY29udGV4dGAgaXMgYSBHRU5FUkFUSU9OLCBhbmQgYSBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gRXZlcnkgd3JpdGUg4oCUXG4gKiBgYXBwbHlQYXRjaGAgKGEgc3RhZ2UgY29tbWl0KSwgYHNldFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCDigJQgYnVpbGRzIHRoZSBuZXh0XG4gKiBnZW5lcmF0aW9uIGJ5IGNvcHlpbmcgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLFxuICogc2hhcmVzIGV2ZXJ5IG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQsIGFuZCBzd2Fwcy4gU28gYVxuICogZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIChpdHMgZmlyc3QtdG91Y2ggdmlldywgaXRzIHRyYW5zYWN0aW9uXG4gKiBidWZmZXIncyBkaWZmIGJhc2UpIHN0YXlzIGV4YWN0bHkgd2hhdCBpdCB3YXMsIGFuZCBhIHdyaXRlIGNvc3RzIE8od2hhdCBpdFxuICogd3JvdGUpLCBub3QgTyhzdGF0ZSkuXG4gKi9cblxuaW1wb3J0IHsgbWVyZ2VDb250ZXh0V2lucywgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGdldE5lc3RlZFZhbHVlLFxuICBnZXRSdW5BbmRHbG9iYWxQYXRocyxcbiAgaXNEZW5pZWRXcml0ZVBhdGgsXG4gIG5leHRHZW5lcmF0aW9uLFxuICBzZXROZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlTmVzdGVkVmFsdWUsXG59IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2hhcmVkTWVtb3J5IHtcbiAgcHJpdmF0ZSBjb250ZXh0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZXM/OiB1bmtub3duO1xuXG4gIGNvbnN0cnVjdG9yKGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLCBpbml0aWFsQ29udGV4dD86IHVua25vd24pIHtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICBjb25zdCBzZWVkID0gbWVyZ2VDb250ZXh0V2lucyhpbml0aWFsQ29udGV4dCB8fCB7fSwgZGVmYXVsdFZhbHVlcyB8fCB7fSk7XG4gICAgLy8gRGV0YWNoZWQgT05DRSwgaGVyZTogYG1lcmdlQ29udGV4dFdpbnNgIGNvcGllcyBvbmx5IHRoZSB0b3AgbGV2ZWwsIHNvXG4gICAgLy8gdGhlIHNlZWQncyBuZXN0ZWQgdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIG9iamVjdHMuIEJlZm9yZSA5LjI5LjBcbiAgICAvLyB0aGUgZmlyc3QgY29tbWl0J3Mgd2hvbGUtc3RhdGUgY2xvbmUgZGV0YWNoZWQgdGhlbSAoYW5kIHVudGlsIHRoZW4gYVxuICAgIC8vIGNhbGxlciBtdXRhdGluZyBpdHMgYGluaXRpYWxDb250ZXh0YCBjaGFuZ2VkIGxpdmUgc3RhdGUgd2l0aCBubyByb3cpO1xuICAgIC8vIG5vdGhpbmcgcmUtY2xvbmVzIHRoZSBzdGF0ZSBhbnkgbW9yZSwgc28gdGhlIHNlZWQgaXMgZGV0YWNoZWQgYXRcbiAgICAvLyBjb25zdHJ1Y3Rpb24g4oCUIG9uZSBjbG9uZSBwZXIgcnVudGltZSwgbm90IG9uZSBwZXIgY29tbWl0LlxuICAgIHRoaXMuY29udGV4dCA9IE9iamVjdC5rZXlzKHNlZWQpLmxlbmd0aCA+IDAgPyBzdHJ1Y3R1cmVkQ2xvbmUoc2VlZCkgOiBzZWVkO1xuICB9XG5cbiAgLyoqIEdldHMgYSBjbG9uZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMuICovXG4gIGdldERlZmF1bHRWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPyBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGVmYXVsdFZhbHVlcykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVXBkYXRlcyBhIHZhbHVlIGF0IGBhZGRyZXNzYCArIGBwYXRoYCB1c2luZyBtZXJnZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICB1cGRhdGVWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHVwZGF0ZU5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqIFNldHMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgb3ZlcndyaXRlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHNldFZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgc2V0TmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjb3B5IG9mIHRoZSBjdXJyZW50IGdlbmVyYXRpb24ncyByb290IHdob3NlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0b1xuICAgKiBga2V5YCBhcmUgb3duZWQg4oCUIHRoZSBpbi1wbGFjZSBoZWxwZXJzIGFib3ZlIHRoZW4gZWRpdCBvbmx5IGNvcGllcy5cbiAgICovXG4gIHByaXZhdGUgb3duZWRQYXRoVG8oYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGlmIChpc0RlbmllZFdyaXRlUGF0aChhZGRyZXNzLCBwYXRoLCBrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IHJvb3QgPSBvd25lZFJvb3RPZih0aGlzLmNvbnRleHQsIG93bmVkKTtcbiAgICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIG93blNwaW5lKHJvb3QsIFsuLi4ocnVuUGF0aCB8fCBnbG9iYWxQYXRoKSwga2V5XSwgb3duZWQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgdmFsdWUgZnJvbSB0aGUgc3RvcmUuXG4gICAqIExvb2tzIHVwIGF0IGBhZGRyZXNzYCBmaXJzdCwgZmFsbHMgYmFjayB0byB0aGUgcm9vdC5cbiAgICovXG4gIGdldFZhbHVlKGFkZHJlc3M/OiByZWFkb25seSBzdHJpbmdbXSwgcGF0aD86IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHsgZ2xvYmFsUGF0aCwgcnVuUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgY29uc3QgdmFsdWUgPSBydW5QYXRoID8gZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBydW5QYXRoLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIGdsb2JhbFBhdGgsIGtleSk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgZW50aXJlIHN0YXRlIGFzIGEgSlNPTiBvYmplY3Qg4oCUIHRoZSBjdXJyZW50IGdlbmVyYXRpb24sIGJ5IHJlZmVyZW5jZS4gTmV2ZXIgbXV0YXRlIGl0LiAqL1xuICBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyOiBidWlsZHMgdGhlIG5leHQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4uICovXG4gIGFwcGx5UGF0Y2gob3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0R2VuZXJhdGlvbih0aGlzLmNvbnRleHQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
5
|
+
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
|
+
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
7
|
*
|
|
8
8
|
* Intentional asymmetry:
|
|
9
|
-
* - nativeSet
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
* hasOwnProperty guard is required to prevent leaking inherited values
|
|
15
|
-
* (e.g. Object.prototype, Object constructor, toString).
|
|
9
|
+
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
10
|
+
* containers. It can follow an inherited object under an ordinary key.
|
|
11
|
+
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
|
+
* - nativeHas — own-property existence only, including own denied names
|
|
13
|
+
* and own undefined values; it does not use the DENIED rule.
|
|
16
14
|
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
17
15
|
* by spec so prototype keys never appear in the iteration.
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Nested diagnostic writers have their own whole-selector preflight and
|
|
18
|
+
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
21
19
|
*
|
|
22
20
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
23
21
|
*/
|
|
24
|
-
/** Is `segment` one of the three prototype-pollution
|
|
22
|
+
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
25
23
|
export declare function isDeniedSegment(segment: string | number): boolean;
|
|
26
24
|
/**
|
|
27
25
|
* Get the value at `path` in `obj`, returning `defaultValue` if absent.
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
5
|
+
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
|
+
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
7
|
*
|
|
8
8
|
* Intentional asymmetry:
|
|
9
|
-
* - nativeSet
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
* hasOwnProperty guard is required to prevent leaking inherited values
|
|
15
|
-
* (e.g. Object.prototype, Object constructor, toString).
|
|
9
|
+
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
10
|
+
* containers. It can follow an inherited object under an ordinary key.
|
|
11
|
+
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
|
+
* - nativeHas — own-property existence only, including own denied names
|
|
13
|
+
* and own undefined values; it does not use the DENIED rule.
|
|
16
14
|
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
17
15
|
* by spec so prototype keys never appear in the iteration.
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Nested diagnostic writers have their own whole-selector preflight and
|
|
18
|
+
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
21
19
|
*
|
|
22
20
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
23
21
|
*/
|
|
24
22
|
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
25
|
-
/** Is `segment` one of the three prototype-pollution
|
|
23
|
+
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
26
24
|
export function isDeniedSegment(segment) {
|
|
27
25
|
return DENIED.has(String(segment));
|
|
28
26
|
}
|
|
@@ -288,4 +286,4 @@ export function mergeContextWins(dst, src) {
|
|
|
288
286
|
}
|
|
289
287
|
return out;
|
|
290
288
|
}
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxD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QUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqIElzIGBzZWdtZW50YCBvbmUgb2YgdGhlIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gdmVjdG9ycyBldmVyeSBoZWxwZXIgaGVyZSByZWZ1c2VzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuaWVkU2VnbWVudChzZWdtZW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIERFTklFRC5oYXMoU3RyaW5nKHNlZ21lbnQpKTtcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vLyDilIDilIAgQ29weS1vbi13cml0ZSBwcmltaXRpdmVzIChkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKSDilIDilIBcbi8vXG4vLyBUSEUgTEFXOiBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gQSB3cml0ZXIgY29waWVzIHRoZSByb290XG4vLyBhbmQgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggcGF0aCBpdCB3cml0ZXMsIGVkaXRzIG9ubHkgY29udGFpbmVycyBpdFxuLy8gY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChpdHMgYG93bmVkYCBzZXQpLCBhbmQgc2hhcmVzIGV2ZXJ5XG4vLyBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LiBUaGUgc2FtZSBsYXdcbi8vIGByZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMgwrcgc2V0SW5QYXRoYCBhcHBsaWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuXG4vKiogQSBjb250YWluZXIgYSB3cml0ZXIgbWF5IG93bjogYW55dGhpbmcgYHR5cGVvZiAnb2JqZWN0J2AgYW5kIG5vdCBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogYHBhcmVudFtrZXldYCB3aGVuIGBwYXJlbnRgIGlzIGEgY29udGFpbmVyIHRoYXQgT1dOUyBga2V5YCDigJQgdGhlIHNsb3RcbiAqIHtAbGluayBuYXRpdmVHZXR9IHdvdWxkIHJlYWQsIHJlZnVzaW5nIHRoZSBzYW1lIHByb3RvdHlwZS1wb2xsdXRpb25cbiAqIHNlZ21lbnRzIOKAlCBlbHNlIGB1bmRlZmluZWRgLiBPbmUgc3RlcCBvZiBhIHBhdGggd2Fsay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkNoaWxkKHBhcmVudDogdW5rbm93biwga2V5OiBzdHJpbmcgfCBudW1iZXIpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzQ29udGFpbmVyKHBhcmVudCkgJiYgIURFTklFRC5oYXMoU3RyaW5nKGtleSkpICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnQsIGtleSlcbiAgICA/IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgZm9yIGFuIG93biBrZXkgb2YgYW4gYXJyYXkgdGhhdCBpcyBhbiBhcnJheSBJTkRFWCAoYCcwJ2AsIGAnMTInYCksIG5vdCBhIG5hbWUgKGBhcnIubm90ZWApLiAqL1xuZnVuY3Rpb24gaXNBcnJheUluZGV4S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwICYmIG4gPCA0Mjk0OTY3Mjk1ICYmIFN0cmluZyhuKSA9PT0ga2V5O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lZCAobm9uLWluZGV4KSBvd24ga2V5cyBvZiBhbiBhcnJheSwgaW4gb3JkZXIuIE93bi1rZXkgb3JkZXIgcHV0c1xuICogZXZlcnkgaW5kZXggZmlyc3QsIGFzY2VuZGluZywgYW5kIG5hbWVzIGFmdGVyIHRoZW0g4oCUIHNvIHRoZSBuYW1lcyBhcmUgdGhlXG4gKiB0YWlsIG9mIGBPYmplY3Qua2V5c2AsIGFuZCBhbiBhcnJheSB3aXRob3V0IGFueSBpcyB0b2xkIGJ5IGl0cyBsYXN0IGtleS5cbiAqL1xuZnVuY3Rpb24gbmFtZWRBcnJheUtleXMoYXJyYXk6IHVua25vd25bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgbGV0IGZpcnN0ID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChmaXJzdCA+IDAgJiYgIWlzQXJyYXlJbmRleEtleShrZXlzW2ZpcnN0IC0gMV0pKSBmaXJzdC0tO1xuICByZXR1cm4ga2V5cy5zbGljZShmaXJzdCk7XG59XG5cbi8qKlxuICogQSBTSEFMTE9XIGNvcHkgb2Ygb25lIGNvbnRhaW5lciB0aGF0IGtlZXBzIGV2ZXJ5IHNsb3QgdGhlIHdob2xlLXN0YXRlXG4gKiBgc3RydWN0dXJlZENsb25lYCB0aGlzIHJlcGxhY2VkIGtlcHQg4oCUIHNvIGEgcGF0aCBjb3B5IGFuZCBhIGRlZXAgY2xvbmUgZ2l2ZVxuICogdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aDpcbiAqICAgLSBhIHBsYWluIG9iamVjdCAob3IgYSBudWxsLXByb3RvdHlwZSBvbmUpOiBpdHMgb3duIGVudW1lcmFibGUga2V5cywgaW5cbiAqICAgICBvcmRlciwgYnkgc3ByZWFkIOKAlCBhbiBvd24gYF9fcHJvdG9fX2Aga2V5IHN0YXlzIGEga2V5OyB0aGUgcmVzdWx0IGhhc1xuICogICAgIGBPYmplY3QucHJvdG90eXBlYCwgYXMgYSBjbG9uZSdzIGRvZXM7XG4gKiAgIC0gYW4gYXJyYXk6IGl0cyBpbmRpY2VzLCBob2xlcyBhbmQgbGVuZ3RoIChgc2xpY2VgKSBBTkQgYW55IG5hbWVkXG4gKiAgICAgcHJvcGVydHkgYSBuZXN0ZWQgd3JpdGUgaHVuZyBvZmYgaXQgKGBzbGljZWAgYWxvbmUgd291bGQgZHJvcCB0aG9zZSk7XG4gKiAgIC0gYW55dGhpbmcgZWxzZSDigJQgYSBgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgdHlwZWQgYXJyYXksIGEgY2xhc3MgaW5zdGFuY2Ug4oCUXG4gKiAgICAgaXMgZGVlcC1jbG9uZWQsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIGRpZCB0byBpdDsgYW5kIHRoZVxuICogICAgIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhlIGNsb25lIGNhbm5vdCBjYXJyeSAoYW4gZXhwYW5kbyBhIG5lc3RlZFxuICogICAgIHdyaXRlIGh1bmcgb24gYSBgRGF0ZWApIGFyZSBjYXJyaWVkIG92ZXIgYnkgcmVmZXJlbmNlLCBzbyBhIGxhdGVyIHdyaXRlXG4gKiAgICAgdGhyb3VnaCBpdCBjaGFuZ2VzIGV4YWN0bHkgaXRzIG93biBwYXRoLiBSYXJlIG9uIGEgd3JpdGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRhaW5lcjogVCk6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29weSA9IGNvbnRhaW5lci5zbGljZSgpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbmFtZWRBcnJheUtleXMoY29udGFpbmVyKSkgY29weVtrZXldID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFbEUsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBd0I7SUFDdEQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBUSxFQUFFLElBQWtDLEVBQUUsWUFBa0I7SUFDeEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FB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RyxDQUFDLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCw2QkFBNkI7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXRoT3BzLnRzIOKAlCBOYXRpdmUgbmVzdGVkLXBhdGggaGVscGVycyAocmVwbGFjZXMgbG9kYXNoLmdldC9zZXQvaGFzL21lcmdld2l0aClcbiAqXG4gKiBUaGUgREVOSUVEIHNldCBpcyB0aGUgc2hhcmVkIHJ1bGUgZm9yIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gc2VsZWN0b3JcbiAqIHNlZ21lbnRzIChfX3Byb3RvX18sIGNvbnN0cnVjdG9yLCBwcm90b3R5cGUpLiBFYWNoIG9wZXJhdGlvbidzIHRyYXZlcnNhbFxuICogY29udHJhY3QgaXMgZXhwbGljaXQgYmVsb3c7IG1lcmVseSB1c2luZyB0aGlzIG1vZHVsZSBpcyBub3QgYSBzYW5kYm94LlxuICpcbiAqIEludGVudGlvbmFsIGFzeW1tZXRyeTpcbiAqICAgLSBuYXRpdmVTZXQg4oCUIERFTklFRCBjaGVjayBhdCBlYWNoIHNlZ21lbnQ7IHVzZWQgb24gd3JpdGVyLW93bmVkXG4gKiAgICAgY29udGFpbmVycy4gSXQgY2FuIGZvbGxvdyBhbiBpbmhlcml0ZWQgb2JqZWN0IHVuZGVyIGFuIG9yZGluYXJ5IGtleS5cbiAqICAgLSBuYXRpdmVHZXQg4oCUIERFTklFRCBjaGVjayArIGhhc093blByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAuXG4gKiAgIC0gbmF0aXZlSGFzIOKAlCBvd24tcHJvcGVydHkgZXhpc3RlbmNlIG9ubHksIGluY2x1ZGluZyBvd24gZGVuaWVkIG5hbWVzXG4gKiAgICAgYW5kIG93biB1bmRlZmluZWQgdmFsdWVzOyBpdCBkb2VzIG5vdCB1c2UgdGhlIERFTklFRCBydWxlLlxuICogICAtIG1lcmdlQ29udGV4dFdpbnMg4oCUIERFTklFRCBjaGVjayBvbmx5OyBPYmplY3Qua2V5cygpIGlzIG93bi1lbnVtZXJhYmxlLW9ubHlcbiAqICAgICBieSBzcGVjIHNvIHByb3RvdHlwZSBrZXlzIG5ldmVyIGFwcGVhciBpbiB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIE5lc3RlZCBkaWFnbm9zdGljIHdyaXRlcnMgaGF2ZSB0aGVpciBvd24gd2hvbGUtc2VsZWN0b3IgcHJlZmxpZ2h0IGFuZFxuICogb3duLXByb3BlcnR5IHdyaXRlcyBpbiB1dGlscy50cywgdXNpbmcgdGhlIHNhbWUgaXNEZW5pZWRTZWdtZW50IHByZWRpY2F0ZS5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqIElzIGBzZWdtZW50YCBvbmUgb2YgdGhlIHRocmVlIGRlbmllZCBwcm90b3R5cGUtcG9sbHV0aW9uIHNlbGVjdG9yIG5hbWVzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuaWVkU2VnbWVudChzZWdtZW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIERFTklFRC5oYXMoU3RyaW5nKHNlZ21lbnQpKTtcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vLyDilIDilIAgQ29weS1vbi13cml0ZSBwcmltaXRpdmVzIChkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKSDilIDilIBcbi8vXG4vLyBUSEUgTEFXOiBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gQSB3cml0ZXIgY29waWVzIHRoZSByb290XG4vLyBhbmQgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggcGF0aCBpdCB3cml0ZXMsIGVkaXRzIG9ubHkgY29udGFpbmVycyBpdFxuLy8gY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChpdHMgYG93bmVkYCBzZXQpLCBhbmQgc2hhcmVzIGV2ZXJ5XG4vLyBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LiBUaGUgc2FtZSBsYXdcbi8vIGByZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMgwrcgc2V0SW5QYXRoYCBhcHBsaWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuXG4vKiogQSBjb250YWluZXIgYSB3cml0ZXIgbWF5IG93bjogYW55dGhpbmcgYHR5cGVvZiAnb2JqZWN0J2AgYW5kIG5vdCBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogYHBhcmVudFtrZXldYCB3aGVuIGBwYXJlbnRgIGlzIGEgY29udGFpbmVyIHRoYXQgT1dOUyBga2V5YCDigJQgdGhlIHNsb3RcbiAqIHtAbGluayBuYXRpdmVHZXR9IHdvdWxkIHJlYWQsIHJlZnVzaW5nIHRoZSBzYW1lIHByb3RvdHlwZS1wb2xsdXRpb25cbiAqIHNlZ21lbnRzIOKAlCBlbHNlIGB1bmRlZmluZWRgLiBPbmUgc3RlcCBvZiBhIHBhdGggd2Fsay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkNoaWxkKHBhcmVudDogdW5rbm93biwga2V5OiBzdHJpbmcgfCBudW1iZXIpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzQ29udGFpbmVyKHBhcmVudCkgJiYgIURFTklFRC5oYXMoU3RyaW5nKGtleSkpICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnQsIGtleSlcbiAgICA/IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgZm9yIGFuIG93biBrZXkgb2YgYW4gYXJyYXkgdGhhdCBpcyBhbiBhcnJheSBJTkRFWCAoYCcwJ2AsIGAnMTInYCksIG5vdCBhIG5hbWUgKGBhcnIubm90ZWApLiAqL1xuZnVuY3Rpb24gaXNBcnJheUluZGV4S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwICYmIG4gPCA0Mjk0OTY3Mjk1ICYmIFN0cmluZyhuKSA9PT0ga2V5O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lZCAobm9uLWluZGV4KSBvd24ga2V5cyBvZiBhbiBhcnJheSwgaW4gb3JkZXIuIE93bi1rZXkgb3JkZXIgcHV0c1xuICogZXZlcnkgaW5kZXggZmlyc3QsIGFzY2VuZGluZywgYW5kIG5hbWVzIGFmdGVyIHRoZW0g4oCUIHNvIHRoZSBuYW1lcyBhcmUgdGhlXG4gKiB0YWlsIG9mIGBPYmplY3Qua2V5c2AsIGFuZCBhbiBhcnJheSB3aXRob3V0IGFueSBpcyB0b2xkIGJ5IGl0cyBsYXN0IGtleS5cbiAqL1xuZnVuY3Rpb24gbmFtZWRBcnJheUtleXMoYXJyYXk6IHVua25vd25bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgbGV0IGZpcnN0ID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChmaXJzdCA+IDAgJiYgIWlzQXJyYXlJbmRleEtleShrZXlzW2ZpcnN0IC0gMV0pKSBmaXJzdC0tO1xuICByZXR1cm4ga2V5cy5zbGljZShmaXJzdCk7XG59XG5cbi8qKlxuICogQSBTSEFMTE9XIGNvcHkgb2Ygb25lIGNvbnRhaW5lciB0aGF0IGtlZXBzIGV2ZXJ5IHNsb3QgdGhlIHdob2xlLXN0YXRlXG4gKiBgc3RydWN0dXJlZENsb25lYCB0aGlzIHJlcGxhY2VkIGtlcHQg4oCUIHNvIGEgcGF0aCBjb3B5IGFuZCBhIGRlZXAgY2xvbmUgZ2l2ZVxuICogdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aDpcbiAqICAgLSBhIHBsYWluIG9iamVjdCAob3IgYSBudWxsLXByb3RvdHlwZSBvbmUpOiBpdHMgb3duIGVudW1lcmFibGUga2V5cywgaW5cbiAqICAgICBvcmRlciwgYnkgc3ByZWFkIOKAlCBhbiBvd24gYF9fcHJvdG9fX2Aga2V5IHN0YXlzIGEga2V5OyB0aGUgcmVzdWx0IGhhc1xuICogICAgIGBPYmplY3QucHJvdG90eXBlYCwgYXMgYSBjbG9uZSdzIGRvZXM7XG4gKiAgIC0gYW4gYXJyYXk6IGl0cyBpbmRpY2VzLCBob2xlcyBhbmQgbGVuZ3RoIChgc2xpY2VgKSBBTkQgYW55IG5hbWVkXG4gKiAgICAgcHJvcGVydHkgYSBuZXN0ZWQgd3JpdGUgaHVuZyBvZmYgaXQgKGBzbGljZWAgYWxvbmUgd291bGQgZHJvcCB0aG9zZSk7XG4gKiAgIC0gYW55dGhpbmcgZWxzZSDigJQgYSBgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgdHlwZWQgYXJyYXksIGEgY2xhc3MgaW5zdGFuY2Ug4oCUXG4gKiAgICAgaXMgZGVlcC1jbG9uZWQsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIGRpZCB0byBpdDsgYW5kIHRoZVxuICogICAgIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhlIGNsb25lIGNhbm5vdCBjYXJyeSAoYW4gZXhwYW5kbyBhIG5lc3RlZFxuICogICAgIHdyaXRlIGh1bmcgb24gYSBgRGF0ZWApIGFyZSBjYXJyaWVkIG92ZXIgYnkgcmVmZXJlbmNlLCBzbyBhIGxhdGVyIHdyaXRlXG4gKiAgICAgdGhyb3VnaCBpdCBjaGFuZ2VzIGV4YWN0bHkgaXRzIG93biBwYXRoLiBSYXJlIG9uIGEgd3JpdGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRhaW5lcjogVCk6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29weSA9IGNvbnRhaW5lci5zbGljZSgpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbmFtZWRBcnJheUtleXMoY29udGFpbmVyKSkgY29weVtrZXldID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
@@ -31,12 +31,21 @@ export declare function getRunAndGlobalPaths(address?: readonly string[], path?:
|
|
|
31
31
|
runPath: (string | number)[] | undefined;
|
|
32
32
|
globalPath: (string | number)[];
|
|
33
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
36
|
+
* The address's array contract is checked even when another selector is denied.
|
|
37
|
+
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
38
|
+
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isDeniedWritePath(address: readonly string[] | undefined, path: readonly (string | number)[] | undefined, field: string | number): boolean;
|
|
34
41
|
/**
|
|
35
42
|
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
43
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
36
44
|
*/
|
|
37
45
|
export declare function setNestedValue<T>(obj: NestedObject, address: readonly string[], path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
|
|
38
46
|
/**
|
|
39
|
-
*
|
|
47
|
+
* Updates a value in the object at a nested path under `address`.
|
|
48
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
40
49
|
* - Arrays: concatenate
|
|
41
50
|
* - Objects: shallow merge at each level
|
|
42
51
|
* - Primitives: replace
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
|
|
15
15
|
* Zero external dependencies.
|
|
16
16
|
*/
|
|
17
|
-
import { nativeGet as _get } from './pathOps.js';
|
|
17
|
+
import { isDeniedSegment, nativeGet as _get } from './pathOps.js';
|
|
18
18
|
export { deepEqual } from './equality.js';
|
|
19
19
|
export { deepSmartMerge } from './merge.js';
|
|
20
20
|
export { DELIM, normalisePath, pathSegments } from './paths.js';
|
|
@@ -50,6 +50,25 @@ function pathUnder(address, path) {
|
|
|
50
50
|
out[address.length + i] = path[i];
|
|
51
51
|
return out;
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
55
|
+
* The address's array contract is checked even when another selector is denied.
|
|
56
|
+
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
57
|
+
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
58
|
+
*/
|
|
59
|
+
export function isDeniedWritePath(address = [], path = [], field) {
|
|
60
|
+
const prefix = addressOf(address);
|
|
61
|
+
return prefix.some(isDeniedSegment) || path.some(isDeniedSegment) || isDeniedSegment(field);
|
|
62
|
+
}
|
|
63
|
+
/** Keep existing own-property behavior; a missing slot must not call an inherited setter. */
|
|
64
|
+
function setOwnValue(object, key, value) {
|
|
65
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
66
|
+
object[key] = value;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
Object.defineProperty(object, key, { value, enumerable: true, writable: true, configurable: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
53
72
|
/**
|
|
54
73
|
* The container at `address` + `path` inside `obj`, each missing one created
|
|
55
74
|
* on the way: the one AT the address from `defaultValues` when given, every
|
|
@@ -61,7 +80,7 @@ function containerAt(obj, address = [], path = [], defaultValues) {
|
|
|
61
80
|
for (let i = 0; i < segments.length; i++) {
|
|
62
81
|
const key = segments[i];
|
|
63
82
|
if (!Object.prototype.hasOwnProperty.call(current, key)) {
|
|
64
|
-
current
|
|
83
|
+
setOwnValue(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
|
|
65
84
|
}
|
|
66
85
|
current = current[key];
|
|
67
86
|
}
|
|
@@ -69,18 +88,24 @@ function containerAt(obj, address = [], path = [], defaultValues) {
|
|
|
69
88
|
}
|
|
70
89
|
/**
|
|
71
90
|
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
91
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
72
92
|
*/
|
|
73
93
|
export function setNestedValue(obj, address, path, field, value, defaultValues) {
|
|
74
|
-
|
|
94
|
+
if (isDeniedWritePath(address, path, field))
|
|
95
|
+
return obj;
|
|
96
|
+
setOwnValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
75
97
|
return obj;
|
|
76
98
|
}
|
|
77
99
|
/**
|
|
78
|
-
*
|
|
100
|
+
* Updates a value in the object at a nested path under `address`.
|
|
101
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
79
102
|
* - Arrays: concatenate
|
|
80
103
|
* - Objects: shallow merge at each level
|
|
81
104
|
* - Primitives: replace
|
|
82
105
|
*/
|
|
83
106
|
export function updateNestedValue(obj, address, path, field, value, defaultValues) {
|
|
107
|
+
if (isDeniedWritePath(address, path, field))
|
|
108
|
+
return obj;
|
|
84
109
|
updateValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
85
110
|
return obj;
|
|
86
111
|
}
|
|
@@ -100,21 +125,23 @@ export function updateNestedValue(obj, address, path, field, value, defaultValue
|
|
|
100
125
|
* The fix is the explicit `value.length === 0` early-return branch.
|
|
101
126
|
*/
|
|
102
127
|
export function updateValue(object, key, value) {
|
|
128
|
+
if (isDeniedSegment(key))
|
|
129
|
+
return;
|
|
103
130
|
if (Array.isArray(value)) {
|
|
104
131
|
if (value.length === 0) {
|
|
105
|
-
object
|
|
132
|
+
setOwnValue(object, key, value); // clear: [] replaces whatever was there
|
|
106
133
|
}
|
|
107
134
|
else {
|
|
108
|
-
const cur = object[key];
|
|
109
|
-
object
|
|
135
|
+
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
136
|
+
setOwnValue(object, key, cur === undefined ? value : [...cur, ...value]);
|
|
110
137
|
}
|
|
111
138
|
}
|
|
112
139
|
else if (value && typeof value === 'object' && Object.keys(value).length) {
|
|
113
|
-
const cur = object[key];
|
|
114
|
-
object
|
|
140
|
+
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
141
|
+
setOwnValue(object, key, cur === undefined ? value : { ...cur, ...value });
|
|
115
142
|
}
|
|
116
143
|
else {
|
|
117
|
-
object
|
|
144
|
+
setOwnValue(object, key, value);
|
|
118
145
|
}
|
|
119
146
|
}
|
|
120
147
|
/**
|
|
@@ -129,4 +156,4 @@ export function getNestedValue(root, path, field) {
|
|
|
129
156
|
}
|
|
130
157
|
return undefined;
|
|
131
158
|
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBMEIsRUFBRSxJQUFrQztJQUMvRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBa0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUNsQixHQUFpQixFQUNqQixVQUE2QixFQUFFLEVBQy9CLE9BQXFDLEVBQUUsRUFDdkMsYUFBdUI7SUFFdkIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEYsQ0FBQztRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLE9BQTBCLEVBQzFCLElBQWMsRUFDZCxLQUFhLEVBQ2IsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVEsRUFDUixPQUEwQixFQUMxQixJQUF5QixFQUN6QixLQUFzQixFQUN0QixLQUFRLEVBQ1IsYUFBdUI7SUFFdkIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQVcsRUFBRSxHQUFvQixFQUFFLEtBQVU7SUFDdkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyx3Q0FBd0M7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCBvdXQgaW4gOS4zMy4wOyBpdCBpcyB0aGUgcmVjb3JkJ3Mgb3duLCBgc2NydWIudHNgIChDNCkuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgLCBDMiksIGhlbGQgYnkgaXRzIHJlY29yZCBmcmFtZSAoYFJlY29yZEZyYW1lIMK3IGFkZHJlc3NgLCBDMykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBhZGRyZXNzT2YoYWRkcmVzcykubGVuZ3RoID4gMCA/IHBhdGhVbmRlcihhZGRyZXNzLCBwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKiBBbiBhZGRyZXNzIGlzIGFuIGFycmF5LiBBIHJ1biBpZCBzdGlsbCBwYXNzZWQgaW4gaXRzIHBsYWNlIChDMikgaXMgcmVmdXNlZCwgbmV2ZXIgc3ByZWFkIGludG8gaXRzIGNoYXJhY3RlcnMuICovXG5mdW5jdGlvbiBhZGRyZXNzT2YoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFkZHJlc3MpKSByZXR1cm4gYWRkcmVzcztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgZm9vdHByaW50anM6IGFuIGFkZHJlc3MgaXMgYW4gYXJyYXkgcGF0aCBwcmVmaXgsIGdvdCAke2FkZHJlc3MgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWRkcmVzc31gLFxuICApO1xufVxuXG4vKipcbiAqIGBhZGRyZXNzYCB0aGVuIGBwYXRoYCwgYXMgb25lIG5ldyBhcnJheS4gQW4gaW5kZXggbG9vcCwgYmVjYXVzZSB0aGUgZG91YmxlXG4gKiBzcHJlYWQgYFsuLi5hZGRyZXNzLCAuLi5wYXRoXWAgY29zdHMgdHdpY2UgYXMgbXVjaCBhbmQgYSBmcmFtZSBidWlsZHMgb25lIG9uXG4gKiBldmVyeSByZWFkIGl0IHNlcnZlcyBmcm9tIGxpdmUgc3RhdGUgKGEgZm9yayBjaGlsZCByZWFkaW5nIGEgcm9vdCBrZXkpLlxuICovXG5mdW5jdGlvbiBwYXRoVW5kZXIoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PHN0cmluZyB8IG51bWJlcj4oYWRkcmVzcy5sZW5ndGggKyBwYXRoLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gYWRkcmVzc1tpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgaW5zaWRlIGBvYmpgLCBlYWNoIG1pc3Npbmcgb25lIGNyZWF0ZWRcbiAqIG9uIHRoZSB3YXk6IHRoZSBvbmUgQVQgdGhlIGFkZHJlc3MgZnJvbSBgZGVmYXVsdFZhbHVlc2Agd2hlbiBnaXZlbiwgZXZlcnlcbiAqIG90aGVyIG9uZSBlbXB0eS4gVGhlIG9uZSB3YWxrIGJvdGggbmVzdGVkIHdyaXRlcnMgc2hhcmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckF0KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFVuZGVyKGFkZHJlc3NPZihhZGRyZXNzKSwgcGF0aCk7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV07XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0gaSA9PT0gYWRkcmVzcy5sZW5ndGggLSAxICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKVtmaWVsZF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBEZWVwLW1lcmdlcyBhIHZhbHVlIGludG8gdGhlIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYC5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgdXBkYXRlVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFJbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztB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QUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCBvdXQgaW4gOS4zMy4wOyBpdCBpcyB0aGUgcmVjb3JkJ3Mgb3duLCBgc2NydWIudHNgIChDNCkuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBpc0RlbmllZFNlZ21lbnQsIG5hdGl2ZUdldCBhcyBfZ2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgLCBDMiksIGhlbGQgYnkgaXRzIHJlY29yZCBmcmFtZSAoYFJlY29yZEZyYW1lIMK3IGFkZHJlc3NgLCBDMykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBhZGRyZXNzT2YoYWRkcmVzcykubGVuZ3RoID4gMCA/IHBhdGhVbmRlcihhZGRyZXNzLCBwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKiBBbiBhZGRyZXNzIGlzIGFuIGFycmF5LiBBIHJ1biBpZCBzdGlsbCBwYXNzZWQgaW4gaXRzIHBsYWNlIChDMikgaXMgcmVmdXNlZCwgbmV2ZXIgc3ByZWFkIGludG8gaXRzIGNoYXJhY3RlcnMuICovXG5mdW5jdGlvbiBhZGRyZXNzT2YoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFkZHJlc3MpKSByZXR1cm4gYWRkcmVzcztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgZm9vdHByaW50anM6IGFuIGFkZHJlc3MgaXMgYW4gYXJyYXkgcGF0aCBwcmVmaXgsIGdvdCAke2FkZHJlc3MgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWRkcmVzc31gLFxuICApO1xufVxuXG4vKipcbiAqIGBhZGRyZXNzYCB0aGVuIGBwYXRoYCwgYXMgb25lIG5ldyBhcnJheS4gQW4gaW5kZXggbG9vcCwgYmVjYXVzZSB0aGUgZG91YmxlXG4gKiBzcHJlYWQgYFsuLi5hZGRyZXNzLCAuLi5wYXRoXWAgY29zdHMgdHdpY2UgYXMgbXVjaCBhbmQgYSBmcmFtZSBidWlsZHMgb25lIG9uXG4gKiBldmVyeSByZWFkIGl0IHNlcnZlcyBmcm9tIGxpdmUgc3RhdGUgKGEgZm9yayBjaGlsZCByZWFkaW5nIGEgcm9vdCBrZXkpLlxuICovXG5mdW5jdGlvbiBwYXRoVW5kZXIoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PHN0cmluZyB8IG51bWJlcj4oYWRkcmVzcy5sZW5ndGggKyBwYXRoLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gYWRkcmVzc1tpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVmdXNlIHRoZSBXSE9MRSBzZWxlY3RvciBiZWZvcmUgY3JlYXRpbmcgYSBjb250YWluZXIgb3IgY29weWluZyBhIGdlbmVyYXRpb24uXG4gKiBUaGUgYWRkcmVzcydzIGFycmF5IGNvbnRyYWN0IGlzIGNoZWNrZWQgZXZlbiB3aGVuIGFub3RoZXIgc2VsZWN0b3IgaXMgZGVuaWVkLlxuICogUGF5bG9hZCBrZXlzIGFyZSBkYXRhLCBub3Qgc2VsZWN0b3JzLCBhbmQgYXJlIGRlbGliZXJhdGVseSBub3QgaW5zcGVjdGVkLlxuICogQGludGVybmFsIFNoYXJlZCBieSB0aGUgbmVzdGVkIHdyaXRlcnMgYW5kIFNoYXJlZE1lbW9yeSdzIHByZS1jb3B5IGJvdW5kYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRXcml0ZVBhdGgoXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzT2YoYWRkcmVzcyk7XG4gIHJldHVybiBwcmVmaXguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IHBhdGguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IGlzRGVuaWVkU2VnbWVudChmaWVsZCk7XG59XG5cbi8qKiBLZWVwIGV4aXN0aW5nIG93bi1wcm9wZXJ0eSBiZWhhdmlvcjsgYSBtaXNzaW5nIHNsb3QgbXVzdCBub3QgY2FsbCBhbiBpbmhlcml0ZWQgc2V0dGVyLiAqL1xuZnVuY3Rpb24gc2V0T3duVmFsdWUob2JqZWN0OiBOZXN0ZWRPYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgaW5zaWRlIGBvYmpgLCBlYWNoIG1pc3Npbmcgb25lIGNyZWF0ZWRcbiAqIG9uIHRoZSB3YXk6IHRoZSBvbmUgQVQgdGhlIGFkZHJlc3MgZnJvbSBgZGVmYXVsdFZhbHVlc2Agd2hlbiBnaXZlbiwgZXZlcnlcbiAqIG90aGVyIG9uZSBlbXB0eS4gVGhlIG9uZSB3YWxrIGJvdGggbmVzdGVkIHdyaXRlcnMgc2hhcmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckF0KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFVuZGVyKGFkZHJlc3NPZihhZGRyZXNzKSwgcGF0aCk7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV07XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgc2V0T3duVmFsdWUoY3VycmVudCwga2V5LCBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fSk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKiBBIGRlbmllZCBhZGRyZXNzL3BhdGgvZmllbGQgbGVhdmVzIGBvYmpgIHVuY2hhbmdlZCwgaW5jbHVkaW5nIGl0cyBwcm90b3R5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgc2V0T3duVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgdmFsdWUgaW4gdGhlIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgdXBkYXRlVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGlzRGVuaWVkU2VnbWVudChrZXkpKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldE93blZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSA/IG9iamVjdFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -44,12 +44,16 @@ class SharedMemory {
|
|
|
44
44
|
/** Updates a value at `address` + `path` using merge semantics, as a new generation (path copy + swap). */
|
|
45
45
|
updateValue(address, path, key, value) {
|
|
46
46
|
const next = this.ownedPathTo(address, path, key);
|
|
47
|
+
if (next === undefined)
|
|
48
|
+
return;
|
|
47
49
|
(0, utils_js_1.updateNestedValue)(next, address, path, key, value, this.getDefaultValues());
|
|
48
50
|
this.context = next;
|
|
49
51
|
}
|
|
50
52
|
/** Sets a value at `address` + `path` using overwrite semantics, as a new generation (path copy + swap). */
|
|
51
53
|
setValue(address, path, key, value) {
|
|
52
54
|
const next = this.ownedPathTo(address, path, key);
|
|
55
|
+
if (next === undefined)
|
|
56
|
+
return;
|
|
53
57
|
(0, utils_js_1.setNestedValue)(next, address, path, key, value, this.getDefaultValues());
|
|
54
58
|
this.context = next;
|
|
55
59
|
}
|
|
@@ -58,6 +62,8 @@ class SharedMemory {
|
|
|
58
62
|
* `key` are owned — the in-place helpers above then edit only copies.
|
|
59
63
|
*/
|
|
60
64
|
ownedPathTo(address, path, key) {
|
|
65
|
+
if ((0, utils_js_1.isDeniedWritePath)(address, path, key))
|
|
66
|
+
return undefined;
|
|
61
67
|
const owned = new WeakSet();
|
|
62
68
|
const root = (0, pathOps_js_1.ownedRootOf)(this.context, owned);
|
|
63
69
|
const { runPath, globalPath } = (0, utils_js_1.getRunAndGlobalPaths)(address, path);
|
|
@@ -83,4 +89,4 @@ class SharedMemory {
|
|
|
83
89
|
}
|
|
84
90
|
}
|
|
85
91
|
exports.SharedMemory = SharedMemory;
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7O0FBRUgsNkNBQXVFO0FBRXZFLHlDQU9vQjtBQUVwQixNQUFhLFlBQVk7SUFDZixPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUNyQyxjQUFjLENBQVc7SUFFakMsWUFBWSxhQUF1QixFQUFFLGNBQXdCO1FBQzNELElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsNkJBQWdCLEVBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekUsd0VBQXdFO1FBQ3hFLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzdFLENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEYsQ0FBQztJQUVELDJHQUEyRztJQUMzRyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDakYsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELElBQUksSUFBSSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQy9CLElBQUEsNEJBQWlCLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUMvQixJQUFBLHlCQUFjLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxJQUFJLElBQUEsNEJBQWlCLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVcsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSwrQkFBb0IsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEUsSUFBQSxxQkFBUSxFQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLE9BQTJCLEVBQUUsSUFBZSxFQUFFLEdBQVk7UUFDakUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLCtCQUFvQixFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9FLE9BQU8sT0FBTyxLQUFLLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUEseUJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsc0dBQXNHO0lBQ3RHLFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxVQUFVLENBQUMsU0FBc0IsRUFBRSxPQUFvQixFQUFFLEtBQW1CO1FBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx5QkFBYyxFQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDO0NBQ0Y7QUFyRUQsb0NBcUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWRNZW1vcnkg4oCUIFRoZSBzaGFyZWQgc3RhdGUgY29udGFpbmVyIGZvciBhbGwgZmxvd2NoYXJ0IGV4ZWN1dGlvblxuICpcbiAqIExpa2UgYSBydW50aW1lIGhlYXAgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uOlxuICogLSBBIHZhbHVlIGlzIHdyaXR0ZW4gYXQgYW4gQUREUkVTUyDigJQgYSBwYXRoIHByZWZpeCB0aGUgY2FsbGVyIGNvbXB1dGVkXG4gKiAgIChDMjogdGhlIGVuZ2luZSdzIGZyYW1lIGRlY2lkZXMgaXQsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKSDigJQgYW5kIHJlYWRcbiAqICAgdGhlcmUgZmlyc3QsIHRoZW4gYXQgdGhlIHJvb3RcbiAqIC0gRGVmYXVsdCB2YWx1ZXMgc2VlZCB0aGUgcm9vdCwgYW5kIHRoZSBjb250YWluZXIgYXQgYW4gYWRkcmVzcyB3aGVuIGFcbiAqICAgd3JpdGUgY3JlYXRlcyBpdFxuICogLSBBY2NlcHRzIGNvbW1pdCBidW5kbGVzIGZyb20gVHJhbnNhY3Rpb25CdWZmZXJcbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpOlxuICogYGNvbnRleHRgIGlzIGEgR0VORVJBVElPTiwgYW5kIGEgZ2VuZXJhdGlvbiBpcyBuZXZlciBlZGl0ZWQuIEV2ZXJ5IHdyaXRlIOKAlFxuICogYGFwcGx5UGF0Y2hgIChhIHN0YWdlIGNvbW1pdCksIGBzZXRWYWx1ZWAsIGB1cGRhdGVWYWx1ZWAg4oCUIGJ1aWxkcyB0aGUgbmV4dFxuICogZ2VuZXJhdGlvbiBieSBjb3B5aW5nIHRoZSByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiBlYWNoIHdyaXR0ZW4gcGF0aCxcbiAqIHNoYXJlcyBldmVyeSBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LCBhbmQgc3dhcHMuIFNvIGFcbiAqIGdlbmVyYXRpb24gYSBzdGFnZSBjYXB0dXJlZCAoaXRzIGZpcnN0LXRvdWNoIHZpZXcsIGl0cyB0cmFuc2FjdGlvblxuICogYnVmZmVyJ3MgZGlmZiBiYXNlKSBzdGF5cyBleGFjdGx5IHdoYXQgaXQgd2FzLCBhbmQgYSB3cml0ZSBjb3N0cyBPKHdoYXQgaXRcbiAqIHdyb3RlKSwgbm90IE8oc3RhdGUpLlxuICovXG5cbmltcG9ydCB7IG1lcmdlQ29udGV4dFdpbnMsIG93bmVkUm9vdE9mLCBvd25TcGluZSB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQge1xuICBnZXROZXN0ZWRWYWx1ZSxcbiAgZ2V0UnVuQW5kR2xvYmFsUGF0aHMsXG4gIGlzRGVuaWVkV3JpdGVQYXRoLFxuICBuZXh0R2VuZXJhdGlvbixcbiAgc2V0TmVzdGVkVmFsdWUsXG4gIHVwZGF0ZU5lc3RlZFZhbHVlLFxufSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNoYXJlZE1lbW9yeSB7XG4gIHByaXZhdGUgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzPzogdW5rbm93biwgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgY29uc3Qgc2VlZCA9IG1lcmdlQ29udGV4dFdpbnMoaW5pdGlhbENvbnRleHQgfHwge30sIGRlZmF1bHRWYWx1ZXMgfHwge30pO1xuICAgIC8vIERldGFjaGVkIE9OQ0UsIGhlcmU6IGBtZXJnZUNvbnRleHRXaW5zYCBjb3BpZXMgb25seSB0aGUgdG9wIGxldmVsLCBzb1xuICAgIC8vIHRoZSBzZWVkJ3MgbmVzdGVkIHZhbHVlcyBhcmUgdGhlIGNhbGxlcidzIG93biBvYmplY3RzLiBCZWZvcmUgOS4yOS4wXG4gICAgLy8gdGhlIGZpcnN0IGNvbW1pdCdzIHdob2xlLXN0YXRlIGNsb25lIGRldGFjaGVkIHRoZW0gKGFuZCB1bnRpbCB0aGVuIGFcbiAgICAvLyBjYWxsZXIgbXV0YXRpbmcgaXRzIGBpbml0aWFsQ29udGV4dGAgY2hhbmdlZCBsaXZlIHN0YXRlIHdpdGggbm8gcm93KTtcbiAgICAvLyBub3RoaW5nIHJlLWNsb25lcyB0aGUgc3RhdGUgYW55IG1vcmUsIHNvIHRoZSBzZWVkIGlzIGRldGFjaGVkIGF0XG4gICAgLy8gY29uc3RydWN0aW9uIOKAlCBvbmUgY2xvbmUgcGVyIHJ1bnRpbWUsIG5vdCBvbmUgcGVyIGNvbW1pdC5cbiAgICB0aGlzLmNvbnRleHQgPSBPYmplY3Qua2V5cyhzZWVkKS5sZW5ndGggPiAwID8gc3RydWN0dXJlZENsb25lKHNlZWQpIDogc2VlZDtcbiAgfVxuXG4gIC8qKiBHZXRzIGEgY2xvbmUgb2YgdGhlIGRlZmF1bHQgdmFsdWVzLiAqL1xuICBnZXREZWZhdWx0VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzID8gc3RydWN0dXJlZENsb25lKHRoaXMuX2RlZmF1bHRWYWx1ZXMpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgbWVyZ2Ugc2VtYW50aWNzLCBhcyBhIG5ldyBnZW5lcmF0aW9uIChwYXRoIGNvcHkgKyBzd2FwKS4gKi9cbiAgdXBkYXRlVmFsdWUoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vd25lZFBhdGhUbyhhZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIGlmIChuZXh0ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICB1cGRhdGVOZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKiBTZXRzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG92ZXJ3cml0ZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICBzZXRWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHNldE5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY29weSBvZiB0aGUgY3VycmVudCBnZW5lcmF0aW9uJ3Mgcm9vdCB3aG9zZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG9cbiAgICogYGtleWAgYXJlIG93bmVkIOKAlCB0aGUgaW4tcGxhY2UgaGVscGVycyBhYm92ZSB0aGVuIGVkaXQgb25seSBjb3BpZXMuXG4gICAqL1xuICBwcml2YXRlIG93bmVkUGF0aFRvKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwga2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCByb290ID0gb3duZWRSb290T2YodGhpcy5jb250ZXh0LCBvd25lZCk7XG4gICAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzLCBwYXRoKTtcbiAgICBvd25TcGluZShyb290LCBbLi4uKHJ1blBhdGggfHwgZ2xvYmFsUGF0aCksIGtleV0sIG93bmVkKTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gdGhlIHN0b3JlLlxuICAgKiBMb29rcyB1cCBhdCBgYWRkcmVzc2AgZmlyc3QsIGZhbGxzIGJhY2sgdG8gdGhlIHJvb3QuXG4gICAqL1xuICBnZXRWYWx1ZShhZGRyZXNzPzogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg/OiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCB7IGdsb2JhbFBhdGgsIHJ1blBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIGNvbnN0IHZhbHVlID0gcnVuUGF0aCA/IGdldE5lc3RlZFZhbHVlKHRoaXMuY29udGV4dCwgcnVuUGF0aCwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBnbG9iYWxQYXRoLCBrZXkpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGVudGlyZSBzdGF0ZSBhcyBhIEpTT04gb2JqZWN0IOKAlCB0aGUgY3VycmVudCBnZW5lcmF0aW9uLCBieSByZWZlcmVuY2UuIE5ldmVyIG11dGF0ZSBpdC4gKi9cbiAgZ2V0U3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gIH1cblxuICAvKiogQXBwbGllcyBhIGNvbW1pdCBidW5kbGUgZnJvbSBUcmFuc2FjdGlvbkJ1ZmZlcjogYnVpbGRzIHRoZSBuZXh0IGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluLiAqL1xuICBhcHBseVBhdGNoKG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dEdlbmVyYXRpb24odGhpcy5jb250ZXh0LCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlKTtcbiAgfVxufVxuIl19
|
|
@@ -2,30 +2,28 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
6
|
+
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
7
|
+
* contract is explicit below; merely using this module is not a sandbox.
|
|
8
8
|
*
|
|
9
9
|
* Intentional asymmetry:
|
|
10
|
-
* - nativeSet
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* -
|
|
14
|
-
*
|
|
15
|
-
* hasOwnProperty guard is required to prevent leaking inherited values
|
|
16
|
-
* (e.g. Object.prototype, Object constructor, toString).
|
|
10
|
+
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
11
|
+
* containers. It can follow an inherited object under an ordinary key.
|
|
12
|
+
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
13
|
+
* - nativeHas — own-property existence only, including own denied names
|
|
14
|
+
* and own undefined values; it does not use the DENIED rule.
|
|
17
15
|
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
18
16
|
* by spec so prototype keys never appear in the iteration.
|
|
19
17
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* Nested diagnostic writers have their own whole-selector preflight and
|
|
19
|
+
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
22
20
|
*
|
|
23
21
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
24
22
|
*/
|
|
25
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
24
|
exports.mergeContextWins = exports.nativeHas = exports.adopt = exports.own = exports.ownedRootOf = exports.ownSpine = exports.shallowCopy = exports.ownChild = exports.isContainer = exports.nativeDelete = exports.nativeSet = exports.nativeGet = exports.isDeniedSegment = void 0;
|
|
27
25
|
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
28
|
-
/** Is `segment` one of the three prototype-pollution
|
|
26
|
+
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
29
27
|
function isDeniedSegment(segment) {
|
|
30
28
|
return DENIED.has(String(segment));
|
|
31
29
|
}
|
|
@@ -304,4 +302,4 @@ function mergeContextWins(dst, src) {
|
|
|
304
302
|
return out;
|
|
305
303
|
}
|
|
306
304
|
exports.mergeContextWins = mergeContextWins;
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHOzs7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsU0FBZ0IsZUFBZSxDQUFDLE9BQXdCO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRkQsMENBRUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFrQztJQUNwRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFB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Q2pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDeEIsQ0FBQztnQkFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCw2QkFBNkI7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBMUJELDRDQTBCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcGF0aE9wcy50cyDigJQgTmF0aXZlIG5lc3RlZC1wYXRoIGhlbHBlcnMgKHJlcGxhY2VzIGxvZGFzaC5nZXQvc2V0L2hhcy9tZXJnZXdpdGgpXG4gKlxuICogU2VjdXJpdHkgY29udHJhY3Q6IGFsbCBmdW5jdGlvbnMgZ3VhcmQgYWdhaW5zdCBwcm90b3R5cGUtcG9sbHV0aW9uIGFuZFxuICogcHJvdG90eXBlLWNoYWluLXJlYWQgYXR0YWNrcy4gVGhlIERFTklFRCBzZXQgYmxvY2tzIHRoZSB0aHJlZSBjYW5vbmljYWxcbiAqIHBvbGx1dGlvbiB2ZWN0b3JzIChfX3Byb3RvX18sIGNvbnN0cnVjdG9yLCBwcm90b3R5cGUpIG9uIGV2ZXJ5IGZ1bmN0aW9uLlxuICpcbiAqIEludGVudGlvbmFsIGFzeW1tZXRyeTpcbiAqICAgLSBuYXRpdmVTZXQgIOKAlCBERU5JRUQgY2hlY2sgb25seSBhdCBlYWNoIHNlZ21lbnQuIE5vIGhhc093blByb3BlcnR5XG4gKiAgICAgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2Ugd3JpdGluZyBhbHdheXMgY3JlYXRlcyBhbiBPV04gcHJvcGVydHkgb24gYGN1cnJgLFxuICogICAgIHdoaWNoIGNhbm5vdCBwb2xsdXRlIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gKiAgIC0gbmF0aXZlR2V0IC8gbmF0aXZlSGFzIOKAlCBERU5JRUQgY2hlY2sgKyBoYXNPd25Qcm9wZXJ0eSBhdCBldmVyeSBzdGVwLlxuICogICAgIFJlYWRzIGZvbGxvdyB0aGUgcHJvdG90eXBlIGNoYWluIGJ5IGRlZmF1bHQgKGJyYWNrZXQgbm90YXRpb24pLCBzbyB0aGVcbiAqICAgICBoYXNPd25Qcm9wZXJ0eSBndWFyZCBpcyByZXF1aXJlZCB0byBwcmV2ZW50IGxlYWtpbmcgaW5oZXJpdGVkIHZhbHVlc1xuICogICAgIChlLmcuIE9iamVjdC5wcm90b3R5cGUsIE9iamVjdCBjb25zdHJ1Y3RvciwgdG9TdHJpbmcpLlxuICogICAtIG1lcmdlQ29udGV4dFdpbnMg4oCUIERFTklFRCBjaGVjayBvbmx5OyBPYmplY3Qua2V5cygpIGlzIG93bi1lbnVtZXJhYmxlLW9ubHlcbiAqICAgICBieSBzcGVjIHNvIHByb3RvdHlwZSBrZXlzIG5ldmVyIGFwcGVhciBpbiB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIERvIE5PVCBcImZpeFwiIHRoZSBuYXRpdmVTZXQgYXN5bW1ldHJ5IGJ5IGFkZGluZyBoYXNPd25Qcm9wZXJ0eSDigJQgaXQgaXNcbiAqIGludGVudGlvbmFsIGFuZCB3b3VsZCBicmVhayBwYXRoIGNyZWF0aW9uIGZvciBuZXcgaW50ZXJtZWRpYXRlIG5vZGVzLlxuICpcbiAqIFBhdGhzIG1heSBiZSBkb3Qtbm90YXRpb24gc3RyaW5ncyBvciBwcmUtc3BsaXQgKHN0cmluZ3xudW1iZXIpW10gYXJyYXlzLlxuICovXG5cbmNvbnN0IERFTklFRCA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKiogSXMgYHNlZ21lbnRgIG9uZSBvZiB0aGUgdGhyZWUgcHJvdG90eXBlLXBvbGx1dGlvbiB2ZWN0b3JzIGV2ZXJ5IGhlbHBlciBoZXJlIHJlZnVzZXM/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gREVOSUVELmhhcyhTdHJpbmcoc2VnbWVudCkpO1xufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnRzKHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXQgYHBhdGhgIGluIGBvYmpgLCByZXR1cm5pbmcgYGRlZmF1bHRWYWx1ZWAgaWYgYWJzZW50LlxuICpcbiAqIFNlY3VyaXR5OiBlYWNoIHBhdGggc2VnbWVudCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIERFTklFRCBsaXN0IGFuZCByZXF1aXJlc1xuICogYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAsIHByZXZlbnRpbmcgcHJvdG90eXBlLWNoYWluIHJlYWRzLlxuICogZS5nLiBuYXRpdmVHZXQoe30sICdfX3Byb3RvX18nKSBhbmQgbmF0aXZlR2V0KHt9LCAnY29uc3RydWN0b3InKSBib3RoIHJldHVyblxuICogYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBvZiBsZWFraW5nIE9iamVjdC5wcm90b3R5cGUgLyB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ3MpIHtcbiAgICBpZiAoY3VyciA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgcmV0dXJuIGN1cnIgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IGN1cnI7XG59XG5cbi8qKiBNdXRhdGUgYG9iamAsIHNldHRpbmcgYHZhbHVlYCBhdCBgcGF0aGAgKGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMpLiBSZXR1cm5zIGBvYmpgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZVNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybiBvYmo7XG4gICAgaWYgKGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGN1cnJba10gPSB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fTtcbiAgICB9XG4gICAgY3VyciA9IGN1cnJba107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuIG9iajtcbiAgY3VycltsYXN0XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgb3duIHByb3BlcnR5IGF0IGBwYXRoYCBpbiBgb2JqYCAodGhlIHJlcGxheSBwcmltaXRpdmUgZm9yIHRoZVxuICogYGRlbGV0ZWAgY29tbWl0IHZlcmIsICMxM2MtQikuIE5vLW9wIHdoZW4gYW55IGludGVybWVkaWF0ZSBzZWdtZW50IGlzXG4gKiBtaXNzaW5nIOKAlCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGhhcyBub3RoaW5nIHRvIHJlbW92ZS5cbiAqXG4gKiBTZWN1cml0eTogc2FtZSBERU5JRUQgKyBoYXNPd25Qcm9wZXJ0eSBkaXNjaXBsaW5lIGFzIG5hdGl2ZUdldCDigJQgZXZlcnlcbiAqIHNlZ21lbnQgaXMgY2hlY2tlZCwgc28gYG5hdGl2ZURlbGV0ZShvYmosICdfX3Byb3RvX19cdTAwMWZ4JylgIGFuZFxuICogcHJvdG90eXBlLWNoYWluIHdhbGtzIGFyZSBpbmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZURlbGV0ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuO1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgdHlwZW9mIGN1cnIgIT09ICdvYmplY3QnIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuO1xuICBpZiAoY3VyciAhPSBudWxsICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyW2xhc3RdO1xuICB9XG59XG5cbi8vIOKUgOKUgCBDb3B5LW9uLXdyaXRlIHByaW1pdGl2ZXMgKGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpIOKUgOKUgFxuLy9cbi8vIFRIRSBMQVc6IGEgY29tbWl0dGVkIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBBIHdyaXRlciBjb3BpZXMgdGhlIHJvb3Rcbi8vIGFuZCBldmVyeSBjb250YWluZXIgb24gZWFjaCBwYXRoIGl0IHdyaXRlcywgZWRpdHMgb25seSBjb250YWluZXJzIGl0XG4vLyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gKGl0cyBgb3duZWRgIHNldCksIGFuZCBzaGFyZXMgZXZlcnlcbi8vIG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQuIFRoZSBzYW1lIGxhd1xuLy8gYHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZS50cyDCtyBzZXRJblBhdGhgIGFwcGxpZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG5cbi8qKiBBIGNvbnRhaW5lciBhIHdyaXRlciBtYXkgb3duOiBhbnl0aGluZyBgdHlwZW9mICdvYmplY3QnYCBhbmQgbm90IG51bGwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBgcGFyZW50W2tleV1gIHdoZW4gYHBhcmVudGAgaXMgYSBjb250YWluZXIgdGhhdCBPV05TIGBrZXlgIOKAlCB0aGUgc2xvdFxuICoge0BsaW5rIG5hdGl2ZUdldH0gd291bGQgcmVhZCwgcmVmdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlLXBvbGx1dGlvblxuICogc2VnbWVudHMg4oCUIGVsc2UgYHVuZGVmaW5lZGAuIE9uZSBzdGVwIG9mIGEgcGF0aCB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duQ2hpbGQocGFyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZyB8IG51bWJlcik6IHVua25vd24ge1xuICByZXR1cm4gaXNDb250YWluZXIocGFyZW50KSAmJiAhREVOSUVELmhhcyhTdHJpbmcoa2V5KSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmVudCwga2V5KVxuICAgID8gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSBmb3IgYW4gb3duIGtleSBvZiBhbiBhcnJheSB0aGF0IGlzIGFuIGFycmF5IElOREVYIChgJzAnYCwgYCcxMidgKSwgbm90IGEgbmFtZSAoYGFyci5ub3RlYCkuICovXG5mdW5jdGlvbiBpc0FycmF5SW5kZXhLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IE51bWJlcihrZXkpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgJiYgbiA8IDQyOTQ5NjcyOTUgJiYgU3RyaW5nKG4pID09PSBrZXk7XG59XG5cbi8qKlxuICogVGhlIG5hbWVkIChub24taW5kZXgpIG93biBrZXlzIG9mIGFuIGFycmF5LCBpbiBvcmRlci4gT3duLWtleSBvcmRlciBwdXRzXG4gKiBldmVyeSBpbmRleCBmaXJzdCwgYXNjZW5kaW5nLCBhbmQgbmFtZXMgYWZ0ZXIgdGhlbSDigJQgc28gdGhlIG5hbWVzIGFyZSB0aGVcbiAqIHRhaWwgb2YgYE9iamVjdC5rZXlzYCwgYW5kIGFuIGFycmF5IHdpdGhvdXQgYW55IGlzIHRvbGQgYnkgaXRzIGxhc3Qga2V5LlxuICovXG5mdW5jdGlvbiBuYW1lZEFycmF5S2V5cyhhcnJheTogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyYXkpO1xuICBsZXQgZmlyc3QgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGZpcnN0ID4gMCAmJiAhaXNBcnJheUluZGV4S2V5KGtleXNbZmlyc3QgLSAxXSkpIGZpcnN0LS07XG4gIHJldHVybiBrZXlzLnNsaWNlKGZpcnN0KTtcbn1cblxuLyoqXG4gKiBBIFNIQUxMT1cgY29weSBvZiBvbmUgY29udGFpbmVyIHRoYXQga2VlcHMgZXZlcnkgc2xvdCB0aGUgd2hvbGUtc3RhdGVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoaXMgcmVwbGFjZWQga2VwdCDigJQgc28gYSBwYXRoIGNvcHkgYW5kIGEgZGVlcCBjbG9uZSBnaXZlXG4gKiB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoOlxuICogICAtIGEgcGxhaW4gb2JqZWN0IChvciBhIG51bGwtcHJvdG90eXBlIG9uZSk6IGl0cyBvd24gZW51bWVyYWJsZSBrZXlzLCBpblxuICogICAgIG9yZGVyLCBieSBzcHJlYWQg4oCUIGFuIG93biBgX19wcm90b19fYCBrZXkgc3RheXMgYSBrZXk7IHRoZSByZXN1bHQgaGFzXG4gKiAgICAgYE9iamVjdC5wcm90b3R5cGVgLCBhcyBhIGNsb25lJ3MgZG9lcztcbiAqICAgLSBhbiBhcnJheTogaXRzIGluZGljZXMsIGhvbGVzIGFuZCBsZW5ndGggKGBzbGljZWApIEFORCBhbnkgbmFtZWRcbiAqICAgICBwcm9wZXJ0eSBhIG5lc3RlZCB3cml0ZSBodW5nIG9mZiBpdCAoYHNsaWNlYCBhbG9uZSB3b3VsZCBkcm9wIHRob3NlKTtcbiAqICAgLSBhbnl0aGluZyBlbHNlIOKAlCBhIGBEYXRlYCwgYE1hcGAsIGBTZXRgLCB0eXBlZCBhcnJheSwgYSBjbGFzcyBpbnN0YW5jZSDigJRcbiAqICAgICBpcyBkZWVwLWNsb25lZCwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgZGlkIHRvIGl0OyBhbmQgdGhlXG4gKiAgICAgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyB0aGUgY2xvbmUgY2Fubm90IGNhcnJ5IChhbiBleHBhbmRvIGEgbmVzdGVkXG4gKiAgICAgd3JpdGUgaHVuZyBvbiBhIGBEYXRlYCkgYXJlIGNhcnJpZWQgb3ZlciBieSByZWZlcmVuY2UsIHNvIGEgbGF0ZXIgd3JpdGVcbiAqICAgICB0aHJvdWdoIGl0IGNoYW5nZXMgZXhhY3RseSBpdHMgb3duIHBhdGguIFJhcmUgb24gYSB3cml0ZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VCBleHRlbmRzIG9iamVjdD4oY29udGFpbmVyOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb3B5ID0gY29udGFpbmVyLnNsaWNlKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuYW1lZEFycmF5S2V5cyhjb250YWluZXIpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgcmV0dXJuIGNvcHkgYXMgdW5rbm93biBhcyBUO1xuICB9XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnRhaW5lcik7XG4gIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkgcmV0dXJuIHsgLi4uY29udGFpbmVyIH07XG4gIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29udGFpbmVyKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29udGFpbmVyKSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGtleSkpIGNvcHlba2V5XSA9IChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gIH1cbiAgcmV0dXJuIGNvcHkgYXMgVDtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gYHBhdGhgJ3MgTEVBRiBvbmVzIHRoZSB3cml0ZXIgb3ducywgc29cbiAqIHRoZSB3cml0ZSB0aGF0IGZvbGxvd3MgKGBuYXRpdmVTZXRgIC8gYG5hdGl2ZURlbGV0ZWAgLyBhIHZlcmIgYXJtKSBlZGl0c1xuICogbm90aGluZyBpdCBkaWQgbm90IGNyZWF0ZS5cbiAqXG4gKiBgcm9vdGAgbXVzdCBhbHJlYWR5IGJlIG93bmVkLiBXYWxraW5nIGRvd24sIGV2ZXJ5IGNvbnRhaW5lciB0aGUgd3JpdGVyIGRpZFxuICogbm90IGNyZWF0ZSAoYG93bmVkYCBkb2VzIG5vdCBob2xkIGl0KSBpcyByZXBsYWNlZCwgaW4gaXRzIHBhcmVudCwgYnkgaXRzXG4gKiB7QGxpbmsgc2hhbGxvd0NvcHl9LCB3aGljaCB0aGUgd3JpdGVyIHRoZW4gb3ducy4gVGhlIHdhbGsgc3RvcHMgd2hlcmVcbiAqIGBuYXRpdmVTZXRgIHdvdWxkIHN0b3Agb3IgY3JlYXRlOiBhIERFTklFRCBzZWdtZW50ICh0aGUgd3JpdGUgaXMgcmVmdXNlZFxuICogdGhlcmUgYW55d2F5KSwgb3IgYSBtaXNzaW5nIC8gcHJpbWl0aXZlIGludGVybWVkaWF0ZSAoYG5hdGl2ZVNldGAgbWFrZXMgYVxuICogZnJlc2ggY29udGFpbmVyIGZyb20gdGhhdCBwb2ludCBvbikuIFRoZSBsZWFmIGl0c2VsZiBpcyBuZXZlciBjb3BpZWQg4oCUIHRoZVxuICogd3JpdGUgcmVwbGFjZXMgaXQuXG4gKlxuICogQ29zdDogb25lIHNoYWxsb3cgY29weSBwZXIgY29udGFpbmVyIG9uIHRoZSBwYXRoIHRoYXQgdGhpcyB3cml0ZXIgaGFzIG5vdFxuICogYWxyZWFkeSBjb3BpZWQg4oCUIE8oZGVwdGggw5cgd2lkdGgpLCBpbmRlcGVuZGVudCBvZiBldmVyeXRoaW5nIHRoZSB3cml0ZVxuICogZG9lcyBub3QgcGFzcyB0aHJvdWdoLiBBIHBhdGggb2Ygb25lIHNlZ21lbnQgKGEgcm9vdCBrZXksIHRoZSBjb21tb24gY2FzZSlcbiAqIGNvcGllcyBub3RoaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25TcGluZShyb290OiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gcm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gY3VycltrXTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKG5leHQpKSByZXR1cm47XG4gICAgaWYgKG93bmVkLmhhcyhuZXh0KSkge1xuICAgICAgY3VyciA9IG5leHQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY29weSA9IHNoYWxsb3dDb3B5KG5leHQpO1xuICAgIG93bmVkLmFkZChjb3B5KTtcbiAgICBjdXJyW2tdID0gY29weTtcbiAgICBjdXJyID0gY29weTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IG9mIGEgbmV3IGdlbmVyYXRpb246IGEgc2hhbGxvdyBjb3B5IG9mIGBiYXNlYCB3aGVuIGl0IGlzIGFcbiAqIGNvbnRhaW5lciAob3duZWQgYnkgdGhlIHdyaXRlciksIGVsc2UgdGhlIGhpc3RvcmljYWwgZGVlcCBjbG9uZSBvZiBhXG4gKiBub24tY29udGFpbmVyIGJhc2UgKGB1bmRlZmluZWRgLCBhIHByaW1pdGl2ZSkgc28gdGhlIGNhbGxlcnMnIGJlaGF2aW91ciBvblxuICogc3VjaCBhIGJhc2UgaXMgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duZWRSb290T2YoYmFzZTogYW55LCBvd25lZD86IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmICghaXNDb250YWluZXIoYmFzZSkpIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGNvbnN0IHJvb3QgPSBzaGFsbG93Q29weShiYXNlKTtcbiAgb3duZWQ/LmFkZChyb290KTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBNYXJrIGEgdmFsdWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgKGEgZnJlc2ggY2xvbmUsIGEgbWVyZ2UgcmVzdWx0KSBhcyBvd25lZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd24odmFsdWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG93bmVkICE9PSB1bmRlZmluZWQgJiYgaXNDb250YWluZXIodmFsdWUpKSBvd25lZC5hZGQodmFsdWUpO1xufVxuXG4vKipcbiAqIE1hcmsgRVZFUlkgY29udGFpbmVyIG9mIGEgdHJlZSB0aGUgd3JpdGVyIGp1c3QgY3JlYXRlZCB3aG9sZSAoYVxuICogYHN0cnVjdHVyZWRDbG9uZWAgcmVzdWx0KSBhcyBvd25lZCwgc28gYSBsYXRlciB3cml0ZSB0aHJvdWdoIGFueSBvZiB0aGVtXG4gKiBlZGl0cyBpdCBpbiBwbGFjZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgYWdhaW4uIFdhbGtzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUXG4gKiB0aGUgc2xvdHMgYSBwYXRoIGNhbiBhZGRyZXNzOyBhIGBNYXBgJ3Mgb3IgYFNldGAncyBlbnRyaWVzIGFyZSBub3QuIE8odGhlXG4gKiB0cmVlJ3MgY29udGFpbmVycyk7IGEgY29udGFpbmVyIGFscmVhZHkgb3duZWQgaXMgbm90IHdhbGtlZCB0d2ljZSAoYSBjeWNsZVxuICogaW5zaWRlIHRoZSBjbG9uZSBlbmRzIHRoZXJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkb3B0KHRyZWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhY2s6IHVua25vd25bXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8IG93bmVkLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIG93bmVkLmFkZCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSBzdGFjay5wdXNoKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFbEUsK0VBQStFO0FBQy9FLFNBQWdCLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUZELDBDQUVDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBa0M7SUFDcEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsR0FBUSxFQUFFLElBQWtDLEVBQUUsWUFBa0I7SUFDeEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ3RDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLFlBQVks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QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRO2dCQUM1QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ3hCLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsNkJBQTZCO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQTFCRCw0Q0EwQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFRoZSBERU5JRUQgc2V0IGlzIHRoZSBzaGFyZWQgcnVsZSBmb3IgdGhyZWUgcHJvdG90eXBlLXBvbGx1dGlvbiBzZWxlY3RvclxuICogc2VnbWVudHMgKF9fcHJvdG9fXywgY29uc3RydWN0b3IsIHByb3RvdHlwZSkuIEVhY2ggb3BlcmF0aW9uJ3MgdHJhdmVyc2FsXG4gKiBjb250cmFjdCBpcyBleHBsaWNpdCBiZWxvdzsgbWVyZWx5IHVzaW5nIHRoaXMgbW9kdWxlIGlzIG5vdCBhIHNhbmRib3guXG4gKlxuICogSW50ZW50aW9uYWwgYXN5bW1ldHJ5OlxuICogICAtIG5hdGl2ZVNldCDigJQgREVOSUVEIGNoZWNrIGF0IGVhY2ggc2VnbWVudDsgdXNlZCBvbiB3cml0ZXItb3duZWRcbiAqICAgICBjb250YWluZXJzLiBJdCBjYW4gZm9sbG93IGFuIGluaGVyaXRlZCBvYmplY3QgdW5kZXIgYW4gb3JkaW5hcnkga2V5LlxuICogICAtIG5hdGl2ZUdldCDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgLSBuYXRpdmVIYXMg4oCUIG93bi1wcm9wZXJ0eSBleGlzdGVuY2Ugb25seSwgaW5jbHVkaW5nIG93biBkZW5pZWQgbmFtZXNcbiAqICAgICBhbmQgb3duIHVuZGVmaW5lZCB2YWx1ZXM7IGl0IGRvZXMgbm90IHVzZSB0aGUgREVOSUVEIHJ1bGUuXG4gKiAgIC0gbWVyZ2VDb250ZXh0V2lucyDigJQgREVOSUVEIGNoZWNrIG9ubHk7IE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seVxuICogICAgIGJ5IHNwZWMgc28gcHJvdG90eXBlIGtleXMgbmV2ZXIgYXBwZWFyIGluIHRoZSBpdGVyYXRpb24uXG4gKlxuICogTmVzdGVkIGRpYWdub3N0aWMgd3JpdGVycyBoYXZlIHRoZWlyIG93biB3aG9sZS1zZWxlY3RvciBwcmVmbGlnaHQgYW5kXG4gKiBvd24tcHJvcGVydHkgd3JpdGVzIGluIHV0aWxzLnRzLCB1c2luZyB0aGUgc2FtZSBpc0RlbmllZFNlZ21lbnQgcHJlZGljYXRlLlxuICpcbiAqIFBhdGhzIG1heSBiZSBkb3Qtbm90YXRpb24gc3RyaW5ncyBvciBwcmUtc3BsaXQgKHN0cmluZ3xudW1iZXIpW10gYXJyYXlzLlxuICovXG5cbmNvbnN0IERFTklFRCA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKiogSXMgYHNlZ21lbnRgIG9uZSBvZiB0aGUgdGhyZWUgZGVuaWVkIHByb3RvdHlwZS1wb2xsdXRpb24gc2VsZWN0b3IgbmFtZXM/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gREVOSUVELmhhcyhTdHJpbmcoc2VnbWVudCkpO1xufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnRzKHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXQgYHBhdGhgIGluIGBvYmpgLCByZXR1cm5pbmcgYGRlZmF1bHRWYWx1ZWAgaWYgYWJzZW50LlxuICpcbiAqIFNlY3VyaXR5OiBlYWNoIHBhdGggc2VnbWVudCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIERFTklFRCBsaXN0IGFuZCByZXF1aXJlc1xuICogYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAsIHByZXZlbnRpbmcgcHJvdG90eXBlLWNoYWluIHJlYWRzLlxuICogZS5nLiBuYXRpdmVHZXQoe30sICdfX3Byb3RvX18nKSBhbmQgbmF0aXZlR2V0KHt9LCAnY29uc3RydWN0b3InKSBib3RoIHJldHVyblxuICogYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBvZiBsZWFraW5nIE9iamVjdC5wcm90b3R5cGUgLyB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ3MpIHtcbiAgICBpZiAoY3VyciA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgcmV0dXJuIGN1cnIgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IGN1cnI7XG59XG5cbi8qKiBNdXRhdGUgYG9iamAsIHNldHRpbmcgYHZhbHVlYCBhdCBgcGF0aGAgKGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMpLiBSZXR1cm5zIGBvYmpgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZVNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybiBvYmo7XG4gICAgaWYgKGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGN1cnJba10gPSB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fTtcbiAgICB9XG4gICAgY3VyciA9IGN1cnJba107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuIG9iajtcbiAgY3VycltsYXN0XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgb3duIHByb3BlcnR5IGF0IGBwYXRoYCBpbiBgb2JqYCAodGhlIHJlcGxheSBwcmltaXRpdmUgZm9yIHRoZVxuICogYGRlbGV0ZWAgY29tbWl0IHZlcmIsICMxM2MtQikuIE5vLW9wIHdoZW4gYW55IGludGVybWVkaWF0ZSBzZWdtZW50IGlzXG4gKiBtaXNzaW5nIOKAlCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGhhcyBub3RoaW5nIHRvIHJlbW92ZS5cbiAqXG4gKiBTZWN1cml0eTogc2FtZSBERU5JRUQgKyBoYXNPd25Qcm9wZXJ0eSBkaXNjaXBsaW5lIGFzIG5hdGl2ZUdldCDigJQgZXZlcnlcbiAqIHNlZ21lbnQgaXMgY2hlY2tlZCwgc28gYG5hdGl2ZURlbGV0ZShvYmosICdfX3Byb3RvX19cdTAwMWZ4JylgIGFuZFxuICogcHJvdG90eXBlLWNoYWluIHdhbGtzIGFyZSBpbmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZURlbGV0ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuO1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgdHlwZW9mIGN1cnIgIT09ICdvYmplY3QnIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuO1xuICBpZiAoY3VyciAhPSBudWxsICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyW2xhc3RdO1xuICB9XG59XG5cbi8vIOKUgOKUgCBDb3B5LW9uLXdyaXRlIHByaW1pdGl2ZXMgKGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpIOKUgOKUgFxuLy9cbi8vIFRIRSBMQVc6IGEgY29tbWl0dGVkIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBBIHdyaXRlciBjb3BpZXMgdGhlIHJvb3Rcbi8vIGFuZCBldmVyeSBjb250YWluZXIgb24gZWFjaCBwYXRoIGl0IHdyaXRlcywgZWRpdHMgb25seSBjb250YWluZXJzIGl0XG4vLyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gKGl0cyBgb3duZWRgIHNldCksIGFuZCBzaGFyZXMgZXZlcnlcbi8vIG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQuIFRoZSBzYW1lIGxhd1xuLy8gYHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZS50cyDCtyBzZXRJblBhdGhgIGFwcGxpZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG5cbi8qKiBBIGNvbnRhaW5lciBhIHdyaXRlciBtYXkgb3duOiBhbnl0aGluZyBgdHlwZW9mICdvYmplY3QnYCBhbmQgbm90IG51bGwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBgcGFyZW50W2tleV1gIHdoZW4gYHBhcmVudGAgaXMgYSBjb250YWluZXIgdGhhdCBPV05TIGBrZXlgIOKAlCB0aGUgc2xvdFxuICoge0BsaW5rIG5hdGl2ZUdldH0gd291bGQgcmVhZCwgcmVmdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlLXBvbGx1dGlvblxuICogc2VnbWVudHMg4oCUIGVsc2UgYHVuZGVmaW5lZGAuIE9uZSBzdGVwIG9mIGEgcGF0aCB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duQ2hpbGQocGFyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZyB8IG51bWJlcik6IHVua25vd24ge1xuICByZXR1cm4gaXNDb250YWluZXIocGFyZW50KSAmJiAhREVOSUVELmhhcyhTdHJpbmcoa2V5KSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmVudCwga2V5KVxuICAgID8gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSBmb3IgYW4gb3duIGtleSBvZiBhbiBhcnJheSB0aGF0IGlzIGFuIGFycmF5IElOREVYIChgJzAnYCwgYCcxMidgKSwgbm90IGEgbmFtZSAoYGFyci5ub3RlYCkuICovXG5mdW5jdGlvbiBpc0FycmF5SW5kZXhLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IE51bWJlcihrZXkpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgJiYgbiA8IDQyOTQ5NjcyOTUgJiYgU3RyaW5nKG4pID09PSBrZXk7XG59XG5cbi8qKlxuICogVGhlIG5hbWVkIChub24taW5kZXgpIG93biBrZXlzIG9mIGFuIGFycmF5LCBpbiBvcmRlci4gT3duLWtleSBvcmRlciBwdXRzXG4gKiBldmVyeSBpbmRleCBmaXJzdCwgYXNjZW5kaW5nLCBhbmQgbmFtZXMgYWZ0ZXIgdGhlbSDigJQgc28gdGhlIG5hbWVzIGFyZSB0aGVcbiAqIHRhaWwgb2YgYE9iamVjdC5rZXlzYCwgYW5kIGFuIGFycmF5IHdpdGhvdXQgYW55IGlzIHRvbGQgYnkgaXRzIGxhc3Qga2V5LlxuICovXG5mdW5jdGlvbiBuYW1lZEFycmF5S2V5cyhhcnJheTogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyYXkpO1xuICBsZXQgZmlyc3QgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGZpcnN0ID4gMCAmJiAhaXNBcnJheUluZGV4S2V5KGtleXNbZmlyc3QgLSAxXSkpIGZpcnN0LS07XG4gIHJldHVybiBrZXlzLnNsaWNlKGZpcnN0KTtcbn1cblxuLyoqXG4gKiBBIFNIQUxMT1cgY29weSBvZiBvbmUgY29udGFpbmVyIHRoYXQga2VlcHMgZXZlcnkgc2xvdCB0aGUgd2hvbGUtc3RhdGVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoaXMgcmVwbGFjZWQga2VwdCDigJQgc28gYSBwYXRoIGNvcHkgYW5kIGEgZGVlcCBjbG9uZSBnaXZlXG4gKiB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoOlxuICogICAtIGEgcGxhaW4gb2JqZWN0IChvciBhIG51bGwtcHJvdG90eXBlIG9uZSk6IGl0cyBvd24gZW51bWVyYWJsZSBrZXlzLCBpblxuICogICAgIG9yZGVyLCBieSBzcHJlYWQg4oCUIGFuIG93biBgX19wcm90b19fYCBrZXkgc3RheXMgYSBrZXk7IHRoZSByZXN1bHQgaGFzXG4gKiAgICAgYE9iamVjdC5wcm90b3R5cGVgLCBhcyBhIGNsb25lJ3MgZG9lcztcbiAqICAgLSBhbiBhcnJheTogaXRzIGluZGljZXMsIGhvbGVzIGFuZCBsZW5ndGggKGBzbGljZWApIEFORCBhbnkgbmFtZWRcbiAqICAgICBwcm9wZXJ0eSBhIG5lc3RlZCB3cml0ZSBodW5nIG9mZiBpdCAoYHNsaWNlYCBhbG9uZSB3b3VsZCBkcm9wIHRob3NlKTtcbiAqICAgLSBhbnl0aGluZyBlbHNlIOKAlCBhIGBEYXRlYCwgYE1hcGAsIGBTZXRgLCB0eXBlZCBhcnJheSwgYSBjbGFzcyBpbnN0YW5jZSDigJRcbiAqICAgICBpcyBkZWVwLWNsb25lZCwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgZGlkIHRvIGl0OyBhbmQgdGhlXG4gKiAgICAgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyB0aGUgY2xvbmUgY2Fubm90IGNhcnJ5IChhbiBleHBhbmRvIGEgbmVzdGVkXG4gKiAgICAgd3JpdGUgaHVuZyBvbiBhIGBEYXRlYCkgYXJlIGNhcnJpZWQgb3ZlciBieSByZWZlcmVuY2UsIHNvIGEgbGF0ZXIgd3JpdGVcbiAqICAgICB0aHJvdWdoIGl0IGNoYW5nZXMgZXhhY3RseSBpdHMgb3duIHBhdGguIFJhcmUgb24gYSB3cml0ZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VCBleHRlbmRzIG9iamVjdD4oY29udGFpbmVyOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb3B5ID0gY29udGFpbmVyLnNsaWNlKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuYW1lZEFycmF5S2V5cyhjb250YWluZXIpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgcmV0dXJuIGNvcHkgYXMgdW5rbm93biBhcyBUO1xuICB9XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNvbnRhaW5lcik7XG4gIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkgcmV0dXJuIHsgLi4uY29udGFpbmVyIH07XG4gIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29udGFpbmVyKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29udGFpbmVyKSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvcHksIGtleSkpIGNvcHlba2V5XSA9IChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gIH1cbiAgcmV0dXJuIGNvcHkgYXMgVDtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gYHBhdGhgJ3MgTEVBRiBvbmVzIHRoZSB3cml0ZXIgb3ducywgc29cbiAqIHRoZSB3cml0ZSB0aGF0IGZvbGxvd3MgKGBuYXRpdmVTZXRgIC8gYG5hdGl2ZURlbGV0ZWAgLyBhIHZlcmIgYXJtKSBlZGl0c1xuICogbm90aGluZyBpdCBkaWQgbm90IGNyZWF0ZS5cbiAqXG4gKiBgcm9vdGAgbXVzdCBhbHJlYWR5IGJlIG93bmVkLiBXYWxraW5nIGRvd24sIGV2ZXJ5IGNvbnRhaW5lciB0aGUgd3JpdGVyIGRpZFxuICogbm90IGNyZWF0ZSAoYG93bmVkYCBkb2VzIG5vdCBob2xkIGl0KSBpcyByZXBsYWNlZCwgaW4gaXRzIHBhcmVudCwgYnkgaXRzXG4gKiB7QGxpbmsgc2hhbGxvd0NvcHl9LCB3aGljaCB0aGUgd3JpdGVyIHRoZW4gb3ducy4gVGhlIHdhbGsgc3RvcHMgd2hlcmVcbiAqIGBuYXRpdmVTZXRgIHdvdWxkIHN0b3Agb3IgY3JlYXRlOiBhIERFTklFRCBzZWdtZW50ICh0aGUgd3JpdGUgaXMgcmVmdXNlZFxuICogdGhlcmUgYW55d2F5KSwgb3IgYSBtaXNzaW5nIC8gcHJpbWl0aXZlIGludGVybWVkaWF0ZSAoYG5hdGl2ZVNldGAgbWFrZXMgYVxuICogZnJlc2ggY29udGFpbmVyIGZyb20gdGhhdCBwb2ludCBvbikuIFRoZSBsZWFmIGl0c2VsZiBpcyBuZXZlciBjb3BpZWQg4oCUIHRoZVxuICogd3JpdGUgcmVwbGFjZXMgaXQuXG4gKlxuICogQ29zdDogb25lIHNoYWxsb3cgY29weSBwZXIgY29udGFpbmVyIG9uIHRoZSBwYXRoIHRoYXQgdGhpcyB3cml0ZXIgaGFzIG5vdFxuICogYWxyZWFkeSBjb3BpZWQg4oCUIE8oZGVwdGggw5cgd2lkdGgpLCBpbmRlcGVuZGVudCBvZiBldmVyeXRoaW5nIHRoZSB3cml0ZVxuICogZG9lcyBub3QgcGFzcyB0aHJvdWdoLiBBIHBhdGggb2Ygb25lIHNlZ21lbnQgKGEgcm9vdCBrZXksIHRoZSBjb21tb24gY2FzZSlcbiAqIGNvcGllcyBub3RoaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25TcGluZShyb290OiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gcm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gY3VycltrXTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKG5leHQpKSByZXR1cm47XG4gICAgaWYgKG93bmVkLmhhcyhuZXh0KSkge1xuICAgICAgY3VyciA9IG5leHQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY29weSA9IHNoYWxsb3dDb3B5KG5leHQpO1xuICAgIG93bmVkLmFkZChjb3B5KTtcbiAgICBjdXJyW2tdID0gY29weTtcbiAgICBjdXJyID0gY29weTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSByb290IG9mIGEgbmV3IGdlbmVyYXRpb246IGEgc2hhbGxvdyBjb3B5IG9mIGBiYXNlYCB3aGVuIGl0IGlzIGFcbiAqIGNvbnRhaW5lciAob3duZWQgYnkgdGhlIHdyaXRlciksIGVsc2UgdGhlIGhpc3RvcmljYWwgZGVlcCBjbG9uZSBvZiBhXG4gKiBub24tY29udGFpbmVyIGJhc2UgKGB1bmRlZmluZWRgLCBhIHByaW1pdGl2ZSkgc28gdGhlIGNhbGxlcnMnIGJlaGF2aW91ciBvblxuICogc3VjaCBhIGJhc2UgaXMgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duZWRSb290T2YoYmFzZTogYW55LCBvd25lZD86IFdlYWtTZXQ8b2JqZWN0Pik6IGFueSB7XG4gIGlmICghaXNDb250YWluZXIoYmFzZSkpIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGNvbnN0IHJvb3QgPSBzaGFsbG93Q29weShiYXNlKTtcbiAgb3duZWQ/LmFkZChyb290KTtcbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8qKiBNYXJrIGEgdmFsdWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgKGEgZnJlc2ggY2xvbmUsIGEgbWVyZ2UgcmVzdWx0KSBhcyBvd25lZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd24odmFsdWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG93bmVkICE9PSB1bmRlZmluZWQgJiYgaXNDb250YWluZXIodmFsdWUpKSBvd25lZC5hZGQodmFsdWUpO1xufVxuXG4vKipcbiAqIE1hcmsgRVZFUlkgY29udGFpbmVyIG9mIGEgdHJlZSB0aGUgd3JpdGVyIGp1c3QgY3JlYXRlZCB3aG9sZSAoYVxuICogYHN0cnVjdHVyZWRDbG9uZWAgcmVzdWx0KSBhcyBvd25lZCwgc28gYSBsYXRlciB3cml0ZSB0aHJvdWdoIGFueSBvZiB0aGVtXG4gKiBlZGl0cyBpdCBpbiBwbGFjZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgYWdhaW4uIFdhbGtzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUXG4gKiB0aGUgc2xvdHMgYSBwYXRoIGNhbiBhZGRyZXNzOyBhIGBNYXBgJ3Mgb3IgYFNldGAncyBlbnRyaWVzIGFyZSBub3QuIE8odGhlXG4gKiB0cmVlJ3MgY29udGFpbmVycyk7IGEgY29udGFpbmVyIGFscmVhZHkgb3duZWQgaXMgbm90IHdhbGtlZCB0d2ljZSAoYSBjeWNsZVxuICogaW5zaWRlIHRoZSBjbG9uZSBlbmRzIHRoZXJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkb3B0KHRyZWU6IHVua25vd24sIG93bmVkOiBXZWFrU2V0PG9iamVjdD4pOiB2b2lkIHtcbiAgY29uc3Qgc3RhY2s6IHVua25vd25bXSA9IFt0cmVlXTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8IG93bmVkLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIG93bmVkLmFkZCh2YWx1ZSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSBzdGFjay5wdXNoKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gIH1cbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiBgb2JqYCBoYXMgYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHNlZ21lbnQgb2YgYHBhdGhgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUhhcyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWdzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpIDwgc2Vncy5sZW5ndGggLSAxKSBjdXJyID0gY3VycltzZWdzW2ldXTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIG1lcmdlIHdoZXJlIGRlc3RpbmF0aW9uIHdpbnMgZm9yIGFueSBkZWZpbmVkIHZhbHVlLlxuICogRmlsbHMgbWlzc2luZyBrZXlzIGZyb20gYHNyY2AsIGJ1dCBuZXZlciBvdmVyd3JpdGVzIGRlZmluZWQga2V5cyBpbiBgZHN0YC5cbiAqIEFycmF5cyBhcmUgbm90IHJlY3Vyc2VkIOKAlCBkc3QgYXJyYXkgYWx3YXlzIHdpbnMgd2hlbiBwcmVzZW50LlxuICpcbiAqIFJlcGxhY2VzOiBgbWVyZ2VXaXRoKGRzdCwgc3JjLCAob2JqVmFsdWUpID0+IG9ialZhbHVlICE9PSB1bmRlZmluZWQgPyBvYmpWYWx1ZSA6IHVuZGVmaW5lZClgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUNvbnRleHRXaW5zKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIHJldHVybiBkc3QgIT09IHVuZGVmaW5lZCA/IGRzdCA6IHNyYztcbiAgfVxuICBjb25zdCBvdXQ6IGFueSA9IGRzdCAhPSBudWxsICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8geyAuLi5kc3QgfSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgaWYgKERFTklFRC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY29uc3QgZHN0VmFsID0gb3V0W2tleV07XG4gICAgaWYgKGRzdFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkc3Qgd2luczsgcmVjdXJzZSBvbmx5IGlmIGJvdGggc2lkZXMgYXJlIHBsYWluIG9iamVjdHNcbiAgICAgIGlmIChcbiAgICAgICAgZHN0VmFsICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBkc3RWYWwgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGRzdFZhbCkgJiZcbiAgICAgICAgc3JjW2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIHNyY1trZXldID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShzcmNba2V5XSlcbiAgICAgICkge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQ29udGV4dFdpbnMoZHN0VmFsLCBzcmNba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBlbHNlIGtlZXAgZHN0VmFsIHVuY2hhbmdlZFxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba2V5XSA9IHNyY1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
package/dist/lib/memory/utils.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* Zero external dependencies.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
|
|
19
|
+
exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.isDeniedWritePath = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
|
|
20
20
|
const pathOps_js_1 = require("./pathOps.js");
|
|
21
21
|
var equality_js_1 = require("./equality.js");
|
|
22
22
|
Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
|
|
@@ -64,6 +64,26 @@ function pathUnder(address, path) {
|
|
|
64
64
|
out[address.length + i] = path[i];
|
|
65
65
|
return out;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
69
|
+
* The address's array contract is checked even when another selector is denied.
|
|
70
|
+
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
71
|
+
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
72
|
+
*/
|
|
73
|
+
function isDeniedWritePath(address = [], path = [], field) {
|
|
74
|
+
const prefix = addressOf(address);
|
|
75
|
+
return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
|
|
76
|
+
}
|
|
77
|
+
exports.isDeniedWritePath = isDeniedWritePath;
|
|
78
|
+
/** Keep existing own-property behavior; a missing slot must not call an inherited setter. */
|
|
79
|
+
function setOwnValue(object, key, value) {
|
|
80
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
81
|
+
object[key] = value;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
Object.defineProperty(object, key, { value, enumerable: true, writable: true, configurable: true });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
67
87
|
/**
|
|
68
88
|
* The container at `address` + `path` inside `obj`, each missing one created
|
|
69
89
|
* on the way: the one AT the address from `defaultValues` when given, every
|
|
@@ -75,7 +95,7 @@ function containerAt(obj, address = [], path = [], defaultValues) {
|
|
|
75
95
|
for (let i = 0; i < segments.length; i++) {
|
|
76
96
|
const key = segments[i];
|
|
77
97
|
if (!Object.prototype.hasOwnProperty.call(current, key)) {
|
|
78
|
-
current
|
|
98
|
+
setOwnValue(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
|
|
79
99
|
}
|
|
80
100
|
current = current[key];
|
|
81
101
|
}
|
|
@@ -83,19 +103,25 @@ function containerAt(obj, address = [], path = [], defaultValues) {
|
|
|
83
103
|
}
|
|
84
104
|
/**
|
|
85
105
|
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
106
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
86
107
|
*/
|
|
87
108
|
function setNestedValue(obj, address, path, field, value, defaultValues) {
|
|
88
|
-
|
|
109
|
+
if (isDeniedWritePath(address, path, field))
|
|
110
|
+
return obj;
|
|
111
|
+
setOwnValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
89
112
|
return obj;
|
|
90
113
|
}
|
|
91
114
|
exports.setNestedValue = setNestedValue;
|
|
92
115
|
/**
|
|
93
|
-
*
|
|
116
|
+
* Updates a value in the object at a nested path under `address`.
|
|
117
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
94
118
|
* - Arrays: concatenate
|
|
95
119
|
* - Objects: shallow merge at each level
|
|
96
120
|
* - Primitives: replace
|
|
97
121
|
*/
|
|
98
122
|
function updateNestedValue(obj, address, path, field, value, defaultValues) {
|
|
123
|
+
if (isDeniedWritePath(address, path, field))
|
|
124
|
+
return obj;
|
|
99
125
|
updateValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
100
126
|
return obj;
|
|
101
127
|
}
|
|
@@ -116,21 +142,23 @@ exports.updateNestedValue = updateNestedValue;
|
|
|
116
142
|
* The fix is the explicit `value.length === 0` early-return branch.
|
|
117
143
|
*/
|
|
118
144
|
function updateValue(object, key, value) {
|
|
145
|
+
if ((0, pathOps_js_1.isDeniedSegment)(key))
|
|
146
|
+
return;
|
|
119
147
|
if (Array.isArray(value)) {
|
|
120
148
|
if (value.length === 0) {
|
|
121
|
-
object
|
|
149
|
+
setOwnValue(object, key, value); // clear: [] replaces whatever was there
|
|
122
150
|
}
|
|
123
151
|
else {
|
|
124
|
-
const cur = object[key];
|
|
125
|
-
object
|
|
152
|
+
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
153
|
+
setOwnValue(object, key, cur === undefined ? value : [...cur, ...value]);
|
|
126
154
|
}
|
|
127
155
|
}
|
|
128
156
|
else if (value && typeof value === 'object' && Object.keys(value).length) {
|
|
129
|
-
const cur = object[key];
|
|
130
|
-
object
|
|
157
|
+
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
158
|
+
setOwnValue(object, key, cur === undefined ? value : { ...cur, ...value });
|
|
131
159
|
}
|
|
132
160
|
else {
|
|
133
|
-
object
|
|
161
|
+
setOwnValue(object, key, value);
|
|
134
162
|
}
|
|
135
163
|
}
|
|
136
164
|
exports.updateValue = updateValue;
|
|
@@ -147,4 +175,4 @@ function getNestedValue(root, path, field) {
|
|
|
147
175
|
return undefined;
|
|
148
176
|
}
|
|
149
177
|
exports.getNestedValue = getNestedValue;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBdUY7QUFJdkYsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBa0U7QUFJbEUsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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QUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IGlzRGVuaWVkU2VnbWVudCwgbmF0aXZlR2V0IGFzIF9nZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgdGhlIFdIT0xFIHNlbGVjdG9yIGJlZm9yZSBjcmVhdGluZyBhIGNvbnRhaW5lciBvciBjb3B5aW5nIGEgZ2VuZXJhdGlvbi5cbiAqIFRoZSBhZGRyZXNzJ3MgYXJyYXkgY29udHJhY3QgaXMgY2hlY2tlZCBldmVuIHdoZW4gYW5vdGhlciBzZWxlY3RvciBpcyBkZW5pZWQuXG4gKiBQYXlsb2FkIGtleXMgYXJlIGRhdGEsIG5vdCBzZWxlY3RvcnMsIGFuZCBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBpbnNwZWN0ZWQuXG4gKiBAaW50ZXJuYWwgU2hhcmVkIGJ5IHRoZSBuZXN0ZWQgd3JpdGVycyBhbmQgU2hhcmVkTWVtb3J5J3MgcHJlLWNvcHkgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFdyaXRlUGF0aChcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NPZihhZGRyZXNzKTtcbiAgcmV0dXJuIHByZWZpeC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgcGF0aC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgaXNEZW5pZWRTZWdtZW50KGZpZWxkKTtcbn1cblxuLyoqIEtlZXAgZXhpc3Rpbmcgb3duLXByb3BlcnR5IGJlaGF2aW9yOyBhIG1pc3Npbmcgc2xvdCBtdXN0IG5vdCBjYWxsIGFuIGluaGVyaXRlZCBzZXR0ZXIuICovXG5mdW5jdGlvbiBzZXRPd25WYWx1ZShvYmplY3Q6IE5lc3RlZE9iamVjdCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBzZXRPd25WYWx1ZShjdXJyZW50LCBrZXksIGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9KTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICBzZXRPd25WYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogQSBkZW5pZWQgYWRkcmVzcy9wYXRoL2ZpZWxkIGxlYXZlcyBgb2JqYCB1bmNoYW5nZWQsIGluY2x1ZGluZyBpdHMgcHJvdG90eXBlLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoaXNEZW5pZWRTZWdtZW50KGtleSkpIHJldHVybjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgPyBvYmplY3Rba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pathOps.ts — Native nested-path helpers (replaces lodash.get/set/has/mergewith)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The DENIED set is the shared rule for three prototype-pollution selector
|
|
5
|
+
* segments (__proto__, constructor, prototype). Each operation's traversal
|
|
6
|
+
* contract is explicit below; merely using this module is not a sandbox.
|
|
7
7
|
*
|
|
8
8
|
* Intentional asymmetry:
|
|
9
|
-
* - nativeSet
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
* hasOwnProperty guard is required to prevent leaking inherited values
|
|
15
|
-
* (e.g. Object.prototype, Object constructor, toString).
|
|
9
|
+
* - nativeSet — DENIED check at each segment; used on writer-owned
|
|
10
|
+
* containers. It can follow an inherited object under an ordinary key.
|
|
11
|
+
* - nativeGet — DENIED check + hasOwnProperty at every step.
|
|
12
|
+
* - nativeHas — own-property existence only, including own denied names
|
|
13
|
+
* and own undefined values; it does not use the DENIED rule.
|
|
16
14
|
* - mergeContextWins — DENIED check only; Object.keys() is own-enumerable-only
|
|
17
15
|
* by spec so prototype keys never appear in the iteration.
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
17
|
+
* Nested diagnostic writers have their own whole-selector preflight and
|
|
18
|
+
* own-property writes in utils.ts, using the same isDeniedSegment predicate.
|
|
21
19
|
*
|
|
22
20
|
* Paths may be dot-notation strings or pre-split (string|number)[] arrays.
|
|
23
21
|
*/
|
|
24
|
-
/** Is `segment` one of the three prototype-pollution
|
|
22
|
+
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
25
23
|
export declare function isDeniedSegment(segment: string | number): boolean;
|
|
26
24
|
/**
|
|
27
25
|
* Get the value at `path` in `obj`, returning `defaultValue` if absent.
|
|
@@ -31,12 +31,21 @@ export declare function getRunAndGlobalPaths(address?: readonly string[], path?:
|
|
|
31
31
|
runPath: (string | number)[] | undefined;
|
|
32
32
|
globalPath: (string | number)[];
|
|
33
33
|
};
|
|
34
|
+
/**
|
|
35
|
+
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
36
|
+
* The address's array contract is checked even when another selector is denied.
|
|
37
|
+
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
38
|
+
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
39
|
+
*/
|
|
40
|
+
export declare function isDeniedWritePath(address: readonly string[] | undefined, path: readonly (string | number)[] | undefined, field: string | number): boolean;
|
|
34
41
|
/**
|
|
35
42
|
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
43
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
36
44
|
*/
|
|
37
45
|
export declare function setNestedValue<T>(obj: NestedObject, address: readonly string[], path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
|
|
38
46
|
/**
|
|
39
|
-
*
|
|
47
|
+
* Updates a value in the object at a nested path under `address`.
|
|
48
|
+
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
40
49
|
* - Arrays: concatenate
|
|
41
50
|
* - Objects: shallow merge at each level
|
|
42
51
|
* - Primitives: replace
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "footprintjs",
|
|
3
|
-
"version": "9.48.
|
|
3
|
+
"version": "9.48.1",
|
|
4
4
|
"description": "Explainable backend flows — automatic causal traces, decision evidence, and MCP tool generation for AI agents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Sanjay Krishna Anbalagan",
|
|
@@ -51,6 +51,9 @@
|
|
|
51
51
|
"release:major": "bash scripts/release.sh major",
|
|
52
52
|
"check:dup-types": "node scripts/check-dup-types.mjs",
|
|
53
53
|
"check:layering": "node scripts/check-layering.mjs",
|
|
54
|
+
"check:record-tests": "node scripts/record-tests.mjs --check",
|
|
55
|
+
"check:trace-ready": "node scripts/trace-ready.mjs --check-e1",
|
|
56
|
+
"trace:ready": "node scripts/trace-ready.mjs",
|
|
54
57
|
"check:doc-snippets": "node scripts/check-doc-snippets.mjs",
|
|
55
58
|
"audit:family": "node scripts/audit-family-versions.mjs",
|
|
56
59
|
"audit:consumers": "node scripts/audit-consumers.mjs",
|