footprintjs 9.48.0 → 9.48.2
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/capture/freeze.js +2 -14
- package/dist/esm/lib/capture/ownData.d.ts +7 -0
- package/dist/esm/lib/capture/ownData.js +15 -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 +15 -16
- package/dist/esm/lib/memory/utils.d.ts +10 -1
- package/dist/esm/lib/memory/utils.js +38 -11
- package/dist/lib/capture/freeze.js +3 -15
- package/dist/lib/capture/ownData.js +19 -0
- package/dist/lib/memory/SharedMemory.js +7 -1
- package/dist/lib/memory/pathOps.js +15 -16
- package/dist/lib/memory/utils.js +39 -11
- package/dist/types/lib/capture/ownData.d.ts +7 -0
- 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.
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
|
+
import { putOwn } from './ownData.js';
|
|
42
43
|
import { kindOf, SEALABLE } from './valueKinds.js';
|
|
43
44
|
/**
|
|
44
45
|
* Freezes `obj` and every object reachable through its own properties, and returns `obj`.
|
|
@@ -299,19 +300,6 @@ function copyOpenPaths(root) {
|
|
|
299
300
|
Object.freeze(copy);
|
|
300
301
|
return out;
|
|
301
302
|
}
|
|
302
|
-
/**
|
|
303
|
-
* `target[name] = value`, as an OWN data property. A key the shell only inherits — an own `"__proto__"`
|
|
304
|
-
* of the record (`JSON.parse` makes one) — would call the inherited setter and re-parent the copy; it is
|
|
305
|
-
* defined as data instead, as `memory/merge.ts · mergeGuarded` keeps it.
|
|
306
|
-
*/
|
|
307
|
-
function putOwn(target, name, value) {
|
|
308
|
-
if (!Object.prototype.hasOwnProperty.call(target, name) && Reflect.has(target, name)) {
|
|
309
|
-
Object.defineProperty(target, name, { value, enumerable: true, writable: true, configurable: true });
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
target[name] = value;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
303
|
/** A fresh copy of a value freezing cannot seal. One the clone refuses (hand-built) is served as it is. */
|
|
316
304
|
function copyLeaf(value) {
|
|
317
305
|
if (kindOf(value) === 'date')
|
|
@@ -323,4 +311,4 @@ function copyLeaf(value) {
|
|
|
323
311
|
return value;
|
|
324
312
|
}
|
|
325
313
|
}
|
|
326
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2ZyZWV6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFjbkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUFNLEVBQUUsU0FBb0IsV0FBVztJQUNuRSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQW1CLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQW1CLE1BQVMsRUFBRSxTQUFvQixXQUFXO0lBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxJQUFJLENBQUM7UUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLE1BQVM7SUFDdEMsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFD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Q0FBQztBQUNILENBQUM7QUFFRCwyR0FBMkc7QUFDM0csU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRixJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZnJlZXplLnRzIOKAlCB0aGUgT05FIGRlZXAtZnJlZXplIHdhbGsgKG1vdmVkIGhlcmUgZnJvbSBgc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzYCBpbiBGMyksXG4gKiBhbmQgdGhlIHNlcnZlLXRpbWUgbGF3IGZvciB0aGUgY29tbWl0IGxvZyAoOS40NC4yKS5cbiAqXG4gKiBXSFkgSEVSRS4gU2F2ZWQgdHJlZXMgZnJlZXplIHRocm91Z2ggdGhpcyB3YWxrOiB0aGUgZm9sZCBiYXNlIHNlcnZlZCBhc1xuICogYGluaXRpYWxTdGF0ZWAgKGBFeGVjdXRpb25SdW50aW1lIMK3IGdldEZvbGRCYXNlYCksIHRoZVxuICogZGV2LW1vZGUgc25hcHNob3QgKGBydW5uZXIvc25hcHNob3QudHMgwrcgc2VydmVkU25hcHNob3RgKSwgZXZlcnkgc3RhdGUgYHN0YXRlQXRgIGhhbmRzIG91dFxuICogKGB0aW1lLXRyYXZlbC9zdGF0ZUF0LnRzYCkgYW5kLCBzaW5jZSBGMywgZXZlcnkgY29tbWl0IGJ1bmRsZSAoYEV2ZW50TG9nIMK3IHJlY29yZGApLiBgbWVtb3J5L2AgbXVzdFxuICogbm90IGltcG9ydCBgc2NvcGUvYCAodGhhdCBlZGdlIGNsb3NlZCB0aGUgbWVtb3J5IOKHhCBzY29wZSDih4QgcmVjb3JkZXIgbW9kdWxlIGN5Y2xlIEYwIHJlbW92ZWQpLCBzbyB0aGVcbiAqIHdhbGsgbGl2ZXMgaW4gdGhpcyBsZWFmIGZvbGRlciwgd2hpY2ggaW1wb3J0cyBub3RoaW5nIG91dHNpZGUgaXRzZWxmLiBBcmdzIHVzZSBhbiBvd25lcnNoaXAgc25hcHNob3RcbiAqIGluc3RlYWQgKGBzY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQudHMgwrcgY3JlYXRlRnJvemVuQXJnc2ApOiBuZXZlciBmcmVlemUgYm9ycm93ZWQgY2FsbGVyIHZhbHVlcy5cbiAqXG4gKiBGUkVFWkUgV0hBVCBDQU4gQkUgRlJPWkVOLCBDT1BZIFdIQVQgQ0FOJ1QgKDkuNDQuMikuIGBPYmplY3QuZnJlZXplYCBjYW5ub3Qgc2VhbCBhIERhdGUncyB0aW1lLCBhXG4gKiBNYXAncyBvciBTZXQncyBlbnRyaWVzLCBhIGJ1ZmZlcidzIGJ5dGVzLCBhIFJlZ0V4cCAoYGNvbXBpbGUoKWAgcmV3cml0ZXMgYSBmcm96ZW4gb25lKSBvciBhbiBFcnJvclxuICogKFY4J3Mgb3duIGBzdGFja2AgYWNjZXNzb3Igd3JpdGVzIHRocm91Z2ggYSBmcm96ZW4gb25lKS4gQSBmcmVzaCB0cmVlIGhhbmRlZCB0byBvbmUgY2FsbGVyIChhIGBzdGF0ZUF0YFxuICogc3RhdGUsIHRoZSBkZXYtbW9kZSBzbmFwc2hvdCkgaXMgdGhhdCBjYWxsZXIncyBvd24sIHNvIGZyZWV6aW5nIGl0IGlzIGEgZ3VhcmQgYW5kIG5vdGhpbmcgbW9yZS4gVGhlXG4gKiBDT01NSVQgTE9HIOKAlCBlYWNoIGJ1bmRsZSwgYW5kIHRoZSBmb2xkIGJhc2Ug4oCUIGlzIHNlcnZlZCB0byBldmVyeSByZWFkZXIsIHNvIHtAbGluayBmcmVlemVSZWNvcmR9XG4gKiByZW1lbWJlcnMgdGhhdCBhIHJlY29yZCBob2xkcyBzdWNoIGEgdmFsdWUsIGl0cyBmaXJzdCBzZXJ2ZSBtYXBzIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gZWFjaFxuICogb25lIChpdHMgb3BlbiBQQVRIUyksIGFuZCB7QGxpbmsgc2VydmVSZWNvcmR9IGhhbmRzIGEgcmVhZGVyIGEgY29weSBvZiB0aG9zZSBwYXRocyBvbmx5OiBhIGZyZXNoIGNvcHlcbiAqIG9mIGVhY2ggc3VjaCB2YWx1ZSwgZnJlc2ggZnJvemVuIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0byBpdCwgYW5kIGV2ZXJ5IG90aGVyIHBhcnQgc2hhcmVkLCBmcm96ZW4sIGFzXG4gKiBpdCBpcy4gVW50aWwgOS40NC4yIGBzbmFwc2hvdC5jb21taXRMb2dbaV0ub3ZlcndyaXRlLndoZW4uc2V0VGltZSgwKWAgcmV3cm90ZSBldmVyeSBsYXRlciBzbmFwc2hvdCxcbiAqIGBzdGF0ZUF0YCwgYGNvbW1pdFZhbHVlQXRgLCBzbGljZSBhbmQgY3Vyc29yIGFuc3dlci5cbiAqXG4gKiBFdmVyeSB3YWxrIGhlcmUgaXMgSVRFUkFUSVZFIChhbiBleHBsaWNpdCBzdGFjayk6IGEgcmVjb3JkJ3MgZGVwdGggaXMgbm90IGJvdW5kZWQgYnkgdGhlIGNhbGwgc3RhY2suXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRlZXBGcmVlemUsIGZyZWV6ZVJlY29yZCwgc2VydmVSZWNvcmQgfSBmcm9tICcuL2ZyZWV6ZS5qcyc7XG4gKlxuICogY29uc3QgYXJncyA9IGRlZXBGcmVlemUoeyBvcmRlcjogeyBsaW5lczogW3sgc2t1OiAnQScgfV0gfSwgYnl0ZXM6IG5ldyBVaW50OEFycmF5KFsxXSkgfSk7XG4gKiBPYmplY3QuaXNGcm96ZW4oYXJncy5vcmRlci5saW5lc1swXSk7IC8vIHRydWVcbiAqIE9iamVjdC5pc0Zyb3plbihhcmdzLmJ5dGVzKTsgLy8gZmFsc2Ug4oCUIGEgdHlwZWQgYXJyYXkgY2Fubm90IGJlIGZyb3plbjsgaXQgaXMgc2tpcHBlZFxuICpcbiAqIGNvbnN0IHJlY29yZCA9IGZyZWV6ZVJlY29yZCh7IHdoZW46IG5ldyBEYXRlKDApLCB0YWdzOiBbJ2EnXSB9KTtcbiAqIGNvbnN0IHNlcnZlZCA9IHNlcnZlUmVjb3JkKHJlY29yZCk7XG4gKiBzZXJ2ZWQud2hlbi5zZXRUaW1lKDUpOyAvLyBjaGFuZ2VzIHRoZSByZWFkZXIncyBjb3B5XG4gKiBzZXJ2ZVJlY29yZChyZWNvcmQpLndoZW4uZ2V0VGltZSgpOyAvLyAwIOKAlCBldmVyeSBzZXJ2ZSBpcyB0aGUgcmVjb3JkIGFzIHJlY29yZGVkXG4gKiBzZXJ2ZWQudGFncyA9PT0gcmVjb3JkLnRhZ3M7IC8vIHRydWUg4oCUIHRoZSBzZWFsZWQgcGFydCBpcyBzaGFyZWQsIG5vdCBjb3BpZWRcbiAqIHNlcnZlUmVjb3JkKGZyZWV6ZVJlY29yZCh7IG46IDEgfSkpOyAvLyBhIHJlY29yZCBmcmVlemluZyBzZWFsZWQgd2hvbGU6IHNlcnZlZCBhcyBpdHNlbGZcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGtpbmRPZiwgU0VBTEFCTEUgfSBmcm9tICcuL3ZhbHVlS2luZHMuanMnO1xuXG4vKipcbiAqIEhvdyB7QGxpbmsgZGVlcEZyZWV6ZX0gd2Fsa3MgYW4gQVJSQVkuXG4gKlxuICogLSBgJ2V2ZXJ5LWtleSdgICh0aGUgZGVmYXVsdCkg4oCUIGV2ZXJ5IG93biBwcm9wZXJ0eSwgYXMgZm9yIGFueSBvdGhlciBvYmplY3Q6IHRoZSBpbmRleCBlbGVtZW50c1xuICogICBBTkQgYW55IGV4cGFuZG8gKGBhcnIubm90ZSA9IHsg4oCmIH1gKS4gVGhlIGRldi1tb2RlIHNuYXBzaG90IHJlbGllcyBvbiB0aGlzIGNvbnRyYWN0LlxuICogLSBgJ2luZGljZXMnYCDigJQgdGhlIGluZGV4IGVsZW1lbnRzIG9ubHksIHNvIG5vIGtleSBzdHJpbmcgaXMgYWxsb2NhdGVkIHBlciBlbGVtZW50OyB0aGlzIGlzIHdoYXRcbiAqICAga2VlcHMgZnJlZXppbmcgYSAxMCwwMDAtZWxlbWVudCBjb21taXQgaW5zaWRlIGl0cyBidWRnZXQgKGBiZW5jaC9lbGVtZW50LXdyaXRlcy50c2ApLiBBbiBvYmplY3RcbiAqICAgaHVuZyBvbiBhbiBhcnJheSBFWFBBTkRPIGlzIHRoZW4gbGVmdCB1bmZyb3plbiwgYW5kIHVuc2VlbiBieSB7QGxpbmsgc2VydmVSZWNvcmR9IOKAlCB0aGUgY29tbWl0XG4gKiAgIGxvZydzIG5hbWVkIGhvbGUgKGBFdmVudExvZyDCtyByZWNvcmRgOyBhbiBhcnJheSBleHBhbmRvIGlzIG91dCBvZiBjb250cmFjdCBmb3Igc3RhdGUpLlxuICovXG5leHBvcnQgdHlwZSBBcnJheVdhbGsgPSAnZXZlcnkta2V5JyB8ICdpbmRpY2VzJztcblxuLyoqXG4gKiBGcmVlemVzIGBvYmpgIGFuZCBldmVyeSBvYmplY3QgcmVhY2hhYmxlIHRocm91Z2ggaXRzIG93biBwcm9wZXJ0aWVzLCBhbmQgcmV0dXJucyBgb2JqYC5cbiAqXG4gKiAtIEFuIG9iamVjdCB0aGF0IGlzIEFMUkVBRFkgZnJvemVuIGlzIGxlZnQgYXMgaXQgaXMsIGFuZCBub3QgZGVzY2VuZGVkIOKAlCA5LjMyLjAncyBjb250cmFjdCwga2VwdDpcbiAqICAgYXJncyBtYXkgaG9sZCBhIGNhbGxlcidzIGZyb3plbiBvYmplY3Qgd2l0aCBsaXZlIHBhcnRzIGluc2lkZSAoYSBjbGFzcyBpbnN0YW5jZSBhIHN0YWdlIGNhbGxzKSxcbiAqICAgYW5kIGZyZWV6aW5nIHBhc3QgaXQgd291bGQgYnJlYWsgdGhlbS4gSXQgaXMgYWxzbyB3aGF0IGVuZHMgYSBjeWNsZS4gVGhlIGNvbW1pdCBsb2cgbmV2ZXIgbWVldHNcbiAqICAgb25lOiBpdHMgcGF5bG9hZHMgYXJlIGZyZXNoIGBzdHJ1Y3R1cmVkQ2xvbmVgcy5cbiAqIC0gQXJyYXlCdWZmZXIgdmlld3MgKHR5cGVkIGFycmF5cywgYERhdGFWaWV3YCkgYXJlIHNraXBwZWQ6IGBPYmplY3QuZnJlZXplYCB0aHJvd3Mgb24gYSBub24tZW1wdHlcbiAqICAgdHlwZWQgYXJyYXksIHNvIGEgYFVpbnQ4QXJyYXlgIGluIHN0YXRlLCBhcmdzIG9yIHRoZSBmb2xkIGJhc2UgdXNlZCB0byBmYWlsIHRoZSBydW4gb3IgdGhlXG4gKiAgIHNuYXBzaG90IGhlcmUuXG4gKiAtIFdoYXQgYE9iamVjdC5mcmVlemVgIGNhbm5vdCByZWFjaCBzdGF5cyBtdXRhYmxlIOKAlCBNYXAgYW5kIFNldCBjb250ZW50cywgYSBEYXRlJ3MgdGltZSwgdGhlXG4gKiAgIGJ5dGVzIGJlaGluZCBhIGJ1ZmZlci4gQSBmcm96ZW4gUmVnRXhwJ3MgYGxhc3RJbmRleGAgaXMgcmVhZC1vbmx5LCBzbyBhIGAvZ2Agb3IgYC95YCByZWdleFxuICogICB0YWtlbiBmcm9tIGEgZnJvemVuIHRyZWUgdGhyb3dzIHdoZW4gYGV4ZWNgIG9yIGByZXBsYWNlYCBhZHZhbmNlIGl0LiBUaGUgY29tbWl0IGxvZyBnb2VzIHRocm91Z2hcbiAqICAge0BsaW5rIGZyZWV6ZVJlY29yZH0gYW5kIHtAbGluayBzZXJ2ZVJlY29yZH0gaW5zdGVhZC5cbiAqIC0gRnVuY3Rpb25zIGFyZSBub3QgZGVzY2VuZGVkICh0aGV5IGFyZSBub3QgdmFsdWVzIHRoZSBlbmdpbmUgc3RvcmVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBGcmVlemU8VD4ob2JqOiBULCBhcnJheXM6IEFycmF5V2FsayA9ICdldmVyeS1rZXknKTogVCB7XG4gIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHdhbGtBbmRGcmVlemUob2JqLCBhcnJheXMgPT09ICdpbmRpY2VzJywgZmFsc2UpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIENvbnRhaW5lcnMgb2YgYSByZWNvcmQgdGhhdCBob2xkIOKAlCBvbiBzb21lIHBhdGggYmVsb3cgdGhlbSDigJQgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbDogYHRydWVgIG9uY2VcbiAqIG1hcHBlZCAodGhlIGNvbnRhaW5lciBpcyBvbiBhbiBvcGVuIHBhdGgpLCBgZmFsc2VgIGZvciBhIHJlY29yZCB7QGxpbmsgZnJlZXplUmVjb3JkfSBmb3VuZCBvcGVuIHdob3NlXG4gKiBwYXRocyBubyBzZXJ2ZSBoYXMgbWFwcGVkIHlldC4gQSBjb250YWluZXIgYWJzZW50IGhlcmUgaXMgc2VhbGVkIHdob2xlLlxuICovXG5jb25zdCBPUEVOID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBib29sZWFuPigpO1xuXG4vKipcbiAqIHtAbGluayBkZWVwRnJlZXplfSBmb3IgYSByZWNvcmQgbWFueSByZWFkZXJzIGFyZSBTRVJWRUQgKGEgY29tbWl0IGJ1bmRsZSwgdGhlIGZvbGQgYmFzZSksIGFuZCB0d28gbW9yZVxuICogdGhpbmdzIG9uIHRoZSBzYW1lIHdhbGs6XG4gKlxuICogICAtIGl0IHJlbWVtYmVycyBUSEFUIHRoZSByZWNvcmQgaG9sZHMgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCDigJQgb25lIGZsYWc7IHRoZSByZWNvcmQncyBmaXJzdFxuICogICAgIHNlcnZlIG1hcHMgV0hFUkUgKHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gZWFjaCBzdWNoIHZhbHVlLCBpdHMgb3BlbiBwYXRocyksIHNvIHRoZSBydW4gcGF5c1xuICogICAgIG5vdGhpbmcgbW9yZSBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBjb3BpZXMgdGhvc2UgcGF0aHMgYW5kIG5vdGhpbmcgZWxzZTtcbiAqICAgLSBhIHR5cGVkIGFycmF5IG9yIGBEYXRhVmlld2AgdGhhdCB2aWV3cyBhIFNMSUNFIG9mIGEgYmlnZ2VyIGJ1ZmZlciAoYSBOb2RlIGBCdWZmZXJgIHZpZXdzIGl0c1xuICogICAgIHNoYXJlZCBwb29sKSBpcyByZXBsYWNlZCwgaW4gdGhlIHJlY29yZCwgYnkgYSBjb3B5IG9mIHRoZSBieXRlcyBpdCB2aWV3cyDigJQgdGhlIHJlY29yZCBrZWVwcyB0aGVcbiAqICAgICB2aWV3J3MgYnl0ZXMsIG5ldmVyIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgKGEgcmVzaXphYmxlIG9yIHNoYXJlZCBidWZmZXIgaXMga2VwdCBhcyBpdCBpcykuXG4gKlxuICogQSBwYXJ0IGZyb3plbiBiZWZvcmUgaXMgbm90IGZyb3plbiBwYXN0IChkZWVwRnJlZXplJ3MgY29udHJhY3QpIGJ1dCBpcyBsb29rZWQgdGhyb3VnaCwgc28gYSB2YWx1ZVxuICogZnJlZXppbmcgY2Fubm90IHNlYWwgaW5zaWRlIGl0IHN0aWxsIG9wZW5zIHRoZSByZWNvcmQuIFJldHVybnMgYHJlY29yZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemVSZWNvcmQ8VCBleHRlbmRzIG9iamVjdD4ocmVjb3JkOiBULCBhcnJheXM6IEFycmF5V2FsayA9ICdldmVyeS1rZXknKTogVCB7XG4gIGlmICghT1BFTi5oYXMocmVjb3JkKSAmJiB3YWxrQW5kRnJlZXplKHJlY29yZCwgYXJyYXlzID09PSAnaW5kaWNlcycsIHRydWUpKSBPUEVOLnNldChyZWNvcmQsIGZhbHNlKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqXG4gKiBUaGUgcmVjb3JkIGFzIGEgcmVhZGVyIG1heSBob2xkIGl0IOKAlCBUSEUgc2VydmUtdGltZSBsYXc6IGEgcmVjb3JkIGZyZWV6aW5nIHNlYWxlZCB3aG9sZSBpcyBzZXJ2ZWQgYXNcbiAqIGl0c2VsZiAoc2hhcmVkLCBubyBjb3N0KTsgYW55IG90aGVyIGFzIGEgY29weSBvZiBpdHMgb3BlbiBwYXRocyAoe0BsaW5rIGZyZWV6ZVJlY29yZH0pOiBmcmVzaCBmcm96ZW5cbiAqIGNvbnRhaW5lcnMgZG93biB0byBlYWNoIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsLCBhIGZyZXNoIGNvcHkgb2YgdGhhdCB2YWx1ZSwgYW5kIGV2ZXJ5IG90aGVyIHBhcnRcbiAqIHNoYXJlZCwgZnJvemVuLCBhcyBpdCBpcy4gQSBjb3B5IGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZVJlY29yZDxUPihyZWNvcmQ6IFQpOiBUIHtcbiAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JykgcmV0dXJuIHJlY29yZDtcbiAgY29uc3QgbWFwcGVkID0gT1BFTi5nZXQocmVjb3JkKTtcbiAgaWYgKG1hcHBlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gcmVjb3JkO1xuICBpZiAoIW1hcHBlZCkgbWFwT3BlblBhdGhzKHJlY29yZCk7XG4gIHJldHVybiBPUEVOLmdldChyZWNvcmQpID09PSB0cnVlID8gKGNvcHlPcGVuUGF0aHMocmVjb3JkKSBhcyBUKSA6IHJlY29yZDtcbn1cblxuLyoqIEEgdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwg4oCUIGEgdmlldywgb3IgYSBraW5kIGBTRUFMQUJMRWAgc2F5cyBubyB0byAoYSBEYXRlLCBhIE1hcCwgYW4gRXJyb3Ig4oCmKS4gKi9cbmZ1bmN0aW9uIGlzVW5zZWFsYWJsZSh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpIHx8ICFTRUFMQUJMRVtraW5kT2YodmFsdWUpXTtcbn1cblxuLyoqXG4gKiBGcmVlemUgYHJvb3RgIGFuZCBldmVyeSBjb250YWluZXIgdW5kZXIgaXQsIGl0ZXJhdGl2ZWx5OyBgcmVjb3JkYCBhZGRzIHRoZSBsb29rLXRocm91Z2ggb2YgcGFydHNcbiAqIGZyb3plbiBiZWZvcmUgYW5kIHRoZSBjb21wYWN0aW9uIG9mIHZpZXdzIG92ZXIgYSBzbGljZS4gYHRydWVgIHdoZW4gc29tZXRoaW5nIHVuZGVyIGByb290YCAob3IgYHJvb3RgXG4gKiBpdHNlbGYpIGNhbm5vdCBiZSBzZWFsZWQuXG4gKi9cbmZ1bmN0aW9uIHdhbGtBbmRGcmVlemUocm9vdDogb2JqZWN0LCBpbmRpY2VzOiBib29sZWFuLCByZWNvcmQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgbGV0IG9wZW4gPSBmYWxzZTtcbiAgbGV0IGxvb2tlZFRocm91Z2g6IFNldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KG5vZGUpKSB7XG4gICAgICBvcGVuID0gdHJ1ZTsgLy8gaXRzIGJ5dGVzIOKAlCBhbmQgYSBub24tZW1wdHkgb25lIGNhbm5vdCBiZSBmcm96ZW4gYXQgYWxsXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZnJvemVuQmVmb3JlID0gT2JqZWN0LmlzRnJvemVuKG5vZGUpO1xuICAgIGlmIChmcm96ZW5CZWZvcmUpIHtcbiAgICAgIGlmICghcmVjb3JkIHx8IE9QRU4uaGFzKG5vZGUpKSB7XG4gICAgICAgIG9wZW4gfHw9IHJlY29yZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoKGxvb2tlZFRocm91Z2ggPz89IG5ldyBTZXQoKSkuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIGxvb2tlZFRocm91Z2guYWRkKG5vZGUpOyAvLyBhIHBhcnQgZnJvemVuIGJlZm9yZTogbG9va2VkIHRocm91Z2gsIG5ldmVyIGZyb3plbiBwYXN0XG4gICAgfVxuICAgIGlmIChyZWNvcmQgJiYgIW9wZW4gJiYgIVNFQUxBQkxFW2tpbmRPZihub2RlKV0pIG9wZW4gPSB0cnVlO1xuICAgIC8vIENoaWxkcmVuIGZpcnN0LCB3aGlsZSBgbm9kZWAgaXMgc3RpbGwgb3BlbiB0byB0aGUgY29tcGFjdGlvbiBiZWxvdzsgdGhlbiB0aGUgZnJlZXplLlxuICAgIGNvbnN0IGNvbXBhY3RpbmcgPSByZWNvcmQgJiYgIWZyb3plbkJlZm9yZTtcbiAgICBpZiAoaW5kaWNlcyAmJiBBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQ6IHVua25vd24gPSBub2RlW2ldO1xuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goY29tcGFjdGluZyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoY2hpbGQpID8gY29tcGFjdChub2RlLCBpLCBjaGlsZCkgOiBjaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobm9kZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVzW2ldXTtcbiAgICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgICBzdGFjay5wdXNoKGNvbXBhY3RpbmcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGNoaWxkKSA/IGNvbXBhY3Qobm9kZSwgbmFtZXNbaV0sIGNoaWxkKSA6IGNoaWxkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFmcm96ZW5CZWZvcmUpIE9iamVjdC5mcmVlemUobm9kZSk7XG4gIH1cbiAgcmV0dXJuIG9wZW47XG59XG5cbi8qKlxuICogQSB2aWV3IG92ZXIgYSBTTElDRSBvZiBhIGJpZ2dlciBidWZmZXIsIHJlcGxhY2VkIGluIGBjb250YWluZXJgIGJ5IGEgY29weSBvZiB0aGUgYnl0ZXMgaXQgdmlld3NcbiAqICh0aGUgdHlwZSBpdCBpcyDigJQgYSBOb2RlIGBCdWZmZXJgIGNvbWVzIG91dCBhIGBVaW50OEFycmF5YCwgYXMgYSBjbG9uZSBvZiBpdCBkb2VzKS4gQW55dGhpbmcgZWxzZSBpc1xuICogcmV0dXJuZWQgYXMgaXQgaXMuIEEgcmVzaXphYmxlIG9yIHNoYXJlZCBidWZmZXIgaXMga2VwdDogYSBjb3B5IHdvdWxkIGNoYW5nZSB3aGF0IGl0IGlzLlxuICovXG5mdW5jdGlvbiBjb21wYWN0KGNvbnRhaW5lcjogb2JqZWN0LCBrZXk6IHN0cmluZyB8IG51bWJlciwgY2hpbGQ6IEFycmF5QnVmZmVyVmlldyk6IG9iamVjdCB7XG4gIGNvbnN0IGJ1ZmZlciA9IGNoaWxkLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlciAmIHsgcmVzaXphYmxlPzogYm9vbGVhbiB9O1xuICBpZiAoY2hpbGQuYnl0ZU9mZnNldCA9PT0gMCAmJiBjaGlsZC5ieXRlTGVuZ3RoID09PSBidWZmZXIuYnl0ZUxlbmd0aCkgcmV0dXJuIGNoaWxkO1xuICBpZiAoYnVmZmVyLnJlc2l6YWJsZSA9PT0gdHJ1ZSB8fCAhKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkgcmV0dXJuIGNoaWxkO1xuICBjb25zdCBieXRlcyA9IGJ1ZmZlci5zbGljZShjaGlsZC5ieXRlT2Zmc2V0LCBjaGlsZC5ieXRlT2Zmc2V0ICsgY2hpbGQuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHRhZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjaGlsZCkuc2xpY2UoOCwgLTEpO1xuICBjb25zdCBDdG9yID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBuZXcgKGJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IEFycmF5QnVmZmVyVmlldz4pW3RhZ107XG4gIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGNoaWxkO1xuICBjb25zdCBjb3B5ID0gbmV3IEN0b3IoYnl0ZXMpO1xuICB0cnkge1xuICAgIChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV0gPSBjb3B5O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gY2hpbGQ7IC8vIGEgcHJvcGVydHkgdGhlIHJlY29yZCBkb2VzIG5vdCBsZXQgYmUgcmVwbGFjZWQgKGEgaGFuZC1idWlsdCBidW5kbGUpXG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8qKlxuICogTWFwIHRoZSBvcGVuIHBhdGhzIG9mIGByb290YCDigJQgbWFyayBldmVyeSBjb250YWluZXIgdGhhdCByZWFjaGVzIGEgdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwsIHNvIGFcbiAqIHNlcnZlIGNvcGllcyBleGFjdGx5IHRob3NlIChEQUdzIGFuZCBjeWNsZXMgaW5jbHVkZWQ6IHRoZSBtYXJrcyBydW4gVVAgdGhlIHJldmVyc2UgZWRnZXMgZnJvbSBlYWNoXG4gKiBzdWNoIHZhbHVlKS4gUnVucyBvbmNlIHBlciBvcGVuIHJlY29yZCwgYXQgaXRzIGZpcnN0IHNlcnZlLiBBIG5vZGUncyBmaXJzdCBob2xkZXIgaXMga2VwdCBpbiBvbmUgbWFwO1xuICogYW55IG90aGVyIGhvbGRlciAoYSBzaGFyZWQgcGFydCwgYSBjeWNsZSkgaW4gYSBzZWNvbmQsIG1hZGUgb25seSB3aGVuIHRoZXJlIGlzIG9uZS5cbiAqL1xuZnVuY3Rpb24gbWFwT3BlblBhdGhzKHJvb3Q6IG9iamVjdCk6IHZvaWQge1xuICBjb25zdCBob2xkZXIgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuICBsZXQgbW9yZUhvbGRlcnM6IE1hcDxvYmplY3QsIG9iamVjdFtdPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgbGVhdmVzOiBvYmplY3RbXSA9IFtdO1xuICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICBpZiAoaXNVbnNlYWxhYmxlKG5vZGUpKSB7XG4gICAgICBsZWF2ZXMucHVzaChub2RlKTsgLy8gYSBsZWFmOiBpdHMgY29udGVudHMgYXJlIGNvcGllZCB3aXRoIGl0XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhub2RlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IChub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lc1tpXV07XG4gICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAoY2hpbGQgIT09IHJvb3QgJiYgIWhvbGRlci5oYXMoY2hpbGQpKSB7XG4gICAgICAgIGhvbGRlci5zZXQoY2hpbGQsIG5vZGUpO1xuICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBtb3JlID0gKG1vcmVIb2xkZXJzID8/PSBuZXcgTWFwKCkpLmdldChjaGlsZCk7XG4gICAgICBpZiAobW9yZSA9PT0gdW5kZWZpbmVkKSBtb3JlSG9sZGVycy5zZXQoY2hpbGQsIFtub2RlXSk7XG4gICAgICBlbHNlIG1vcmUucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbiAgLy8gTWFya2VkIGluIFRISVMgbWFwLCBub3QgYnkgYW4gZWFybGllciBvbmU6IGEgcGFydCBhbm90aGVyIHJlY29yZCBhbHJlYWR5IG1hcHBlZCBzdGlsbCBvcGVuc1xuICAvLyBldmVyeSBjb250YWluZXIgb2YgdGhpcyByZWNvcmQgb24gdGhlIHdheSB0byBpdC5cbiAgY29uc3QgbWFya2VkID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gIGNvbnN0IHVwOiBvYmplY3RbXSA9IFtdO1xuICBjb25zdCBob2xkZXJzT2YgPSAobm9kZTogb2JqZWN0KTogdm9pZCA9PiB7XG4gICAgY29uc3QgZmlyc3QgPSBob2xkZXIuZ2V0KG5vZGUpO1xuICAgIGlmIChmaXJzdCAhPT0gdW5kZWZpbmVkKSB1cC5wdXNoKGZpcnN0KTtcbiAgICBjb25zdCBtb3JlID0gbW9yZUhvbGRlcnM/LmdldChub2RlKTtcbiAgICAvLyBPbmUgcHVzaCBwZXIgaG9sZGVyOiBhIHNwcmVhZCBwYXNzZXMgZXZlcnkgaG9sZGVyIGFzIGEgY2FsbCBhcmd1bWVudCwgYW5kIG9uZSBvYmplY3QgaGVsZCBieVxuICAgIC8vIDEyMCwwMDAgY29udGFpbmVycyBvdmVyZmxvd2VkIHRoZSBzdGFjay5cbiAgICBpZiAobW9yZSAhPT0gdW5kZWZpbmVkKSBmb3IgKGxldCBpID0gMDsgaSA8IG1vcmUubGVuZ3RoOyBpKyspIHVwLnB1c2gobW9yZVtpXSk7XG4gIH07XG4gIGZvciAoY29uc3QgbGVhZiBvZiBsZWF2ZXMpIHtcbiAgICBpZiAobGVhZiA9PT0gcm9vdCkgbWFya2VkLmFkZChyb290KTtcbiAgICBob2xkZXJzT2YobGVhZik7XG4gIH1cbiAgd2hpbGUgKHVwLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gdXAucG9wKCkhO1xuICAgIGlmIChtYXJrZWQuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICBtYXJrZWQuYWRkKG5vZGUpO1xuICAgIGhvbGRlcnNPZihub2RlKTtcbiAgfVxuICAvLyBPbmx5IG5vdywgdGhlIHdhbGsgZG9uZSwgZG9lcyB0aGUgcmVjb3JkJ3MgZmxhZyBnaXZlIHdheSB0byBpdHMgbWFwOiBhIG1hcHBpbmcgdGhhdCB0aHJvd3MgbGVhdmVzXG4gIC8vIHRoZSByZWNvcmQgZmxhZ2dlZCwgc28gdGhlIG5leHQgc2VydmUgbWFwcyBhZ2FpbiDigJQgaXQgbmV2ZXIgaGFuZHMgb3V0IHRoZSByZWNvcmQgaXRzZWxmLlxuICBpZiAoIW1hcmtlZC5oYXMocm9vdCkpIE9QRU4uZGVsZXRlKHJvb3QpO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbWFya2VkKSBPUEVOLnNldChub2RlLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGNvcHkgb2YgYW4gb3BlbiByZWNvcmQ6IGl0cyBvcGVuIGNvbnRhaW5lcnMgY29waWVkIChmcmVzaCwgdGhlbiBmcm96ZW4sIGFuZCB0aGVtc2VsdmVzXG4gKiBvcGVuIOKAlCBhIGNvcHkgaXMgc2VydmVkIGJ5IGNvcHkgYWdhaW4pLCBlYWNoIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsIGNvcGllZCwgZXZlcnkgc2VhbGVkIHBhcnRcbiAqIHNoYXJlZC4gSXRlcmF0aXZlOyBvbmUgY29weSBwZXIgb3JpZ2luYWwsIHNvIGNvbnRhaW5lcnMgc2hhcmVkIG9yIGN5Y2xpYyBzdGF5IHNoYXJlZCBpbiB0aGUgY29weS4gVGhlXG4gKiB2YWx1ZXMgZnJlZXppbmcgY2Fubm90IHNlYWwgYXJlIGNvcGllZCBPTkUgQlkgT05FOiB0d28gb2YgdGhlbSB0aGF0IHNoYXJlIGEgcGFydCAoYW4gYEFycmF5QnVmZmVyYFxuICogYW5kIGEgdmlldyBvZiBpdCwgYW4gZXJyb3Igd2hvc2UgYGNhdXNlYCBpcyBhbm90aGVyIGtleSdzIERhdGUpIGNvbWUgb3V0IGFzIHNlcGFyYXRlIGNvcGllcyDigJQgZXF1YWxcbiAqIHZhbHVlcywgdGhlIHNoYXJpbmcgYmV0d2VlbiB0aGVtIG5vdCBrZXB0LlxuICovXG5mdW5jdGlvbiBjb3B5T3BlblBhdGhzKHJvb3Q6IG9iamVjdCk6IG9iamVjdCB7XG4gIGNvbnN0IGNvcGllcyA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG4gIGNvbnN0IHNoZWxsczogb2JqZWN0W10gPSBbXTtcbiAgY29uc3QgY29weU9mID0gKHZhbHVlOiBvYmplY3QsIHBlbmRpbmc6IG9iamVjdFtdKTogb2JqZWN0ID0+IHtcbiAgICBjb25zdCBkb25lID0gY29waWVzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGRvbmUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRvbmU7XG4gICAgbGV0IGNvcHk6IG9iamVjdDtcbiAgICBpZiAoaXNVbnNlYWxhYmxlKHZhbHVlKSkge1xuICAgICAgY29weSA9IGNvcHlMZWFmKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29weSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gbmV3IEFycmF5KHZhbHVlLmxlbmd0aCkgOiB7fTtcbiAgICAgIHNoZWxscy5wdXNoKGNvcHkpO1xuICAgICAgcGVuZGluZy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgY29waWVzLnNldCh2YWx1ZSwgY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH07XG4gIGNvbnN0IHBlbmRpbmc6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IG91dCA9IGNvcHlPZihyb290LCBwZW5kaW5nKTtcbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBwZW5kaW5nLnBvcCgpITtcbiAgICBjb25zdCBjb3B5ID0gY29waWVzLmdldChub2RlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMobm9kZSkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVdO1xuICAgICAgcHV0T3duKFxuICAgICAgICBjb3B5LFxuICAgICAgICBuYW1lLFxuICAgICAgICBjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIChPUEVOLmhhcyhjaGlsZCkgfHwgaXNVbnNlYWxhYmxlKGNoaWxkKSlcbiAgICAgICAgICA/IGNvcHlPZihjaGlsZCwgcGVuZGluZylcbiAgICAgICAgICA6IGNoaWxkLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBzaGVsbCBvZiBzaGVsbHMpIHtcbiAgICBPYmplY3QuZnJlZXplKHNoZWxsKTtcbiAgICBPUEVOLnNldChzaGVsbCwgdHJ1ZSk7XG4gIH1cbiAgLy8gQSBsZWFmIGNvcHkgaXMgdGhlIHJlYWRlcidzIG93bjsgZnJvemVuIHdoZXJlIGZyZWV6aW5nIHJlYWNoZXMsIGFzIHRoZSByZWNvcmQncyBwYXJ0cyBhcmUuXG4gIGZvciAoY29uc3QgY29weSBvZiBjb3BpZXMudmFsdWVzKCkpIGlmICghQXJyYXlCdWZmZXIuaXNWaWV3KGNvcHkpKSBPYmplY3QuZnJlZXplKGNvcHkpO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIGB0YXJnZXRbbmFtZV0gPSB2YWx1ZWAsIGFzIGFuIE9XTiBkYXRhIHByb3BlcnR5LiBBIGtleSB0aGUgc2hlbGwgb25seSBpbmhlcml0cyDigJQgYW4gb3duIGBcIl9fcHJvdG9fX1wiYFxuICogb2YgdGhlIHJlY29yZCAoYEpTT04ucGFyc2VgIG1ha2VzIG9uZSkg4oCUIHdvdWxkIGNhbGwgdGhlIGluaGVyaXRlZCBzZXR0ZXIgYW5kIHJlLXBhcmVudCB0aGUgY29weTsgaXQgaXNcbiAqIGRlZmluZWQgYXMgZGF0YSBpbnN0ZWFkLCBhcyBgbWVtb3J5L21lcmdlLnRzIMK3IG1lcmdlR3VhcmRlZGAga2VlcHMgaXQuXG4gKi9cbmZ1bmN0aW9uIHB1dE93bih0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgbmFtZSkgJiYgUmVmbGVjdC5oYXModGFyZ2V0LCBuYW1lKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG5hbWUsIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0W25hbWVdID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqIEEgZnJlc2ggY29weSBvZiBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsLiBPbmUgdGhlIGNsb25lIHJlZnVzZXMgKGhhbmQtYnVpbHQpIGlzIHNlcnZlZCBhcyBpdCBpcy4gKi9cbmZ1bmN0aW9uIGNvcHlMZWFmKHZhbHVlOiBvYmplY3QpOiBvYmplY3Qge1xuICBpZiAoa2luZE9mKHZhbHVlKSA9PT0gJ2RhdGUnKSByZXR1cm4gbmV3IERhdGUoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZS5jYWxsKHZhbHVlKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuIl19
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2ZyZWV6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWNuRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFJLEdBQU0sRUFBRSxTQUFvQixXQUFXO0lBQ25FLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdGLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztBQUU1Qzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBbUIsTUFBUyxFQUFFLFNBQW9CLFdBQVc7SUFDdkYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLElBQUksQ0FBQztRQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BHLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksTUFBUztJQUN0QyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFD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IChtb3ZlZCBoZXJlIGZyb20gYHNjb3BlL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50c2AgaW4gRjMpLFxuICogYW5kIHRoZSBzZXJ2ZS10aW1lIGxhdyBmb3IgdGhlIGNvbW1pdCBsb2cgKDkuNDQuMikuXG4gKlxuICogV0hZIEhFUkUuIFNhdmVkIHRyZWVzIGZyZWV6ZSB0aHJvdWdoIHRoaXMgd2FsazogdGhlIGZvbGQgYmFzZSBzZXJ2ZWQgYXNcbiAqIGBpbml0aWFsU3RhdGVgIChgRXhlY3V0aW9uUnVudGltZSDCtyBnZXRGb2xkQmFzZWApLCB0aGVcbiAqIGRldi1tb2RlIHNuYXBzaG90IChgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCksIGV2ZXJ5IHN0YXRlIGBzdGF0ZUF0YCBoYW5kcyBvdXRcbiAqIChgdGltZS10cmF2ZWwvc3RhdGVBdC50c2ApIGFuZCwgc2luY2UgRjMsIGV2ZXJ5IGNvbW1pdCBidW5kbGUgKGBFdmVudExvZyDCtyByZWNvcmRgKS4gYG1lbW9yeS9gIG11c3RcbiAqIG5vdCBpbXBvcnQgYHNjb3BlL2AgKHRoYXQgZWRnZSBjbG9zZWQgdGhlIG1lbW9yeSDih4Qgc2NvcGUg4oeEIHJlY29yZGVyIG1vZHVsZSBjeWNsZSBGMCByZW1vdmVkKSwgc28gdGhlXG4gKiB3YWxrIGxpdmVzIGluIHRoaXMgbGVhZiBmb2xkZXIsIHdoaWNoIGltcG9ydHMgbm90aGluZyBvdXRzaWRlIGl0c2VsZi4gQXJncyB1c2UgYW4gb3duZXJzaGlwIHNuYXBzaG90XG4gKiBpbnN0ZWFkIChgc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LnRzIMK3IGNyZWF0ZUZyb3plbkFyZ3NgKTogbmV2ZXIgZnJlZXplIGJvcnJvd2VkIGNhbGxlciB2YWx1ZXMuXG4gKlxuICogRlJFRVpFIFdIQVQgQ0FOIEJFIEZST1pFTiwgQ09QWSBXSEFUIENBTidUICg5LjQ0LjIpLiBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHNlYWwgYSBEYXRlJ3MgdGltZSwgYVxuICogTWFwJ3Mgb3IgU2V0J3MgZW50cmllcywgYSBidWZmZXIncyBieXRlcywgYSBSZWdFeHAgKGBjb21waWxlKClgIHJld3JpdGVzIGEgZnJvemVuIG9uZSkgb3IgYW4gRXJyb3JcbiAqIChWOCdzIG93biBgc3RhY2tgIGFjY2Vzc29yIHdyaXRlcyB0aHJvdWdoIGEgZnJvemVuIG9uZSkuIEEgZnJlc2ggdHJlZSBoYW5kZWQgdG8gb25lIGNhbGxlciAoYSBgc3RhdGVBdGBcbiAqIHN0YXRlLCB0aGUgZGV2LW1vZGUgc25hcHNob3QpIGlzIHRoYXQgY2FsbGVyJ3Mgb3duLCBzbyBmcmVlemluZyBpdCBpcyBhIGd1YXJkIGFuZCBub3RoaW5nIG1vcmUuIFRoZVxuICogQ09NTUlUIExPRyDigJQgZWFjaCBidW5kbGUsIGFuZCB0aGUgZm9sZCBiYXNlIOKAlCBpcyBzZXJ2ZWQgdG8gZXZlcnkgcmVhZGVyLCBzbyB7QGxpbmsgZnJlZXplUmVjb3JkfVxuICogcmVtZW1iZXJzIHRoYXQgYSByZWNvcmQgaG9sZHMgc3VjaCBhIHZhbHVlLCBpdHMgZmlyc3Qgc2VydmUgbWFwcyB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGVhY2hcbiAqIG9uZSAoaXRzIG9wZW4gUEFUSFMpLCBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBoYW5kcyBhIHJlYWRlciBhIGNvcHkgb2YgdGhvc2UgcGF0aHMgb25seTogYSBmcmVzaCBjb3B5XG4gKiBvZiBlYWNoIHN1Y2ggdmFsdWUsIGZyZXNoIGZyb3plbiBjb250YWluZXJzIG9uIHRoZSB3YXkgdG8gaXQsIGFuZCBldmVyeSBvdGhlciBwYXJ0IHNoYXJlZCwgZnJvemVuLCBhc1xuICogaXQgaXMuIFVudGlsIDkuNDQuMiBgc25hcHNob3QuY29tbWl0TG9nW2ldLm92ZXJ3cml0ZS53aGVuLnNldFRpbWUoMClgIHJld3JvdGUgZXZlcnkgbGF0ZXIgc25hcHNob3QsXG4gKiBgc3RhdGVBdGAsIGBjb21taXRWYWx1ZUF0YCwgc2xpY2UgYW5kIGN1cnNvciBhbnN3ZXIuXG4gKlxuICogRXZlcnkgd2FsayBoZXJlIGlzIElURVJBVElWRSAoYW4gZXhwbGljaXQgc3RhY2spOiBhIHJlY29yZCdzIGRlcHRoIGlzIG5vdCBib3VuZGVkIGJ5IHRoZSBjYWxsIHN0YWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBkZWVwRnJlZXplLCBmcmVlemVSZWNvcmQsIHNlcnZlUmVjb3JkIH0gZnJvbSAnLi9mcmVlemUuanMnO1xuICpcbiAqIGNvbnN0IGFyZ3MgPSBkZWVwRnJlZXplKHsgb3JkZXI6IHsgbGluZXM6IFt7IHNrdTogJ0EnIH1dIH0sIGJ5dGVzOiBuZXcgVWludDhBcnJheShbMV0pIH0pO1xuICogT2JqZWN0LmlzRnJvemVuKGFyZ3Mub3JkZXIubGluZXNbMF0pOyAvLyB0cnVlXG4gKiBPYmplY3QuaXNGcm96ZW4oYXJncy5ieXRlcyk7IC8vIGZhbHNlIOKAlCBhIHR5cGVkIGFycmF5IGNhbm5vdCBiZSBmcm96ZW47IGl0IGlzIHNraXBwZWRcbiAqXG4gKiBjb25zdCByZWNvcmQgPSBmcmVlemVSZWNvcmQoeyB3aGVuOiBuZXcgRGF0ZSgwKSwgdGFnczogWydhJ10gfSk7XG4gKiBjb25zdCBzZXJ2ZWQgPSBzZXJ2ZVJlY29yZChyZWNvcmQpO1xuICogc2VydmVkLndoZW4uc2V0VGltZSg1KTsgLy8gY2hhbmdlcyB0aGUgcmVhZGVyJ3MgY29weVxuICogc2VydmVSZWNvcmQocmVjb3JkKS53aGVuLmdldFRpbWUoKTsgLy8gMCDigJQgZXZlcnkgc2VydmUgaXMgdGhlIHJlY29yZCBhcyByZWNvcmRlZFxuICogc2VydmVkLnRhZ3MgPT09IHJlY29yZC50YWdzOyAvLyB0cnVlIOKAlCB0aGUgc2VhbGVkIHBhcnQgaXMgc2hhcmVkLCBub3QgY29waWVkXG4gKiBzZXJ2ZVJlY29yZChmcmVlemVSZWNvcmQoeyBuOiAxIH0pKTsgLy8gYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlOiBzZXJ2ZWQgYXMgaXRzZWxmXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuL293bkRhdGEuanMnO1xuaW1wb3J0IHsga2luZE9mLCBTRUFMQUJMRSB9IGZyb20gJy4vdmFsdWVLaW5kcy5qcyc7XG5cbi8qKlxuICogSG93IHtAbGluayBkZWVwRnJlZXplfSB3YWxrcyBhbiBBUlJBWS5cbiAqXG4gKiAtIGAnZXZlcnkta2V5J2AgKHRoZSBkZWZhdWx0KSDigJQgZXZlcnkgb3duIHByb3BlcnR5LCBhcyBmb3IgYW55IG90aGVyIG9iamVjdDogdGhlIGluZGV4IGVsZW1lbnRzXG4gKiAgIEFORCBhbnkgZXhwYW5kbyAoYGFyci5ub3RlID0geyDigKYgfWApLiBUaGUgZGV2LW1vZGUgc25hcHNob3QgcmVsaWVzIG9uIHRoaXMgY29udHJhY3QuXG4gKiAtIGAnaW5kaWNlcydgIOKAlCB0aGUgaW5kZXggZWxlbWVudHMgb25seSwgc28gbm8ga2V5IHN0cmluZyBpcyBhbGxvY2F0ZWQgcGVyIGVsZW1lbnQ7IHRoaXMgaXMgd2hhdFxuICogICBrZWVwcyBmcmVlemluZyBhIDEwLDAwMC1lbGVtZW50IGNvbW1pdCBpbnNpZGUgaXRzIGJ1ZGdldCAoYGJlbmNoL2VsZW1lbnQtd3JpdGVzLnRzYCkuIEFuIG9iamVjdFxuICogICBodW5nIG9uIGFuIGFycmF5IEVYUEFORE8gaXMgdGhlbiBsZWZ0IHVuZnJvemVuLCBhbmQgdW5zZWVuIGJ5IHtAbGluayBzZXJ2ZVJlY29yZH0g4oCUIHRoZSBjb21taXRcbiAqICAgbG9nJ3MgbmFtZWQgaG9sZSAoYEV2ZW50TG9nIMK3IHJlY29yZGA7IGFuIGFycmF5IGV4cGFuZG8gaXMgb3V0IG9mIGNvbnRyYWN0IGZvciBzdGF0ZSkuXG4gKi9cbmV4cG9ydCB0eXBlIEFycmF5V2FsayA9ICdldmVyeS1rZXknIHwgJ2luZGljZXMnO1xuXG4vKipcbiAqIEZyZWV6ZXMgYG9iamAgYW5kIGV2ZXJ5IG9iamVjdCByZWFjaGFibGUgdGhyb3VnaCBpdHMgb3duIHByb3BlcnRpZXMsIGFuZCByZXR1cm5zIGBvYmpgLlxuICpcbiAqIC0gQW4gb2JqZWN0IHRoYXQgaXMgQUxSRUFEWSBmcm96ZW4gaXMgbGVmdCBhcyBpdCBpcywgYW5kIG5vdCBkZXNjZW5kZWQg4oCUIDkuMzIuMCdzIGNvbnRyYWN0LCBrZXB0OlxuICogICBhcmdzIG1heSBob2xkIGEgY2FsbGVyJ3MgZnJvemVuIG9iamVjdCB3aXRoIGxpdmUgcGFydHMgaW5zaWRlIChhIGNsYXNzIGluc3RhbmNlIGEgc3RhZ2UgY2FsbHMpLFxuICogICBhbmQgZnJlZXppbmcgcGFzdCBpdCB3b3VsZCBicmVhayB0aGVtLiBJdCBpcyBhbHNvIHdoYXQgZW5kcyBhIGN5Y2xlLiBUaGUgY29tbWl0IGxvZyBuZXZlciBtZWV0c1xuICogICBvbmU6IGl0cyBwYXlsb2FkcyBhcmUgZnJlc2ggYHN0cnVjdHVyZWRDbG9uZWBzLlxuICogLSBBcnJheUJ1ZmZlciB2aWV3cyAodHlwZWQgYXJyYXlzLCBgRGF0YVZpZXdgKSBhcmUgc2tpcHBlZDogYE9iamVjdC5mcmVlemVgIHRocm93cyBvbiBhIG5vbi1lbXB0eVxuICogICB0eXBlZCBhcnJheSwgc28gYSBgVWludDhBcnJheWAgaW4gc3RhdGUsIGFyZ3Mgb3IgdGhlIGZvbGQgYmFzZSB1c2VkIHRvIGZhaWwgdGhlIHJ1biBvciB0aGVcbiAqICAgc25hcHNob3QgaGVyZS5cbiAqIC0gV2hhdCBgT2JqZWN0LmZyZWV6ZWAgY2Fubm90IHJlYWNoIHN0YXlzIG11dGFibGUg4oCUIE1hcCBhbmQgU2V0IGNvbnRlbnRzLCBhIERhdGUncyB0aW1lLCB0aGVcbiAqICAgYnl0ZXMgYmVoaW5kIGEgYnVmZmVyLiBBIGZyb3plbiBSZWdFeHAncyBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgIHJlZ2V4XG4gKiAgIHRha2VuIGZyb20gYSBmcm96ZW4gdHJlZSB0aHJvd3Mgd2hlbiBgZXhlY2Agb3IgYHJlcGxhY2VgIGFkdmFuY2UgaXQuIFRoZSBjb21taXQgbG9nIGdvZXMgdGhyb3VnaFxuICogICB7QGxpbmsgZnJlZXplUmVjb3JkfSBhbmQge0BsaW5rIHNlcnZlUmVjb3JkfSBpbnN0ZWFkLlxuICogLSBGdW5jdGlvbnMgYXJlIG5vdCBkZXNjZW5kZWQgKHRoZXkgYXJlIG5vdCB2YWx1ZXMgdGhlIGVuZ2luZSBzdG9yZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEZyZWV6ZTxUPihvYmo6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykgd2Fsa0FuZEZyZWV6ZShvYmosIGFycmF5cyA9PT0gJ2luZGljZXMnLCBmYWxzZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ29udGFpbmVycyBvZiBhIHJlY29yZCB0aGF0IGhvbGQg4oCUIG9uIHNvbWUgcGF0aCBiZWxvdyB0aGVtIOKAlCBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsOiBgdHJ1ZWAgb25jZVxuICogbWFwcGVkICh0aGUgY29udGFpbmVyIGlzIG9uIGFuIG9wZW4gcGF0aCksIGBmYWxzZWAgZm9yIGEgcmVjb3JkIHtAbGluayBmcmVlemVSZWNvcmR9IGZvdW5kIG9wZW4gd2hvc2VcbiAqIHBhdGhzIG5vIHNlcnZlIGhhcyBtYXBwZWQgeWV0LiBBIGNvbnRhaW5lciBhYnNlbnQgaGVyZSBpcyBzZWFsZWQgd2hvbGUuXG4gKi9cbmNvbnN0IE9QRU4gPSBuZXcgV2Vha01hcDxvYmplY3QsIGJvb2xlYW4+KCk7XG5cbi8qKlxuICoge0BsaW5rIGRlZXBGcmVlemV9IGZvciBhIHJlY29yZCBtYW55IHJlYWRlcnMgYXJlIFNFUlZFRCAoYSBjb21taXQgYnVuZGxlLCB0aGUgZm9sZCBiYXNlKSwgYW5kIHR3byBtb3JlXG4gKiB0aGluZ3Mgb24gdGhlIHNhbWUgd2FsazpcbiAqXG4gKiAgIC0gaXQgcmVtZW1iZXJzIFRIQVQgdGhlIHJlY29yZCBob2xkcyBhIHZhbHVlIGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBvbmUgZmxhZzsgdGhlIHJlY29yZCdzIGZpcnN0XG4gKiAgICAgc2VydmUgbWFwcyBXSEVSRSAodGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0byBlYWNoIHN1Y2ggdmFsdWUsIGl0cyBvcGVuIHBhdGhzKSwgc28gdGhlIHJ1biBwYXlzXG4gKiAgICAgbm90aGluZyBtb3JlIGFuZCB7QGxpbmsgc2VydmVSZWNvcmR9IGNvcGllcyB0aG9zZSBwYXRocyBhbmQgbm90aGluZyBlbHNlO1xuICogICAtIGEgdHlwZWQgYXJyYXkgb3IgYERhdGFWaWV3YCB0aGF0IHZpZXdzIGEgU0xJQ0Ugb2YgYSBiaWdnZXIgYnVmZmVyIChhIE5vZGUgYEJ1ZmZlcmAgdmlld3MgaXRzXG4gKiAgICAgc2hhcmVkIHBvb2wpIGlzIHJlcGxhY2VkLCBpbiB0aGUgcmVjb3JkLCBieSBhIGNvcHkgb2YgdGhlIGJ5dGVzIGl0IHZpZXdzIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHRoZVxuICogICAgIHZpZXcncyBieXRlcywgbmV2ZXIgdGhlIHJlc3Qgb2YgdGhlIGJ1ZmZlciAoYSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0IGFzIGl0IGlzKS5cbiAqXG4gKiBBIHBhcnQgZnJvemVuIGJlZm9yZSBpcyBub3QgZnJvemVuIHBhc3QgKGRlZXBGcmVlemUncyBjb250cmFjdCkgYnV0IGlzIGxvb2tlZCB0aHJvdWdoLCBzbyBhIHZhbHVlXG4gKiBmcmVlemluZyBjYW5ub3Qgc2VhbCBpbnNpZGUgaXQgc3RpbGwgb3BlbnMgdGhlIHJlY29yZC4gUmV0dXJucyBgcmVjb3JkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZVJlY29yZDxUIGV4dGVuZHMgb2JqZWN0PihyZWNvcmQ6IFQsIGFycmF5czogQXJyYXlXYWxrID0gJ2V2ZXJ5LWtleScpOiBUIHtcbiAgaWYgKCFPUEVOLmhhcyhyZWNvcmQpICYmIHdhbGtBbmRGcmVlemUocmVjb3JkLCBhcnJheXMgPT09ICdpbmRpY2VzJywgdHJ1ZSkpIE9QRU4uc2V0KHJlY29yZCwgZmFsc2UpO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG4vKipcbiAqIFRoZSByZWNvcmQgYXMgYSByZWFkZXIgbWF5IGhvbGQgaXQg4oCUIFRIRSBzZXJ2ZS10aW1lIGxhdzogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlIGlzIHNlcnZlZCBhc1xuICogaXRzZWxmIChzaGFyZWQsIG5vIGNvc3QpOyBhbnkgb3RoZXIgYXMgYSBjb3B5IG9mIGl0cyBvcGVuIHBhdGhzICh7QGxpbmsgZnJlZXplUmVjb3JkfSk6IGZyZXNoIGZyb3plblxuICogY29udGFpbmVycyBkb3duIHRvIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwsIGEgZnJlc2ggY29weSBvZiB0aGF0IHZhbHVlLCBhbmQgZXZlcnkgb3RoZXIgcGFydFxuICogc2hhcmVkLCBmcm96ZW4sIGFzIGl0IGlzLiBBIGNvcHkgaXMgc2VydmVkIHRoZSBzYW1lIHdheSBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlUmVjb3JkPFQ+KHJlY29yZDogVCk6IFQge1xuICBpZiAocmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnKSByZXR1cm4gcmVjb3JkO1xuICBjb25zdCBtYXBwZWQgPSBPUEVOLmdldChyZWNvcmQpO1xuICBpZiAobWFwcGVkID09PSB1bmRlZmluZWQpIHJldHVybiByZWNvcmQ7XG4gIGlmICghbWFwcGVkKSBtYXBPcGVuUGF0aHMocmVjb3JkKTtcbiAgcmV0dXJuIE9QRU4uZ2V0KHJlY29yZCkgPT09IHRydWUgPyAoY29weU9wZW5QYXRocyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xufVxuXG4vKiogQSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCDigJQgYSB2aWV3LCBvciBhIGtpbmQgYFNFQUxBQkxFYCBzYXlzIG5vIHRvIChhIERhdGUsIGEgTWFwLCBhbiBFcnJvciDigKYpLiAqL1xuZnVuY3Rpb24gaXNVbnNlYWxhYmxlKHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkgfHwgIVNFQUxBQkxFW2tpbmRPZih2YWx1ZSldO1xufVxuXG4vKipcbiAqIEZyZWV6ZSBgcm9vdGAgYW5kIGV2ZXJ5IGNvbnRhaW5lciB1bmRlciBpdCwgaXRlcmF0aXZlbHk7IGByZWNvcmRgIGFkZHMgdGhlIGxvb2stdGhyb3VnaCBvZiBwYXJ0c1xuICogZnJvemVuIGJlZm9yZSBhbmQgdGhlIGNvbXBhY3Rpb24gb2Ygdmlld3Mgb3ZlciBhIHNsaWNlLiBgdHJ1ZWAgd2hlbiBzb21ldGhpbmcgdW5kZXIgYHJvb3RgIChvciBgcm9vdGBcbiAqIGl0c2VsZikgY2Fubm90IGJlIHNlYWxlZC5cbiAqL1xuZnVuY3Rpb24gd2Fsa0FuZEZyZWV6ZShyb290OiBvYmplY3QsIGluZGljZXM6IGJvb2xlYW4sIHJlY29yZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBsZXQgb3BlbiA9IGZhbHNlO1xuICBsZXQgbG9va2VkVGhyb3VnaDogU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcobm9kZSkpIHtcbiAgICAgIG9wZW4gPSB0cnVlOyAvLyBpdHMgYnl0ZXMg4oCUIGFuZCBhIG5vbi1lbXB0eSBvbmUgY2Fubm90IGJlIGZyb3plbiBhdCBhbGxcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBmcm96ZW5CZWZvcmUgPSBPYmplY3QuaXNGcm96ZW4obm9kZSk7XG4gICAgaWYgKGZyb3plbkJlZm9yZSkge1xuICAgICAgaWYgKCFyZWNvcmQgfHwgT1BFTi5oYXMobm9kZSkpIHtcbiAgICAgICAgb3BlbiB8fD0gcmVjb3JkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICgobG9va2VkVGhyb3VnaCA/Pz0gbmV3IFNldCgpKS5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgbG9va2VkVGhyb3VnaC5hZGQobm9kZSk7IC8vIGEgcGFydCBmcm96ZW4gYmVmb3JlOiBsb29rZWQgdGhyb3VnaCwgbmV2ZXIgZnJvemVuIHBhc3RcbiAgICB9XG4gICAgaWYgKHJlY29yZCAmJiAhb3BlbiAmJiAhU0VBTEFCTEVba2luZE9mKG5vZGUpXSkgb3BlbiA9IHRydWU7XG4gICAgLy8gQ2hpbGRyZW4gZmlyc3QsIHdoaWxlIGBub2RlYCBpcyBzdGlsbCBvcGVuIHRvIHRoZSBjb21wYWN0aW9uIGJlbG93OyB0aGVuIHRoZSBmcmVlemUuXG4gICAgY29uc3QgY29tcGFjdGluZyA9IHJlY29yZCAmJiAhZnJvemVuQmVmb3JlO1xuICAgIGlmIChpbmRpY2VzICYmIEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZDogdW5rbm93biA9IG5vZGVbaV07XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgc3RhY2sucHVzaChjb21wYWN0aW5nICYmIEFycmF5QnVmZmVyLmlzVmlldyhjaGlsZCkgPyBjb21wYWN0KG5vZGUsIGksIGNoaWxkKSA6IGNoaWxkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhub2RlKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZXNbaV1dO1xuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIHN0YWNrLnB1c2goY29tcGFjdGluZyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoY2hpbGQpID8gY29tcGFjdChub2RlLCBuYW1lc1tpXSwgY2hpbGQpIDogY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZyb3plbkJlZm9yZSkgT2JqZWN0LmZyZWV6ZShub2RlKTtcbiAgfVxuICByZXR1cm4gb3Blbjtcbn1cblxuLyoqXG4gKiBBIHZpZXcgb3ZlciBhIFNMSUNFIG9mIGEgYmlnZ2VyIGJ1ZmZlciwgcmVwbGFjZWQgaW4gYGNvbnRhaW5lcmAgYnkgYSBjb3B5IG9mIHRoZSBieXRlcyBpdCB2aWV3c1xuICogKHRoZSB0eXBlIGl0IGlzIOKAlCBhIE5vZGUgYEJ1ZmZlcmAgY29tZXMgb3V0IGEgYFVpbnQ4QXJyYXlgLCBhcyBhIGNsb25lIG9mIGl0IGRvZXMpLiBBbnl0aGluZyBlbHNlIGlzXG4gKiByZXR1cm5lZCBhcyBpdCBpcy4gQSByZXNpemFibGUgb3Igc2hhcmVkIGJ1ZmZlciBpcyBrZXB0OiBhIGNvcHkgd291bGQgY2hhbmdlIHdoYXQgaXQgaXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhY3QoY29udGFpbmVyOiBvYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyLCBjaGlsZDogQXJyYXlCdWZmZXJWaWV3KTogb2JqZWN0IHtcbiAgY29uc3QgYnVmZmVyID0gY2hpbGQuYnVmZmVyIGFzIEFycmF5QnVmZmVyICYgeyByZXNpemFibGU/OiBib29sZWFuIH07XG4gIGlmIChjaGlsZC5ieXRlT2Zmc2V0ID09PSAwICYmIGNoaWxkLmJ5dGVMZW5ndGggPT09IGJ1ZmZlci5ieXRlTGVuZ3RoKSByZXR1cm4gY2hpbGQ7XG4gIGlmIChidWZmZXIucmVzaXphYmxlID09PSB0cnVlIHx8ICEoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGJ5dGVzID0gYnVmZmVyLnNsaWNlKGNoaWxkLmJ5dGVPZmZzZXQsIGNoaWxkLmJ5dGVPZmZzZXQgKyBjaGlsZC5ieXRlTGVuZ3RoKTtcbiAgY29uc3QgdGFnID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNoaWxkKS5zbGljZSg4LCAtMSk7XG4gIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIG5ldyAoYnVmZmVyOiBBcnJheUJ1ZmZlcikgPT4gQXJyYXlCdWZmZXJWaWV3PilbdGFnXTtcbiAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gY2hpbGQ7XG4gIGNvbnN0IGNvcHkgPSBuZXcgQ3RvcihieXRlcyk7XG4gIHRyeSB7XG4gICAgKGNvbnRhaW5lciBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XSA9IGNvcHk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjaGlsZDsgLy8gYSBwcm9wZXJ0eSB0aGUgcmVjb3JkIGRvZXMgbm90IGxldCBiZSByZXBsYWNlZCAoYSBoYW5kLWJ1aWx0IGJ1bmRsZSlcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBNYXAgdGhlIG9wZW4gcGF0aHMgb2YgYHJvb3RgIOKAlCBtYXJrIGV2ZXJ5IGNvbnRhaW5lciB0aGF0IHJlYWNoZXMgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbCwgc28gYVxuICogc2VydmUgY29waWVzIGV4YWN0bHkgdGhvc2UgKERBR3MgYW5kIGN5Y2xlcyBpbmNsdWRlZDogdGhlIG1hcmtzIHJ1biBVUCB0aGUgcmV2ZXJzZSBlZGdlcyBmcm9tIGVhY2hcbiAqIHN1Y2ggdmFsdWUpLiBSdW5zIG9uY2UgcGVyIG9wZW4gcmVjb3JkLCBhdCBpdHMgZmlyc3Qgc2VydmUuIEEgbm9kZSdzIGZpcnN0IGhvbGRlciBpcyBrZXB0IGluIG9uZSBtYXA7XG4gKiBhbnkgb3RoZXIgaG9sZGVyIChhIHNoYXJlZCBwYXJ0LCBhIGN5Y2xlKSBpbiBhIHNlY29uZCwgbWFkZSBvbmx5IHdoZW4gdGhlcmUgaXMgb25lLlxuICovXG5mdW5jdGlvbiBtYXBPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IGhvbGRlciA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG4gIGxldCBtb3JlSG9sZGVyczogTWFwPG9iamVjdCwgb2JqZWN0W10+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBsZWF2ZXM6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgIGlmIChpc1Vuc2VhbGFibGUobm9kZSkpIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpOyAvLyBhIGxlYWY6IGl0cyBjb250ZW50cyBhcmUgY29waWVkIHdpdGggaXRcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKG5vZGUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW25hbWVzW2ldXTtcbiAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAhaG9sZGVyLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgaG9sZGVyLnNldChjaGlsZCwgbm9kZSk7XG4gICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vcmUgPSAobW9yZUhvbGRlcnMgPz89IG5ldyBNYXAoKSkuZ2V0KGNoaWxkKTtcbiAgICAgIGlmIChtb3JlID09PSB1bmRlZmluZWQpIG1vcmVIb2xkZXJzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgIGVsc2UgbW9yZS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICAvLyBNYXJrZWQgaW4gVEhJUyBtYXAsIG5vdCBieSBhbiBlYXJsaWVyIG9uZTogYSBwYXJ0IGFub3RoZXIgcmVjb3JkIGFscmVhZHkgbWFwcGVkIHN0aWxsIG9wZW5zXG4gIC8vIGV2ZXJ5IGNvbnRhaW5lciBvZiB0aGlzIHJlY29yZCBvbiB0aGUgd2F5IHRvIGl0LlxuICBjb25zdCBtYXJrZWQgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdXA6IG9iamVjdFtdID0gW107XG4gIGNvbnN0IGhvbGRlcnNPZiA9IChub2RlOiBvYmplY3QpOiB2b2lkID0+IHtcbiAgICBjb25zdCBmaXJzdCA9IGhvbGRlci5nZXQobm9kZSk7XG4gICAgaWYgKGZpcnN0ICE9PSB1bmRlZmluZWQpIHVwLnB1c2goZmlyc3QpO1xuICAgIGNvbnN0IG1vcmUgPSBtb3JlSG9sZGVycz8uZ2V0KG5vZGUpO1xuICAgIC8vIE9uZSBwdXNoIHBlciBob2xkZXI6IGEgc3ByZWFkIHBhc3NlcyBldmVyeSBob2xkZXIgYXMgYSBjYWxsIGFyZ3VtZW50LCBhbmQgb25lIG9iamVjdCBoZWxkIGJ5XG4gICAgLy8gMTIwLDAwMCBjb250YWluZXJzIG92ZXJmbG93ZWQgdGhlIHN0YWNrLlxuICAgIGlmIChtb3JlICE9PSB1bmRlZmluZWQpIGZvciAobGV0IGkgPSAwOyBpIDwgbW9yZS5sZW5ndGg7IGkrKykgdXAucHVzaChtb3JlW2ldKTtcbiAgfTtcbiAgZm9yIChjb25zdCBsZWFmIG9mIGxlYXZlcykge1xuICAgIGlmIChsZWFmID09PSByb290KSBtYXJrZWQuYWRkKHJvb3QpO1xuICAgIGhvbGRlcnNPZihsZWFmKTtcbiAgfVxuICB3aGlsZSAodXAubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSB1cC5wb3AoKSE7XG4gICAgaWYgKG1hcmtlZC5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgIG1hcmtlZC5hZGQobm9kZSk7XG4gICAgaG9sZGVyc09mKG5vZGUpO1xuICB9XG4gIC8vIE9ubHkgbm93LCB0aGUgd2FsayBkb25lLCBkb2VzIHRoZSByZWNvcmQncyBmbGFnIGdpdmUgd2F5IHRvIGl0cyBtYXA6IGEgbWFwcGluZyB0aGF0IHRocm93cyBsZWF2ZXNcbiAgLy8gdGhlIHJlY29yZCBmbGFnZ2VkLCBzbyB0aGUgbmV4dCBzZXJ2ZSBtYXBzIGFnYWluIOKAlCBpdCBuZXZlciBoYW5kcyBvdXQgdGhlIHJlY29yZCBpdHNlbGYuXG4gIGlmICghbWFya2VkLmhhcyhyb290KSkgT1BFTi5kZWxldGUocm9vdCk7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiBtYXJrZWQpIE9QRU4uc2V0KG5vZGUsIHRydWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBhbiBvcGVuIHJlY29yZDogaXRzIG9wZW4gY29udGFpbmVycyBjb3BpZWQgKGZyZXNoLCB0aGVuIGZyb3plbiwgYW5kIHRoZW1zZWx2ZXNcbiAqIG9wZW4g4oCUIGEgY29weSBpcyBzZXJ2ZWQgYnkgY29weSBhZ2FpbiksIGVhY2ggdmFsdWUgZnJlZXppbmcgY2Fubm90IHNlYWwgY29waWVkLCBldmVyeSBzZWFsZWQgcGFydFxuICogc2hhcmVkLiBJdGVyYXRpdmU7IG9uZSBjb3B5IHBlciBvcmlnaW5hbCwgc28gY29udGFpbmVycyBzaGFyZWQgb3IgY3ljbGljIHN0YXkgc2hhcmVkIGluIHRoZSBjb3B5LiBUaGVcbiAqIHZhbHVlcyBmcmVlemluZyBjYW5ub3Qgc2VhbCBhcmUgY29waWVkIE9ORSBCWSBPTkU6IHR3byBvZiB0aGVtIHRoYXQgc2hhcmUgYSBwYXJ0IChhbiBgQXJyYXlCdWZmZXJgXG4gKiBhbmQgYSB2aWV3IG9mIGl0LCBhbiBlcnJvciB3aG9zZSBgY2F1c2VgIGlzIGFub3RoZXIga2V5J3MgRGF0ZSkgY29tZSBvdXQgYXMgc2VwYXJhdGUgY29waWVzIOKAlCBlcXVhbFxuICogdmFsdWVzLCB0aGUgc2hhcmluZyBiZXR3ZWVuIHRoZW0gbm90IGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGNvcHlPcGVuUGF0aHMocm9vdDogb2JqZWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdD4oKTtcbiAgY29uc3Qgc2hlbGxzOiBvYmplY3RbXSA9IFtdO1xuICBjb25zdCBjb3B5T2YgPSAodmFsdWU6IG9iamVjdCwgcGVuZGluZzogb2JqZWN0W10pOiBvYmplY3QgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSBjb3BpZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoZG9uZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZG9uZTtcbiAgICBsZXQgY29weTogb2JqZWN0O1xuICAgIGlmIChpc1Vuc2VhbGFibGUodmFsdWUpKSB7XG4gICAgICBjb3B5ID0gY29weUxlYWYodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb3B5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBuZXcgQXJyYXkodmFsdWUubGVuZ3RoKSA6IHt9O1xuICAgICAgc2hlbGxzLnB1c2goY29weSk7XG4gICAgICBwZW5kaW5nLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb3BpZXMuc2V0KHZhbHVlLCBjb3B5KTtcbiAgICByZXR1cm4gY29weTtcbiAgfTtcbiAgY29uc3QgcGVuZGluZzogb2JqZWN0W10gPSBbXTtcbiAgY29uc3Qgb3V0ID0gY29weU9mKHJvb3QsIHBlbmRpbmcpO1xuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHBlbmRpbmcucG9wKCkhO1xuICAgIGNvbnN0IGNvcHkgPSBjb3BpZXMuZ2V0KG5vZGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgY29uc3QgY2hpbGQgPSAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbmFtZV07XG4gICAgICBwdXRPd24oXG4gICAgICAgIGNvcHksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgKE9QRU4uaGFzKGNoaWxkKSB8fCBpc1Vuc2VhbGFibGUoY2hpbGQpKVxuICAgICAgICAgID8gY29weU9mKGNoaWxkLCBwZW5kaW5nKVxuICAgICAgICAgIDogY2hpbGQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IHNoZWxsIG9mIHNoZWxscykge1xuICAgIE9iamVjdC5mcmVlemUoc2hlbGwpO1xuICAgIE9QRU4uc2V0KHNoZWxsLCB0cnVlKTtcbiAgfVxuICAvLyBBIGxlYWYgY29weSBpcyB0aGUgcmVhZGVyJ3Mgb3duOyBmcm96ZW4gd2hlcmUgZnJlZXppbmcgcmVhY2hlcywgYXMgdGhlIHJlY29yZCdzIHBhcnRzIGFyZS5cbiAgZm9yIChjb25zdCBjb3B5IG9mIGNvcGllcy52YWx1ZXMoKSkgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcoY29weSkpIE9iamVjdC5mcmVlemUoY29weSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBIGZyZXNoIGNvcHkgb2YgYSB2YWx1ZSBmcmVlemluZyBjYW5ub3Qgc2VhbC4gT25lIHRoZSBjbG9uZSByZWZ1c2VzIChoYW5kLWJ1aWx0KSBpcyBzZXJ2ZWQgYXMgaXQgaXMuICovXG5mdW5jdGlvbiBjb3B5TGVhZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgaWYgKGtpbmRPZih2YWx1ZSkgPT09ICdkYXRlJykgcmV0dXJuIG5ldyBEYXRlKERhdGUucHJvdG90eXBlLmdldFRpbWUuY2FsbCh2YWx1ZSkpO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `target[name] = value`, preserving existing own-slot behavior while making
|
|
3
|
+
* a missing inherited name an OWN data property. Payload names such as
|
|
4
|
+
* `__proto__` are data, not setters or selector instructions. Shared by the
|
|
5
|
+
* record-serving and copy-on-write copies; this is not a public helper.
|
|
6
|
+
*/
|
|
7
|
+
export declare function putOwn(target: Record<string, unknown>, name: string, value: unknown): void;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `target[name] = value`, preserving existing own-slot behavior while making
|
|
3
|
+
* a missing inherited name an OWN data property. Payload names such as
|
|
4
|
+
* `__proto__` are data, not setters or selector instructions. Shared by the
|
|
5
|
+
* record-serving and copy-on-write copies; this is not a public helper.
|
|
6
|
+
*/
|
|
7
|
+
export function putOwn(target, name, value) {
|
|
8
|
+
if (!Object.prototype.hasOwnProperty.call(target, name) && Reflect.has(target, name)) {
|
|
9
|
+
Object.defineProperty(target, name, { value, enumerable: true, writable: true, configurable: true });
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
target[name] = value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3duRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9vd25EYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUErQixFQUFFLElBQVksRUFBRSxLQUFjO0lBQ2xGLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RyxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGB0YXJnZXRbbmFtZV0gPSB2YWx1ZWAsIHByZXNlcnZpbmcgZXhpc3Rpbmcgb3duLXNsb3QgYmVoYXZpb3Igd2hpbGUgbWFraW5nXG4gKiBhIG1pc3NpbmcgaW5oZXJpdGVkIG5hbWUgYW4gT1dOIGRhdGEgcHJvcGVydHkuIFBheWxvYWQgbmFtZXMgc3VjaCBhc1xuICogYF9fcHJvdG9fX2AgYXJlIGRhdGEsIG5vdCBzZXR0ZXJzIG9yIHNlbGVjdG9yIGluc3RydWN0aW9ucy4gU2hhcmVkIGJ5IHRoZVxuICogcmVjb3JkLXNlcnZpbmcgYW5kIGNvcHktb24td3JpdGUgY29waWVzOyB0aGlzIGlzIG5vdCBhIHB1YmxpYyBoZWxwZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdXRPd24odGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIG5hbWUpICYmIFJlZmxlY3QuaGFzKHRhcmdldCwgbmFtZSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBuYW1lLCB7IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICB9XG59XG4iXX0=
|
|
@@ -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,27 @@
|
|
|
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
|
*/
|
|
22
|
+
import { putOwn } from '../capture/ownData.js';
|
|
24
23
|
const DENIED = new Set(['__proto__', 'constructor', 'prototype']);
|
|
25
|
-
/** Is `segment` one of the three prototype-pollution
|
|
24
|
+
/** Is `segment` one of the three denied prototype-pollution selector names? */
|
|
26
25
|
export function isDeniedSegment(segment) {
|
|
27
26
|
return DENIED.has(String(segment));
|
|
28
27
|
}
|
|
@@ -154,7 +153,7 @@ export function shallowCopy(container) {
|
|
|
154
153
|
if (Array.isArray(container)) {
|
|
155
154
|
const copy = container.slice();
|
|
156
155
|
for (const key of namedArrayKeys(container))
|
|
157
|
-
copy
|
|
156
|
+
putOwn(copy, key, container[key]);
|
|
158
157
|
return copy;
|
|
159
158
|
}
|
|
160
159
|
const proto = Object.getPrototypeOf(container);
|
|
@@ -163,7 +162,7 @@ export function shallowCopy(container) {
|
|
|
163
162
|
const copy = structuredClone(container);
|
|
164
163
|
for (const key of Object.keys(container)) {
|
|
165
164
|
if (!Object.prototype.hasOwnProperty.call(copy, key))
|
|
166
|
-
copy
|
|
165
|
+
putOwn(copy, key, container[key]);
|
|
167
166
|
}
|
|
168
167
|
return copy;
|
|
169
168
|
}
|
|
@@ -288,4 +287,4 @@ export function mergeContextWins(dst, src) {
|
|
|
288
287
|
}
|
|
289
288
|
return out;
|
|
290
289
|
}
|
|
291
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUVsRSwyRkFBMkY7QUFDM0YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUF3QjtJQUN0RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtDO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFRLEVBQUUsSUFBa0MsRUFBRSxZQUFrQjtJQUN4RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksSUFBSSxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQzFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbEQsQ0FBQztBQUVELDZGQUE2RjtBQUM3RixNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFrQyxFQUFFLEtBQVU7SUFDaEYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEdBQVEsRUFBRSxJQUFrQztJQUN2RSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ3BDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDekcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU87SUFDckMsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsdUVBQXVFO0FBQ3ZFLDJFQUEyRTtBQUMzRSw0REFBNEQ7QUFDNUQsdUVBQXVFO0FBRXZFLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWM7SUFDeEMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBZSxFQUFFLEdBQW9CO0lBQzVELE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztRQUN6RyxDQUFDLENBQUUsTUFBMkMsQ0FBQyxHQUFHLENBQUM7UUFDbkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNoQixDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLFNBQVMsZUFBZSxDQUFDLEdBQVc7SUFDbEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQWdCO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN4QixPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLEtBQUssRUFBRSxDQUFDO0lBQy9ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFtQixTQUFZO0lBQ3hELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQXdDLENBQUM7UUFDckUsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFJLFNBQWdELENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEgsT0FBTyxJQUFvQixDQUFDO0lBQzlCLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztJQUMxRSxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsU0FBUyxDQUE0QixDQUFDO0lBQ25FLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBSSxTQUFxQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFDRCxPQUFPLElBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFTLEVBQUUsSUFBa0MsRUFBRSxLQUFzQjtJQUM1RixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPO1FBQy9CLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksR0FBRyxJQUFJLENBQUM7WUFDWixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBUyxFQUFFLEtBQXVCO0lBQzVELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYyxFQUFFLEtBQWtDO0lBQ3BFLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBYSxFQUFFLEtBQXNCO0lBQ3pELE1BQU0sS0FBSyxHQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUN0RCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxLQUFLLENBQUMsSUFBSSxDQUFFLEtBQWlDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1RixDQUFDO0FBQ0gsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFrQztJQUNwRSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFRLEVBQUUsR0FBUTtJQUNqRCxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUQsT0FBTyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFFLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxTQUFTO1FBQzlCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6Qix5REFBeUQ7WUFDekQsSUFDRSxNQUFNLEtBQUssSUFBSTtnQkFDZixPQUFPLE1BQU0sS0FBSyxRQUFRO2dCQUMxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSTtnQkFDakIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFNlY3VyaXR5IGNvbnRyYWN0OiBhbGwgZnVuY3Rpb25zIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlLXBvbGx1dGlvbiBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbi1yZWFkIGF0dGFja3MuIFRoZSBERU5JRUQgc2V0IGJsb2NrcyB0aGUgdGhyZWUgY2Fub25pY2FsXG4gKiBwb2xsdXRpb24gdmVjdG9ycyAoX19wcm90b19fLCBjb25zdHJ1Y3RvciwgcHJvdG90eXBlKSBvbiBldmVyeSBmdW5jdGlvbi5cbiAqXG4gKiBJbnRlbnRpb25hbCBhc3ltbWV0cnk6XG4gKiAgIC0gbmF0aXZlU2V0ICDigJQgREVOSUVEIGNoZWNrIG9ubHkgYXQgZWFjaCBzZWdtZW50LiBObyBoYXNPd25Qcm9wZXJ0eVxuICogICAgIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHdyaXRpbmcgYWx3YXlzIGNyZWF0ZXMgYW4gT1dOIHByb3BlcnR5IG9uIGBjdXJyYCxcbiAqICAgICB3aGljaCBjYW5ub3QgcG9sbHV0ZSB0aGUgcHJvdG90eXBlIGNoYWluLlxuICogICAtIG5hdGl2ZUdldCAvIG5hdGl2ZUhhcyDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgICBSZWFkcyBmb2xsb3cgdGhlIHByb3RvdHlwZSBjaGFpbiBieSBkZWZhdWx0IChicmFja2V0IG5vdGF0aW9uKSwgc28gdGhlXG4gKiAgICAgaGFzT3duUHJvcGVydHkgZ3VhcmQgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBsZWFraW5nIGluaGVyaXRlZCB2YWx1ZXNcbiAqICAgICAoZS5nLiBPYmplY3QucHJvdG90eXBlLCBPYmplY3QgY29uc3RydWN0b3IsIHRvU3RyaW5nKS5cbiAqICAgLSBtZXJnZUNvbnRleHRXaW5zIOKAlCBERU5JRUQgY2hlY2sgb25seTsgT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5XG4gKiAgICAgYnkgc3BlYyBzbyBwcm90b3R5cGUga2V5cyBuZXZlciBhcHBlYXIgaW4gdGhlIGl0ZXJhdGlvbi5cbiAqXG4gKiBEbyBOT1QgXCJmaXhcIiB0aGUgbmF0aXZlU2V0IGFzeW1tZXRyeSBieSBhZGRpbmcgaGFzT3duUHJvcGVydHkg4oCUIGl0IGlzXG4gKiBpbnRlbnRpb25hbCBhbmQgd291bGQgYnJlYWsgcGF0aCBjcmVhdGlvbiBmb3IgbmV3IGludGVybWVkaWF0ZSBub2Rlcy5cbiAqXG4gKiBQYXRocyBtYXkgYmUgZG90LW5vdGF0aW9uIHN0cmluZ3Mgb3IgcHJlLXNwbGl0IChzdHJpbmd8bnVtYmVyKVtdIGFycmF5cy5cbiAqL1xuXG5jb25zdCBERU5JRUQgPSBuZXcgU2V0KFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddKTtcblxuLyoqIElzIGBzZWdtZW50YCBvbmUgb2YgdGhlIHRocmVlIHByb3RvdHlwZS1wb2xsdXRpb24gdmVjdG9ycyBldmVyeSBoZWxwZXIgaGVyZSByZWZ1c2VzPyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVuaWVkU2VnbWVudChzZWdtZW50OiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIERFTklFRC5oYXMoU3RyaW5nKHNlZ21lbnQpKTtcbn1cblxuZnVuY3Rpb24gdG9TZWdtZW50cyhwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdKTogKHN0cmluZyB8IG51bWJlcilbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aCA6IHBhdGguc3BsaXQoJy4nKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGF0IGBwYXRoYCBpbiBgb2JqYCwgcmV0dXJuaW5nIGBkZWZhdWx0VmFsdWVgIGlmIGFic2VudC5cbiAqXG4gKiBTZWN1cml0eTogZWFjaCBwYXRoIHNlZ21lbnQgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBERU5JRUQgbGlzdCBhbmQgcmVxdWlyZXNcbiAqIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzdGVwLCBwcmV2ZW50aW5nIHByb3RvdHlwZS1jaGFpbiByZWFkcy5cbiAqIGUuZy4gbmF0aXZlR2V0KHt9LCAnX19wcm90b19fJykgYW5kIG5hdGl2ZUdldCh7fSwgJ2NvbnN0cnVjdG9yJykgYm90aCByZXR1cm5cbiAqIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgb2YgbGVha2luZyBPYmplY3QucHJvdG90eXBlIC8gdGhlIE9iamVjdCBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZUdldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdzKSB7XG4gICAgaWYgKGN1cnIgPT0gbnVsbCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIHJldHVybiBjdXJyID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBjdXJyO1xufVxuXG4vKiogTXV0YXRlIGBvYmpgLCBzZXR0aW5nIGB2YWx1ZWAgYXQgYHBhdGhgIChjcmVhdGVzIGludGVybWVkaWF0ZSBvYmplY3RzKS4gUmV0dXJucyBgb2JqYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVTZXQob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm4gb2JqO1xuICAgIGlmIChjdXJyW2tdID09IG51bGwgfHwgdHlwZW9mIGN1cnJba10gIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyW2tdID0gdHlwZW9mIHNlZ3NbaSArIDFdID09PSAnbnVtYmVyJyA/IFtdIDoge307XG4gICAgfVxuICAgIGN1cnIgPSBjdXJyW2tdO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybiBvYmo7XG4gIGN1cnJbbGFzdF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBSZW1vdmUgdGhlIG93biBwcm9wZXJ0eSBhdCBgcGF0aGAgaW4gYG9iamAgKHRoZSByZXBsYXkgcHJpbWl0aXZlIGZvciB0aGVcbiAqIGBkZWxldGVgIGNvbW1pdCB2ZXJiLCAjMTNjLUIpLiBOby1vcCB3aGVuIGFueSBpbnRlcm1lZGlhdGUgc2VnbWVudCBpc1xuICogbWlzc2luZyDigJQgZGVsZXRpbmcgYW4gYWJzZW50IGtleSBoYXMgbm90aGluZyB0byByZW1vdmUuXG4gKlxuICogU2VjdXJpdHk6IHNhbWUgREVOSUVEICsgaGFzT3duUHJvcGVydHkgZGlzY2lwbGluZSBhcyBuYXRpdmVHZXQg4oCUIGV2ZXJ5XG4gKiBzZWdtZW50IGlzIGNoZWNrZWQsIHNvIGBuYXRpdmVEZWxldGUob2JqLCAnX19wcm90b19fXHUwMDFmeCcpYCBhbmRcbiAqIHByb3RvdHlwZS1jaGFpbiB3YWxrcyBhcmUgaW5lcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVEZWxldGUob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoc2VnKSkpIHJldHVybjtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8IHR5cGVvZiBjdXJyICE9PSAnb2JqZWN0JyB8fCAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnIsIHNlZykpIHJldHVybjtcbiAgICBjdXJyID0gY3VycltzZWddO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBzZWdzW3NlZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChERU5JRUQuaGFzKFN0cmluZyhsYXN0KSkpIHJldHVybjtcbiAgaWYgKGN1cnIgIT0gbnVsbCAmJiB0eXBlb2YgY3VyciA9PT0gJ29iamVjdCcpIHtcbiAgICBkZWxldGUgY3VycltsYXN0XTtcbiAgfVxufVxuXG4vLyDilIDilIAgQ29weS1vbi13cml0ZSBwcmltaXRpdmVzIChkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKSDilIDilIBcbi8vXG4vLyBUSEUgTEFXOiBhIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGlzIG5ldmVyIGVkaXRlZC4gQSB3cml0ZXIgY29waWVzIHRoZSByb290XG4vLyBhbmQgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggcGF0aCBpdCB3cml0ZXMsIGVkaXRzIG9ubHkgY29udGFpbmVycyBpdFxuLy8gY3JlYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIChpdHMgYG93bmVkYCBzZXQpLCBhbmQgc2hhcmVzIGV2ZXJ5XG4vLyBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LiBUaGUgc2FtZSBsYXdcbi8vIGByZWFjdGl2ZS9zdHJ1Y3R1cmFsV3JpdGUudHMgwrcgc2V0SW5QYXRoYCBhcHBsaWVzIHRvIGEgc2luZ2xlIHZhbHVlLlxuXG4vKiogQSBjb250YWluZXIgYSB3cml0ZXIgbWF5IG93bjogYW55dGhpbmcgYHR5cGVvZiAnb2JqZWN0J2AgYW5kIG5vdCBudWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29udGFpbmVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogYHBhcmVudFtrZXldYCB3aGVuIGBwYXJlbnRgIGlzIGEgY29udGFpbmVyIHRoYXQgT1dOUyBga2V5YCDigJQgdGhlIHNsb3RcbiAqIHtAbGluayBuYXRpdmVHZXR9IHdvdWxkIHJlYWQsIHJlZnVzaW5nIHRoZSBzYW1lIHByb3RvdHlwZS1wb2xsdXRpb25cbiAqIHNlZ21lbnRzIOKAlCBlbHNlIGB1bmRlZmluZWRgLiBPbmUgc3RlcCBvZiBhIHBhdGggd2Fsay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkNoaWxkKHBhcmVudDogdW5rbm93biwga2V5OiBzdHJpbmcgfCBudW1iZXIpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzQ29udGFpbmVyKHBhcmVudCkgJiYgIURFTklFRC5oYXMoU3RyaW5nKGtleSkpICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJlbnQsIGtleSlcbiAgICA/IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgdW5rbm93bj4pW2tleV1cbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgZm9yIGFuIG93biBrZXkgb2YgYW4gYXJyYXkgdGhhdCBpcyBhbiBhcnJheSBJTkRFWCAoYCcwJ2AsIGAnMTInYCksIG5vdCBhIG5hbWUgKGBhcnIubm90ZWApLiAqL1xuZnVuY3Rpb24gaXNBcnJheUluZGV4S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIoa2V5KTtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobikgJiYgbiA+PSAwICYmIG4gPCA0Mjk0OTY3Mjk1ICYmIFN0cmluZyhuKSA9PT0ga2V5O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lZCAobm9uLWluZGV4KSBvd24ga2V5cyBvZiBhbiBhcnJheSwgaW4gb3JkZXIuIE93bi1rZXkgb3JkZXIgcHV0c1xuICogZXZlcnkgaW5kZXggZmlyc3QsIGFzY2VuZGluZywgYW5kIG5hbWVzIGFmdGVyIHRoZW0g4oCUIHNvIHRoZSBuYW1lcyBhcmUgdGhlXG4gKiB0YWlsIG9mIGBPYmplY3Qua2V5c2AsIGFuZCBhbiBhcnJheSB3aXRob3V0IGFueSBpcyB0b2xkIGJ5IGl0cyBsYXN0IGtleS5cbiAqL1xuZnVuY3Rpb24gbmFtZWRBcnJheUtleXMoYXJyYXk6IHVua25vd25bXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFycmF5KTtcbiAgbGV0IGZpcnN0ID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChmaXJzdCA+IDAgJiYgIWlzQXJyYXlJbmRleEtleShrZXlzW2ZpcnN0IC0gMV0pKSBmaXJzdC0tO1xuICByZXR1cm4ga2V5cy5zbGljZShmaXJzdCk7XG59XG5cbi8qKlxuICogQSBTSEFMTE9XIGNvcHkgb2Ygb25lIGNvbnRhaW5lciB0aGF0IGtlZXBzIGV2ZXJ5IHNsb3QgdGhlIHdob2xlLXN0YXRlXG4gKiBgc3RydWN0dXJlZENsb25lYCB0aGlzIHJlcGxhY2VkIGtlcHQg4oCUIHNvIGEgcGF0aCBjb3B5IGFuZCBhIGRlZXAgY2xvbmUgZ2l2ZVxuICogdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aDpcbiAqICAgLSBhIHBsYWluIG9iamVjdCAob3IgYSBudWxsLXByb3RvdHlwZSBvbmUpOiBpdHMgb3duIGVudW1lcmFibGUga2V5cywgaW5cbiAqICAgICBvcmRlciwgYnkgc3ByZWFkIOKAlCBhbiBvd24gYF9fcHJvdG9fX2Aga2V5IHN0YXlzIGEga2V5OyB0aGUgcmVzdWx0IGhhc1xuICogICAgIGBPYmplY3QucHJvdG90eXBlYCwgYXMgYSBjbG9uZSdzIGRvZXM7XG4gKiAgIC0gYW4gYXJyYXk6IGl0cyBpbmRpY2VzLCBob2xlcyBhbmQgbGVuZ3RoIChgc2xpY2VgKSBBTkQgYW55IG5hbWVkXG4gKiAgICAgcHJvcGVydHkgYSBuZXN0ZWQgd3JpdGUgaHVuZyBvZmYgaXQgKGBzbGljZWAgYWxvbmUgd291bGQgZHJvcCB0aG9zZSk7XG4gKiAgIC0gYW55dGhpbmcgZWxzZSDigJQgYSBgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgdHlwZWQgYXJyYXksIGEgY2xhc3MgaW5zdGFuY2Ug4oCUXG4gKiAgICAgaXMgZGVlcC1jbG9uZWQsIHdoaWNoIGlzIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIGRpZCB0byBpdDsgYW5kIHRoZVxuICogICAgIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgdGhlIGNsb25lIGNhbm5vdCBjYXJyeSAoYW4gZXhwYW5kbyBhIG5lc3RlZFxuICogICAgIHdyaXRlIGh1bmcgb24gYSBgRGF0ZWApIGFyZSBjYXJyaWVkIG92ZXIgYnkgcmVmZXJlbmNlLCBzbyBhIGxhdGVyIHdyaXRlXG4gKiAgICAgdGhyb3VnaCBpdCBjaGFuZ2VzIGV4YWN0bHkgaXRzIG93biBwYXRoLiBSYXJlIG9uIGEgd3JpdGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dDb3B5PFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRhaW5lcjogVCk6IFQge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb250YWluZXIpKSB7XG4gICAgY29uc3QgY29weSA9IGNvbnRhaW5lci5zbGljZSgpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbmFtZWRBcnJheUtleXMoY29udGFpbmVyKSkgY29weVtrZXldID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgIHJldHVybiBjb3B5IGFzIHVua25vd24gYXMgVDtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb250YWluZXIpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiB7IC4uLmNvbnRhaW5lciB9O1xuICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKGNvbnRhaW5lcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbnRhaW5lcikpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb3B5LCBrZXkpKSBjb3B5W2tleV0gPSAoY29udGFpbmVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IHJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrID0gc2Vnc1tpXTtcbiAgICBpZiAoREVOSUVELmhhcyhTdHJpbmcoaykpKSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IGN1cnJba107XG4gICAgaWYgKCFpc0NvbnRhaW5lcihuZXh0KSkgcmV0dXJuO1xuICAgIGlmIChvd25lZC5oYXMobmV4dCkpIHtcbiAgICAgIGN1cnIgPSBuZXh0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvcHkgPSBzaGFsbG93Q29weShuZXh0KTtcbiAgICBvd25lZC5hZGQoY29weSk7XG4gICAgY3VycltrXSA9IGNvcHk7XG4gICAgY3VyciA9IGNvcHk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcm9vdCBvZiBhIG5ldyBnZW5lcmF0aW9uOiBhIHNoYWxsb3cgY29weSBvZiBgYmFzZWAgd2hlbiBpdCBpcyBhXG4gKiBjb250YWluZXIgKG93bmVkIGJ5IHRoZSB3cml0ZXIpLCBlbHNlIHRoZSBoaXN0b3JpY2FsIGRlZXAgY2xvbmUgb2YgYVxuICogbm9uLWNvbnRhaW5lciBiYXNlIChgdW5kZWZpbmVkYCwgYSBwcmltaXRpdmUpIHNvIHRoZSBjYWxsZXJzJyBiZWhhdmlvdXIgb25cbiAqIHN1Y2ggYSBiYXNlIGlzIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bmVkUm9vdE9mKGJhc2U6IGFueSwgb3duZWQ/OiBXZWFrU2V0PG9iamVjdD4pOiBhbnkge1xuICBpZiAoIWlzQ29udGFpbmVyKGJhc2UpKSByZXR1cm4gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBjb25zdCByb290ID0gc2hhbGxvd0NvcHkoYmFzZSk7XG4gIG93bmVkPy5hZGQocm9vdCk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogTWFyayBhIHZhbHVlIHRoZSB3cml0ZXIganVzdCBjcmVhdGVkIChhIGZyZXNoIGNsb25lLCBhIG1lcmdlIHJlc3VsdCkgYXMgb3duZWQuICovXG5leHBvcnQgZnVuY3Rpb24gb3duKHZhbHVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIGlzQ29udGFpbmVyKHZhbHVlKSkgb3duZWQuYWRkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBNYXJrIEVWRVJZIGNvbnRhaW5lciBvZiBhIHRyZWUgdGhlIHdyaXRlciBqdXN0IGNyZWF0ZWQgd2hvbGUgKGFcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlc3VsdCkgYXMgb3duZWQsIHNvIGEgbGF0ZXIgd3JpdGUgdGhyb3VnaCBhbnkgb2YgdGhlbVxuICogZWRpdHMgaXQgaW4gcGxhY2UgaW5zdGVhZCBvZiBjb3B5aW5nIGl0IGFnYWluLiBXYWxrcyBvd24gZW51bWVyYWJsZSBrZXlzIOKAlFxuICogdGhlIHNsb3RzIGEgcGF0aCBjYW4gYWRkcmVzczsgYSBgTWFwYCdzIG9yIGBTZXRgJ3MgZW50cmllcyBhcmUgbm90LiBPKHRoZVxuICogdHJlZSdzIGNvbnRhaW5lcnMpOyBhIGNvbnRhaW5lciBhbHJlYWR5IG93bmVkIGlzIG5vdCB3YWxrZWQgdHdpY2UgKGEgY3ljbGVcbiAqIGluc2lkZSB0aGUgY2xvbmUgZW5kcyB0aGVyZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG9wdCh0cmVlOiB1bmtub3duLCBvd25lZDogV2Vha1NldDxvYmplY3Q+KTogdm9pZCB7XG4gIGNvbnN0IHN0YWNrOiB1bmtub3duW10gPSBbdHJlZV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCBvd25lZC5oYXModmFsdWUpKSBjb250aW51ZTtcbiAgICBvd25lZC5hZGQodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgc3RhY2sucHVzaCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYG9iamAgaGFzIGFuIG93biBwcm9wZXJ0eSBhdCBldmVyeSBzZWdtZW50IG9mIGBwYXRoYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVIYXMob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VncyA9IHRvU2VnbWVudHMocGF0aCk7XG4gIGxldCBjdXJyID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY3VyciA9PSBudWxsIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2Vnc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA8IHNlZ3MubGVuZ3RoIC0gMSkgY3VyciA9IGN1cnJbc2Vnc1tpXV07XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCBtZXJnZSB3aGVyZSBkZXN0aW5hdGlvbiB3aW5zIGZvciBhbnkgZGVmaW5lZCB2YWx1ZS5cbiAqIEZpbGxzIG1pc3Npbmcga2V5cyBmcm9tIGBzcmNgLCBidXQgbmV2ZXIgb3ZlcndyaXRlcyBkZWZpbmVkIGtleXMgaW4gYGRzdGAuXG4gKiBBcnJheXMgYXJlIG5vdCByZWN1cnNlZCDigJQgZHN0IGFycmF5IGFsd2F5cyB3aW5zIHdoZW4gcHJlc2VudC5cbiAqXG4gKiBSZXBsYWNlczogYG1lcmdlV2l0aChkc3QsIHNyYywgKG9ialZhbHVlKSA9PiBvYmpWYWx1ZSAhPT0gdW5kZWZpbmVkID8gb2JqVmFsdWUgOiB1bmRlZmluZWQpYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb250ZXh0V2lucyhkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICByZXR1cm4gZHN0ICE9PSB1bmRlZmluZWQgPyBkc3QgOiBzcmM7XG4gIH1cbiAgY29uc3Qgb3V0OiBhbnkgPSBkc3QgIT0gbnVsbCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IHsgLi4uZHN0IH0gOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIGlmIChERU5JRUQuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdFZhbCA9IG91dFtrZXldO1xuICAgIGlmIChkc3RWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZHN0IHdpbnM7IHJlY3Vyc2Ugb25seSBpZiBib3RoIHNpZGVzIGFyZSBwbGFpbiBvYmplY3RzXG4gICAgICBpZiAoXG4gICAgICAgIGRzdFZhbCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZHN0VmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShkc3RWYWwpICYmXG4gICAgICAgIHNyY1trZXldICE9PSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBzcmNba2V5XSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoc3JjW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUNvbnRleHRXaW5zKGRzdFZhbCwgc3JjW2tleV0pO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBrZWVwIGRzdFZhbCB1bmNoYW5nZWRcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W2tleV0gPSBzcmNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
290
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aE9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3BhdGhPcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRWxFLCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXdCO0lBQ3RELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBa0M7SUFDcEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVEsRUFBRSxJQUFrQyxFQUFFLFlBQWtCO0lBQ3hGLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLFlBQVksQ0FBQztRQUN0QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUks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R0FBRyxDQUFDLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUN4QixDQUFDO2dCQUNELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELDZCQUE2QjtRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHBhdGhPcHMudHMg4oCUIE5hdGl2ZSBuZXN0ZWQtcGF0aCBoZWxwZXJzIChyZXBsYWNlcyBsb2Rhc2guZ2V0L3NldC9oYXMvbWVyZ2V3aXRoKVxuICpcbiAqIFRoZSBERU5JRUQgc2V0IGlzIHRoZSBzaGFyZWQgcnVsZSBmb3IgdGhyZWUgcHJvdG90eXBlLXBvbGx1dGlvbiBzZWxlY3RvclxuICogc2VnbWVudHMgKF9fcHJvdG9fXywgY29uc3RydWN0b3IsIHByb3RvdHlwZSkuIEVhY2ggb3BlcmF0aW9uJ3MgdHJhdmVyc2FsXG4gKiBjb250cmFjdCBpcyBleHBsaWNpdCBiZWxvdzsgbWVyZWx5IHVzaW5nIHRoaXMgbW9kdWxlIGlzIG5vdCBhIHNhbmRib3guXG4gKlxuICogSW50ZW50aW9uYWwgYXN5bW1ldHJ5OlxuICogICAtIG5hdGl2ZVNldCDigJQgREVOSUVEIGNoZWNrIGF0IGVhY2ggc2VnbWVudDsgdXNlZCBvbiB3cml0ZXItb3duZWRcbiAqICAgICBjb250YWluZXJzLiBJdCBjYW4gZm9sbG93IGFuIGluaGVyaXRlZCBvYmplY3QgdW5kZXIgYW4gb3JkaW5hcnkga2V5LlxuICogICAtIG5hdGl2ZUdldCDigJQgREVOSUVEIGNoZWNrICsgaGFzT3duUHJvcGVydHkgYXQgZXZlcnkgc3RlcC5cbiAqICAgLSBuYXRpdmVIYXMg4oCUIG93bi1wcm9wZXJ0eSBleGlzdGVuY2Ugb25seSwgaW5jbHVkaW5nIG93biBkZW5pZWQgbmFtZXNcbiAqICAgICBhbmQgb3duIHVuZGVmaW5lZCB2YWx1ZXM7IGl0IGRvZXMgbm90IHVzZSB0aGUgREVOSUVEIHJ1bGUuXG4gKiAgIC0gbWVyZ2VDb250ZXh0V2lucyDigJQgREVOSUVEIGNoZWNrIG9ubHk7IE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seVxuICogICAgIGJ5IHNwZWMgc28gcHJvdG90eXBlIGtleXMgbmV2ZXIgYXBwZWFyIGluIHRoZSBpdGVyYXRpb24uXG4gKlxuICogTmVzdGVkIGRpYWdub3N0aWMgd3JpdGVycyBoYXZlIHRoZWlyIG93biB3aG9sZS1zZWxlY3RvciBwcmVmbGlnaHQgYW5kXG4gKiBvd24tcHJvcGVydHkgd3JpdGVzIGluIHV0aWxzLnRzLCB1c2luZyB0aGUgc2FtZSBpc0RlbmllZFNlZ21lbnQgcHJlZGljYXRlLlxuICpcbiAqIFBhdGhzIG1heSBiZSBkb3Qtbm90YXRpb24gc3RyaW5ncyBvciBwcmUtc3BsaXQgKHN0cmluZ3xudW1iZXIpW10gYXJyYXlzLlxuICovXG5cbmltcG9ydCB7IHB1dE93biB9IGZyb20gJy4uL2NhcHR1cmUvb3duRGF0YS5qcyc7XG5cbmNvbnN0IERFTklFRCA9IG5ldyBTZXQoWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10pO1xuXG4vKiogSXMgYHNlZ21lbnRgIG9uZSBvZiB0aGUgdGhyZWUgZGVuaWVkIHByb3RvdHlwZS1wb2xsdXRpb24gc2VsZWN0b3IgbmFtZXM/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gREVOSUVELmhhcyhTdHJpbmcoc2VnbWVudCkpO1xufVxuXG5mdW5jdGlvbiB0b1NlZ21lbnRzKHBhdGg6IHN0cmluZyB8IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGF0aCkgPyBwYXRoIDogcGF0aC5zcGxpdCgnLicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgYXQgYHBhdGhgIGluIGBvYmpgLCByZXR1cm5pbmcgYGRlZmF1bHRWYWx1ZWAgaWYgYWJzZW50LlxuICpcbiAqIFNlY3VyaXR5OiBlYWNoIHBhdGggc2VnbWVudCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIERFTklFRCBsaXN0IGFuZCByZXF1aXJlc1xuICogYW4gb3duIHByb3BlcnR5IGF0IGV2ZXJ5IHN0ZXAsIHByZXZlbnRpbmcgcHJvdG90eXBlLWNoYWluIHJlYWRzLlxuICogZS5nLiBuYXRpdmVHZXQoe30sICdfX3Byb3RvX18nKSBhbmQgbmF0aXZlR2V0KHt9LCAnY29uc3RydWN0b3InKSBib3RoIHJldHVyblxuICogYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBvZiBsZWFraW5nIE9iamVjdC5wcm90b3R5cGUgLyB0aGUgT2JqZWN0IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlR2V0KG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ3MpIHtcbiAgICBpZiAoY3VyciA9PSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyLCBzZWcpKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgcmV0dXJuIGN1cnIgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IGN1cnI7XG59XG5cbi8qKiBNdXRhdGUgYG9iamAsIHNldHRpbmcgYHZhbHVlYCBhdCBgcGF0aGAgKGNyZWF0ZXMgaW50ZXJtZWRpYXRlIG9iamVjdHMpLiBSZXR1cm5zIGBvYmpgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZVNldChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHNlZ3MgPSB0b1NlZ21lbnRzKHBhdGgpO1xuICBsZXQgY3VyciA9IG9iajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGsgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhrKSkpIHJldHVybiBvYmo7XG4gICAgaWYgKGN1cnJba10gPT0gbnVsbCB8fCB0eXBlb2YgY3VycltrXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGN1cnJba10gPSB0eXBlb2Ygc2Vnc1tpICsgMV0gPT09ICdudW1iZXInID8gW10gOiB7fTtcbiAgICB9XG4gICAgY3VyciA9IGN1cnJba107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuIG9iajtcbiAgY3VycltsYXN0XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgb3duIHByb3BlcnR5IGF0IGBwYXRoYCBpbiBgb2JqYCAodGhlIHJlcGxheSBwcmltaXRpdmUgZm9yIHRoZVxuICogYGRlbGV0ZWAgY29tbWl0IHZlcmIsICMxM2MtQikuIE5vLW9wIHdoZW4gYW55IGludGVybWVkaWF0ZSBzZWdtZW50IGlzXG4gKiBtaXNzaW5nIOKAlCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGhhcyBub3RoaW5nIHRvIHJlbW92ZS5cbiAqXG4gKiBTZWN1cml0eTogc2FtZSBERU5JRUQgKyBoYXNPd25Qcm9wZXJ0eSBkaXNjaXBsaW5lIGFzIG5hdGl2ZUdldCDigJQgZXZlcnlcbiAqIHNlZ21lbnQgaXMgY2hlY2tlZCwgc28gYG5hdGl2ZURlbGV0ZShvYmosICdfX3Byb3RvX19cdTAwMWZ4JylgIGFuZFxuICogcHJvdG90eXBlLWNoYWluIHdhbGtzIGFyZSBpbmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdGl2ZURlbGV0ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICBjb25zdCBzZWdzID0gdG9TZWdtZW50cyhwYXRoKTtcbiAgbGV0IGN1cnIgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vncy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdzW2ldO1xuICAgIGlmIChERU5JRUQuaGFzKFN0cmluZyhzZWcpKSkgcmV0dXJuO1xuICAgIGlmIChjdXJyID09IG51bGwgfHwgdHlwZW9mIGN1cnIgIT09ICdvYmplY3QnIHx8ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3Vyciwgc2VnKSkgcmV0dXJuO1xuICAgIGN1cnIgPSBjdXJyW3NlZ107XG4gIH1cbiAgY29uc3QgbGFzdCA9IHNlZ3Nbc2Vncy5sZW5ndGggLSAxXTtcbiAgaWYgKERFTklFRC5oYXMoU3RyaW5nKGxhc3QpKSkgcmV0dXJuO1xuICBpZiAoY3VyciAhPSBudWxsICYmIHR5cGVvZiBjdXJyID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyW2xhc3RdO1xuICB9XG59XG5cbi8vIOKUgOKUgCBDb3B5LW9uLXdyaXRlIHByaW1pdGl2ZXMgKGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpIOKUgOKUgFxuLy9cbi8vIFRIRSBMQVc6IGEgY29tbWl0dGVkIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBBIHdyaXRlciBjb3BpZXMgdGhlIHJvb3Rcbi8vIGFuZCBldmVyeSBjb250YWluZXIgb24gZWFjaCBwYXRoIGl0IHdyaXRlcywgZWRpdHMgb25seSBjb250YWluZXJzIGl0XG4vLyBjcmVhdGVkIGR1cmluZyB0aGUgY3VycmVudCBvcGVyYXRpb24gKGl0cyBgb3duZWRgIHNldCksIGFuZCBzaGFyZXMgZXZlcnlcbi8vIG90aGVyIHN1YnRyZWUgd2l0aCB0aGUgZ2VuZXJhdGlvbiBiZWZvcmUgaXQuIFRoZSBzYW1lIGxhd1xuLy8gYHJlYWN0aXZlL3N0cnVjdHVyYWxXcml0ZS50cyDCtyBzZXRJblBhdGhgIGFwcGxpZXMgdG8gYSBzaW5nbGUgdmFsdWUuXG5cbi8qKiBBIGNvbnRhaW5lciBhIHdyaXRlciBtYXkgb3duOiBhbnl0aGluZyBgdHlwZW9mICdvYmplY3QnYCBhbmQgbm90IG51bGwuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb250YWluZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBgcGFyZW50W2tleV1gIHdoZW4gYHBhcmVudGAgaXMgYSBjb250YWluZXIgdGhhdCBPV05TIGBrZXlgIOKAlCB0aGUgc2xvdFxuICoge0BsaW5rIG5hdGl2ZUdldH0gd291bGQgcmVhZCwgcmVmdXNpbmcgdGhlIHNhbWUgcHJvdG90eXBlLXBvbGx1dGlvblxuICogc2VnbWVudHMg4oCUIGVsc2UgYHVuZGVmaW5lZGAuIE9uZSBzdGVwIG9mIGEgcGF0aCB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duQ2hpbGQocGFyZW50OiB1bmtub3duLCBrZXk6IHN0cmluZyB8IG51bWJlcik6IHVua25vd24ge1xuICByZXR1cm4gaXNDb250YWluZXIocGFyZW50KSAmJiAhREVOSUVELmhhcyhTdHJpbmcoa2V5KSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmVudCwga2V5KVxuICAgID8gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVHJ1ZSBmb3IgYW4gb3duIGtleSBvZiBhbiBhcnJheSB0aGF0IGlzIGFuIGFycmF5IElOREVYIChgJzAnYCwgYCcxMidgKSwgbm90IGEgbmFtZSAoYGFyci5ub3RlYCkuICovXG5mdW5jdGlvbiBpc0FycmF5SW5kZXhLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbiA9IE51bWJlcihrZXkpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihuKSAmJiBuID49IDAgJiYgbiA8IDQyOTQ5NjcyOTUgJiYgU3RyaW5nKG4pID09PSBrZXk7XG59XG5cbi8qKlxuICogVGhlIG5hbWVkIChub24taW5kZXgpIG93biBrZXlzIG9mIGFuIGFycmF5LCBpbiBvcmRlci4gT3duLWtleSBvcmRlciBwdXRzXG4gKiBldmVyeSBpbmRleCBmaXJzdCwgYXNjZW5kaW5nLCBhbmQgbmFtZXMgYWZ0ZXIgdGhlbSDigJQgc28gdGhlIG5hbWVzIGFyZSB0aGVcbiAqIHRhaWwgb2YgYE9iamVjdC5rZXlzYCwgYW5kIGFuIGFycmF5IHdpdGhvdXQgYW55IGlzIHRvbGQgYnkgaXRzIGxhc3Qga2V5LlxuICovXG5mdW5jdGlvbiBuYW1lZEFycmF5S2V5cyhhcnJheTogdW5rbm93bltdKTogc3RyaW5nW10ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyYXkpO1xuICBsZXQgZmlyc3QgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGZpcnN0ID4gMCAmJiAhaXNBcnJheUluZGV4S2V5KGtleXNbZmlyc3QgLSAxXSkpIGZpcnN0LS07XG4gIHJldHVybiBrZXlzLnNsaWNlKGZpcnN0KTtcbn1cblxuLyoqXG4gKiBBIFNIQUxMT1cgY29weSBvZiBvbmUgY29udGFpbmVyIHRoYXQga2VlcHMgZXZlcnkgc2xvdCB0aGUgd2hvbGUtc3RhdGVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoaXMgcmVwbGFjZWQga2VwdCDigJQgc28gYSBwYXRoIGNvcHkgYW5kIGEgZGVlcCBjbG9uZSBnaXZlXG4gKiB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoOlxuICogICAtIGEgcGxhaW4gb2JqZWN0IChvciBhIG51bGwtcHJvdG90eXBlIG9uZSk6IGl0cyBvd24gZW51bWVyYWJsZSBrZXlzLCBpblxuICogICAgIG9yZGVyLCBieSBzcHJlYWQg4oCUIGFuIG93biBgX19wcm90b19fYCBrZXkgc3RheXMgYSBrZXk7IHRoZSByZXN1bHQgaGFzXG4gKiAgICAgYE9iamVjdC5wcm90b3R5cGVgLCBhcyBhIGNsb25lJ3MgZG9lcztcbiAqICAgLSBhbiBhcnJheTogaXRzIGluZGljZXMsIGhvbGVzIGFuZCBsZW5ndGggKGBzbGljZWApIEFORCBhbnkgbmFtZWRcbiAqICAgICBwcm9wZXJ0eSBhIG5lc3RlZCB3cml0ZSBodW5nIG9mZiBpdCAoYHNsaWNlYCBhbG9uZSB3b3VsZCBkcm9wIHRob3NlKTtcbiAqICAgLSBhbnl0aGluZyBlbHNlIOKAlCBhIGBEYXRlYCwgYE1hcGAsIGBTZXRgLCB0eXBlZCBhcnJheSwgYSBjbGFzcyBpbnN0YW5jZSDigJRcbiAqICAgICBpcyBkZWVwLWNsb25lZCwgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgZGlkIHRvIGl0OyBhbmQgdGhlXG4gKiAgICAgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyB0aGUgY2xvbmUgY2Fubm90IGNhcnJ5IChhbiBleHBhbmRvIGEgbmVzdGVkXG4gKiAgICAgd3JpdGUgaHVuZyBvbiBhIGBEYXRlYCkgYXJlIGNhcnJpZWQgb3ZlciBieSByZWZlcmVuY2UsIHNvIGEgbGF0ZXIgd3JpdGVcbiAqICAgICB0aHJvdWdoIGl0IGNoYW5nZXMgZXhhY3RseSBpdHMgb3duIHBhdGguIFJhcmUgb24gYSB3cml0ZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd0NvcHk8VCBleHRlbmRzIG9iamVjdD4oY29udGFpbmVyOiBUKTogVCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb3B5ID0gY29udGFpbmVyLnNsaWNlKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBuYW1lZEFycmF5S2V5cyhjb250YWluZXIpKVxuICAgICAgcHV0T3duKGNvcHksIGtleSwgKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldKTtcbiAgICByZXR1cm4gY29weSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY29udGFpbmVyKTtcbiAgaWYgKHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsKSByZXR1cm4geyAuLi5jb250YWluZXIgfTtcbiAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZShjb250YWluZXIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb250YWluZXIpKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29weSwga2V5KSlcbiAgICAgIHB1dE93bihjb3B5LCBrZXksIChjb250YWluZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG4gIHJldHVybiBjb3B5IGFzIFQ7XG59XG5cbi8qKlxuICogTWFrZSB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvIGBwYXRoYCdzIExFQUYgb25lcyB0aGUgd3JpdGVyIG93bnMsIHNvXG4gKiB0aGUgd3JpdGUgdGhhdCBmb2xsb3dzIChgbmF0aXZlU2V0YCAvIGBuYXRpdmVEZWxldGVgIC8gYSB2ZXJiIGFybSkgZWRpdHNcbiAqIG5vdGhpbmcgaXQgZGlkIG5vdCBjcmVhdGUuXG4gKlxuICogYHJvb3RgIG11c3QgYWxyZWFkeSBiZSBvd25lZC4gV2Fsa2luZyBkb3duLCBldmVyeSBjb250YWluZXIgdGhlIHdyaXRlciBkaWRcbiAqIG5vdCBjcmVhdGUgKGBvd25lZGAgZG9lcyBub3QgaG9sZCBpdCkgaXMgcmVwbGFjZWQsIGluIGl0cyBwYXJlbnQsIGJ5IGl0c1xuICoge0BsaW5rIHNoYWxsb3dDb3B5fSwgd2hpY2ggdGhlIHdyaXRlciB0aGVuIG93bnMuIFRoZSB3YWxrIHN0b3BzIHdoZXJlXG4gKiBgbmF0aXZlU2V0YCB3b3VsZCBzdG9wIG9yIGNyZWF0ZTogYSBERU5JRUQgc2VnbWVudCAodGhlIHdyaXRlIGlzIHJlZnVzZWRcbiAqIHRoZXJlIGFueXdheSksIG9yIGEgbWlzc2luZyAvIHByaW1pdGl2ZSBpbnRlcm1lZGlhdGUgKGBuYXRpdmVTZXRgIG1ha2VzIGFcbiAqIGZyZXNoIGNvbnRhaW5lciBmcm9tIHRoYXQgcG9pbnQgb24pLiBUaGUgbGVhZiBpdHNlbGYgaXMgbmV2ZXIgY29waWVkIOKAlCB0aGVcbiAqIHdyaXRlIHJlcGxhY2VzIGl0LlxuICpcbiAqIENvc3Q6IG9uZSBzaGFsbG93IGNvcHkgcGVyIGNvbnRhaW5lciBvbiB0aGUgcGF0aCB0aGF0IHRoaXMgd3JpdGVyIGhhcyBub3RcbiAqIGFscmVhZHkgY29waWVkIOKAlCBPKGRlcHRoIMOXIHdpZHRoKSwgaW5kZXBlbmRlbnQgb2YgZXZlcnl0aGluZyB0aGUgd3JpdGVcbiAqIGRvZXMgbm90IHBhc3MgdGhyb3VnaC4gQSBwYXRoIG9mIG9uZSBzZWdtZW50IChhIHJvb3Qga2V5LCB0aGUgY29tbW9uIGNhc2UpXG4gKiBjb3BpZXMgbm90aGluZyBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3duU3BpbmUocm9vdDogYW55LCBwYXRoOiBzdHJpbmcgfCAoc3RyaW5nIHwgbnVtYmVyKVtdLCBvd25lZDogV2Vha1NldDxvYmplY3Q+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
|