footprintjs 9.23.0 → 9.23.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.
@@ -19,11 +19,10 @@ exports.createTypedScope = void 0;
19
19
  const pathOps_js_1 = require("../memory/pathOps.js");
20
20
  const allowlist_js_1 = require("./allowlist.js");
21
21
  const arrayTraps_js_1 = require("./arrayTraps.js");
22
- const jsonProjection_js_1 = require("./jsonProjection.js");
23
22
  const liveView_js_1 = require("./liveView.js");
24
- const pathBuilder_js_1 = require("./pathBuilder.js");
25
23
  const structuralWrite_js_1 = require("./structuralWrite.js");
26
24
  const types_js_1 = require("./types.js");
25
+ const writeTraps_js_1 = require("./writeTraps.js");
27
26
  const METHOD_ROUTES = {
28
27
  $getValue: (t) => t.getValue.bind(t),
29
28
  $setValue: (t) => t.setValue.bind(t),
@@ -102,178 +101,153 @@ function silentlyKnownKey(target, key) {
102
101
  return undefined;
103
102
  return target.getStateKeys().includes(key);
104
103
  }
105
- // -- Nested child proxy (for deep write interception) ------------------------
104
+ // -- Nested child proxies (for deep write interception) -----------------------
105
+ //
106
+ // Both factories are ORCHESTRATORS (9.23.1): reads are `liveView.ts`, writes
107
+ // are `writeTraps.ts` over a `rootKeySink`, and the ONE thing each decides
108
+ // itself is what a child member becomes — the cycle policy. Each holds its
109
+ // own per-member proxy cache (9.23.2, `liveView.ts · cachedMember`).
106
110
  //
107
111
  // Cycle safety: an immutable Set<object> of ancestor objects is passed down
108
112
  // each access chain. Each branch gets its own copy (new Set(parent)) so
109
113
  // scope.x.friend and scope.x.coworker don't pollute each other's tracking.
110
114
  // When a child value is already in the ancestor set, we've hit a cycle.
111
115
  // At the cycle break: return a terminal proxy that tracks writes (set trap
112
- // still builds path + calls updateValue) but doesn't recurse reads further.
113
- function createTerminalProxy(obj, rootKey, segments, target, readSilent, state, visited = new Set()) {
116
+ // still builds path + commits through the sink) but doesn't recurse reads
117
+ // further. The terminal chain shares ONE mutable `visited` set: a value seen
118
+ // anywhere past the cycle edge is handed back raw.
119
+ function createTerminalProxy(obj, sink, segments, visited = new Set()) {
114
120
  visited.add(obj);
115
- // Reads are LIVE (9.22.0) — see liveView.ts.
116
- const live = () => (0, liveView_js_1.liveObject)(obj, (0, pathOps_js_1.nativeGet)(readSilent(rootKey), segments));
117
- return new Proxy(obj, {
118
- get(_raw, prop) {
119
- const raw = live();
120
- if (typeof prop === 'symbol')
121
- return raw[prop];
122
- if (prop === 'then')
123
- return undefined;
124
- if (prop === 'asymmetricMatch')
125
- return undefined;
126
- if (prop === 'constructor')
127
- return Object;
128
- // Law: serializing a proxied value equals serializing $getValue's value.
129
- // Only a cycle back-edge is pruned (jsonProjection.ts).
130
- if (prop === 'toJSON')
131
- return () => (0, jsonProjection_js_1.toJSONView)(raw);
132
- const value = raw[prop];
133
- // An array past the cycle edge still gets copy-on-write interception —
134
- // it commits as a `set` of the root key, the same law as the nested
135
- // proxy above.
136
- if (Array.isArray(value) && (0, allowlist_js_1.shouldWrapWithProxy)(value)) {
137
- const arrSegments = [...segments, prop];
138
- return (0, arrayTraps_js_1.createArrayProxy)(() => (0, pathOps_js_1.nativeGet)(readSilent(rootKey), arrSegments) ?? [], (newArr) => {
139
- // The traps unwrapped the assigned value; the rebuilt array is
140
- // committed as it is (9.23.0 — untouched siblings by reference).
141
- target.setValue(rootKey, (0, structuralWrite_js_1.setInPath)(readSilent(rootKey), arrSegments, newArr));
142
- state.childCache.delete(rootKey);
143
- });
144
- }
145
- // Continue tracking writes at deeper levels via chained terminal proxies.
146
- // Use visited set to prevent re-entering the same object (cycle in terminal chain).
147
- if ((0, allowlist_js_1.shouldWrapWithProxy)(value) && !Array.isArray(value) && !visited.has(value)) {
148
- return createTerminalProxy(value, rootKey, [...segments, prop], target, readSilent, state, visited);
149
- }
121
+ const members = new liveView_js_1.MemberCache();
122
+ const live = () => (0, liveView_js_1.liveObject)(obj, sink.readAt(segments));
123
+ const child = (value, path) => {
124
+ if (!(0, allowlist_js_1.shouldWrapWithProxy)(value))
150
125
  return value;
151
- },
152
- set(_raw, prop, value) {
153
- if (typeof prop !== 'string')
154
- return true;
155
- const childSegments = [...segments, prop];
156
- const unwrapped = (0, structuralWrite_js_1.unwrapProxy)(value);
157
- // Same law as the nested proxy: an array assignment REPLACES.
158
- if (Array.isArray(unwrapped)) {
159
- target.setValue(rootKey, (0, structuralWrite_js_1.setInPath)(readSilent(rootKey), childSegments, unwrapped));
160
- state.childCache.delete(rootKey);
161
- return true;
162
- }
163
- const patch = (0, pathBuilder_js_1.buildNestedPatch)(childSegments, unwrapped);
164
- target.updateValue(rootKey, patch);
165
- state.childCache.delete(rootKey);
166
- return true;
167
- },
168
- deleteProperty(_raw, prop) {
169
- if (typeof prop !== 'string')
170
- return true;
171
- target.setValue(rootKey, (0, structuralWrite_js_1.deleteInPath)(readSilent(rootKey), [...segments, prop]));
172
- state.childCache.delete(rootKey);
173
- return true;
174
- },
126
+ // An array past the cycle edge still gets copy-on-write interception —
127
+ // it commits as a `set` of the root key, the same law as the nested proxy.
128
+ if (Array.isArray(value))
129
+ return (0, arrayTraps_js_1.arrayProxyAt)(sink, path);
130
+ if (visited.has(value))
131
+ return value;
132
+ return createTerminalProxy(value, sink, path, visited);
133
+ };
134
+ return new Proxy(obj, {
135
+ get: (0, liveView_js_1.liveGetTrap)(live, segments, child, members),
136
+ set: (0, writeTraps_js_1.sinkSetTrap)(sink, segments),
137
+ deleteProperty: (0, writeTraps_js_1.sinkDeleteTrap)(sink, segments),
175
138
  ...(0, liveView_js_1.liveInspectionTraps)(live),
176
139
  });
177
140
  }
178
- function createNestedProxy(obj, rootKey, segments, target, readSilent, state, ancestors = new Set()) {
141
+ function createNestedProxy(obj, sink, segments, ancestors = new Set()) {
179
142
  // Reads are LIVE (9.22.0): a held proxy reads its own writes, `'x' in o`
180
143
  // and `Object.keys(o)` see them, and `o.b = o.a * 10` uses the new `a`.
181
144
  // The captured object answers only when the path is gone — see liveView.ts.
182
- const live = () => (0, liveView_js_1.liveObject)(obj, (0, pathOps_js_1.nativeGet)(readSilent(rootKey), segments));
145
+ const members = new liveView_js_1.MemberCache();
146
+ const live = () => (0, liveView_js_1.liveObject)(obj, sink.readAt(segments));
147
+ const child = (value, path) => {
148
+ if (!(0, allowlist_js_1.shouldWrapWithProxy)(value))
149
+ return value;
150
+ // An array commits as a `set` of the ROOT KEY (reactive/README.md, law 3)
151
+ // — the sink's verb, whatever depth the array sits at.
152
+ if (Array.isArray(value))
153
+ return (0, arrayTraps_js_1.arrayProxyAt)(sink, path);
154
+ if (ancestors.has(value))
155
+ return createTerminalProxy(value, sink, path);
156
+ return createNestedProxy(value, sink, path, new Set(ancestors).add(value));
157
+ };
183
158
  return new Proxy(obj, {
184
- get(_raw, prop) {
185
- const raw = live();
186
- if (typeof prop === 'symbol')
187
- return raw[prop];
188
- // Guard properties
189
- if (prop === 'then')
190
- return undefined;
191
- if (prop === 'asymmetricMatch')
192
- return undefined;
193
- if (prop === 'constructor')
194
- return Object;
195
- // Law: serializing a proxied value equals serializing $getValue's value —
196
- // nested objects, arrays and Dates included. Only a cycle back-edge is
197
- // pruned, so circular state still never throws here (jsonProjection.ts).
198
- // This trap also carries the WRITE path: unwrapProxy() round-trips
199
- // through JSON, so `scope.copy = scope.results` commits via this view.
200
- if (prop === 'toJSON')
201
- return () => (0, jsonProjection_js_1.toJSONView)(raw);
202
- const value = raw[prop];
203
- // Primitive or non-wrappable -- return as-is (no deeper proxy)
204
- if (!(0, allowlist_js_1.shouldWrapWithProxy)(value))
205
- return value;
206
- const childSegments = [...segments, prop];
207
- // Array -- return array proxy.
208
- //
209
- // WHY THIS COMMITS A `set` OF THE ROOT KEY, not a merge of a nested patch
210
- // (9.22.0): an array mutation hands back the COMPLETE new array, and
211
- // `merge`'s array arm is a set UNION (`deepSmartMerge`). Committing
212
- // `[1,99,3]` as a merge onto `[1,2,3]` produced `[1,2,3,99]` — element
213
- // replacement, reordering and shrinking were unrepresentable through any
214
- // array that was not itself a top-level key, and the log recorded the
215
- // union faithfully, so state and log agreed and were both wrong. `set` is
216
- // the only verb that can say "this is the whole value now"; the root key
217
- // is the granularity every consumer indexes by (`findLastWriter`,
218
- // `sliceForKey`, `causalChain`), and it is exactly what a TOP-LEVEL array
219
- // write has always done. The new root is built by copying only the
220
- // containers on the path — the value read stays untouched.
221
- if (Array.isArray(value)) {
222
- return (0, arrayTraps_js_1.createArrayProxy)(() => {
223
- // Segments, not a dot-joined string: a nested key may itself contain
224
- // a dot, and joining would address the wrong node.
225
- const current = readSilent(rootKey);
226
- return (0, pathOps_js_1.nativeGet)(current, childSegments) ?? [];
227
- }, (newArr) => {
228
- // The traps unwrapped the assigned value; the rebuilt array is
229
- // committed as it is (9.23.0 — untouched siblings by reference).
230
- target.setValue(rootKey, (0, structuralWrite_js_1.setInPath)(readSilent(rootKey), childSegments, newArr));
231
- state.childCache.delete(rootKey);
232
- });
233
- }
234
- // Cycle detection: if this value is an ancestor in the current access
235
- // chain, return a terminal proxy (tracks writes, stops recursing reads).
236
- if (ancestors.has(value)) {
237
- return createTerminalProxy(value, rootKey, childSegments, target, readSilent, state);
238
- }
239
- // Build new ancestor set for this branch (immutable -- no cross-branch pollution)
240
- const childAncestors = new Set(ancestors);
241
- childAncestors.add(value);
242
- return createNestedProxy(value, rootKey, childSegments, target, readSilent, state, childAncestors);
243
- },
244
- set(_raw, prop, value) {
245
- if (typeof prop !== 'string')
246
- return true;
247
- const childSegments = [...segments, prop];
248
- const unwrapped = (0, structuralWrite_js_1.unwrapProxy)(value);
249
- // An ARRAY assignment REPLACES, at every depth (9.22.0). `merge`'s array
250
- // arm is a union, so `scope.k.tags = ['b']` used to APPEND — while the
251
- // identical expression one level up (`scope.tags = ['b']`) replaced, and
252
- // a shorter array (`scope.k.arr = [1]`) could not be expressed at all.
253
- // `$update(key, { tags: [...] })` remains the explicit append.
254
- if (Array.isArray(unwrapped)) {
255
- target.setValue(rootKey, (0, structuralWrite_js_1.setInPath)(readSilent(rootKey), childSegments, unwrapped));
256
- state.childCache.delete(rootKey);
257
- return true;
258
- }
259
- const patch = (0, pathBuilder_js_1.buildNestedPatch)(childSegments, unwrapped);
260
- target.updateValue(rootKey, patch);
261
- state.childCache.delete(rootKey);
262
- return true;
263
- },
264
- // `delete scope.order.customer.tier` — merge cannot express a REMOVAL
265
- // (a patch of `undefined` is read as absent by every consumer), so the key
266
- // is removed from a copy of the root and committed as a `set` of the root.
267
- deleteProperty(_raw, prop) {
268
- if (typeof prop !== 'string')
269
- return true;
270
- target.setValue(rootKey, (0, structuralWrite_js_1.deleteInPath)(readSilent(rootKey), [...segments, prop]));
271
- state.childCache.delete(rootKey);
272
- return true;
273
- },
159
+ get: (0, liveView_js_1.liveGetTrap)(live, segments, child, members),
160
+ set: (0, writeTraps_js_1.sinkSetTrap)(sink, segments),
161
+ deleteProperty: (0, writeTraps_js_1.sinkDeleteTrap)(sink, segments),
274
162
  ...(0, liveView_js_1.liveInspectionTraps)(live),
275
163
  });
276
164
  }
165
+ // -- Top-level leaves ---------------------------------------------------------
166
+ /** `internalRead` answered nothing: the name is a state key and must be read (tracked) from the target. */
167
+ const STATE_KEY = Symbol('state-key');
168
+ /**
169
+ * WHY: the names the scope answers ITSELF — internal symbols, the guard
170
+ * properties, Node's inspect hook, the `$`-methods, the executor's allowlisted
171
+ * pass-throughs (`attachScopeRecorder`, `notifyStageStart`, …, called directly
172
+ * on the scope) and the JSON probe — must never become tracked reads;
173
+ * everything else is a state key and is left to the caller.
174
+ *
175
+ * The probe: `JSON.stringify` asks EVERY value for a `toJSON` method. That
176
+ * question comes from the runtime, not the stage author, so it must not enter
177
+ * the read set. A state key literally called 'toJSON' is legal: when it EXISTS
178
+ * this is a genuine read and stays tracked, and when the target cannot answer
179
+ * silently, truth wins over noise — fall through.
180
+ */
181
+ function internalRead(target, state, prop) {
182
+ if (prop === types_js_1.IS_TYPED_SCOPE)
183
+ return true;
184
+ if (prop === types_js_1.BREAK_SETTER) {
185
+ return (fn) => {
186
+ state.breakFn = fn;
187
+ };
188
+ }
189
+ if (typeof prop === 'symbol') {
190
+ if (Object.prototype.hasOwnProperty.call(GUARD_PROPS, prop))
191
+ return GUARD_PROPS[prop];
192
+ if (prop === Symbol.for('nodejs.util.inspect.custom'))
193
+ return () => target.getValue();
194
+ return undefined;
195
+ }
196
+ if (Object.prototype.hasOwnProperty.call(GUARD_PROPS, prop))
197
+ return GUARD_PROPS[prop];
198
+ if (types_js_1.SCOPE_METHOD_NAMES.has(prop))
199
+ return METHOD_ROUTES[prop]?.(target, state);
200
+ if (types_js_1.EXECUTOR_INTERNAL_METHODS.has(prop) && typeof target[prop] === 'function') {
201
+ return target[prop].bind(target);
202
+ }
203
+ if (prop === 'toJSON' && silentlyKnownKey(target, prop) === false)
204
+ return undefined;
205
+ return STATE_KEY;
206
+ }
207
+ /**
208
+ * A wrappable state value becomes the array or nested proxy for its key;
209
+ * anything else is handed back raw. `scope.k === scope.k` holds within a
210
+ * stage through the same per-member cache every object proxy uses
211
+ * (`liveView.ts · cachedMember`): a write to the key drops the entry (the
212
+ * sink does it), a commit swaps the value and the ref check misses — either
213
+ * way the next read builds a fresh proxy over the new value.
214
+ */
215
+ function wrapStateValue(target, readSilent, state, key, value) {
216
+ if (value === null || value === undefined || typeof value !== 'object')
217
+ return value;
218
+ if (!(0, allowlist_js_1.shouldWrapWithProxy)(value))
219
+ return value; // Date, Map, class instance, frozen …
220
+ return (0, liveView_js_1.cachedMember)(state.childCache, key, value, () => {
221
+ const sink = (0, writeTraps_js_1.rootKeySink)(target, readSilent, key, state.childCache);
222
+ if (Array.isArray(value))
223
+ return (0, arrayTraps_js_1.arrayProxyAt)(sink, []);
224
+ return createNestedProxy(value, sink, [], new Set([value]));
225
+ }, []);
226
+ }
227
+ /** WHY: a `$`-name can never be a state key — the write is refused, not shadowed; every other assignment
228
+ * stores the unwrapped value (landmine 1) and drops the key's cached proxy. */
229
+ function assignStateKey(target, state, key, value) {
230
+ if (types_js_1.SCOPE_METHOD_NAMES.has(key)) {
231
+ throw new Error(`Cannot set state key "${key}" -- it conflicts with a reserved TypedScope method. Rename the state key to avoid $-prefixed names.`);
232
+ }
233
+ target.setValue(key, (0, structuralWrite_js_1.unwrapProxy)(value));
234
+ state.childCache.delete(key);
235
+ }
236
+ /** Does the key exist — answered without a tracked read wherever the target can; `getValue` is the last resort. */
237
+ function knownKey(target, key) {
238
+ if (target.hasKey)
239
+ return target.hasKey(key);
240
+ if (target.getStateKeys)
241
+ return target.getStateKeys().includes(key);
242
+ return target.getValue(key) !== undefined; // fallback: fires onRead (acceptable degradation)
243
+ }
244
+ /** Every state key — silently where the target can, else from a whole-state read. */
245
+ function stateKeys(target) {
246
+ if (target.getStateKeys)
247
+ return target.getStateKeys();
248
+ const snapshot = target.getValue();
249
+ return snapshot && typeof snapshot === 'object' ? Object.keys(snapshot) : [];
250
+ }
277
251
  // -- Top-level proxy (the main TypedScope) -----------------------------------
278
252
  /**
279
253
  * Creates a TypedScope<T> proxy wrapping a ReactiveTarget.
@@ -283,101 +257,20 @@ function createNestedProxy(obj, rootKey, segments, target, readSilent, state, an
283
257
  * @returns A Proxy with typed property access and $-prefixed methods
284
258
  */
285
259
  function createTypedScope(target, options) {
286
- const state = {
287
- breakFn: options?.breakPipeline,
288
- childCache: new Map(),
289
- };
290
- // Bind silent-read method once — avoids per-call ?? + .call() in array proxy getCurrent closures
260
+ const state = { breakFn: options?.breakPipeline, childCache: new liveView_js_1.MemberCache() };
261
+ // Bind the silent read once — the nested/array proxies resolve their live view through it.
291
262
  const readSilent = (target.getValueSilent ?? target.getValue).bind(target);
292
- const proxy = new Proxy(target, {
293
- get(_proxyTarget, prop, _receiver) {
294
- // 1. Internal symbols (check before other symbols)
295
- if (prop === types_js_1.IS_TYPED_SCOPE)
296
- return true;
297
- if (prop === types_js_1.BREAK_SETTER) {
298
- return (fn) => {
299
- state.breakFn = fn;
300
- };
301
- }
302
- // 2. Symbol properties (guard + inspection)
303
- if (typeof prop === 'symbol') {
304
- if (Object.prototype.hasOwnProperty.call(GUARD_PROPS, prop))
305
- return GUARD_PROPS[prop];
306
- // Node.js util.inspect — show state snapshot, not proxy internals
307
- if (prop === Symbol.for('nodejs.util.inspect.custom')) {
308
- return () => target.getValue();
309
- }
310
- return undefined;
311
- }
312
- // 3. String guard properties
313
- if (Object.prototype.hasOwnProperty.call(GUARD_PROPS, prop))
314
- return GUARD_PROPS[prop];
315
- // 4. $-prefixed methods -- route to facade
316
- if (types_js_1.SCOPE_METHOD_NAMES.has(prop)) {
317
- const router = METHOD_ROUTES[prop];
318
- if (router)
319
- return router(target, state);
320
- return undefined;
321
- }
322
- // 5. Executor-internal method pass-through (explicit allowlist)
323
- // FlowChartExecutor wrapping calls attachScopeRecorder, notifyStageStart, etc.
324
- // directly on the scope. Forward only allowlisted methods.
325
- if (types_js_1.EXECUTOR_INTERNAL_METHODS.has(prop) && typeof target[prop] === 'function') {
326
- return target[prop].bind(target);
327
- }
328
- // 6. Serialization protocol probe. JSON.stringify asks EVERY value for a
329
- // `toJSON` method before serializing it. That question comes from the
330
- // runtime, not from the stage author, so it must not enter the read
331
- // set — causalChain and sliceForKey would carry a key no chart names.
332
- // A state key literally called 'toJSON' is legal, though: when the key
333
- // really EXISTS this is a genuine read and stays tracked. And when the
334
- // target cannot answer silently (silentlyKnownKey -> undefined), truth
335
- // wins over noise: fall through and track. Never silently untracked.
336
- if (prop === 'toJSON' && silentlyKnownKey(target, prop) === false)
337
- return undefined;
338
- // 7. State key -- call getValue (fires onRead ONCE)
339
- const value = target.getValue(prop);
340
- // Primitive or null/undefined -- return as-is
341
- if (value === null || value === undefined || typeof value !== 'object') {
342
- return value;
343
- }
344
- // Non-wrappable (Date, Map, class instance, etc.) -- return unwrapped
345
- if (!(0, allowlist_js_1.shouldWrapWithProxy)(value))
346
- return value;
347
- // Array -- return array proxy (cached for identity equality)
348
- if (Array.isArray(value)) {
349
- const cached = state.childCache.get(prop);
350
- if (cached && cached.ref === value)
351
- return cached.proxy;
352
- const arrProxy = (0, arrayTraps_js_1.createArrayProxy)(() => readSilent(prop) ?? [], (newArr) => {
353
- // The traps unwrapped the assigned value; the rebuilt array is
354
- // committed as it is (9.23.0 — untouched siblings by reference,
355
- // so an element write is O(1) here, not a round-trip of N).
356
- target.setValue(prop, newArr);
357
- state.childCache.delete(prop);
358
- });
359
- state.childCache.set(prop, { ref: value, proxy: arrProxy });
360
- return arrProxy;
361
- }
362
- // Plain object -- return nested proxy (cached for identity equality)
363
- const cached = state.childCache.get(prop);
364
- if (cached && cached.ref === value)
365
- return cached.proxy;
366
- const nested = createNestedProxy(value, prop, [], target, readSilent, state, new Set([value]));
367
- state.childCache.set(prop, { ref: value, proxy: nested });
368
- return nested;
263
+ return new Proxy(target, {
264
+ get(_proxyTarget, prop) {
265
+ const answered = internalRead(target, state, prop);
266
+ if (answered !== STATE_KEY)
267
+ return answered;
268
+ // A state key: ONE tracked read (fires onRead once), then the wrapper.
269
+ return wrapStateValue(target, readSilent, state, prop, target.getValue(prop));
369
270
  },
370
271
  set(_proxyTarget, prop, value) {
371
- if (typeof prop !== 'string')
372
- return true;
373
- if (types_js_1.SCOPE_METHOD_NAMES.has(prop)) {
374
- throw new Error(`Cannot set state key "${prop}" -- it conflicts with a reserved TypedScope method. Rename the state key to avoid $-prefixed names.`);
375
- }
376
- // Unwrap Proxy values before storing — structuredClone in TransactionBuffer
377
- // cannot clone Proxy objects. This handles: scope.backup = scope.customer
378
- const unwrapped = (0, structuralWrite_js_1.unwrapProxy)(value);
379
- target.setValue(prop, unwrapped);
380
- state.childCache.delete(prop); // invalidate cache
272
+ if (typeof prop === 'string')
273
+ assignStateKey(target, state, prop, value);
381
274
  return true;
382
275
  },
383
276
  deleteProperty(_proxyTarget, prop) {
@@ -390,43 +283,17 @@ function createTypedScope(target, options) {
390
283
  has(_proxyTarget, prop) {
391
284
  if (typeof prop === 'symbol')
392
285
  return Object.prototype.hasOwnProperty.call(GUARD_PROPS, prop);
393
- if (types_js_1.SCOPE_METHOD_NAMES.has(prop))
394
- return true;
395
- // Use non-tracking hasKey if available, else fallback to getStateKeys
396
- if (target.hasKey)
397
- return target.hasKey(prop);
398
- if (target.getStateKeys)
399
- return target.getStateKeys().includes(prop);
400
- // Fallback: getValue fires onRead (acceptable degradation)
401
- return target.getValue(prop) !== undefined;
402
- },
403
- ownKeys() {
404
- // Use non-tracking getStateKeys if available, else fallback
405
- if (target.getStateKeys)
406
- return target.getStateKeys();
407
- const snapshot = target.getValue();
408
- if (!snapshot || typeof snapshot !== 'object')
409
- return [];
410
- return Object.keys(snapshot);
286
+ return types_js_1.SCOPE_METHOD_NAMES.has(prop) || knownKey(target, prop);
411
287
  },
288
+ ownKeys: () => stateKeys(target),
412
289
  getOwnPropertyDescriptor(_proxyTarget, prop) {
413
- if (typeof prop !== 'string')
414
- return undefined;
415
- if (types_js_1.SCOPE_METHOD_NAMES.has(prop))
290
+ if (typeof prop !== 'string' || types_js_1.SCOPE_METHOD_NAMES.has(prop))
416
291
  return undefined; // $-methods are non-enumerable
417
- // Check existence without firing onRead — no getValue call here
418
- const exists = target.hasKey
419
- ? target.hasKey(prop)
420
- : target.getStateKeys
421
- ? target.getStateKeys().includes(prop)
422
- : target.getValue(prop) !== undefined; // fallback only
423
- if (!exists)
292
+ if (!knownKey(target, prop))
424
293
  return undefined;
425
- // Return a minimal descriptor — actual value is fetched via the get trap
426
- return { configurable: true, enumerable: true, writable: true };
294
+ return { configurable: true, enumerable: true, writable: true }; // the value is fetched via the get trap
427
295
  },
428
296
  });
429
- return proxy;
430
297
  }
431
298
  exports.createTypedScope = createTypedScope;
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7OztBQUVILHFEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsbURBQW1EO0FBQ25ELDJEQUFpRDtBQUNqRCwrQ0FBZ0U7QUFDaEUscURBQW9EO0FBQ3BELDZEQUE0RTtBQUU1RSx5Q0FBeUc7QUFNekcsTUFBTSxhQUFhLEdBQWlDO0lBQ2xELFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekMsT0FBTyxJQUFBLHNCQUFTLEVBQUMsS0FB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QUFDLE1BQU07Z0JBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZO29CQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLGdCQUFnQjtZQUN6RCxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5Qix5RUFBeUU7WUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDbEUsQ0FBQztLQUNGLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQS9KRCw0Q0ErSkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGNyZWF0ZUFycmF5UHJveHkgfSBmcm9tICcuL2FycmF5VHJhcHMuanMnO1xuaW1wb3J0IHsgdG9KU09OVmlldyB9IGZyb20gJy4vanNvblByb2plY3Rpb24uanMnO1xuaW1wb3J0IHsgbGl2ZUluc3BlY3Rpb25UcmFwcywgbGl2ZU9iamVjdCB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgYnVpbGROZXN0ZWRQYXRjaCB9IGZyb20gJy4vcGF0aEJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgZGVsZXRlSW5QYXRoLCBzZXRJblBhdGgsIHVud3JhcFByb3h5IH0gZnJvbSAnLi9zdHJ1Y3R1cmFsV3JpdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdGl2ZU9wdGlvbnMsIFJlYWN0aXZlVGFyZ2V0LCBUeXBlZFNjb3BlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBCUkVBS19TRVRURVIsIEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMsIElTX1RZUEVEX1NDT1BFLCBTQ09QRV9NRVRIT0RfTkFNRVMgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gLS0gJC1tZXRob2Qgcm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIE1ldGhvZFJvdXRlciA9ICh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRzOiBSZWFjdGl2ZVN0YXRlKSA9PiB1bmtub3duO1xuXG5jb25zdCBNRVRIT0RfUk9VVEVTOiBSZWNvcmQ8c3RyaW5nLCBNZXRob2RSb3V0ZXI+ID0ge1xuICAkZ2V0VmFsdWU6ICh0KSA9PiB0LmdldFZhbHVlLmJpbmQodCksXG4gICRzZXRWYWx1ZTogKHQpID0+IHQuc2V0VmFsdWUuYmluZCh0KSxcbiAgJHVwZGF0ZTogKHQpID0+IHQudXBkYXRlVmFsdWUuYmluZCh0KSxcbiAgJGRlbGV0ZTogKHQpID0+IHQuZGVsZXRlVmFsdWUuYmluZCh0KSxcbiAgJHJlYWQ6ICh0KSA9PiAoZG90UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgcm9vdEtleSA9IGRvdFBhdGguc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IHQuZ2V0VmFsdWUocm9vdEtleSk7XG4gICAgaWYgKCFkb3RQYXRoLmluY2x1ZGVzKCcuJykpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gbG9kYXNoR2V0KHZhbHVlLCBkb3RQYXRoLnNsaWNlKHJvb3RLZXkubGVuZ3RoICsgMSkpO1xuICB9LFxuICAkZ2V0QXJnczogKHQpID0+IHQuZ2V0QXJncy5iaW5kKHQpLFxuICAkZ2V0RW52OiAodCkgPT4gdC5nZXRFbnYuYmluZCh0KSxcbiAgJGRlYnVnOiAodCkgPT4gdC5hZGREZWJ1Z0luZm8uYmluZCh0KSxcbiAgJGxvZzogKHQpID0+IHQuYWRkRGVidWdNZXNzYWdlLmJpbmQodCksXG4gICRlcnJvcjogKHQpID0+IHQuYWRkRXJyb3JJbmZvLmJpbmQodCksXG4gICRtZXRyaWM6ICh0KSA9PiB0LmFkZE1ldHJpYy5iaW5kKHQpLFxuICAkZXZhbDogKHQpID0+IHQuYWRkRXZhbC5iaW5kKHQpLFxuICAkYXR0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuYXR0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZGV0YWNoU2NvcGVSZWNvcmRlcjogKHQpID0+IHQuZGV0YWNoU2NvcGVSZWNvcmRlci5iaW5kKHQpLFxuICAkZ2V0U2NvcGVSZWNvcmRlcnM6ICh0KSA9PiB0LmdldFNjb3BlUmVjb3JkZXJzLmJpbmQodCksXG4gICRiYXRjaEFycmF5OiAodCkgPT4gKGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKSA9PiB7XG4gICAgLy8gT25lIGdldFZhbHVlIOKAlCBmaXJlcyBvblJlYWQgb25jZVxuICAgIGNvbnN0IGN1cnJlbnQgPSB0LmdldFZhbHVlKGtleSk7XG4gICAgLy8gQ2xvbmUgb25jZSDigJQgREVFUCAob3Igc3RhcnQgZW1wdHkgaWYgbWlzc2luZy9ub24tYXJyYXkpLiBUaGUgcmVhZCBpc1xuICAgIC8vIEJPUlJPV0VEOiBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgc3RhZ2VkIHdyaXRlIGl0IGlzIGNvbW1pdHRlZCBzaGFyZWRcbiAgICAvLyBtZW1vcnkgaXRzZWxmLCBzbyBhIHNoYWxsb3cgYFsuLi5jdXJyZW50XWAgaGFuZGVkIHRoZSBzdGFnZSB0aGVcbiAgICAvLyBjb21taXR0ZWQgRUxFTUVOVFMgYW5kIGBhcnJbMF0ubiA9IDlgIGVkaXRlZCBjb21taXR0ZWQgc3RhdGUgaW4gcGxhY2VcbiAgICAvLyB3aXRoIG5vIHRyYWNlIHJvdyAoYW5kIHRoZSBsYXp5IGJ1ZmZlcidzIGJhc2Ugd2FzIHRoZW4gdGFrZW4gQUZURVIgdGhlXG4gICAgLy8gZWRpdCwgc28gdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIHNhdyBub3RoaW5nKS4gU3RhdGUgdmFsdWVzIHN1cnZpdmVcbiAgICAvLyBgc3RydWN0dXJlZENsb25lYCBieSBjb250cmFjdCwgc28gdGhlIHdvcmtpbmcgY29weSBpcyBhIGZ1bGwgY29weS5cbiAgICBjb25zdCBjbG9uZTogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IHN0cnVjdHVyZWRDbG9uZShjdXJyZW50KSA6IFtdO1xuICAgIC8vIFVzZXIgYXBwbGllcyBhbGwgbXV0YXRpb25zIHRvIHRoZSBwbGFpbiBjbG9uZSDigJQgbm8gUHJveHksIG5vIHBlci1tdXRhdGlvbiBjb21taXRcbiAgICBmbihjbG9uZSk7XG4gICAgLy8gT25lIHNldFZhbHVlIOKAlCBmaXJlcyBvbldyaXRlIG9uY2Ugd2l0aCB0aGUgZmluYWwgYXJyYXlcbiAgICB0LnNldFZhbHVlKGtleSwgY2xvbmUpO1xuICB9LFxuICAkYnJlYWs6IChfdCwgb3B0cykgPT4gKHJlYXNvbj86IHN0cmluZykgPT4ge1xuICAgIGlmICghb3B0cy5icmVha0ZuKSB0aHJvdyBuZXcgRXJyb3IoJyRicmVhaygpIGlzIG5vdCBhdmFpbGFibGUgb3V0c2lkZSBzdGFnZSBleGVjdXRpb24nKTtcbiAgICBvcHRzLmJyZWFrRm4ocmVhc29uKTtcbiAgfSxcbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKS4gUm91dGVzIHRvIFNjb3BlRmFjYWRlLmVtaXRFdmVudFxuICAvLyB3aGljaCBoYW5kbGVzIGZhc3QtcGF0aCwgZW5yaWNobWVudCwgcmVkYWN0aW9uLCBhbmQgZXJyb3IgaXNvbGF0aW9uLlxuICAkZW1pdDogKHQpID0+IHQuZW1pdEV2ZW50LmJpbmQodCksXG4gIC8vIERldGFjaCAoVDQpIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0cy4gRGVsZWdhdGVzIHRvIFNjb3BlRmFjYWRlXG4gIC8vIHdoaWNoIG1pbnRlZCByZWZJZHMgZnJvbSBydW50aW1lU3RhZ2VJZC5cbiAgJGRldGFjaEFuZEpvaW5MYXRlcjogKHQpID0+IHQuZGV0YWNoQW5kSm9pbkxhdGVyLmJpbmQodCksXG4gICRkZXRhY2hBbmRGb3JnZXQ6ICh0KSA9PiB0LmRldGFjaEFuZEZvcmdldC5iaW5kKHQpLFxuICAkdG9SYXc6ICh0KSA9PiAoKSA9PiB0LFxufTtcblxuLy8gLS0gR3VhcmQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIHRvIHByZXZlbnQgUHJveHkgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgUHJvbWlzZSxcbi8vIGJyZWFraW5nIGluc3RhbmNlb2YgY2hlY2tzLCBvciBjb25mdXNpbmcgdGVzdCBtYXRjaGVycy5cblxuY29uc3QgR1VBUkRfUFJPUFM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+ID0ge1xuICB0aGVuOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgUHJvbWlzZSBkZXRlY3Rpb25cbiAgYXN5bW1ldHJpY01hdGNoOiB1bmRlZmluZWQsIC8vIHByZXZlbnQgdml0ZXN0L2plc3QgbWF0Y2hlciBjb25mdXNpb25cbiAgY29uc3RydWN0b3I6IE9iamVjdCwgLy8gc2FmZSBwcm90b3R5cGVcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdUeXBlZFNjb3BlJyxcbn07XG5cbi8vIC0tIFNpbGVudCBleGlzdGVuY2UgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEb2VzIHRoaXMga2V5IGV4aXN0IGluIHN0YXRlLCBhbnN3ZXJlZCB3aXRoIE5PIHRyYWNraW5nIHNpZGUgZWZmZWN0IGF0IGFsbD9cbiAqXG4gKiBgZ2V0U3RhdGVLZXlzKClgIGlzIHRoZSBvbmx5IGluc3BlY3Rpb24gYSBTY29wZUZhY2FkZSBhbnN3ZXJzIHdpdGhvdXQgcm91dGluZ1xuICogdGhyb3VnaCB0aGUgdHJhY2tlZCByZWFkIHBhdGguIGBoYXNLZXkoKWAgZGVsaWJlcmF0ZWx5IERPRVMgcm91dGUgdGhyb3VnaCBpdDpcbiAqIGAnaycgaW4gc2NvcGVgIGlzIGEgcmVhbCBxdWVzdGlvbiBhYm91dCBzdGF0ZSB0aGF0IGEgc3RhZ2UgY2FuIGJyYW5jaCBvbiwgc29cbiAqIGl0IHJlZ2lzdGVycyBhcyBhIHJlYWQg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoaXMgcHJvYmUgbXVzdCBub3QgdXNlIGl0LlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdGFyZ2V0IG9mZmVycyBubyBzaWxlbnQgYW5zd2VyOyBjYWxsZXJzIG11c3RcbiAqIHRoZW4gY2hvb3NlIGRlbGliZXJhdGVseSByYXRoZXIgdGhhbiBhc3N1bWUuXG4gKi9cbmZ1bmN0aW9uIHNpbGVudGx5S25vd25LZXkodGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCwga2V5OiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKGtleSk7XG59XG5cbi8vIC0tIE11dGFibGUgc3RhdGUgcGVyIHByb3h5IGluc3RhbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFJlYWN0aXZlU3RhdGUge1xuICBicmVha0ZuPzogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhY2hlOiB0b3AtbGV2ZWwga2V5IC0+IHsgcmF3IG9iamVjdCByZWYsIGNoaWxkIHByb3h5IH0gKi9cbiAgY2hpbGRDYWNoZTogTWFwPHN0cmluZywgeyByZWY6IG9iamVjdDsgcHJveHk6IG9iamVjdCB9Pjtcbn1cblxuLy8gLS0gTmVzdGVkIGNoaWxkIHByb3h5IChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEN5Y2xlIHNhZmV0eTogYW4gaW1tdXRhYmxlIFNldDxvYmplY3Q+IG9mIGFuY2VzdG9yIG9iamVjdHMgaXMgcGFzc2VkIGRvd25cbi8vIGVhY2ggYWNjZXNzIGNoYWluLiBFYWNoIGJyYW5jaCBnZXRzIGl0cyBvd24gY29weSAobmV3IFNldChwYXJlbnQpKSBzb1xuLy8gc2NvcGUueC5mcmllbmQgYW5kIHNjb3BlLnguY293b3JrZXIgZG9uJ3QgcG9sbHV0ZSBlYWNoIG90aGVyJ3MgdHJhY2tpbmcuXG4vLyBXaGVuIGEgY2hpbGQgdmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgYW5jZXN0b3Igc2V0LCB3ZSd2ZSBoaXQgYSBjeWNsZS5cbi8vIEF0IHRoZSBjeWNsZSBicmVhazogcmV0dXJuIGEgdGVybWluYWwgcHJveHkgdGhhdCB0cmFja3Mgd3JpdGVzIChzZXQgdHJhcFxuLy8gc3RpbGwgYnVpbGRzIHBhdGggKyBjYWxscyB1cGRhdGVWYWx1ZSkgYnV0IGRvZXNuJ3QgcmVjdXJzZSByZWFkcyBmdXJ0aGVyLlxuXG5mdW5jdGlvbiBjcmVhdGVUZXJtaW5hbFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByb290S2V5OiBzdHJpbmcsXG4gIHNlZ21lbnRzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCxcbiAgcmVhZFNpbGVudDogKGtleT86IHN0cmluZykgPT4gdW5rbm93bixcbiAgc3RhdGU6IFJlYWN0aXZlU3RhdGUsXG4gIHZpc2l0ZWQ6IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpLFxuKTogdW5rbm93biB7XG4gIHZpc2l0ZWQuYWRkKG9iaik7XG4gIC8vIFJlYWRzIGFyZSBMSVZFICg5LjIyLjApIOKAlCBzZWUgbGl2ZVZpZXcudHMuXG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgbG9kYXNoR2V0KHJlYWRTaWxlbnQocm9vdEtleSksIHNlZ21lbnRzKSk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQoX3JhdywgcHJvcCkge1xuICAgICAgY29uc3QgcmF3ID0gbGl2ZSgpO1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykgcmV0dXJuIChyYXcgYXMgYW55KVtwcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSAndGhlbicpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2FzeW1tZXRyaWNNYXRjaCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykgcmV0dXJuIE9iamVjdDtcbiAgICAgIC8vIExhdzogc2VyaWFsaXppbmcgYSBwcm94aWVkIHZhbHVlIGVxdWFscyBzZXJpYWxpemluZyAkZ2V0VmFsdWUncyB2YWx1ZS5cbiAgICAgIC8vIE9ubHkgYSBjeWNsZSBiYWNrLWVkZ2UgaXMgcHJ1bmVkIChqc29uUHJvamVjdGlvbi50cykuXG4gICAgICBpZiAocHJvcCA9PT0gJ3RvSlNPTicpIHJldHVybiAoKSA9PiB0b0pTT05WaWV3KHJhdyk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBBbiBhcnJheSBwYXN0IHRoZSBjeWNsZSBlZGdlIHN0aWxsIGdldHMgY29weS1vbi13cml0ZSBpbnRlcmNlcHRpb24g4oCUXG4gICAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZFxuICAgICAgLy8gcHJveHkgYWJvdmUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgYXJyU2VnbWVudHMgPSBbLi4uc2VnbWVudHMsIHByb3AgYXMgc3RyaW5nXTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFycmF5UHJveHkoXG4gICAgICAgICAgKCkgPT4gKGxvZGFzaEdldChyZWFkU2lsZW50KHJvb3RLZXkpLCBhcnJTZWdtZW50cykgYXMgdW5rbm93bltdKSA/PyBbXSxcbiAgICAgICAgICAobmV3QXJyKSA9PiB7XG4gICAgICAgICAgICAvLyBUaGUgdHJhcHMgdW53cmFwcGVkIHRoZSBhc3NpZ25lZCB2YWx1ZTsgdGhlIHJlYnVpbHQgYXJyYXkgaXNcbiAgICAgICAgICAgIC8vIGNvbW1pdHRlZCBhcyBpdCBpcyAoOS4yMy4wIOKAlCB1bnRvdWNoZWQgc2libGluZ3MgYnkgcmVmZXJlbmNlKS5cbiAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZShyb290S2V5LCBzZXRJblBhdGgocmVhZFNpbGVudChyb290S2V5KSwgYXJyU2VnbWVudHMsIG5ld0FycikpO1xuICAgICAgICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGludWUgdHJhY2tpbmcgd3JpdGVzIGF0IGRlZXBlciBsZXZlbHMgdmlhIGNoYWluZWQgdGVybWluYWwgcHJveGllcy5cbiAgICAgIC8vIFVzZSB2aXNpdGVkIHNldCB0byBwcmV2ZW50IHJlLWVudGVyaW5nIHRoZSBzYW1lIG9iamVjdCAoY3ljbGUgaW4gdGVybWluYWwgY2hhaW4pLlxuICAgICAgaWYgKHNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAhdmlzaXRlZC5oYXModmFsdWUgYXMgb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eShcbiAgICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICByb290S2V5LFxuICAgICAgICAgIFsuLi5zZWdtZW50cywgcHJvcCBhcyBzdHJpbmddLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICByZWFkU2lsZW50LFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIHNldChfcmF3LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICBjb25zdCBjaGlsZFNlZ21lbnRzID0gWy4uLnNlZ21lbnRzLCBwcm9wXTtcbiAgICAgIGNvbnN0IHVud3JhcHBlZCA9IHVud3JhcFByb3h5KHZhbHVlKTtcbiAgICAgIC8vIFNhbWUgbGF3IGFzIHRoZSBuZXN0ZWQgcHJveHk6IGFuIGFycmF5IGFzc2lnbm1lbnQgUkVQTEFDRVMuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1bndyYXBwZWQpKSB7XG4gICAgICAgIHRhcmdldC5zZXRWYWx1ZShyb290S2V5LCBzZXRJblBhdGgocmVhZFNpbGVudChyb290S2V5KSwgY2hpbGRTZWdtZW50cywgdW53cmFwcGVkKSk7XG4gICAgICAgIHN0YXRlLmNoaWxkQ2FjaGUuZGVsZXRlKHJvb3RLZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGNoID0gYnVpbGROZXN0ZWRQYXRjaChjaGlsZFNlZ21lbnRzLCB1bndyYXBwZWQpO1xuICAgICAgdGFyZ2V0LnVwZGF0ZVZhbHVlKHJvb3RLZXksIHBhdGNoKTtcbiAgICAgIHN0YXRlLmNoaWxkQ2FjaGUuZGVsZXRlKHJvb3RLZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGRlbGV0ZVByb3BlcnR5KF9yYXcsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LnNldFZhbHVlKHJvb3RLZXksIGRlbGV0ZUluUGF0aChyZWFkU2lsZW50KHJvb3RLZXkpLCBbLi4uc2VnbWVudHMsIHByb3BdKSk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShyb290S2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAuLi5saXZlSW5zcGVjdGlvblRyYXBzKGxpdmUpLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmVzdGVkUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJvb3RLZXk6IHN0cmluZyxcbiAgc2VnbWVudHM6IHN0cmluZ1tdLFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5Pzogc3RyaW5nKSA9PiB1bmtub3duLFxuICBzdGF0ZTogUmVhY3RpdmVTdGF0ZSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbGl2ZSA9ICgpID0+IGxpdmVPYmplY3Qob2JqLCBsb2Rhc2hHZXQocmVhZFNpbGVudChyb290S2V5KSwgc2VnbWVudHMpKTtcblxuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldChfcmF3LCBwcm9wKSB7XG4gICAgICBjb25zdCByYXcgPSBsaXZlKCk7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSByZXR1cm4gKHJhdyBhcyBhbnkpW3Byb3BdO1xuXG4gICAgICAvLyBHdWFyZCBwcm9wZXJ0aWVzXG4gICAgICBpZiAocHJvcCA9PT0gJ3RoZW4nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKHByb3AgPT09ICdhc3ltbWV0cmljTWF0Y2gnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKHByb3AgPT09ICdjb25zdHJ1Y3RvcicpIHJldHVybiBPYmplY3Q7XG4gICAgICAvLyBMYXc6IHNlcmlhbGl6aW5nIGEgcHJveGllZCB2YWx1ZSBlcXVhbHMgc2VyaWFsaXppbmcgJGdldFZhbHVlJ3MgdmFsdWUg4oCUXG4gICAgICAvLyBuZXN0ZWQgb2JqZWN0cywgYXJyYXlzIGFuZCBEYXRlcyBpbmNsdWRlZC4gT25seSBhIGN5Y2xlIGJhY2stZWRnZSBpc1xuICAgICAgLy8gcHJ1bmVkLCBzbyBjaXJjdWxhciBzdGF0ZSBzdGlsbCBuZXZlciB0aHJvd3MgaGVyZSAoanNvblByb2plY3Rpb24udHMpLlxuICAgICAgLy8gVGhpcyB0cmFwIGFsc28gY2FycmllcyB0aGUgV1JJVEUgcGF0aDogdW53cmFwUHJveHkoKSByb3VuZC10cmlwc1xuICAgICAgLy8gdGhyb3VnaCBKU09OLCBzbyBgc2NvcGUuY29weSA9IHNjb3BlLnJlc3VsdHNgIGNvbW1pdHMgdmlhIHRoaXMgdmlldy5cbiAgICAgIGlmIChwcm9wID09PSAndG9KU09OJykgcmV0dXJuICgpID0+IHRvSlNPTlZpZXcocmF3KTtcblxuICAgICAgY29uc3QgdmFsdWUgPSAocmF3IGFzIGFueSlbcHJvcF07XG5cbiAgICAgIC8vIFByaW1pdGl2ZSBvciBub24td3JhcHBhYmxlIC0tIHJldHVybiBhcy1pcyAobm8gZGVlcGVyIHByb3h5KVxuICAgICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjb25zdCBjaGlsZFNlZ21lbnRzID0gWy4uLnNlZ21lbnRzLCBwcm9wIGFzIHN0cmluZ107XG5cbiAgICAgIC8vIEFycmF5IC0tIHJldHVybiBhcnJheSBwcm94eS5cbiAgICAgIC8vXG4gICAgICAvLyBXSFkgVEhJUyBDT01NSVRTIEEgYHNldGAgT0YgVEhFIFJPT1QgS0VZLCBub3QgYSBtZXJnZSBvZiBhIG5lc3RlZCBwYXRjaFxuICAgICAgLy8gKDkuMjIuMCk6IGFuIGFycmF5IG11dGF0aW9uIGhhbmRzIGJhY2sgdGhlIENPTVBMRVRFIG5ldyBhcnJheSwgYW5kXG4gICAgICAvLyBgbWVyZ2VgJ3MgYXJyYXkgYXJtIGlzIGEgc2V0IFVOSU9OIChgZGVlcFNtYXJ0TWVyZ2VgKS4gQ29tbWl0dGluZ1xuICAgICAgLy8gYFsxLDk5LDNdYCBhcyBhIG1lcmdlIG9udG8gYFsxLDIsM11gIHByb2R1Y2VkIGBbMSwyLDMsOTldYCDigJQgZWxlbWVudFxuICAgICAgLy8gcmVwbGFjZW1lbnQsIHJlb3JkZXJpbmcgYW5kIHNocmlua2luZyB3ZXJlIHVucmVwcmVzZW50YWJsZSB0aHJvdWdoIGFueVxuICAgICAgLy8gYXJyYXkgdGhhdCB3YXMgbm90IGl0c2VsZiBhIHRvcC1sZXZlbCBrZXksIGFuZCB0aGUgbG9nIHJlY29yZGVkIHRoZVxuICAgICAgLy8gdW5pb24gZmFpdGhmdWxseSwgc28gc3RhdGUgYW5kIGxvZyBhZ3JlZWQgYW5kIHdlcmUgYm90aCB3cm9uZy4gYHNldGAgaXNcbiAgICAgIC8vIHRoZSBvbmx5IHZlcmIgdGhhdCBjYW4gc2F5IFwidGhpcyBpcyB0aGUgd2hvbGUgdmFsdWUgbm93XCI7IHRoZSByb290IGtleVxuICAgICAgLy8gaXMgdGhlIGdyYW51bGFyaXR5IGV2ZXJ5IGNvbnN1bWVyIGluZGV4ZXMgYnkgKGBmaW5kTGFzdFdyaXRlcmAsXG4gICAgICAvLyBgc2xpY2VGb3JLZXlgLCBgY2F1c2FsQ2hhaW5gKSwgYW5kIGl0IGlzIGV4YWN0bHkgd2hhdCBhIFRPUC1MRVZFTCBhcnJheVxuICAgICAgLy8gd3JpdGUgaGFzIGFsd2F5cyBkb25lLiBUaGUgbmV3IHJvb3QgaXMgYnVpbHQgYnkgY29weWluZyBvbmx5IHRoZVxuICAgICAgLy8gY29udGFpbmVycyBvbiB0aGUgcGF0aCDigJQgdGhlIHZhbHVlIHJlYWQgc3RheXMgdW50b3VjaGVkLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVBcnJheVByb3h5KFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIFNlZ21lbnRzLCBub3QgYSBkb3Qtam9pbmVkIHN0cmluZzogYSBuZXN0ZWQga2V5IG1heSBpdHNlbGYgY29udGFpblxuICAgICAgICAgICAgLy8gYSBkb3QsIGFuZCBqb2luaW5nIHdvdWxkIGFkZHJlc3MgdGhlIHdyb25nIG5vZGUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVhZFNpbGVudChyb290S2V5KSBhcyBhbnk7XG4gICAgICAgICAgICByZXR1cm4gKGxvZGFzaEdldChjdXJyZW50LCBjaGlsZFNlZ21lbnRzKSBhcyB1bmtub3duW10pID8/IFtdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKG5ld0FycikgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIHRyYXBzIHVud3JhcHBlZCB0aGUgYXNzaWduZWQgdmFsdWU7IHRoZSByZWJ1aWx0IGFycmF5IGlzXG4gICAgICAgICAgICAvLyBjb21taXR0ZWQgYXMgaXQgaXMgKDkuMjMuMCDigJQgdW50b3VjaGVkIHNpYmxpbmdzIGJ5IHJlZmVyZW5jZSkuXG4gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUocm9vdEtleSwgc2V0SW5QYXRoKHJlYWRTaWxlbnQocm9vdEtleSksIGNoaWxkU2VnbWVudHMsIG5ld0FycikpO1xuICAgICAgICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3ljbGUgZGV0ZWN0aW9uOiBpZiB0aGlzIHZhbHVlIGlzIGFuIGFuY2VzdG9yIGluIHRoZSBjdXJyZW50IGFjY2Vzc1xuICAgICAgLy8gY2hhaW4sIHJldHVybiBhIHRlcm1pbmFsIHByb3h5ICh0cmFja3Mgd3JpdGVzLCBzdG9wcyByZWN1cnNpbmcgcmVhZHMpLlxuICAgICAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUgYXMgb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcm9vdEtleSwgY2hpbGRTZWdtZW50cywgdGFyZ2V0LCByZWFkU2lsZW50LCBzdGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIG5ldyBhbmNlc3RvciBzZXQgZm9yIHRoaXMgYnJhbmNoIChpbW11dGFibGUgLS0gbm8gY3Jvc3MtYnJhbmNoIHBvbGx1dGlvbilcbiAgICAgIGNvbnN0IGNoaWxkQW5jZXN0b3JzID0gbmV3IFNldChhbmNlc3RvcnMpO1xuICAgICAgY2hpbGRBbmNlc3RvcnMuYWRkKHZhbHVlIGFzIG9iamVjdCk7XG5cbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eShcbiAgICAgICAgdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIHJvb3RLZXksXG4gICAgICAgIGNoaWxkU2VnbWVudHMsXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcmVhZFNpbGVudCxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGNoaWxkQW5jZXN0b3JzLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgc2V0KF9yYXcsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgY29uc3QgY2hpbGRTZWdtZW50cyA9IFsuLi5zZWdtZW50cywgcHJvcF07XG4gICAgICBjb25zdCB1bndyYXBwZWQgPSB1bndyYXBQcm94eSh2YWx1ZSk7XG5cbiAgICAgIC8vIEFuIEFSUkFZIGFzc2lnbm1lbnQgUkVQTEFDRVMsIGF0IGV2ZXJ5IGRlcHRoICg5LjIyLjApLiBgbWVyZ2VgJ3MgYXJyYXlcbiAgICAgIC8vIGFybSBpcyBhIHVuaW9uLCBzbyBgc2NvcGUuay50YWdzID0gWydiJ11gIHVzZWQgdG8gQVBQRU5EIOKAlCB3aGlsZSB0aGVcbiAgICAgIC8vIGlkZW50aWNhbCBleHByZXNzaW9uIG9uZSBsZXZlbCB1cCAoYHNjb3BlLnRhZ3MgPSBbJ2InXWApIHJlcGxhY2VkLCBhbmRcbiAgICAgIC8vIGEgc2hvcnRlciBhcnJheSAoYHNjb3BlLmsuYXJyID0gWzFdYCkgY291bGQgbm90IGJlIGV4cHJlc3NlZCBhdCBhbGwuXG4gICAgICAvLyBgJHVwZGF0ZShrZXksIHsgdGFnczogWy4uLl0gfSlgIHJlbWFpbnMgdGhlIGV4cGxpY2l0IGFwcGVuZC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHVud3JhcHBlZCkpIHtcbiAgICAgICAgdGFyZ2V0LnNldFZhbHVlKHJvb3RLZXksIHNldEluUGF0aChyZWFkU2lsZW50KHJvb3RLZXkpLCBjaGlsZFNlZ21lbnRzLCB1bndyYXBwZWQpKTtcbiAgICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRjaCA9IGJ1aWxkTmVzdGVkUGF0Y2goY2hpbGRTZWdtZW50cywgdW53cmFwcGVkKTtcbiAgICAgIHRhcmdldC51cGRhdGVWYWx1ZShyb290S2V5LCBwYXRjaCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShyb290S2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBgZGVsZXRlIHNjb3BlLm9yZGVyLmN1c3RvbWVyLnRpZXJgIOKAlCBtZXJnZSBjYW5ub3QgZXhwcmVzcyBhIFJFTU9WQUxcbiAgICAvLyAoYSBwYXRjaCBvZiBgdW5kZWZpbmVkYCBpcyByZWFkIGFzIGFic2VudCBieSBldmVyeSBjb25zdW1lciksIHNvIHRoZSBrZXlcbiAgICAvLyBpcyByZW1vdmVkIGZyb20gYSBjb3B5IG9mIHRoZSByb290IGFuZCBjb21taXR0ZWQgYXMgYSBgc2V0YCBvZiB0aGUgcm9vdC5cbiAgICBkZWxldGVQcm9wZXJ0eShfcmF3LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHRhcmdldC5zZXRWYWx1ZShyb290S2V5LCBkZWxldGVJblBhdGgocmVhZFNpbGVudChyb290S2V5KSwgWy4uLnNlZ21lbnRzLCBwcm9wXSkpO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocm9vdEtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0ge1xuICAgIGJyZWFrRm46IG9wdGlvbnM/LmJyZWFrUGlwZWxpbmUsXG4gICAgY2hpbGRDYWNoZTogbmV3IE1hcCgpLFxuICB9O1xuXG4gIC8vIEJpbmQgc2lsZW50LXJlYWQgbWV0aG9kIG9uY2Ug4oCUIGF2b2lkcyBwZXItY2FsbCA/PyArIC5jYWxsKCkgaW4gYXJyYXkgcHJveHkgZ2V0Q3VycmVudCBjbG9zdXJlc1xuICBjb25zdCByZWFkU2lsZW50ID0gKHRhcmdldC5nZXRWYWx1ZVNpbGVudCA/PyB0YXJnZXQuZ2V0VmFsdWUpLmJpbmQodGFyZ2V0KTtcblxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgdW5rbm93biBhcyBUeXBlZFNjb3BlPFQ+LCB7XG4gICAgZ2V0KF9wcm94eVRhcmdldCwgcHJvcCwgX3JlY2VpdmVyKSB7XG4gICAgICAvLyAxLiBJbnRlcm5hbCBzeW1ib2xzIChjaGVjayBiZWZvcmUgb3RoZXIgc3ltYm9scylcbiAgICAgIGlmIChwcm9wID09PSBJU19UWVBFRF9TQ09QRSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocHJvcCA9PT0gQlJFQUtfU0VUVEVSKSB7XG4gICAgICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBzdGF0ZS5icmVha0ZuID0gZm47XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFN5bWJvbCBwcm9wZXJ0aWVzIChndWFyZCArIGluc3BlY3Rpb24pXG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApKSByZXR1cm4gR1VBUkRfUFJPUFNbcHJvcF07XG4gICAgICAgIC8vIE5vZGUuanMgdXRpbC5pbnNwZWN0IOKAlCBzaG93IHN0YXRlIHNuYXBzaG90LCBub3QgcHJveHkgaW50ZXJuYWxzXG4gICAgICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC5nZXRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFN0cmluZyBndWFyZCBwcm9wZXJ0aWVzXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuXG4gICAgICAvLyA0LiAkLXByZWZpeGVkIG1ldGhvZHMgLS0gcm91dGUgdG8gZmFjYWRlXG4gICAgICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSBNRVRIT0RfUk9VVEVTW3Byb3BdO1xuICAgICAgICBpZiAocm91dGVyKSByZXR1cm4gcm91dGVyKHRhcmdldCwgc3RhdGUpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiBFeGVjdXRvci1pbnRlcm5hbCBtZXRob2QgcGFzcy10aHJvdWdoIChleHBsaWNpdCBhbGxvd2xpc3QpXG4gICAgICAvLyAgICBGbG93Q2hhcnRFeGVjdXRvciB3cmFwcGluZyBjYWxscyBhdHRhY2hTY29wZVJlY29yZGVyLCBub3RpZnlTdGFnZVN0YXJ0LCBldGMuXG4gICAgICAvLyAgICBkaXJlY3RseSBvbiB0aGUgc2NvcGUuIEZvcndhcmQgb25seSBhbGxvd2xpc3RlZCBtZXRob2RzLlxuICAgICAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgYW55KVtwcm9wXS5iaW5kKHRhcmdldCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIFNlcmlhbGl6YXRpb24gcHJvdG9jb2wgcHJvYmUuIEpTT04uc3RyaW5naWZ5IGFza3MgRVZFUlkgdmFsdWUgZm9yIGFcbiAgICAgIC8vICAgIGB0b0pTT05gIG1ldGhvZCBiZWZvcmUgc2VyaWFsaXppbmcgaXQuIFRoYXQgcXVlc3Rpb24gY29tZXMgZnJvbSB0aGVcbiAgICAgIC8vICAgIHJ1bnRpbWUsIG5vdCBmcm9tIHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyIHRoZSByZWFkXG4gICAgICAvLyAgICBzZXQg4oCUIGNhdXNhbENoYWluIGFuZCBzbGljZUZvcktleSB3b3VsZCBjYXJyeSBhIGtleSBubyBjaGFydCBuYW1lcy5cbiAgICAgIC8vICAgIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWwsIHRob3VnaDogd2hlbiB0aGUga2V5XG4gICAgICAvLyAgICByZWFsbHkgRVhJU1RTIHRoaXMgaXMgYSBnZW51aW5lIHJlYWQgYW5kIHN0YXlzIHRyYWNrZWQuIEFuZCB3aGVuIHRoZVxuICAgICAgLy8gICAgdGFyZ2V0IGNhbm5vdCBhbnN3ZXIgc2lsZW50bHkgKHNpbGVudGx5S25vd25LZXkgLT4gdW5kZWZpbmVkKSwgdHJ1dGhcbiAgICAgIC8vICAgIHdpbnMgb3ZlciBub2lzZTogZmFsbCB0aHJvdWdoIGFuZCB0cmFjay4gTmV2ZXIgc2lsZW50bHkgdW50cmFja2VkLlxuICAgICAgaWYgKHByb3AgPT09ICd0b0pTT04nICYmIHNpbGVudGx5S25vd25LZXkodGFyZ2V0LCBwcm9wKSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIDcuIFN0YXRlIGtleSAtLSBjYWxsIGdldFZhbHVlIChmaXJlcyBvblJlYWQgT05DRSlcbiAgICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKHByb3ApO1xuXG4gICAgICAvLyBQcmltaXRpdmUgb3IgbnVsbC91bmRlZmluZWQgLS0gcmV0dXJuIGFzLWlzXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLXdyYXBwYWJsZSAoRGF0ZSwgTWFwLCBjbGFzcyBpbnN0YW5jZSwgZXRjLikgLS0gcmV0dXJuIHVud3JhcHBlZFxuICAgICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAvLyBBcnJheSAtLSByZXR1cm4gYXJyYXkgcHJveHkgKGNhY2hlZCBmb3IgaWRlbnRpdHkgZXF1YWxpdHkpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gc3RhdGUuY2hpbGRDYWNoZS5nZXQocHJvcCk7XG4gICAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gdmFsdWUpIHJldHVybiBjYWNoZWQucHJveHk7XG5cbiAgICAgICAgY29uc3QgYXJyUHJveHkgPSBjcmVhdGVBcnJheVByb3h5KFxuICAgICAgICAgICgpID0+IChyZWFkU2lsZW50KHByb3ApIGFzIHVua25vd25bXSkgPz8gW10sXG4gICAgICAgICAgKG5ld0FycikgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIHRyYXBzIHVud3JhcHBlZCB0aGUgYXNzaWduZWQgdmFsdWU7IHRoZSByZWJ1aWx0IGFycmF5IGlzXG4gICAgICAgICAgICAvLyBjb21taXR0ZWQgYXMgaXQgaXMgKDkuMjMuMCDigJQgdW50b3VjaGVkIHNpYmxpbmdzIGJ5IHJlZmVyZW5jZSxcbiAgICAgICAgICAgIC8vIHNvIGFuIGVsZW1lbnQgd3JpdGUgaXMgTygxKSBoZXJlLCBub3QgYSByb3VuZC10cmlwIG9mIE4pLlxuICAgICAgICAgICAgdGFyZ2V0LnNldFZhbHVlKHByb3AsIG5ld0Fycik7XG4gICAgICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICBzdGF0ZS5jaGlsZENhY2hlLnNldChwcm9wLCB7IHJlZjogdmFsdWUgYXMgb2JqZWN0LCBwcm94eTogYXJyUHJveHkgYXMgdW5rbm93biBhcyBvYmplY3QgfSk7XG4gICAgICAgIHJldHVybiBhcnJQcm94eTtcbiAgICAgIH1cblxuICAgICAgLy8gUGxhaW4gb2JqZWN0IC0tIHJldHVybiBuZXN0ZWQgcHJveHkgKGNhY2hlZCBmb3IgaWRlbnRpdHkgZXF1YWxpdHkpXG4gICAgICBjb25zdCBjYWNoZWQgPSBzdGF0ZS5jaGlsZENhY2hlLmdldChwcm9wKTtcbiAgICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnJlZiA9PT0gdmFsdWUpIHJldHVybiBjYWNoZWQucHJveHk7XG5cbiAgICAgIGNvbnN0IG5lc3RlZCA9IGNyZWF0ZU5lc3RlZFByb3h5KFxuICAgICAgICB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgcHJvcCxcbiAgICAgICAgW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcmVhZFNpbGVudCxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWUgYXMgb2JqZWN0XSksIC8vIHNlZWQgYW5jZXN0b3Igc2V0IHdpdGggcm9vdCBvYmplY3RcbiAgICAgICk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLnNldChwcm9wLCB7IHJlZjogdmFsdWUgYXMgb2JqZWN0LCBwcm94eTogbmVzdGVkIGFzIG9iamVjdCB9KTtcbiAgICAgIHJldHVybiBuZXN0ZWQ7XG4gICAgfSxcblxuICAgIHNldChfcHJveHlUYXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke3Byb3B9XCIgLS0gaXQgY29uZmxpY3RzIHdpdGggYSByZXNlcnZlZCBUeXBlZFNjb3BlIG1ldGhvZC4gUmVuYW1lIHRoZSBzdGF0ZSBrZXkgdG8gYXZvaWQgJC1wcmVmaXhlZCBuYW1lcy5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gVW53cmFwIFByb3h5IHZhbHVlcyBiZWZvcmUgc3RvcmluZyDigJQgc3RydWN0dXJlZENsb25lIGluIFRyYW5zYWN0aW9uQnVmZmVyXG4gICAgICAvLyBjYW5ub3QgY2xvbmUgUHJveHkgb2JqZWN0cy4gVGhpcyBoYW5kbGVzOiBzY29wZS5iYWNrdXAgPSBzY29wZS5jdXN0b21lclxuICAgICAgY29uc3QgdW53cmFwcGVkID0gdW53cmFwUHJveHkodmFsdWUpO1xuICAgICAgdGFyZ2V0LnNldFZhbHVlKHByb3AsIHVud3JhcHBlZCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTsgLy8gaW52YWxpZGF0ZSBjYWNoZVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGRlbGV0ZVByb3BlcnR5KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykgcmV0dXJuIHRydWU7XG4gICAgICB0YXJnZXQuZGVsZXRlVmFsdWUocHJvcCk7XG4gICAgICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBoYXMoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzeW1ib2wnKSByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKTtcbiAgICAgIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKHByb3ApKSByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIFVzZSBub24tdHJhY2tpbmcgaGFzS2V5IGlmIGF2YWlsYWJsZSwgZWxzZSBmYWxsYmFjayB0byBnZXRTdGF0ZUtleXNcbiAgICAgIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShwcm9wKTtcbiAgICAgIGlmICh0YXJnZXQuZ2V0U3RhdGVLZXlzKSByZXR1cm4gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKHByb3ApO1xuICAgICAgLy8gRmFsbGJhY2s6IGdldFZhbHVlIGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbiAgICAgIHJldHVybiB0YXJnZXQuZ2V0VmFsdWUocHJvcCkgIT09IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgb3duS2V5cygpIHtcbiAgICAgIC8vIFVzZSBub24tdHJhY2tpbmcgZ2V0U3RhdGVLZXlzIGlmIGF2YWlsYWJsZSwgZWxzZSBmYWxsYmFja1xuICAgICAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRhcmdldC5nZXRWYWx1ZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3QpO1xuICAgIH0sXG5cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3Byb3h5VGFyZ2V0LCBwcm9wKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkpIHJldHVybiB1bmRlZmluZWQ7IC8vICQtbWV0aG9kcyBhcmUgbm9uLWVudW1lcmFibGVcbiAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQg4oCUIG5vIGdldFZhbHVlIGNhbGwgaGVyZVxuICAgICAgY29uc3QgZXhpc3RzID0gdGFyZ2V0Lmhhc0tleVxuICAgICAgICA/IHRhcmdldC5oYXNLZXkocHJvcClcbiAgICAgICAgOiB0YXJnZXQuZ2V0U3RhdGVLZXlzXG4gICAgICAgID8gdGFyZ2V0LmdldFN0YXRlS2V5cygpLmluY2x1ZGVzKHByb3ApXG4gICAgICAgIDogdGFyZ2V0LmdldFZhbHVlKHByb3ApICE9PSB1bmRlZmluZWQ7IC8vIGZhbGxiYWNrIG9ubHlcbiAgICAgIGlmICghZXhpc3RzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgLy8gUmV0dXJuIGEgbWluaW1hbCBkZXNjcmlwdG9yIOKAlCBhY3R1YWwgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgICByZXR1cm4geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH07XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHByb3h5O1xufVxuIl19
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlVHlwZWRTY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhY3RpdmUvY3JlYXRlVHlwZWRTY29wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7OztBQUVILHFEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLCtDQUF3RztBQUN4Ryw2REFBbUQ7QUFFbkQseUNBQXlHO0FBQ3pHLG1EQUEyRjtBQU0zRixNQUFNLGFBQWEsR0FBaUM7SUFDbEQsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDckMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQWUsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxPQUFPLElBQUEsc0JBQVMsRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9CLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxvQkFBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RELFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBNEIsRUFBRSxFQUFFO1FBQ2hFLG1DQUFtQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLHVFQUF1RTtRQUN2RSx5RUFBeUU7UUFDekUsa0VBQWtFO1FBQ2xFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHFFQUFxRTtRQUNyRSxNQUFNLEtBQUssR0FBYyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRixtRkFBbUY7UUFDbkYsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ1YseURBQXlEO1FBQ3pELENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQWUsRUFBRSxFQUFFO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLDJFQUEyRTtJQUMzRSwyQ0FBMkM7SUFDM0MsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0NBQ3ZCLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDBEQUEwRDtBQUUxRCxNQUFNLFdBQVcsR0FBcUM7SUFDcEQsSUFBSSxFQUFFLFNBQVMsRUFBRSw0QkFBNEI7SUFDN0MsZUFBZSxFQUFFLFNBQVMsRUFBRSx3Q0FBd0M7SUFDcEUsV0FBVyxFQUFFLE1BQU0sRUFBRSxpQkFBaUI7SUFDdEMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsWUFBWTtDQUNuQyxDQUFDO0FBRUYsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE1BQXNCLEVBQUUsR0FBVztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQVVELGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsbURBQW1EO0FBRW5ELFNBQVMsbUJBQW1CLENBQzFCLEdBQTRCLEVBQzVCLElBQWUsRUFDZixRQUEyQixFQUMzQixVQUF1QixJQUFJLEdBQUcsRUFBRTtJQUVoQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQVcsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUEsd0JBQVUsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBYyxFQUFFLElBQWMsRUFBVyxFQUFFO1FBQ3hELElBQUksQ0FBQyxJQUFBLGtDQUFtQixFQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzlDLHVFQUF1RTtRQUN2RSwyRUFBMkU7UUFDM0UsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBQSw0QkFBWSxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBZSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDL0MsT0FBTyxtQkFBbUIsQ0FBQyxLQUFnQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEYsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDcEIsR0FBRyxFQUFFLElBQUEseUJBQVcsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUM7UUFDaEQsR0FBRyxFQUFFLElBQUEsMkJBQVcsRUFBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1FBQ2hDLGNBQWMsRUFBRSxJQUFBLDhCQUFjLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUM5QyxHQUFHLElBQUEsaUNBQW1CLEVBQUMsSUFBSSxDQUFDO0tBQzdCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixHQUE0QixFQUM1QixJQUFlLEVBQ2YsUUFBMkIsRUFDM0IsWUFBeUIsSUFBSSxHQUFHLEVBQUU7SUFFbEMseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBVyxFQUFFLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBQSx3QkFBVSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFjLEVBQUUsSUFBYyxFQUFXLEVBQUU7UUFDeEQsSUFBSSxDQUFDLElBQUEsa0NBQW1CLEVBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDOUMsMEVBQTBFO1FBQzFFLHVEQUF1RDtRQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFBLDRCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFlLENBQUM7WUFBRSxPQUFPLG1CQUFtQixDQUFDLEtBQWdDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdHLE9BQU8saUJBQWlCLENBQUMsS0FBZ0MsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUMsQ0FBQztJQUNGLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO1FBQ3BCLEdBQUcsRUFBRSxJQUFBLHlCQUFXLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBQ2hELEdBQUcsRUFBRSxJQUFBLDJCQUFXLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztRQUNoQyxjQUFjLEVBQUUsSUFBQSw4QkFBYyxFQUFDLElBQUksRUFBRSxRQUFRLENBQUM7UUFDOUMsR0FBRyxJQUFBLGlDQUFtQixFQUFDLElBQUksQ0FBQztLQUM3QixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsZ0ZBQWdGO0FBRWhGLDJHQUEyRztBQUMzRyxNQUFNLFNBQVMsR0FBa0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRXJEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQXNCLEVBQUUsS0FBb0IsRUFBRSxJQUFxQjtJQUN2RixJQUFJLElBQUksS0FBSyx5QkFBYztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3pDLElBQUksSUFBSSxLQUFLLHVCQUFZLEVBQUUsQ0FBQztRQUMxQixPQUFPLENBQUMsRUFBYyxFQUFFLEVBQUU7WUFDeEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7WUFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0RixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RGLElBQUksNkJBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlFLElBQUksb0NBQXlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3ZGLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FDckIsTUFBc0IsRUFDdEIsVUFBb0MsRUFDcEMsS0FBb0IsRUFDcEIsR0FBVyxFQUNYLEtBQWM7SUFFZCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckYsSUFBSSxDQUFDLElBQUEsa0NBQW1CLEVBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxzQ0FBc0M7SUFDckYsT0FBTyxJQUFBLDBCQUFZLEVBQ2pCLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLEdBQUcsRUFDSCxLQUFLLEVBQ0wsR0FBRyxFQUFFO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBQSwyQkFBVyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFBLDRCQUFZLEVBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE9BQU8saUJBQWlCLENBQUMsS0FBZ0MsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDtnRkFDZ0Y7QUFDaEYsU0FBUyxjQUFjLENBQUMsTUFBc0IsRUFBRSxLQUFvQixFQUFFLEdBQVcsRUFBRSxLQUFjO0lBQy9GLElBQUksNkJBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsR0FBRyxzR0FBc0csQ0FDbkksQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFBLGdDQUFXLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6QyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsbUhBQW1IO0FBQ25ILFNBQVMsUUFBUSxDQUFDLE1BQXNCLEVBQUUsR0FBVztJQUNuRCxJQUFJLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLElBQUksTUFBTSxDQUFDLFlBQVk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLGtEQUFrRDtBQUMvRixDQUFDO0FBRUQscUZBQXFGO0FBQ3JGLFNBQVMsU0FBUyxDQUFDLE1BQXNCO0lBQ3ZDLElBQUksTUFBTSxDQUFDLFlBQVk7UUFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUF5QyxDQUFDO0lBQzFFLE9BQU8sUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQy9FLENBQUM7QUFFRCwrRUFBK0U7QUFFL0U7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQW1CLE1BQXNCLEVBQUUsT0FBeUI7SUFDbEcsTUFBTSxLQUFLLEdBQWtCLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLElBQUkseUJBQVcsRUFBRSxFQUFFLENBQUM7SUFDaEcsMkZBQTJGO0lBQzNGLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTNFLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBa0MsRUFBRTtRQUNuRCxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUk7WUFDcEIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLEtBQUssU0FBUztnQkFBRSxPQUFPLFFBQVEsQ0FBQztZQUM1Qyx1RUFBdUU7WUFDdkUsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBYyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBYyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDO1FBQ0QsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBSztZQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSTtZQUMvQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDMUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUk7WUFDcEIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO2dCQUFFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3RixPQUFPLDZCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNoQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsSUFBSTtZQUN6QyxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSw2QkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sU0FBUyxDQUFDLENBQUMsK0JBQStCO1lBQy9HLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLHdDQUF3QztRQUMzRyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWpDRCw0Q0FpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL2NyZWF0ZVR5cGVkU2NvcGUgLS0gQ29yZSBQcm94eSBmYWN0b3J5IGZvciBUeXBlZFNjb3BlPFQ+LlxuICpcbiAqIFdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXM6XG4gKiAtIFR5cGVkIHByb3BlcnR5IGFjY2Vzczogc2NvcGUuY3JlZGl0VGllciAocmVhZCksIHNjb3BlLmNyZWRpdFRpZXIgPSAnQScgKHdyaXRlKVxuICogLSBEZWVwIHdyaXRlIGludGVyY2VwdGlvbjogc2NvcGUuY3VzdG9tZXIuYWRkcmVzcy56aXAgPSAnOTAyMTAnXG4gKiAtIEFycmF5IG11dGF0aW9uIGludGVyY2VwdGlvbjogc2NvcGUuaXRlbXMucHVzaCgnbmV3JylcbiAqIC0gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlczogJGdldFZhbHVlLCAkc2V0VmFsdWUsICRyZWFkLCAkZ2V0QXJncywgZXRjLlxuICpcbiAqIFJlYWQgc2VtYW50aWNzOiB0b3AtbGV2ZWwgZ2V0IGNhbGxzIGdldFZhbHVlKCkgKGZpcmVzIG9uUmVhZCBPTkNFKS5cbiAqICAgTmVzdGVkIGdldCB0cmFwcyBuYXZpZ2F0ZSBpbi1tZW1vcnkgLS0gbm8gYWRkaXRpb25hbCBvblJlYWQuXG4gKlxuICogV3JpdGUgc2VtYW50aWNzOiB0b3AtbGV2ZWwgc2V0IGNhbGxzIHNldFZhbHVlKCkuIE5lc3RlZCBzZXQgY2FsbHNcbiAqICAgdXBkYXRlVmFsdWUoKSB3aXRoIGEgcGFydGlhbCBvYmplY3QgYnVpbHQgZnJvbSB0aGUgYWNjdW11bGF0ZWQgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgbG9kYXNoR2V0IH0gZnJvbSAnLi4vbWVtb3J5L3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgc2hvdWxkV3JhcFdpdGhQcm94eSB9IGZyb20gJy4vYWxsb3dsaXN0LmpzJztcbmltcG9ydCB7IGFycmF5UHJveHlBdCB9IGZyb20gJy4vYXJyYXlUcmFwcy5qcyc7XG5pbXBvcnQgeyBjYWNoZWRNZW1iZXIsIGxpdmVHZXRUcmFwLCBsaXZlSW5zcGVjdGlvblRyYXBzLCBsaXZlT2JqZWN0LCBNZW1iZXJDYWNoZSB9IGZyb20gJy4vbGl2ZVZpZXcuanMnO1xuaW1wb3J0IHsgdW53cmFwUHJveHkgfSBmcm9tICcuL3N0cnVjdHVyYWxXcml0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0aXZlT3B0aW9ucywgUmVhY3RpdmVUYXJnZXQsIFR5cGVkU2NvcGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IEJSRUFLX1NFVFRFUiwgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUywgSVNfVFlQRURfU0NPUEUsIFNDT1BFX01FVEhPRF9OQU1FUyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBXcml0ZVNpbmssIHJvb3RLZXlTaW5rLCBzaW5rRGVsZXRlVHJhcCwgc2lua1NldFRyYXAgfSBmcm9tICcuL3dyaXRlVHJhcHMuanMnO1xuXG4vLyAtLSAkLW1ldGhvZCByb3V0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnR5cGUgTWV0aG9kUm91dGVyID0gKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIG9wdHM6IFJlYWN0aXZlU3RhdGUpID0+IHVua25vd247XG5cbmNvbnN0IE1FVEhPRF9ST1VURVM6IFJlY29yZDxzdHJpbmcsIE1ldGhvZFJvdXRlcj4gPSB7XG4gICRnZXRWYWx1ZTogKHQpID0+IHQuZ2V0VmFsdWUuYmluZCh0KSxcbiAgJHNldFZhbHVlOiAodCkgPT4gdC5zZXRWYWx1ZS5iaW5kKHQpLFxuICAkdXBkYXRlOiAodCkgPT4gdC51cGRhdGVWYWx1ZS5iaW5kKHQpLFxuICAkZGVsZXRlOiAodCkgPT4gdC5kZWxldGVWYWx1ZS5iaW5kKHQpLFxuICAkcmVhZDogKHQpID0+IChkb3RQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290S2V5ID0gZG90UGF0aC5zcGxpdCgnLicpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gdC5nZXRWYWx1ZShyb290S2V5KTtcbiAgICBpZiAoIWRvdFBhdGguaW5jbHVkZXMoJy4nKSkgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiBsb2Rhc2hHZXQodmFsdWUsIGRvdFBhdGguc2xpY2Uocm9vdEtleS5sZW5ndGggKyAxKSk7XG4gIH0sXG4gICRnZXRBcmdzOiAodCkgPT4gdC5nZXRBcmdzLmJpbmQodCksXG4gICRnZXRFbnY6ICh0KSA9PiB0LmdldEVudi5iaW5kKHQpLFxuICAkZGVidWc6ICh0KSA9PiB0LmFkZERlYnVnSW5mby5iaW5kKHQpLFxuICAkbG9nOiAodCkgPT4gdC5hZGREZWJ1Z01lc3NhZ2UuYmluZCh0KSxcbiAgJGVycm9yOiAodCkgPT4gdC5hZGRFcnJvckluZm8uYmluZCh0KSxcbiAgJG1ldHJpYzogKHQpID0+IHQuYWRkTWV0cmljLmJpbmQodCksXG4gICRldmFsOiAodCkgPT4gdC5hZGRFdmFsLmJpbmQodCksXG4gICRhdHRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5hdHRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRkZXRhY2hTY29wZVJlY29yZGVyOiAodCkgPT4gdC5kZXRhY2hTY29wZVJlY29yZGVyLmJpbmQodCksXG4gICRnZXRTY29wZVJlY29yZGVyczogKHQpID0+IHQuZ2V0U2NvcGVSZWNvcmRlcnMuYmluZCh0KSxcbiAgJGJhdGNoQXJyYXk6ICh0KSA9PiAoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAvLyBPbmUgZ2V0VmFsdWUg4oCUIGZpcmVzIG9uUmVhZCBvbmNlXG4gICAgY29uc3QgY3VycmVudCA9IHQuZ2V0VmFsdWUoa2V5KTtcbiAgICAvLyBDbG9uZSBvbmNlIOKAlCBERUVQIChvciBzdGFydCBlbXB0eSBpZiBtaXNzaW5nL25vbi1hcnJheSkuIFRoZSByZWFkIGlzXG4gICAgLy8gQk9SUk9XRUQ6IGJlZm9yZSB0aGUgc3RhZ2UncyBmaXJzdCBzdGFnZWQgd3JpdGUgaXQgaXMgY29tbWl0dGVkIHNoYXJlZFxuICAgIC8vIG1lbW9yeSBpdHNlbGYsIHNvIGEgc2hhbGxvdyBgWy4uLmN1cnJlbnRdYCBoYW5kZWQgdGhlIHN0YWdlIHRoZVxuICAgIC8vIGNvbW1pdHRlZCBFTEVNRU5UUyBhbmQgYGFyclswXS5uID0gOWAgZWRpdGVkIGNvbW1pdHRlZCBzdGF0ZSBpbiBwbGFjZVxuICAgIC8vIHdpdGggbm8gdHJhY2Ugcm93IChhbmQgdGhlIGxhenkgYnVmZmVyJ3MgYmFzZSB3YXMgdGhlbiB0YWtlbiBBRlRFUiB0aGVcbiAgICAvLyBlZGl0LCBzbyB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIgc2F3IG5vdGhpbmcpLiBTdGF0ZSB2YWx1ZXMgc3Vydml2ZVxuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgIGJ5IGNvbnRyYWN0LCBzbyB0aGUgd29ya2luZyBjb3B5IGlzIGEgZnVsbCBjb3B5LlxuICAgIGNvbnN0IGNsb25lOiB1bmtub3duW10gPSBBcnJheS5pc0FycmF5KGN1cnJlbnQpID8gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpIDogW107XG4gICAgLy8gVXNlciBhcHBsaWVzIGFsbCBtdXRhdGlvbnMgdG8gdGhlIHBsYWluIGNsb25lIOKAlCBubyBQcm94eSwgbm8gcGVyLW11dGF0aW9uIGNvbW1pdFxuICAgIGZuKGNsb25lKTtcbiAgICAvLyBPbmUgc2V0VmFsdWUg4oCUIGZpcmVzIG9uV3JpdGUgb25jZSB3aXRoIHRoZSBmaW5hbCBhcnJheVxuICAgIHQuc2V0VmFsdWUoa2V5LCBjbG9uZSk7XG4gIH0sXG4gICRicmVhazogKF90LCBvcHRzKSA9PiAocmVhc29uPzogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFvcHRzLmJyZWFrRm4pIHRocm93IG5ldyBFcnJvcignJGJyZWFrKCkgaXMgbm90IGF2YWlsYWJsZSBvdXRzaWRlIHN0YWdlIGV4ZWN1dGlvbicpO1xuICAgIG9wdHMuYnJlYWtGbihyZWFzb24pO1xuICB9LFxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpLiBSb3V0ZXMgdG8gU2NvcGVGYWNhZGUuZW1pdEV2ZW50XG4gIC8vIHdoaWNoIGhhbmRsZXMgZmFzdC1wYXRoLCBlbnJpY2htZW50LCByZWRhY3Rpb24sIGFuZCBlcnJvciBpc29sYXRpb24uXG4gICRlbWl0OiAodCkgPT4gdC5lbWl0RXZlbnQuYmluZCh0KSxcbiAgLy8gRGV0YWNoIChUNCkg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnRzLiBEZWxlZ2F0ZXMgdG8gU2NvcGVGYWNhZGVcbiAgLy8gd2hpY2ggbWludGVkIHJlZklkcyBmcm9tIHJ1bnRpbWVTdGFnZUlkLlxuICAkZGV0YWNoQW5kSm9pbkxhdGVyOiAodCkgPT4gdC5kZXRhY2hBbmRKb2luTGF0ZXIuYmluZCh0KSxcbiAgJGRldGFjaEFuZEZvcmdldDogKHQpID0+IHQuZGV0YWNoQW5kRm9yZ2V0LmJpbmQodCksXG4gICR0b1JhdzogKHQpID0+ICgpID0+IHQsXG59O1xuXG4vLyAtLSBHdWFyZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaGVzZSBtdXN0IGJlIGhhbmRsZWQgdG8gcHJldmVudCBQcm94eSBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBQcm9taXNlLFxuLy8gYnJlYWtpbmcgaW5zdGFuY2VvZiBjaGVja3MsIG9yIGNvbmZ1c2luZyB0ZXN0IG1hdGNoZXJzLlxuXG5jb25zdCBHVUFSRF9QUk9QUzogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gPSB7XG4gIHRoZW46IHVuZGVmaW5lZCwgLy8gcHJldmVudCBQcm9taXNlIGRldGVjdGlvblxuICBhc3ltbWV0cmljTWF0Y2g6IHVuZGVmaW5lZCwgLy8gcHJldmVudCB2aXRlc3QvamVzdCBtYXRjaGVyIGNvbmZ1c2lvblxuICBjb25zdHJ1Y3RvcjogT2JqZWN0LCAvLyBzYWZlIHByb3RvdHlwZVxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ1R5cGVkU2NvcGUnLFxufTtcblxuLy8gLS0gU2lsZW50IGV4aXN0ZW5jZSBjaGVjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIERvZXMgdGhpcyBrZXkgZXhpc3QgaW4gc3RhdGUsIGFuc3dlcmVkIHdpdGggTk8gdHJhY2tpbmcgc2lkZSBlZmZlY3QgYXQgYWxsP1xuICpcbiAqIGBnZXRTdGF0ZUtleXMoKWAgaXMgdGhlIG9ubHkgaW5zcGVjdGlvbiBhIFNjb3BlRmFjYWRlIGFuc3dlcnMgd2l0aG91dCByb3V0aW5nXG4gKiB0aHJvdWdoIHRoZSB0cmFja2VkIHJlYWQgcGF0aC4gYGhhc0tleSgpYCBkZWxpYmVyYXRlbHkgRE9FUyByb3V0ZSB0aHJvdWdoIGl0OlxuICogYCdrJyBpbiBzY29wZWAgaXMgYSByZWFsIHF1ZXN0aW9uIGFib3V0IHN0YXRlIHRoYXQgYSBzdGFnZSBjYW4gYnJhbmNoIG9uLCBzb1xuICogaXQgcmVnaXN0ZXJzIGFzIGEgcmVhZCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhpcyBwcm9iZSBtdXN0IG5vdCB1c2UgaXQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSB0YXJnZXQgb2ZmZXJzIG5vIHNpbGVudCBhbnN3ZXI7IGNhbGxlcnMgbXVzdFxuICogdGhlbiBjaG9vc2UgZGVsaWJlcmF0ZWx5IHJhdGhlciB0aGFuIGFzc3VtZS5cbiAqL1xuZnVuY3Rpb24gc2lsZW50bHlLbm93bktleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCkuaW5jbHVkZXMoa2V5KTtcbn1cblxuLy8gLS0gTXV0YWJsZSBzdGF0ZSBwZXIgcHJveHkgaW5zdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgUmVhY3RpdmVTdGF0ZSB7XG4gIGJyZWFrRm4/OiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogVGhlIHRvcC1sZXZlbCBrZXkncyBjaGlsZCBwcm94eSwgdmFsaWRhdGVkIGJ5IHJhdyBpZGVudGl0eSAoYGxpdmVWaWV3LnRzIMK3IGNhY2hlZE1lbWJlcmApOyBhIHNpbmsgZHJvcHMgdGhlIGtleSBvbiB3cml0ZS4gKi9cbiAgY2hpbGRDYWNoZTogTWVtYmVyQ2FjaGU7XG59XG5cbi8vIC0tIE5lc3RlZCBjaGlsZCBwcm94aWVzIChmb3IgZGVlcCB3cml0ZSBpbnRlcmNlcHRpb24pIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gQm90aCBmYWN0b3JpZXMgYXJlIE9SQ0hFU1RSQVRPUlMgKDkuMjMuMSk6IHJlYWRzIGFyZSBgbGl2ZVZpZXcudHNgLCB3cml0ZXNcbi8vIGFyZSBgd3JpdGVUcmFwcy50c2Agb3ZlciBhIGByb290S2V5U2lua2AsIGFuZCB0aGUgT05FIHRoaW5nIGVhY2ggZGVjaWRlc1xuLy8gaXRzZWxmIGlzIHdoYXQgYSBjaGlsZCBtZW1iZXIgYmVjb21lcyDigJQgdGhlIGN5Y2xlIHBvbGljeS4gRWFjaCBob2xkcyBpdHNcbi8vIG93biBwZXItbWVtYmVyIHByb3h5IGNhY2hlICg5LjIzLjIsIGBsaXZlVmlldy50cyDCtyBjYWNoZWRNZW1iZXJgKS5cbi8vXG4vLyBDeWNsZSBzYWZldHk6IGFuIGltbXV0YWJsZSBTZXQ8b2JqZWN0PiBvZiBhbmNlc3RvciBvYmplY3RzIGlzIHBhc3NlZCBkb3duXG4vLyBlYWNoIGFjY2VzcyBjaGFpbi4gRWFjaCBicmFuY2ggZ2V0cyBpdHMgb3duIGNvcHkgKG5ldyBTZXQocGFyZW50KSkgc29cbi8vIHNjb3BlLnguZnJpZW5kIGFuZCBzY29wZS54LmNvd29ya2VyIGRvbid0IHBvbGx1dGUgZWFjaCBvdGhlcidzIHRyYWNraW5nLlxuLy8gV2hlbiBhIGNoaWxkIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGFuY2VzdG9yIHNldCwgd2UndmUgaGl0IGEgY3ljbGUuXG4vLyBBdCB0aGUgY3ljbGUgYnJlYWs6IHJldHVybiBhIHRlcm1pbmFsIHByb3h5IHRoYXQgdHJhY2tzIHdyaXRlcyAoc2V0IHRyYXBcbi8vIHN0aWxsIGJ1aWxkcyBwYXRoICsgY29tbWl0cyB0aHJvdWdoIHRoZSBzaW5rKSBidXQgZG9lc24ndCByZWN1cnNlIHJlYWRzXG4vLyBmdXJ0aGVyLiBUaGUgdGVybWluYWwgY2hhaW4gc2hhcmVzIE9ORSBtdXRhYmxlIGB2aXNpdGVkYCBzZXQ6IGEgdmFsdWUgc2VlblxuLy8gYW55d2hlcmUgcGFzdCB0aGUgY3ljbGUgZWRnZSBpcyBoYW5kZWQgYmFjayByYXcuXG5cbmZ1bmN0aW9uIGNyZWF0ZVRlcm1pbmFsUHJveHkoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNpbms6IFdyaXRlU2luayxcbiAgc2VnbWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICB2aXNpdGVkOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICB2aXNpdGVkLmFkZChvYmopO1xuICBjb25zdCBtZW1iZXJzID0gbmV3IE1lbWJlckNhY2hlKCk7XG4gIGNvbnN0IGxpdmUgPSAoKSA9PiBsaXZlT2JqZWN0KG9iaiwgc2luay5yZWFkQXQoc2VnbWVudHMpKTtcbiAgY29uc3QgY2hpbGQgPSAodmFsdWU6IHVua25vd24sIHBhdGg6IHN0cmluZ1tdKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCFzaG91bGRXcmFwV2l0aFByb3h5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIC8vIEFuIGFycmF5IHBhc3QgdGhlIGN5Y2xlIGVkZ2Ugc3RpbGwgZ2V0cyBjb3B5LW9uLXdyaXRlIGludGVyY2VwdGlvbiDigJRcbiAgICAvLyBpdCBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIHJvb3Qga2V5LCB0aGUgc2FtZSBsYXcgYXMgdGhlIG5lc3RlZCBwcm94eS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBhcnJheVByb3h5QXQoc2luaywgcGF0aCk7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHZhbHVlIGFzIG9iamVjdCkpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCwgdmlzaXRlZCk7XG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBsaXZlR2V0VHJhcChsaXZlLCBzZWdtZW50cywgY2hpbGQsIG1lbWJlcnMpLFxuICAgIHNldDogc2lua1NldFRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBzaW5rRGVsZXRlVHJhcChzaW5rLCBzZWdtZW50cyksXG4gICAgLi4ubGl2ZUluc3BlY3Rpb25UcmFwcyhsaXZlKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5lc3RlZFByb3h5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzaW5rOiBXcml0ZVNpbmssXG4gIHNlZ21lbnRzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHVua25vd24ge1xuICAvLyBSZWFkcyBhcmUgTElWRSAoOS4yMi4wKTogYSBoZWxkIHByb3h5IHJlYWRzIGl0cyBvd24gd3JpdGVzLCBgJ3gnIGluIG9gXG4gIC8vIGFuZCBgT2JqZWN0LmtleXMobylgIHNlZSB0aGVtLCBhbmQgYG8uYiA9IG8uYSAqIDEwYCB1c2VzIHRoZSBuZXcgYGFgLlxuICAvLyBUaGUgY2FwdHVyZWQgb2JqZWN0IGFuc3dlcnMgb25seSB3aGVuIHRoZSBwYXRoIGlzIGdvbmUg4oCUIHNlZSBsaXZlVmlldy50cy5cbiAgY29uc3QgbWVtYmVycyA9IG5ldyBNZW1iZXJDYWNoZSgpO1xuICBjb25zdCBsaXZlID0gKCkgPT4gbGl2ZU9iamVjdChvYmosIHNpbmsucmVhZEF0KHNlZ21lbnRzKSk7XG4gIGNvbnN0IGNoaWxkID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmdbXSk6IHVua25vd24gPT4ge1xuICAgIGlmICghc2hvdWxkV3JhcFdpdGhQcm94eSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICAvLyBBbiBhcnJheSBjb21taXRzIGFzIGEgYHNldGAgb2YgdGhlIFJPT1QgS0VZIChyZWFjdGl2ZS9SRUFETUUubWQsIGxhdyAzKVxuICAgIC8vIOKAlCB0aGUgc2luaydzIHZlcmIsIHdoYXRldmVyIGRlcHRoIHRoZSBhcnJheSBzaXRzIGF0LlxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGFycmF5UHJveHlBdChzaW5rLCBwYXRoKTtcbiAgICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSBhcyBvYmplY3QpKSByZXR1cm4gY3JlYXRlVGVybWluYWxQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgcGF0aCk7XG4gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZFByb3h5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzaW5rLCBwYXRoLCBuZXcgU2V0KGFuY2VzdG9ycykuYWRkKHZhbHVlIGFzIG9iamVjdCkpO1xuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KG9iaiwge1xuICAgIGdldDogbGl2ZUdldFRyYXAobGl2ZSwgc2VnbWVudHMsIGNoaWxkLCBtZW1iZXJzKSxcbiAgICBzZXQ6IHNpbmtTZXRUcmFwKHNpbmssIHNlZ21lbnRzKSxcbiAgICBkZWxldGVQcm9wZXJ0eTogc2lua0RlbGV0ZVRyYXAoc2luaywgc2VnbWVudHMpLFxuICAgIC4uLmxpdmVJbnNwZWN0aW9uVHJhcHMobGl2ZSksXG4gIH0pO1xufVxuXG4vLyAtLSBUb3AtbGV2ZWwgbGVhdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogYGludGVybmFsUmVhZGAgYW5zd2VyZWQgbm90aGluZzogdGhlIG5hbWUgaXMgYSBzdGF0ZSBrZXkgYW5kIG11c3QgYmUgcmVhZCAodHJhY2tlZCkgZnJvbSB0aGUgdGFyZ2V0LiAqL1xuY29uc3QgU1RBVEVfS0VZOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdzdGF0ZS1rZXknKTtcblxuLyoqXG4gKiBXSFk6IHRoZSBuYW1lcyB0aGUgc2NvcGUgYW5zd2VycyBJVFNFTEYg4oCUIGludGVybmFsIHN5bWJvbHMsIHRoZSBndWFyZFxuICogcHJvcGVydGllcywgTm9kZSdzIGluc3BlY3QgaG9vaywgdGhlIGAkYC1tZXRob2RzLCB0aGUgZXhlY3V0b3IncyBhbGxvd2xpc3RlZFxuICogcGFzcy10aHJvdWdocyAoYGF0dGFjaFNjb3BlUmVjb3JkZXJgLCBgbm90aWZ5U3RhZ2VTdGFydGAsIOKApiwgY2FsbGVkIGRpcmVjdGx5XG4gKiBvbiB0aGUgc2NvcGUpIGFuZCB0aGUgSlNPTiBwcm9iZSDigJQgbXVzdCBuZXZlciBiZWNvbWUgdHJhY2tlZCByZWFkcztcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyBhIHN0YXRlIGtleSBhbmQgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSBwcm9iZTogYEpTT04uc3RyaW5naWZ5YCBhc2tzIEVWRVJZIHZhbHVlIGZvciBhIGB0b0pTT05gIG1ldGhvZC4gVGhhdFxuICogcXVlc3Rpb24gY29tZXMgZnJvbSB0aGUgcnVudGltZSwgbm90IHRoZSBzdGFnZSBhdXRob3IsIHNvIGl0IG11c3Qgbm90IGVudGVyXG4gKiB0aGUgcmVhZCBzZXQuIEEgc3RhdGUga2V5IGxpdGVyYWxseSBjYWxsZWQgJ3RvSlNPTicgaXMgbGVnYWw6IHdoZW4gaXQgRVhJU1RTXG4gKiB0aGlzIGlzIGEgZ2VudWluZSByZWFkIGFuZCBzdGF5cyB0cmFja2VkLCBhbmQgd2hlbiB0aGUgdGFyZ2V0IGNhbm5vdCBhbnN3ZXJcbiAqIHNpbGVudGx5LCB0cnV0aCB3aW5zIG92ZXIgbm9pc2Ug4oCUIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaW50ZXJuYWxSZWFkKHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgaWYgKHByb3AgPT09IElTX1RZUEVEX1NDT1BFKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb3AgPT09IEJSRUFLX1NFVFRFUikge1xuICAgIHJldHVybiAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgIHN0YXRlLmJyZWFrRm4gPSBmbjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICAgIGlmIChwcm9wID09PSBTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpKSByZXR1cm4gKCkgPT4gdGFyZ2V0LmdldFZhbHVlKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdVQVJEX1BST1BTLCBwcm9wKSkgcmV0dXJuIEdVQVJEX1BST1BTW3Byb3BdO1xuICBpZiAoU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIE1FVEhPRF9ST1VURVNbcHJvcF0/Lih0YXJnZXQsIHN0YXRlKTtcbiAgaWYgKEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMuaGFzKHByb3ApICYmIHR5cGVvZiAodGFyZ2V0IGFzIGFueSlbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gKHRhcmdldCBhcyBhbnkpW3Byb3BdLmJpbmQodGFyZ2V0KTtcbiAgfVxuICBpZiAocHJvcCA9PT0gJ3RvSlNPTicgJiYgc2lsZW50bHlLbm93bktleSh0YXJnZXQsIHByb3ApID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIFNUQVRFX0tFWTtcbn1cblxuLyoqXG4gKiBBIHdyYXBwYWJsZSBzdGF0ZSB2YWx1ZSBiZWNvbWVzIHRoZSBhcnJheSBvciBuZXN0ZWQgcHJveHkgZm9yIGl0cyBrZXk7XG4gKiBhbnl0aGluZyBlbHNlIGlzIGhhbmRlZCBiYWNrIHJhdy4gYHNjb3BlLmsgPT09IHNjb3BlLmtgIGhvbGRzIHdpdGhpbiBhXG4gKiBzdGFnZSB0aHJvdWdoIHRoZSBzYW1lIHBlci1tZW1iZXIgY2FjaGUgZXZlcnkgb2JqZWN0IHByb3h5IHVzZXNcbiAqIChgbGl2ZVZpZXcudHMgwrcgY2FjaGVkTWVtYmVyYCk6IGEgd3JpdGUgdG8gdGhlIGtleSBkcm9wcyB0aGUgZW50cnkgKHRoZVxuICogc2luayBkb2VzIGl0KSwgYSBjb21taXQgc3dhcHMgdGhlIHZhbHVlIGFuZCB0aGUgcmVmIGNoZWNrIG1pc3NlcyDigJQgZWl0aGVyXG4gKiB3YXkgdGhlIG5leHQgcmVhZCBidWlsZHMgYSBmcmVzaCBwcm94eSBvdmVyIHRoZSBuZXcgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBTdGF0ZVZhbHVlKFxuICB0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LFxuICByZWFkU2lsZW50OiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIHN0YXRlOiBSZWFjdGl2ZVN0YXRlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICBpZiAoIXNob3VsZFdyYXBXaXRoUHJveHkodmFsdWUpKSByZXR1cm4gdmFsdWU7IC8vIERhdGUsIE1hcCwgY2xhc3MgaW5zdGFuY2UsIGZyb3plbiDigKZcbiAgcmV0dXJuIGNhY2hlZE1lbWJlcihcbiAgICBzdGF0ZS5jaGlsZENhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZSxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBzaW5rID0gcm9vdEtleVNpbmsodGFyZ2V0LCByZWFkU2lsZW50LCBrZXksIHN0YXRlLmNoaWxkQ2FjaGUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYXJyYXlQcm94eUF0KHNpbmssIFtdKTtcbiAgICAgIHJldHVybiBjcmVhdGVOZXN0ZWRQcm94eSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgc2luaywgW10sIG5ldyBTZXQ8b2JqZWN0PihbdmFsdWVdKSk7XG4gICAgfSxcbiAgICBbXSxcbiAgKTtcbn1cblxuLyoqIFdIWTogYSBgJGAtbmFtZSBjYW4gbmV2ZXIgYmUgYSBzdGF0ZSBrZXkg4oCUIHRoZSB3cml0ZSBpcyByZWZ1c2VkLCBub3Qgc2hhZG93ZWQ7IGV2ZXJ5IG90aGVyIGFzc2lnbm1lbnRcbiAqICBzdG9yZXMgdGhlIHVud3JhcHBlZCB2YWx1ZSAobGFuZG1pbmUgMSkgYW5kIGRyb3BzIHRoZSBrZXkncyBjYWNoZWQgcHJveHkuICovXG5mdW5jdGlvbiBhc3NpZ25TdGF0ZUtleSh0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBzdGF0ZTogUmVhY3RpdmVTdGF0ZSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChTQ09QRV9NRVRIT0RfTkFNRVMuaGFzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHNldCBzdGF0ZSBrZXkgXCIke2tleX1cIiAtLSBpdCBjb25mbGljdHMgd2l0aCBhIHJlc2VydmVkIFR5cGVkU2NvcGUgbWV0aG9kLiBSZW5hbWUgdGhlIHN0YXRlIGtleSB0byBhdm9pZCAkLXByZWZpeGVkIG5hbWVzLmAsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc2V0VmFsdWUoa2V5LCB1bndyYXBQcm94eSh2YWx1ZSkpO1xuICBzdGF0ZS5jaGlsZENhY2hlLmRlbGV0ZShrZXkpO1xufVxuXG4vKiogRG9lcyB0aGUga2V5IGV4aXN0IOKAlCBhbnN3ZXJlZCB3aXRob3V0IGEgdHJhY2tlZCByZWFkIHdoZXJldmVyIHRoZSB0YXJnZXQgY2FuOyBgZ2V0VmFsdWVgIGlzIHRoZSBsYXN0IHJlc29ydC4gKi9cbmZ1bmN0aW9uIGtub3duS2V5KHRhcmdldDogUmVhY3RpdmVUYXJnZXQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaGFzS2V5KSByZXR1cm4gdGFyZ2V0Lmhhc0tleShrZXkpO1xuICBpZiAodGFyZ2V0LmdldFN0YXRlS2V5cykgcmV0dXJuIHRhcmdldC5nZXRTdGF0ZUtleXMoKS5pbmNsdWRlcyhrZXkpO1xuICByZXR1cm4gdGFyZ2V0LmdldFZhbHVlKGtleSkgIT09IHVuZGVmaW5lZDsgLy8gZmFsbGJhY2s6IGZpcmVzIG9uUmVhZCAoYWNjZXB0YWJsZSBkZWdyYWRhdGlvbilcbn1cblxuLyoqIEV2ZXJ5IHN0YXRlIGtleSDigJQgc2lsZW50bHkgd2hlcmUgdGhlIHRhcmdldCBjYW4sIGVsc2UgZnJvbSBhIHdob2xlLXN0YXRlIHJlYWQuICovXG5mdW5jdGlvbiBzdGF0ZUtleXModGFyZ2V0OiBSZWFjdGl2ZVRhcmdldCk6IHN0cmluZ1tdIHtcbiAgaWYgKHRhcmdldC5nZXRTdGF0ZUtleXMpIHJldHVybiB0YXJnZXQuZ2V0U3RhdGVLZXlzKCk7XG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0LmdldFZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBzbmFwc2hvdCAmJiB0eXBlb2Ygc25hcHNob3QgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMoc25hcHNob3QpIDogW107XG59XG5cbi8vIC0tIFRvcC1sZXZlbCBwcm94eSAodGhlIG1haW4gVHlwZWRTY29wZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVHlwZWRTY29wZTxUPiBwcm94eSB3cmFwcGluZyBhIFJlYWN0aXZlVGFyZ2V0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdW5kZXJseWluZyBzY29wZSAoU2NvcGVGYWNhZGUgb3IgYW55IFJlYWN0aXZlVGFyZ2V0KVxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChicmVha1BpcGVsaW5lIGluamVjdGlvbilcbiAqIEByZXR1cm5zIEEgUHJveHkgd2l0aCB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MgYW5kICQtcHJlZml4ZWQgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0Pih0YXJnZXQ6IFJlYWN0aXZlVGFyZ2V0LCBvcHRpb25zPzogUmVhY3RpdmVPcHRpb25zKTogVHlwZWRTY29wZTxUPiB7XG4gIGNvbnN0IHN0YXRlOiBSZWFjdGl2ZVN0YXRlID0geyBicmVha0ZuOiBvcHRpb25zPy5icmVha1BpcGVsaW5lLCBjaGlsZENhY2hlOiBuZXcgTWVtYmVyQ2FjaGUoKSB9O1xuICAvLyBCaW5kIHRoZSBzaWxlbnQgcmVhZCBvbmNlIOKAlCB0aGUgbmVzdGVkL2FycmF5IHByb3hpZXMgcmVzb2x2ZSB0aGVpciBsaXZlIHZpZXcgdGhyb3VnaCBpdC5cbiAgY29uc3QgcmVhZFNpbGVudCA9ICh0YXJnZXQuZ2V0VmFsdWVTaWxlbnQgPz8gdGFyZ2V0LmdldFZhbHVlKS5iaW5kKHRhcmdldCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQgYXMgdW5rbm93biBhcyBUeXBlZFNjb3BlPFQ+LCB7XG4gICAgZ2V0KF9wcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgY29uc3QgYW5zd2VyZWQgPSBpbnRlcm5hbFJlYWQodGFyZ2V0LCBzdGF0ZSwgcHJvcCk7XG4gICAgICBpZiAoYW5zd2VyZWQgIT09IFNUQVRFX0tFWSkgcmV0dXJuIGFuc3dlcmVkO1xuICAgICAgLy8gQSBzdGF0ZSBrZXk6IE9ORSB0cmFja2VkIHJlYWQgKGZpcmVzIG9uUmVhZCBvbmNlKSwgdGhlbiB0aGUgd3JhcHBlci5cbiAgICAgIHJldHVybiB3cmFwU3RhdGVWYWx1ZSh0YXJnZXQsIHJlYWRTaWxlbnQsIHN0YXRlLCBwcm9wIGFzIHN0cmluZywgdGFyZ2V0LmdldFZhbHVlKHByb3AgYXMgc3RyaW5nKSk7XG4gICAgfSxcbiAgICBzZXQoX3Byb3h5VGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykgYXNzaWduU3RhdGVLZXkodGFyZ2V0LCBzdGF0ZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWxldGVQcm9wZXJ0eShfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgdGFyZ2V0LmRlbGV0ZVZhbHVlKHByb3ApO1xuICAgICAgc3RhdGUuY2hpbGRDYWNoZS5kZWxldGUocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyhfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoR1VBUkRfUFJPUFMsIHByb3ApO1xuICAgICAgcmV0dXJuIFNDT1BFX01FVEhPRF9OQU1FUy5oYXMocHJvcCkgfHwga25vd25LZXkodGFyZ2V0LCBwcm9wKTtcbiAgICB9LFxuICAgIG93bktleXM6ICgpID0+IHN0YXRlS2V5cyh0YXJnZXQpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfcHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycgfHwgU0NPUEVfTUVUSE9EX05BTUVTLmhhcyhwcm9wKSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gJC1tZXRob2RzIGFyZSBub24tZW51bWVyYWJsZVxuICAgICAgaWYgKCFrbm93bktleSh0YXJnZXQsIHByb3ApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9OyAvLyB0aGUgdmFsdWUgaXMgZmV0Y2hlZCB2aWEgdGhlIGdldCB0cmFwXG4gICAgfSxcbiAgfSk7XG59XG4iXX0=