@plumile/router 0.1.30 → 0.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/lib/esm/ResourcePage.d.ts +1 -0
  2. package/lib/esm/ResourcePage.d.ts.map +1 -1
  3. package/lib/esm/ResourcePage.js +4 -1
  4. package/lib/esm/history/BrowserHistory.d.ts +7 -2
  5. package/lib/esm/history/BrowserHistory.d.ts.map +1 -1
  6. package/lib/esm/history/BrowserHistory.js +96 -18
  7. package/lib/esm/history/types.d.ts +8 -1
  8. package/lib/esm/history/types.d.ts.map +1 -1
  9. package/lib/esm/history/types.js +1 -1
  10. package/lib/esm/routing/Link.d.ts.map +1 -1
  11. package/lib/esm/routing/Link.js +16 -1
  12. package/lib/esm/routing/createRouter.d.ts +1 -1
  13. package/lib/esm/routing/createRouter.d.ts.map +1 -1
  14. package/lib/esm/routing/createRouter.js +363 -24
  15. package/lib/esm/tools.d.ts +6 -2
  16. package/lib/esm/tools.d.ts.map +1 -1
  17. package/lib/esm/tools.js +47 -2
  18. package/lib/esm/types.d.ts +47 -0
  19. package/lib/esm/types.d.ts.map +1 -1
  20. package/lib/esm/types.js +28 -2
  21. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  22. package/lib/types/ResourcePage.d.ts +1 -0
  23. package/lib/types/ResourcePage.d.ts.map +1 -1
  24. package/lib/types/history/BrowserHistory.d.ts +7 -2
  25. package/lib/types/history/BrowserHistory.d.ts.map +1 -1
  26. package/lib/types/history/types.d.ts +8 -1
  27. package/lib/types/history/types.d.ts.map +1 -1
  28. package/lib/types/routing/Link.d.ts.map +1 -1
  29. package/lib/types/routing/createRouter.d.ts +1 -1
  30. package/lib/types/routing/createRouter.d.ts.map +1 -1
  31. package/lib/types/tools.d.ts +6 -2
  32. package/lib/types/tools.d.ts.map +1 -1
  33. package/lib/types/types.d.ts +47 -0
  34. package/lib/types/types.d.ts.map +1 -1
  35. package/package.json +3 -3
@@ -4,8 +4,179 @@ import { getMatchedRoute, prepareMatch } from '../tools.js';
4
4
  import { parseRawQuery } from '../tools/query.js';
5
5
  import buildCombinedSearch from '../tools/buildCombinedSearch.js';
6
6
  import { parse as parseFilters } from '@plumile/filter-query';
7
+ import { NavigationOrigin, RouterDebugEventKind, } from '../types.js';
7
8
  export default function createRouter(routes, options = {}) {
8
9
  const history = new BrowserHistory();
10
+ const debugEnabled = options.debug === true;
11
+ let debugSubscribers = null;
12
+ if (debugEnabled) {
13
+ debugSubscribers = new Set();
14
+ }
15
+ let pendingNavigationOrigin;
16
+ let lastNavigationOrigin = NavigationOrigin.External;
17
+ let lastPreloadSignature = null;
18
+ function normalizeLocation(location) {
19
+ let pathnameValue = '';
20
+ if (typeof location.pathname === 'string') {
21
+ pathnameValue = location.pathname;
22
+ }
23
+ let searchValue = '';
24
+ if (typeof location.search === 'string') {
25
+ searchValue = location.search;
26
+ }
27
+ let hashValue = '';
28
+ if (typeof location.hash === 'string') {
29
+ hashValue = location.hash;
30
+ }
31
+ return {
32
+ pathname: pathnameValue,
33
+ search: searchValue,
34
+ hash: hashValue,
35
+ };
36
+ }
37
+ function emitDebugEvent(payload) {
38
+ if (!debugEnabled || debugSubscribers === null) {
39
+ return;
40
+ }
41
+ for (const subscriber of debugSubscribers) {
42
+ try {
43
+ subscriber(payload);
44
+ }
45
+ catch {
46
+ }
47
+ }
48
+ }
49
+ function mapOrigin(raw) {
50
+ if (raw === undefined) {
51
+ return undefined;
52
+ }
53
+ switch (raw) {
54
+ case NavigationOrigin.LinkClick:
55
+ case NavigationOrigin.LinkHover:
56
+ case NavigationOrigin.Programmatic:
57
+ case NavigationOrigin.PopstateBack:
58
+ case NavigationOrigin.PopstateForward:
59
+ case NavigationOrigin.PopstateUnknown:
60
+ case NavigationOrigin.External:
61
+ case NavigationOrigin.Normalize:
62
+ case NavigationOrigin.PreloadHover:
63
+ return raw;
64
+ default:
65
+ return undefined;
66
+ }
67
+ }
68
+ function resolveNavigationOrigin(context) {
69
+ const fallbackOrigin = pendingNavigationOrigin;
70
+ let origin;
71
+ const contextOrigin = context?.origin;
72
+ if (contextOrigin !== undefined) {
73
+ origin = mapOrigin(contextOrigin);
74
+ }
75
+ origin ??= fallbackOrigin;
76
+ origin ??= NavigationOrigin.External;
77
+ pendingNavigationOrigin = undefined;
78
+ return origin;
79
+ }
80
+ function readMatchedRoutePath(entry) {
81
+ if (entry === undefined) {
82
+ return undefined;
83
+ }
84
+ const matchedRoute = entry.route;
85
+ if (matchedRoute === null) {
86
+ return undefined;
87
+ }
88
+ const childRoutes = matchedRoute.route.routes;
89
+ if (Array.isArray(childRoutes)) {
90
+ const lastChild = childRoutes.at(-1);
91
+ if (lastChild !== undefined) {
92
+ const lastChildRecord = lastChild;
93
+ const childPath = lastChildRecord.path;
94
+ if (typeof childPath === 'string') {
95
+ return childPath;
96
+ }
97
+ }
98
+ }
99
+ const rootPath = matchedRoute.route.path;
100
+ if (typeof rootPath === 'string') {
101
+ return rootPath;
102
+ }
103
+ return undefined;
104
+ }
105
+ function createPrepareDebug(origin) {
106
+ if (!debugEnabled) {
107
+ return undefined;
108
+ }
109
+ return {
110
+ origin,
111
+ requestTime: Date.now(),
112
+ emit(payload) {
113
+ emitDebugEvent({
114
+ ...payload,
115
+ location: normalizeLocation(history.location),
116
+ });
117
+ },
118
+ };
119
+ }
120
+ function buildPreloadKey(kind, pathname) {
121
+ return `${kind}:${pathname}`;
122
+ }
123
+ function maybeEmitProgrammaticPreload(kind, pathname, origin) {
124
+ if (!debugEnabled) {
125
+ return;
126
+ }
127
+ const key = buildPreloadKey(kind, pathname);
128
+ const now = Date.now();
129
+ const recentlyRecorded = lastPreloadSignature !== null &&
130
+ lastPreloadSignature.key === key &&
131
+ now - lastPreloadSignature.timestamp < 50;
132
+ if (!recentlyRecorded) {
133
+ emitDebugEvent({
134
+ kind,
135
+ origin,
136
+ timestamp: now,
137
+ location: normalizeLocation(history.location),
138
+ details: {
139
+ targetPathname: pathname,
140
+ },
141
+ });
142
+ }
143
+ lastPreloadSignature = null;
144
+ }
145
+ let debugHelpers;
146
+ if (debugEnabled) {
147
+ debugHelpers = {
148
+ recordPreload(kind, origin, pathname) {
149
+ const timestamp = Date.now();
150
+ lastPreloadSignature = {
151
+ key: buildPreloadKey(kind, pathname),
152
+ timestamp,
153
+ };
154
+ emitDebugEvent({
155
+ kind,
156
+ origin,
157
+ timestamp,
158
+ location: normalizeLocation(history.location),
159
+ details: {
160
+ targetPathname: pathname,
161
+ },
162
+ });
163
+ },
164
+ recordNavigationIntent(origin) {
165
+ pendingNavigationOrigin = origin;
166
+ },
167
+ recordHistoryAction(kind, origin, location, details) {
168
+ pendingNavigationOrigin = origin;
169
+ emitDebugEvent({
170
+ kind,
171
+ origin,
172
+ timestamp: Date.now(),
173
+ location: normalizeLocation(location),
174
+ details,
175
+ });
176
+ },
177
+ };
178
+ }
179
+ let routerGlobal = null;
9
180
  const flatRoutes = buildRoutes(routes);
10
181
  const route = getMatchedRoute(flatRoutes, history.location);
11
182
  const initialRawQuery = parseRawQuery(history.location.search);
@@ -23,7 +194,7 @@ export default function createRouter(routes, options = {}) {
23
194
  initialFilters = parsed.filters;
24
195
  initialFilterDiagnostics = parsed.diagnostics;
25
196
  }
26
- const preparedMatch = prepareMatch(route, initialFilters);
197
+ const preparedMatch = prepareMatch(route, initialFilters, createPrepareDebug(lastNavigationOrigin));
27
198
  let currentEntry = {
28
199
  forceRerender: false,
29
200
  location: history.location,
@@ -34,6 +205,7 @@ export default function createRouter(routes, options = {}) {
34
205
  filters: initialFilters,
35
206
  filterDiagnostics: initialFilterDiagnostics,
36
207
  activeQuerySchema: initialUnifiedSchema,
208
+ debugOrigin: lastNavigationOrigin,
37
209
  };
38
210
  const initTyped = currentEntry.filters;
39
211
  let initPageNumeric;
@@ -60,21 +232,105 @@ export default function createRouter(routes, options = {}) {
60
232
  querySchema: initialUnifiedSchema,
61
233
  });
62
234
  if (normalizedSearch !== history.location.search) {
235
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.Normalize, NavigationOrigin.Normalize, {
236
+ pathname: history.location.pathname,
237
+ search: normalizedSearch,
238
+ hash: '',
239
+ }, { reason: 'initial-page-clamp' });
240
+ let normalizeDebugContext;
241
+ if (debugEnabled) {
242
+ normalizeDebugContext = {
243
+ origin: NavigationOrigin.Normalize,
244
+ trigger: 'normalize',
245
+ };
246
+ }
63
247
  history.set({
64
248
  pathname: history.location.pathname,
65
249
  search: normalizedSearch,
66
250
  hash: '',
251
+ debugContext: normalizeDebugContext,
67
252
  });
68
253
  currentEntry = {
69
254
  ...currentEntry,
70
255
  location: { ...currentEntry.location, search: normalizedSearch },
71
256
  rawSearch: normalizedSearch,
257
+ debugOrigin: NavigationOrigin.Normalize,
72
258
  };
73
259
  }
74
260
  }
261
+ if (debugEnabled) {
262
+ let snapshotOrigin = NavigationOrigin.External;
263
+ if (currentEntry.debugOrigin !== undefined) {
264
+ snapshotOrigin = currentEntry.debugOrigin;
265
+ }
266
+ emitDebugEvent({
267
+ kind: RouterDebugEventKind.Snapshot,
268
+ origin: snapshotOrigin,
269
+ timestamp: Date.now(),
270
+ location: normalizeLocation(history.location),
271
+ details: {
272
+ routePath: readMatchedRoutePath(currentEntry),
273
+ },
274
+ });
275
+ }
75
276
  let nextId = 0;
76
277
  const subscribers = new Map();
77
- const cleanup = history.subscribe((location, forceRerender) => {
278
+ const disposeHistory = history.subscribe((location, forceRerender, debugContext) => {
279
+ const origin = resolveNavigationOrigin(debugContext);
280
+ lastNavigationOrigin = origin;
281
+ const locationPayload = normalizeLocation(location);
282
+ const debugContextOrigin = debugContext?.origin;
283
+ if (debugEnabled && debugContextOrigin !== undefined) {
284
+ let historyDetails;
285
+ if (typeof debugContext?.historyIndex === 'number') {
286
+ historyDetails = { historyIndex: debugContext.historyIndex };
287
+ }
288
+ switch (debugContextOrigin) {
289
+ case NavigationOrigin.PopstateBack: {
290
+ emitDebugEvent({
291
+ kind: RouterDebugEventKind.PopstateBack,
292
+ origin,
293
+ timestamp: Date.now(),
294
+ location: locationPayload,
295
+ details: historyDetails,
296
+ });
297
+ break;
298
+ }
299
+ case NavigationOrigin.PopstateForward: {
300
+ emitDebugEvent({
301
+ kind: RouterDebugEventKind.PopstateForward,
302
+ origin,
303
+ timestamp: Date.now(),
304
+ location: locationPayload,
305
+ details: historyDetails,
306
+ });
307
+ break;
308
+ }
309
+ case NavigationOrigin.PopstateUnknown: {
310
+ emitDebugEvent({
311
+ kind: RouterDebugEventKind.PopstateUnknown,
312
+ origin,
313
+ timestamp: Date.now(),
314
+ location: locationPayload,
315
+ details: historyDetails,
316
+ });
317
+ break;
318
+ }
319
+ case NavigationOrigin.External: {
320
+ emitDebugEvent({
321
+ kind: RouterDebugEventKind.ExternalNavigation,
322
+ origin,
323
+ timestamp: Date.now(),
324
+ location: locationPayload,
325
+ details: historyDetails,
326
+ });
327
+ break;
328
+ }
329
+ default: {
330
+ break;
331
+ }
332
+ }
333
+ }
78
334
  const samePathname = location.pathname === currentEntry.location.pathname;
79
335
  const sameSearch = location.search === currentEntry.rawSearch;
80
336
  if (!forceRerender && samePathname && sameSearch) {
@@ -121,7 +377,7 @@ export default function createRouter(routes, options = {}) {
121
377
  normalized = true;
122
378
  }
123
379
  if (!samePathname || !sameSearch) {
124
- nextPreparedMatch = prepareMatch(nextRoute, undefined);
380
+ nextPreparedMatch = prepareMatch(nextRoute, undefined, createPrepareDebug(origin));
125
381
  }
126
382
  const nextEntry = {
127
383
  forceRerender: forceRerender || (samePathname && !sameSearch),
@@ -133,6 +389,7 @@ export default function createRouter(routes, options = {}) {
133
389
  filters,
134
390
  filterDiagnostics,
135
391
  activeQuerySchema: querySchema,
392
+ debugOrigin: origin,
136
393
  };
137
394
  if (normalized && querySchema != null) {
138
395
  const normalizedSearch = buildCombinedSearch({
@@ -141,16 +398,26 @@ export default function createRouter(routes, options = {}) {
141
398
  });
142
399
  if (normalizedSearch !== location.search) {
143
400
  let nextSearchStr = normalizedSearch;
144
- if (!nextSearchStr.startsWith('?')) {
145
- if (nextSearchStr === '')
146
- nextSearchStr = '';
147
- else
148
- nextSearchStr = `?${nextSearchStr}`;
401
+ if (!nextSearchStr.startsWith('?') && nextSearchStr.length > 0) {
402
+ nextSearchStr = `?${nextSearchStr}`;
403
+ }
404
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.Normalize, NavigationOrigin.Normalize, {
405
+ pathname: location.pathname,
406
+ search: nextSearchStr,
407
+ hash: '',
408
+ }, { reason: 'runtime-page-clamp' });
409
+ let runtimeNormalizeContext;
410
+ if (debugEnabled) {
411
+ runtimeNormalizeContext = {
412
+ origin: NavigationOrigin.Normalize,
413
+ trigger: 'normalize',
414
+ };
149
415
  }
150
416
  history.set({
151
417
  pathname: location.pathname,
152
418
  search: nextSearchStr,
153
419
  hash: '',
420
+ debugContext: runtimeNormalizeContext,
154
421
  });
155
422
  return;
156
423
  }
@@ -159,6 +426,17 @@ export default function createRouter(routes, options = {}) {
159
426
  subscribers.forEach((callback) => {
160
427
  callback(nextEntry);
161
428
  });
429
+ if (debugEnabled) {
430
+ emitDebugEvent({
431
+ kind: RouterDebugEventKind.Snapshot,
432
+ origin,
433
+ timestamp: Date.now(),
434
+ location: locationPayload,
435
+ details: {
436
+ routePath: readMatchedRoutePath(nextEntry),
437
+ },
438
+ });
439
+ }
162
440
  });
163
441
  const context = {
164
442
  history,
@@ -166,6 +444,7 @@ export default function createRouter(routes, options = {}) {
166
444
  return currentEntry;
167
445
  },
168
446
  preloadCode(pathname) {
447
+ maybeEmitProgrammaticPreload(RouterDebugEventKind.PreloadCode, pathname, NavigationOrigin.Programmatic);
169
448
  const matches = getMatchedRoute(flatRoutes, {
170
449
  ...window.location,
171
450
  pathname,
@@ -181,11 +460,12 @@ export default function createRouter(routes, options = {}) {
181
460
  });
182
461
  },
183
462
  preload(pathname) {
463
+ maybeEmitProgrammaticPreload(RouterDebugEventKind.Preload, pathname, NavigationOrigin.Programmatic);
184
464
  const matches = getMatchedRoute(flatRoutes, {
185
465
  ...window.location,
186
466
  pathname,
187
467
  });
188
- prepareMatch(matches);
468
+ prepareMatch(matches, undefined, createPrepareDebug(NavigationOrigin.Programmatic));
189
469
  },
190
470
  subscribe(callback) {
191
471
  nextId += 1;
@@ -198,31 +478,57 @@ export default function createRouter(routes, options = {}) {
198
478
  },
199
479
  navigate({ pathname, query, filters: navFilters, replace }) {
200
480
  const current = currentEntry;
201
- const targetPathname = pathname ?? current.location.pathname;
481
+ let targetPathname = pathname;
482
+ if (targetPathname === undefined) {
483
+ targetPathname = current.location.pathname;
484
+ }
202
485
  let destSchema;
203
486
  const destRoute = getMatchedRoute(flatRoutes, {
204
487
  ...window.location,
205
488
  pathname: targetPathname,
206
489
  });
207
- if (destRoute != null) {
208
- const last = destRoute.route.routes.at(-1);
209
- if (last != null) {
210
- destSchema = last.querySchema;
211
- }
490
+ const lastRoute = destRoute?.route.routes.at(-1);
491
+ if (lastRoute != null) {
492
+ destSchema = lastRoute.querySchema;
212
493
  }
213
494
  destSchema ??= current.activeQuerySchema;
214
- const effectiveFilters = navFilters ?? current.filters;
495
+ const typedNavFilters = navFilters;
496
+ const effectiveFilters = typedNavFilters ?? current.filters;
215
497
  const filtersInput = effectiveFilters ?? query;
216
498
  const search = buildCombinedSearch({
217
499
  filters: filtersInput,
218
500
  querySchema: destSchema,
219
501
  });
220
502
  const locationObj = { pathname: targetPathname, search, hash: '' };
503
+ const origin = NavigationOrigin.Programmatic;
504
+ debugHelpers?.recordNavigationIntent(origin);
221
505
  if (replace === true) {
222
- history.set(locationObj);
506
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.HistoryReplace, origin, locationObj, { trigger: 'programmatic' });
507
+ let programmaticReplaceContext;
508
+ if (debugEnabled) {
509
+ programmaticReplaceContext = {
510
+ origin,
511
+ trigger: 'programmatic',
512
+ };
513
+ }
514
+ history.set({
515
+ ...locationObj,
516
+ debugContext: programmaticReplaceContext,
517
+ });
223
518
  }
224
519
  else {
225
- history.push(locationObj);
520
+ debugHelpers?.recordHistoryAction(RouterDebugEventKind.HistoryPush, origin, locationObj, { trigger: 'programmatic' });
521
+ let programmaticPushContext;
522
+ if (debugEnabled) {
523
+ programmaticPushContext = {
524
+ origin,
525
+ trigger: 'programmatic',
526
+ };
527
+ }
528
+ history.push({
529
+ ...locationObj,
530
+ debugContext: programmaticPushContext,
531
+ });
226
532
  }
227
533
  },
228
534
  getPrepared(path) {
@@ -239,20 +545,53 @@ export default function createRouter(routes, options = {}) {
239
545
  return undefined;
240
546
  }
241
547
  },
548
+ __debug: debugHelpers,
242
549
  };
243
550
  if (options.debug === true) {
244
551
  try {
245
552
  if (typeof window !== 'undefined') {
246
- window.__PLUMILE_ROUTER__ =
247
- {
248
- get: context.get,
249
- subscribe: context.subscribe,
250
- };
553
+ const bridgeWindow = window;
554
+ routerGlobal = {
555
+ get: context.get.bind(context),
556
+ subscribe: context.subscribe.bind(context),
557
+ subscribeDebug(callback) {
558
+ const subscribers = debugSubscribers;
559
+ if (!debugEnabled ||
560
+ subscribers === null ||
561
+ typeof callback !== 'function') {
562
+ return undefined;
563
+ }
564
+ subscribers.add(callback);
565
+ return () => {
566
+ subscribers.delete(callback);
567
+ };
568
+ },
569
+ };
570
+ bridgeWindow.__PLUMILE_ROUTER__ = routerGlobal;
251
571
  }
252
572
  }
253
573
  catch {
254
574
  }
255
575
  }
576
+ function cleanup() {
577
+ disposeHistory();
578
+ if (debugSubscribers !== null) {
579
+ debugSubscribers.clear();
580
+ }
581
+ if (debugEnabled) {
582
+ try {
583
+ if (typeof window !== 'undefined') {
584
+ const bridgeWindow = window;
585
+ if (bridgeWindow.__PLUMILE_ROUTER__ === routerGlobal) {
586
+ delete bridgeWindow.__PLUMILE_ROUTER__;
587
+ }
588
+ }
589
+ }
590
+ catch {
591
+ }
592
+ }
593
+ routerGlobal = null;
594
+ }
256
595
  return { context, cleanup };
257
596
  }
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUF5RTlELE1BQU0sQ0FBQyxPQUFPLFVBQVUsWUFBWSxDQUNsQyxNQUEyQixFQUMzQixVQUErQixFQUFFO0lBR2pDLE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFHckMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBR3ZDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVELE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9ELElBQUksb0JBQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUU3QixDQUFDO1FBQ1QsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDO0lB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QzVDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQzt3QkFDckIsT0FBTyxFQUFFLENBQUMsUUFBZSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztLQUVGLENBQUM7SUFFRixJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDakMsTUFBa0QsQ0FBQyxrQkFBa0I7b0JBQ3BFO3dCQUNFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRzt3QkFDaEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO3FCQUM3QixDQUFDO1lBQ04sQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7UUFFVCxDQUFDO0lBQ0gsQ0FBQztJQUdELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUZpbHRlcnMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnknO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxuICBBbnlSb3V0ZSxcbiAgUHJlcGFyZWRBY2Nlc3MsXG4gIE5hdmlnYXRlT3ZlcmxvYWRzLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybjxSIGV4dGVuZHMgQW55Um91dGVbXT4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gJiBQcmVwYXJlZEFjY2VzczxSPjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbi8qKlxuICogQ3JlYXRlIGEgcm91dGVyICh0eXBlZCBvdmVybG9hZCkuIFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdCB0dXBsZSBvZiByb3V0ZXMsIGdlbmVyaWNzIGFyZSBwcmVzZXJ2ZWQuXG4gKi9cbi8qKlxuICogT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgYGNyZWF0ZVJvdXRlcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlck9wdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGV4cG9zZXMgYSBsaWdodHdlaWdodCBkZWJ1ZyBicmlkZ2Ugb24gYHdpbmRvdy5fX1BMVU1JTEVfUk9VVEVSX19gXG4gICAqIGNvbnRhaW5pbmcgYHsgZ2V0LCBzdWJzY3JpYmUgfWAuIEludGVuZGVkIGZvciBsb2NhbCB0b29saW5nIC8gdGhlIERldlRvb2xzIGV4dGVuc2lvbi5cbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvdXRlciBpbnN0YW5jZSBmcm9tIGEgcm91dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gUm91dGUgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGRlYnVnIHNldHRpbmdzIHVzZWQgZm9yIGV4cG9zaW5nIGRldmVsb3BtZW50IHRvb2xpbmcuXG4gKiBAcGFyYW0gb3B0aW9ucy5kZWJ1ZyAtIFdoZW4gdHJ1ZSwgcHVibGlzaGVzIGB3aW5kb3cuX19QTFVNSUxFX1JPVVRFUl9fYCAoZGV2ZWxvcG1lbnQgb25seSkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcjxSIGV4dGVuZHMgQW55Um91dGVbXT4oXG4gIHJvdXRlczogWy4uLlJdIHwgQW55Um91dGVbXSxcbiAgb3B0aW9uczogQ3JlYXRlUm91dGVyT3B0aW9ucyA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuPFIgZXh0ZW5kcyBBbnlSb3V0ZVtdID8gUiA6IEFueVJvdXRlW10+IHtcbiAgLy8gSW5pdGlhbGl6ZSBicm93c2VyIGhpc3RvcnkgbWFuYWdlclxuICBjb25zdCBoaXN0b3J5ID0gbmV3IEJyb3dzZXJIaXN0b3J5KCk7XG5cbiAgLy8gQnVpbGQgYSBmbGF0IGxpc3Qgb2Ygcm91dGVzIGZvciBlZmZpY2llbnQgbWF0Y2hpbmdcbiAgY29uc3QgZmxhdFJvdXRlcyA9IGJ1aWxkUm91dGVzKHJvdXRlcyk7XG5cbiAgLy8gRmluZCB0aGUgaW5pdGlhbCByb3V0ZSBtYXRjaCBhbmQgcHJlcGFyZSBpdCBmb3IgcmVuZGVyaW5nXG4gIGNvbnN0IHJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIGhpc3RvcnkubG9jYXRpb24pO1xuICBjb25zdCBpbml0aWFsUmF3UXVlcnkgPSBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKTtcbiAgLy8gRGlyZWN0IHNjaGVtYTogb25seSB0aGUgbWF0Y2hlZCByb3V0ZSdzIG93biBxdWVyeVNjaGVtYSAobm8gaGllcmFyY2hpY2FsIGRpc2NvdmVyeSlcbiAgbGV0IGluaXRpYWxVbmlmaWVkU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgbGFzdCA9IHJvdXRlLnJvdXRlLnJvdXRlcy5hdCgtMSkgYXMgdW5rbm93biBhcyB7XG4gICAgICBxdWVyeVNjaGVtYT86IHVua25vd247XG4gICAgfSB8IG51bGw7XG4gICAgaWYgKGxhc3QgIT0gbnVsbCkge1xuICAgICAgaW5pdGlhbFVuaWZpZWRTY2hlbWEgPSBsYXN0LnF1ZXJ5U2NoZW1hO1xuICAgIH1cbiAgfVxuICBsZXQgaW5pdGlhbEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzOiBhbnlbXSB8IHVuZGVmaW5lZDtcbiAgaWYgKGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsIGluaXRpYWxVbmlmaWVkU2NoZW1hKTtcbiAgICBpbml0aWFsRmlsdGVycyA9IHBhcnNlZC5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzID0gcGFyc2VkLmRpYWdub3N0aWNzIGFzIHVua25vd25bXTtcbiAgfVxuICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKHJvdXRlLCBpbml0aWFsRmlsdGVycyk7XG4gIC8vIEhlbHBlciB0byBidWlsZCB0aGUgcmF3IHF1ZXJ5IG9iamVjdCBmcm9tIGEgc2VhcmNoIHN0cmluZ1xuICBsZXQgY3VycmVudEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsUmF3UXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBpbml0aWFsRmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgfTtcblxuICAvLyBJbml0aWFsIG5vcm1hbGl6YXRpb24gcGFzcyAoZS5nLiwgY2xhbXAgcGFnZSlcbiAgY29uc3QgaW5pdFR5cGVkID0gY3VycmVudEVudHJ5LmZpbHRlcnMgYXMgdW5rbm93biBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRQYWdlTnVtZXJpYzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdFR5cGVkICE9IG51bGwpIHtcbiAgICBjb25zdCByYXdQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykgaW5pdFBhZ2VOdW1lcmljID0gcmF3UGFnZTtcbiAgICBlbHNlIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJhd1BhZ2UsICdlcScpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgaW5pdFBhZ2VOdW1lcmljID0gKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZU51bWVyaWMgPT09ICdudW1iZXInICYmXG4gICAgaW5pdFBhZ2VOdW1lcmljIDwgMSAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IHsgZXE6IDEgfSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybTsgLy8gaW1tZWRpYXRlIHZpc2liaWxpdHlcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICBmaWx0ZXJzOiBub3JtLFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICBwYXRobmFtZTogaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICBoYXNoOiAnJyxcbiAgICAgIH0pO1xuICAgICAgLy8gVXBkYXRlIGN1cnJlbnRFbnRyeS5sb2NhdGlvbiB0byByZWZsZWN0IG5ldyBzZWFyY2ggZGlyZWN0bHkgKGhpc3Rvcnkuc2V0IHRyaWdnZXJzIGFzeW5jIHN1YnNjcmliZXIpXG4gICAgICBjdXJyZW50RW50cnkgPSB7XG4gICAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2ggfSxcbiAgICAgICAgcmF3U2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBNYWludGFpbiBhIHNldCBvZiBzdWJzY3JpYmVycyB0byB0aGUgYWN0aXZlIHJvdXRlIGVudHJ5XG4gIGxldCBuZXh0SWQgPSAwO1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXA8bnVtYmVyLCBTdWJzY3JpYmVDYWxsYmFjazxhbnk+PigpO1xuXG4gIC8vIExpc3RlbiBmb3IgbG9jYXRpb24gY2hhbmdlcywgbWF0Y2ggdG8gdGhlIHJvdXRlIGVudHJ5LCBwcmVwYXJlIHRoZSBlbnRyeSxcbiAgLy8gYW5kIG5vdGlmeSBzdWJzY3JpYmVycy4gVGhpcyBwYXR0ZXJuIGVuc3VyZXMgdGhhdCBkYXRhLWxvYWRpbmdcbiAgLy8gb2NjdXJzICpvdXRzaWRlKiBvZiAtIGFuZCAqYmVmb3JlKiAtIHJlbmRlcmluZy5cbiAgY29uc3QgY2xlYW51cCA9IGhpc3Rvcnkuc3Vic2NyaWJlKChsb2NhdGlvbiwgZm9yY2VSZXJlbmRlcikgPT4ge1xuICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgY29uc3Qgc2FtZVNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCA9PT0gY3VycmVudEVudHJ5LnJhd1NlYXJjaDtcblxuICAgIGlmICghZm9yY2VSZXJlbmRlciAmJiBzYW1lUGF0aG5hbWUgJiYgc2FtZVNlYXJjaCkge1xuICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIHdlIHN0aWxsIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UuXG4gICAgLy8gS2VlcCB0aGUgZXhpc3RpbmcgcHJlcGFyZWRNYXRjaCB3aGVuIHBhdGhuYW1lIGlzIGlkZW50aWNhbCB0byBhdm9pZCByZWR1bmRhbnQgd29yay5cbiAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuXG4gICAgaWYgKCFzYW1lUGF0aG5hbWUpIHtcbiAgICAgIC8vIFBhdGggY2hhbmdlZDogcmVjb21wdXRlIG1hdGNoICsgcHJlcGFyZWQgZGF0YSBpbmNsdWRpbmcgcXVlcnlcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICAgIC8vIHdlIHdpbGwgc2V0IGJlbG93IGFmdGVyIGNvbXB1dGluZyB0eXBlZCBxdWVyeVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyc2VSYXdRdWVyeShsb2NhdGlvbi5zZWFyY2gpO1xuICAgIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IG1hdGNoZWQgcm91dGVcbiAgICBsZXQgcXVlcnlTY2hlbWE6IGFueTtcbiAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGxhc3QgPSBuZXh0Um91dGUucm91dGUucm91dGVzLmF0KC0xKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgICAgfSB8IG51bGw7XG4gICAgICBpZiAobGFzdCAhPSBudWxsKSB7XG4gICAgICAgIHF1ZXJ5U2NoZW1hID0gbGFzdC5xdWVyeVNjaGVtYTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUGFyc2UgdW5pZmllZCBmaWx0ZXJzXG4gICAgbGV0IGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBmaWx0ZXJEaWFnbm9zdGljczogYW55W10gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEYgPSBwYXJzZUZpbHRlcnMobG9jYXRpb24uc2VhcmNoLCBxdWVyeVNjaGVtYSk7XG4gICAgICBmaWx0ZXJzID0gcGFyc2VkRi5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZEYuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemF0aW9uOiBjbGFtcCBwYWdlID49IDEgaWYgbnVtZXJpYyBwYWdlIHByZXNlbnRcbiAgICBsZXQgbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBwZzogdW5rbm93bjtcbiAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBmOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGZpbHRlcnM7XG4gICAgICBjb25zdCBtYXliZSA9IGYucGFnZTtcbiAgICAgIGlmIChcbiAgICAgICAgbWF5YmUgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgbWF5YmUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KG1heWJlKSAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWF5YmUsICdlcScpXG4gICAgICApIHtcbiAgICAgICAgcGcgPSAobWF5YmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGcgPSBtYXliZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwZyA9PT0gJ251bWJlcicgJiYgcGcgPCAxKSB7XG4gICAgICBjb25zdCBjbG9uZSA9IHsgLi4uKGZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgYW55PiksIHBhZ2U6IHsgZXE6IDEgfSB9O1xuICAgICAgZmlsdGVycyA9IGNsb25lO1xuICAgICAgbm9ybWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgKHNhbWUgcGF0aG5hbWUpIHdlIHN0aWxsIG5lZWQgdG8gcmUtcnVuIHByZXBhcmVcbiAgICBpZiAoIXNhbWVQYXRobmFtZSB8fCAhc2FtZVNlYXJjaCkge1xuICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gobmV4dFJvdXRlLCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljcyxcbiAgICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBxdWVyeVNjaGVtYSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgcXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgIGlmICghbmV4dFNlYXJjaFN0ci5zdGFydHNXaXRoKCc/JykpIHtcbiAgICAgICAgICBpZiAobmV4dFNlYXJjaFN0ciA9PT0gJycpIG5leHRTZWFyY2hTdHIgPSAnJztcbiAgICAgICAgICBlbHNlIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICB9XG4gICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBuZXh0U2VhcmNoU3RyLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZW50cnkgYW5kIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnNcbiAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7XG4gICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgIGNhbGxiYWNrKG5leHRFbnRyeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ICZcbiAgICBQcmVwYXJlZEFjY2VzczxBbnlSb3V0ZVtdPiAmIHtcbiAgICAgIG5hdmlnYXRlOiBOYXZpZ2F0ZU92ZXJsb2FkczxBbnlSb3V0ZVtdPjtcbiAgICB9ID0ge1xuICAgIGhpc3RvcnksXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHBhdGhuYW1lKSB7XG4gICAgICAvLyBQcmVsb2FkIGp1c3QgdGhlIGNvbXBvbmVudCBjb2RlIGZvciBhIHJvdXRlIHdpdGhvdXQgc3RvcmluZyB0aGUgcmVzdWx0XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBhbGwgcmVzb3VyY2UgcGFnZXMgZm9yIHRoZSBtYXRjaGVkIHJvdXRlXG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQocGF0aG5hbWUpIHtcbiAgICAgIC8vIFByZWxvYWQgYm90aCB0aGUgY29tcG9uZW50IGNvZGUgYW5kIHByZXBhcmVkIGRhdGEgZm9yIGEgcm91dGVcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBwcmVwYXJlTWF0Y2gobWF0Y2hlcyk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIC8vIEFkZCBhIG5ldyBzdWJzY3JpYmVyIGFuZCByZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIG5leHRJZCArPSAxO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SWQ7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1zdHlsZVxuICAgICAgY29uc3QgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH07XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoeyBwYXRobmFtZSwgcXVlcnksIGZpbHRlcnM6IG5hdkZpbHRlcnMsIHJlcGxhY2UgfTogYW55KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZSA/PyBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgLy8gRGV0ZXJtaW5lIHNjaGVtYSBvZiBkZXN0aW5hdGlvbiAoaWYgc2FtZSBwYXRoIGFuZCB3ZSBoYXZlIHJvdXRlIHdlIGNhbiByZXVzZSwgZWxzZSByZW1hdGNoKVxuICAgICAgbGV0IGRlc3RTY2hlbWE6IGFueTtcbiAgICAgIC8vIEFsd2F5cyBhdHRlbXB0IGZ1bGwgbWF0Y2ggZm9yIGRlc3RpbmF0aW9uIHRvIGVuc3VyZSBzY2hlbWEgcHJlc2VudCBldmVuIGlmIHNhbWUgcGF0aG5hbWVcbiAgICAgIGNvbnN0IGRlc3RSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAoZGVzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMuYXQoLTEpIGFzIHVua25vd24gYXMge1xuICAgICAgICAgIHF1ZXJ5U2NoZW1hPzogdW5rbm93bjtcbiAgICAgICAgfSB8IG51bGw7XG4gICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHtcbiAgICAgICAgICBkZXN0U2NoZW1hID0gbGFzdC5xdWVyeVNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRmFsbGJhY2sgdG8gY3VycmVudGx5IGFjdGl2ZSBzY2hlbWEgaWYgZGVzdGluYXRpb24gc2NoZW1hIG5vdCBmb3VuZCAoZS5nLiwgcmFjZSBjb25kaXRpb25zKVxuICAgICAgZGVzdFNjaGVtYSA/Pz0gY3VycmVudC5hY3RpdmVRdWVyeVNjaGVtYTtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcnMgPSBuYXZGaWx0ZXJzID8/IGN1cnJlbnQuZmlsdGVycztcbiAgICAgIC8vIFRyZWF0IGxlZ2FjeSBuYXZpZ2F0ZSh7IHF1ZXJ5IH0pIGFzIGZpbHRlcnMgaW4gdW5pZmllZCBtb2RlbCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgY29uc3QgZmlsdGVyc0lucHV0ID1cbiAgICAgICAgZWZmZWN0aXZlRmlsdGVycyA/PyAocXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgIGZpbHRlcnM6IGZpbHRlcnNJbnB1dCxcbiAgICAgICAgcXVlcnlTY2hlbWE6IGRlc3RTY2hlbWEsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uT2JqID0geyBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsIHNlYXJjaCwgaGFzaDogJycgfTtcbiAgICAgIGlmIChyZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgIGhpc3Rvcnkuc2V0KGxvY2F0aW9uT2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpc3RvcnkucHVzaChsb2NhdGlvbk9iaik7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRQcmVwYXJlZChwYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IGN1cnJlbnRFbnRyeTtcbiAgICAgICAgLy8gRmluZCBsYXN0IHByZXBhcmVkIHJvdXRlIHdpdGggbWF0Y2hpbmcgcGF0aFxuICAgICAgICBmb3IgKGNvbnN0IHByIG9mIGVudHJ5LnByZXBhcmVkTWF0Y2gucm91dGVzKSB7XG4gICAgICAgICAgaWYgKHByLnBhdGggPT09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBwci5wcmVwYXJlZCBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGdldFR5cGVkUXVlcnkgcmVtb3ZlZFxuICB9O1xuXG4gIGlmIChvcHRpb25zLmRlYnVnID09PSB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAod2luZG93IGFzIHVua25vd24gYXMgeyBfX1BMVU1JTEVfUk9VVEVSX18/OiBhbnkgfSkuX19QTFVNSUxFX1JPVVRFUl9fID1cbiAgICAgICAgICB7XG4gICAgICAgICAgICBnZXQ6IGNvbnRleHQuZ2V0LFxuICAgICAgICAgICAgc3Vic2NyaWJlOiBjb250ZXh0LnN1YnNjcmliZSxcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIGJvdGggdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuIHsgY29udGV4dCwgY2xlYW51cCB9O1xufVxuIl19
597
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsR0FTckIsTUFBTSxhQUFhLENBQUM7QUFrRXJCLE1BQU0sQ0FBQyxPQUFPLFVBQVUsWUFBWSxDQUNsQyxNQUEyQixFQUMzQixVQUErQixFQUFFO0lBR2pDLE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFDckMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7SUFHNUMsSUFBSSxnQkFBZ0IsR0FBZ0MsSUFBSSxDQUFDO0lBQ3pELElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksdUJBQXFELENBQUM7SUFDMUQsSUFBSSxvQkFBb0IsR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ3ZFLElBQUksb0JBQW9CLEdBR2IsSUFBSSxDQUFDO0lBS2hCLFNBQVMsaUJBQWlCLENBQUMsUUFJMUI7UUFDQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxPQUFPLFFBQVEsQ0FBQyxR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QztRQUNqQixJQUFJLGdCQUFnQixLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUNsQyxNQUFNLFlBQVksR0FBRyxNQUVwQixDQUFDO29CQUNGLElBQUksWUFBWSxDQUFDLGtCQUFrQixLQUFLLFlBQVksRUFBRSxDQUFDO3dCQUNyRCxPQUFPLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDekMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO1FBQ0QsWUFBWSxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBR0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlUmF3UXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS5qcyc7XG5pbXBvcnQgYnVpbGRDb21iaW5lZFNlYXJjaCBmcm9tICcuLi90b29scy9idWlsZENvbWJpbmVkU2VhcmNoLmpzJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRmlsdGVycyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeSc7XG5pbXBvcnQge1xuICBOYXZpZ2F0aW9uT3JpZ2luLFxuICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZCxcbiAgdHlwZSBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCxcbiAgdHlwZSBSb3V0ZXJEZWJ1Z0hlbHBlcnMsXG4gIHR5cGUgUm91dGVFbnRyeSxcbiAgdHlwZSBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIHR5cGUgU3Vic2NyaWJlQ2FsbGJhY2ssXG4gIHR5cGUgQW55Um91dGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGlzdG9yeURlYnVnQ29udGV4dCB9IGZyb20gJy4uL2hpc3RvcnkvdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm48UiBleHRlbmRzIEFueVJvdXRlW10+ID0ge1xuICAvKiogRnVuY3Rpb24gdG8gY2xlYW4gdXAgcm91dGVyIGxpc3RlbmVycyBhbmQgcmVzb3VyY2VzICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBSb3V0ZXIgY29udGV4dCBvYmplY3QgZm9yIHRoZSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyICovXG4gIGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ICYgUHJlcGFyZWRBY2Nlc3M8Uj47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciAodHlwZWQgb3ZlcmxvYWQpLiBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3QgdHVwbGUgb2Ygcm91dGVzLCBnZW5lcmljcyBhcmUgcHJlc2VydmVkLlxuICovXG4vKipcbiAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGBjcmVhdGVSb3V0ZXJgLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJPcHRpb25zID0ge1xuICAvKipcbiAgICogV2hlbiB0cnVlLCBleHBvc2VzIGEgbGlnaHR3ZWlnaHQgZGVidWcgYnJpZGdlIG9uIGB3aW5kb3cuX19QTFVNSUxFX1JPVVRFUl9fYFxuICAgKiBjb250YWluaW5nIGB7IGdldCwgc3Vic2NyaWJlIH1gLiBJbnRlbmRlZCBmb3IgbG9jYWwgdG9vbGluZyAvIHRoZSBEZXZUb29scyBleHRlbnNpb24uXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByb3V0ZXIgaW5zdGFuY2UgZnJvbSBhIHJvdXRlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIFJvdXRlIGRlZmluaXRpb25zIHRvIHJlZ2lzdGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBkZWJ1ZyBzZXR0aW5ncyB1c2VkIGZvciBleHBvc2luZyBkZXZlbG9wbWVudCB0b29saW5nLlxuICogQHBhcmFtIG9wdGlvbnMuZGVidWcgLSBXaGVuIHRydWUsIHB1Ymxpc2hlcyBgd2luZG93Ll9fUExVTUlMRV9ST1VURVJfX2AgKGRldmVsb3BtZW50IG9ubHkpLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXI8UiBleHRlbmRzIEFueVJvdXRlW10+KFxuICByb3V0ZXM6IFsuLi5SXSB8IEFueVJvdXRlW10sXG4gIG9wdGlvbnM6IENyZWF0ZVJvdXRlck9wdGlvbnMgPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybjxSIGV4dGVuZHMgQW55Um91dGVbXSA/IFIgOiBBbnlSb3V0ZVtdPiB7XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuICBjb25zdCBkZWJ1Z0VuYWJsZWQgPSBvcHRpb25zLmRlYnVnID09PSB0cnVlO1xuXG4gIHR5cGUgRGVidWdTdWJzY3JpYmVyID0gKGV2ZW50OiBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCkgPT4gdm9pZDtcbiAgbGV0IGRlYnVnU3Vic2NyaWJlcnM6IFNldDxEZWJ1Z1N1YnNjcmliZXI+IHwgbnVsbCA9IG51bGw7XG4gIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICBkZWJ1Z1N1YnNjcmliZXJzID0gbmV3IFNldDxEZWJ1Z1N1YnNjcmliZXI+KCk7XG4gIH1cblxuICBsZXQgcGVuZGluZ05hdmlnYXRpb25PcmlnaW46IE5hdmlnYXRpb25PcmlnaW4gfCB1bmRlZmluZWQ7XG4gIGxldCBsYXN0TmF2aWdhdGlvbk9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbiA9IE5hdmlnYXRpb25PcmlnaW4uRXh0ZXJuYWw7XG4gIGxldCBsYXN0UHJlbG9hZFNpZ25hdHVyZToge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgcGFydGlhbCBsb2NhdGlvbiBvYmplY3QgaW50byBhIGZ1bGwgbG9jYXRpb24gc3RydWN0dXJlIHdpdGggc3RyaW5nIGZpZWxkcy5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgaGFzaD86IHN0cmluZztcbiAgfSk6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmc7IGhhc2g6IHN0cmluZyB9IHtcbiAgICBsZXQgcGF0aG5hbWVWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24ucGF0aG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXRobmFtZVZhbHVlID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfVxuICAgIGxldCBzZWFyY2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgc2VhcmNoVmFsdWUgPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfVxuICAgIGxldCBoYXNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYXNoVmFsdWUgPSBsb2NhdGlvbi5oYXNoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lVmFsdWUsXG4gICAgICBzZWFyY2g6IHNlYXJjaFZhbHVlLFxuICAgICAgaGFzaDogaGFzaFZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIGRlYnVnIHBheWxvYWQgdG8gYWxsIHJlZ2lzdGVyZWQgc3Vic2NyaWJlcnMuXG4gICAqL1xuICBmdW5jdGlvbiBlbWl0RGVidWdFdmVudChwYXlsb2FkOiBSb3V0ZXJEZWJ1Z0V2ZW50UGF5bG9hZCk6IHZvaWQge1xuICAgIGlmICghZGVidWdFbmFibGVkIHx8IGRlYnVnU3Vic2NyaWJlcnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIGRlYnVnU3Vic2NyaWJlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1YnNjcmliZXIocGF5bG9hZCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWdub3JlIHN1YnNjcmliZXIgZmFpbHVyZXMgdG8gYXZvaWQgZGlzcnVwdGluZyByb3V0ZXIgZmxvdy5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gY29lcmNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGtub3duIG5hdmlnYXRpb24gb3JpZ2luLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwT3JpZ2luKHJhdz86IHN0cmluZyk6IE5hdmlnYXRpb25PcmlnaW4gfCB1bmRlZmluZWQge1xuICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChyYXcpIHtcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5MaW5rQ2xpY2s6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uTGlua0hvdmVyOlxuICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlByb2dyYW1tYXRpYzpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Qb3BzdGF0ZUJhY2s6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUG9wc3RhdGVGb3J3YXJkOlxuICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlBvcHN0YXRlVW5rbm93bjpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5FeHRlcm5hbDpcbiAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Ob3JtYWxpemU6XG4gICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUHJlbG9hZEhvdmVyOlxuICAgICAgICByZXR1cm4gcmF3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvcmlnaW4gZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gZXZlbnQuXG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihcbiAgICBjb250ZXh0PzogSGlzdG9yeURlYnVnQ29udGV4dCB8IG51bGwsXG4gICk6IE5hdmlnYXRpb25PcmlnaW4ge1xuICAgIGNvbnN0IGZhbGxiYWNrT3JpZ2luID0gcGVuZGluZ05hdmlnYXRpb25PcmlnaW47XG4gICAgbGV0IG9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbnRleHRPcmlnaW4gPSBjb250ZXh0Py5vcmlnaW47XG4gICAgaWYgKGNvbnRleHRPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3JpZ2luID0gbWFwT3JpZ2luKGNvbnRleHRPcmlnaW4pO1xuICAgIH1cblxuICAgIG9yaWdpbiA/Pz0gZmFsbGJhY2tPcmlnaW47XG4gICAgb3JpZ2luID8/PSBOYXZpZ2F0aW9uT3JpZ2luLkV4dGVybmFsO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGlubmVyLW1vc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWRNYXRjaGVkUm91dGVQYXRoKFxuICAgIGVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gfCB1bmRlZmluZWQsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRSb3V0ZSA9IGVudHJ5LnJvdXRlO1xuICAgIGlmIChtYXRjaGVkUm91dGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUm91dGVzID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnJvdXRlcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZFJvdXRlcykpIHtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNoaWxkUm91dGVzLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0Q2hpbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsYXN0Q2hpbGRSZWNvcmQgPSBsYXN0Q2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGxhc3RDaGlsZFJlY29yZC5wYXRoO1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkUGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvb3RQYXRoID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnBhdGg7XG4gICAgaWYgKHR5cGVvZiByb290UGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByb290UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHR5cGUgUHJlcGFyZURlYnVnQ29udGV4dCA9IHtcbiAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW47XG4gICAgcmVxdWVzdFRpbWU6IG51bWJlcjtcbiAgICBlbWl0OiAocGF5bG9hZDogUm91dGVyRGVidWdFdmVudFBheWxvYWQpID0+IHZvaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGRlYnVnIGhlbHBlciBzdHJ1Y3R1cmUgZm9yIGEgcHJlcGFyZSBpbnZvY2F0aW9uIHdoZW4gZGVidWcgbW9kZSBpcyBlbmFibGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gY3JlYXRlUHJlcGFyZURlYnVnKFxuICAgIG9yaWdpbjogTmF2aWdhdGlvbk9yaWdpbixcbiAgKTogUHJlcGFyZURlYnVnQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICByZXF1ZXN0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgIGVtaXQocGF5bG9hZDogUm91dGVyRGVidWdFdmVudFBheWxvYWQpIHtcbiAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgIC4uLnBheWxvYWQsXG4gICAgICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZXRlcm1pbmlzdGljIGtleSBmb3IgY29ycmVsYXRpbmcgcHJlbG9hZCBldmVudHMuXG4gICAqL1xuICBmdW5jdGlvbiBidWlsZFByZWxvYWRLZXkoXG4gICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke2tpbmR9OiR7cGF0aG5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgcHJvZ3JhbW1hdGljIHByZWxvYWRzIHdoZW4gaW5zdHJ1bWVudGF0aW9uIGlzIGFjdGl2ZS5cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRW1pdFByb2dyYW1tYXRpY1ByZWxvYWQoXG4gICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLFxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlYnVnRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBidWlsZFByZWxvYWRLZXkoa2luZCwgcGF0aG5hbWUpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmVjZW50bHlSZWNvcmRlZCA9XG4gICAgICBsYXN0UHJlbG9hZFNpZ25hdHVyZSAhPT0gbnVsbCAmJlxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUua2V5ID09PSBrZXkgJiZcbiAgICAgIG5vdyAtIGxhc3RQcmVsb2FkU2lnbmF0dXJlLnRpbWVzdGFtcCA8IDUwO1xuXG4gICAgaWYgKCFyZWNlbnRseVJlY29yZGVkKSB7XG4gICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgIGtpbmQsXG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihoaXN0b3J5LmxvY2F0aW9uKSxcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0gbnVsbDtcbiAgfVxuXG4gIGxldCBkZWJ1Z0hlbHBlcnM6IFJvdXRlckRlYnVnSGVscGVycyB8IHVuZGVmaW5lZDtcblxuICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgZGVidWdIZWxwZXJzID0ge1xuICAgICAgcmVjb3JkUHJlbG9hZChcbiAgICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUHJlbG9hZCB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgICAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW4sXG4gICAgICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgPSB7XG4gICAgICAgICAga2V5OiBidWlsZFByZWxvYWRLZXkoa2luZCwgcGF0aG5hbWUpLFxuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgfTtcbiAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgdGFyZ2V0UGF0aG5hbWU6IHBhdGhuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlY29yZE5hdmlnYXRpb25JbnRlbnQob3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luKSB7XG4gICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgfSxcbiAgICAgIHJlY29yZEhpc3RvcnlBY3Rpb24oXG4gICAgICAgIGtpbmQ6XG4gICAgICAgICAgfCBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5IaXN0b3J5UHVzaFxuICAgICAgICAgIHwgUm91dGVyRGVidWdFdmVudEtpbmQuSGlzdG9yeVJlcGxhY2VcbiAgICAgICAgICB8IFJvdXRlckRlYnVnRXZlbnRLaW5kLk5vcm1hbGl6ZSxcbiAgICAgICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLFxuICAgICAgICBsb2NhdGlvbjogeyBwYXRobmFtZTogc3RyaW5nOyBzZWFyY2g/OiBzdHJpbmc7IGhhc2g/OiBzdHJpbmcgfSxcbiAgICAgICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgKSB7XG4gICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gb3JpZ2luO1xuICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAga2luZCxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbiksXG4gICAgICAgICAgZGV0YWlscyxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICB0eXBlIFJvdXRlckdsb2JhbEJyaWRnZSA9IHtcbiAgICBnZXQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+WydnZXQnXTtcbiAgICBzdWJzY3JpYmU6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+WydzdWJzY3JpYmUnXTtcbiAgICBzdWJzY3JpYmVEZWJ1Zz86IChcbiAgICAgIGNhbGxiYWNrOiAoZXZlbnQ6IFJvdXRlckRlYnVnRXZlbnRQYXlsb2FkKSA9PiB2b2lkLFxuICAgICkgPT4gKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICB9O1xuICBsZXQgcm91dGVyR2xvYmFsOiBSb3V0ZXJHbG9iYWxCcmlkZ2UgfCBudWxsID0gbnVsbDtcblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxSYXdRdWVyeSA9IHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpO1xuICAvLyBEaXJlY3Qgc2NoZW1hOiBvbmx5IHRoZSBtYXRjaGVkIHJvdXRlJ3Mgb3duIHF1ZXJ5U2NoZW1hIChubyBoaWVyYXJjaGljYWwgZGlzY292ZXJ5KVxuICBsZXQgaW5pdGlhbFVuaWZpZWRTY2hlbWE6IGFueTtcbiAgaWYgKHJvdXRlICE9IG51bGwpIHtcbiAgICBjb25zdCBsYXN0ID0gcm91dGUucm91dGUucm91dGVzLmF0KC0xKSBhcyB1bmtub3duIGFzIHtcbiAgICAgIHF1ZXJ5U2NoZW1hPzogdW5rbm93bjtcbiAgICB9IHwgbnVsbDtcbiAgICBpZiAobGFzdCAhPSBudWxsKSB7XG4gICAgICBpbml0aWFsVW5pZmllZFNjaGVtYSA9IGxhc3QucXVlcnlTY2hlbWE7XG4gICAgfVxuICB9XG4gIGxldCBpbml0aWFsRmlsdGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGxldCBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdGlhbFVuaWZpZWRTY2hlbWEgIT0gbnVsbCkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmlsdGVycyhoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCwgaW5pdGlhbFVuaWZpZWRTY2hlbWEpO1xuICAgIGluaXRpYWxGaWx0ZXJzID0gcGFyc2VkLmZpbHRlcnMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MgPSBwYXJzZWQuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICB9XG4gIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgcm91dGUsXG4gICAgaW5pdGlhbEZpbHRlcnMsXG4gICAgY3JlYXRlUHJlcGFyZURlYnVnKGxhc3ROYXZpZ2F0aW9uT3JpZ2luKSxcbiAgKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICBmb3JjZVJlcmVuZGVyOiBmYWxzZSxcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICByb3V0ZSxcbiAgICBwcmVwYXJlZE1hdGNoLFxuICAgIHJhd1NlYXJjaDogaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsXG4gICAgcXVlcnk6IGluaXRpYWxSYXdRdWVyeSxcbiAgICAvLyB0eXBlZFF1ZXJ5IHJlbW92ZWQgKHVuaWZpZWQgaW50byBmaWx0ZXJzL3F1ZXJ5KVxuICAgIGZpbHRlcnM6IGluaXRpYWxGaWx0ZXJzLFxuICAgIGZpbHRlckRpYWdub3N0aWNzOiBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgYWN0aXZlUXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIGRlYnVnT3JpZ2luOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgfTtcblxuICAvLyBJbml0aWFsIG5vcm1hbGl6YXRpb24gcGFzcyAoZS5nLiwgY2xhbXAgcGFnZSlcbiAgY29uc3QgaW5pdFR5cGVkID0gY3VycmVudEVudHJ5LmZpbHRlcnMgYXMgdW5rbm93biBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRQYWdlTnVtZXJpYzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaW5pdFR5cGVkICE9IG51bGwpIHtcbiAgICBjb25zdCByYXdQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykgaW5pdFBhZ2VOdW1lcmljID0gcmF3UGFnZTtcbiAgICBlbHNlIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJhd1BhZ2UsICdlcScpICYmXG4gICAgICB0eXBlb2YgKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgaW5pdFBhZ2VOdW1lcmljID0gKHJhd1BhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVxIGFzIG51bWJlcjtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZU51bWVyaWMgPT09ICdudW1iZXInICYmXG4gICAgaW5pdFBhZ2VOdW1lcmljIDwgMSAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IHsgZXE6IDEgfSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybTsgLy8gaW1tZWRpYXRlIHZpc2liaWxpdHlcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICBmaWx0ZXJzOiBub3JtLFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZGVidWdIZWxwZXJzPy5yZWNvcmRIaXN0b3J5QWN0aW9uKFxuICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Ob3JtYWxpemUsXG4gICAgICAgIE5hdmlnYXRpb25PcmlnaW4uTm9ybWFsaXplLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBsZXQgbm9ybWFsaXplRGVidWdDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgICBub3JtYWxpemVEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgICAgb3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgICBsb2NhdGlvbjogeyAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCB9LFxuICAgICAgICByYXdTZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGRlYnVnT3JpZ2luOiBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgIGxldCBzbmFwc2hvdE9yaWdpbiA9IE5hdmlnYXRpb25PcmlnaW4uRXh0ZXJuYWw7XG4gICAgaWYgKGN1cnJlbnRFbnRyeS5kZWJ1Z09yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzbmFwc2hvdE9yaWdpbiA9IGN1cnJlbnRFbnRyeS5kZWJ1Z09yaWdpbjtcbiAgICB9XG4gICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuU25hcHNob3QsXG4gICAgICBvcmlnaW46IHNuYXBzaG90T3JpZ2luLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGhpc3RvcnkubG9jYXRpb24pLFxuICAgICAgZGV0YWlsczoge1xuICAgICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGN1cnJlbnRFbnRyeSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdFbmFibGVkICYmIGRlYnVnQ29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBoaXN0b3J5RGV0YWlsczogeyBoaXN0b3J5SW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGRlYnVnQ29udGV4dD8uaGlzdG9yeUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGhpc3RvcnlEZXRhaWxzID0geyBoaXN0b3J5SW5kZXg6IGRlYnVnQ29udGV4dC5oaXN0b3J5SW5kZXggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZGVidWdDb250ZXh0T3JpZ2luKSB7XG4gICAgICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLlBvcHN0YXRlQmFjazoge1xuICAgICAgICAgICAgZW1pdERlYnVnRXZlbnQoe1xuICAgICAgICAgICAgICBraW5kOiBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Qb3BzdGF0ZUJhY2ssXG4gICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBoaXN0b3J5RGV0YWlscyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgTmF2aWdhdGlvbk9yaWdpbi5Qb3BzdGF0ZUZvcndhcmQ6IHtcbiAgICAgICAgICAgIGVtaXREZWJ1Z0V2ZW50KHtcbiAgICAgICAgICAgICAga2luZDogUm91dGVyRGVidWdFdmVudEtpbmQuUG9wc3RhdGVGb3J3YXJkLFxuICAgICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgICAgZGV0YWlsczogaGlzdG9yeURldGFpbHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIE5hdmlnYXRpb25PcmlnaW4uUG9wc3RhdGVVbmtub3duOiB7XG4gICAgICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6IFJvdXRlckRlYnVnRXZlbnRLaW5kLlBvcHN0YXRlVW5rbm93bixcbiAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBOYXZpZ2F0aW9uT3JpZ2luLkV4dGVybmFsOiB7XG4gICAgICAgICAgICBlbWl0RGVidWdFdmVudCh7XG4gICAgICAgICAgICAgIGtpbmQ6IFJvdXRlckRlYnVnRXZlbnRLaW5kLkV4dGVybmFsTmF2aWdhdGlvbixcbiAgICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIHdlIHN0aWxsIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UuXG4gICAgICAvLyBLZWVwIHRoZSBleGlzdGluZyBwcmVwYXJlZE1hdGNoIHdoZW4gcGF0aG5hbWUgaXMgaWRlbnRpY2FsIHRvIGF2b2lkIHJlZHVuZGFudCB3b3JrLlxuICAgICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuXG4gICAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICAgICAgLy8gd2Ugd2lsbCBzZXQgYmVsb3cgYWZ0ZXIgY29tcHV0aW5nIHR5cGVkIHF1ZXJ5XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnkgPSBwYXJzZVJhd1F1ZXJ5KGxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgICBsZXQgcXVlcnlTY2hlbWE6IGFueTtcbiAgICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gbmV4dFJvdXRlLnJvdXRlLnJvdXRlcy5hdCgtMSkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgICAgICB9IHwgbnVsbDtcbiAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkge1xuICAgICAgICAgIHF1ZXJ5U2NoZW1hID0gbGFzdC5xdWVyeVNjaGVtYTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gUGFyc2UgdW5pZmllZCBmaWx0ZXJzXG4gICAgICBsZXQgZmlsdGVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRiA9IHBhcnNlRmlsdGVycyhsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgICAgZmlsdGVycyA9IHBhcnNlZEYuZmlsdGVycyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZEYuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICAgICAgfVxuICAgICAgLy8gTm9ybWFsaXphdGlvbjogY2xhbXAgcGFnZSA+PSAxIGlmIG51bWVyaWMgcGFnZSBwcmVzZW50XG4gICAgICBsZXQgbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgICAgbGV0IHBnOiB1bmtub3duO1xuICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBmOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGZpbHRlcnM7XG4gICAgICAgIGNvbnN0IG1heWJlID0gZi5wYWdlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbWF5YmUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiBtYXliZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShtYXliZSkgJiZcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWF5YmUsICdlcScpXG4gICAgICAgICkge1xuICAgICAgICAgIHBnID0gKG1heWJlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5lcTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZyA9IG1heWJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBnID09PSAnbnVtYmVyJyAmJiBwZyA8IDEpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLihmaWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiB7IGVxOiAxIH0gfTtcbiAgICAgICAgZmlsdGVycyA9IGNsb25lO1xuICAgICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgKHNhbWUgcGF0aG5hbWUpIHdlIHN0aWxsIG5lZWQgdG8gcmUtcnVuIHByZXBhcmVcbiAgICAgIGlmICghc2FtZVBhdGhuYW1lIHx8ICFzYW1lU2VhcmNoKSB7XG4gICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgIG5leHRSb3V0ZSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgY3JlYXRlUHJlcGFyZURlYnVnKG9yaWdpbiksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICAgIHJhd1NlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBxdWVyeVNjaGVtYSxcbiAgICAgICAgZGVidWdPcmlnaW46IG9yaWdpbixcbiAgICAgIH07XG5cbiAgICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgICAgaWYgKG5vcm1hbGl6ZWQgJiYgcXVlcnlTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgICAgaWYgKCFuZXh0U2VhcmNoU3RyLnN0YXJ0c1dpdGgoJz8nKSAmJiBuZXh0U2VhcmNoU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWJ1Z0hlbHBlcnM/LnJlY29yZEhpc3RvcnlBY3Rpb24oXG4gICAgICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5Ob3JtYWxpemUsXG4gICAgICAgICAgICBOYXZpZ2F0aW9uT3JpZ2luLk5vcm1hbGl6ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVhc29uOiAncnVudGltZS1wYWdlLWNsYW1wJyB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbGV0IHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVOb3JtYWxpemVDb250ZXh0ID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IE5hdmlnYXRpb25PcmlnaW4uTm9ybWFsaXplLFxuICAgICAgICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaDogbmV4dFNlYXJjaFN0cixcbiAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgZGVidWdDb250ZXh0OiBydW50aW1lTm9ybWFsaXplQ29udGV4dCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgICAgY3VycmVudEVudHJ5ID0gbmV4dEVudHJ5O1xuICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICAgIGVtaXREZWJ1Z0V2ZW50KHtcbiAgICAgICAgICBraW5kOiBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5TbmFwc2hvdCxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChuZXh0RW50cnkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gJlxuICAgIFByZXBhcmVkQWNjZXNzPEFueVJvdXRlW10+ICYge1xuICAgICAgbmF2aWdhdGU6IE5hdmlnYXRlT3ZlcmxvYWRzPEFueVJvdXRlW10+O1xuICAgIH0gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWUpIHtcbiAgICAgIG1heWJlRW1pdFByb2dyYW1tYXRpY1ByZWxvYWQoXG4gICAgICAgIFJvdXRlckRlYnVnRXZlbnRLaW5kLlByZWxvYWRDb2RlLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMsXG4gICAgICApO1xuICAgICAgLy8gUHJlbG9hZCBqdXN0IHRoZSBjb21wb25lbnQgY29kZSBmb3IgYSByb3V0ZSB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdFxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgYWxsIHJlc291cmNlIHBhZ2VzIGZvciB0aGUgbWF0Y2hlZCByb3V0ZVxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHBhdGhuYW1lKSB7XG4gICAgICBtYXliZUVtaXRQcm9ncmFtbWF0aWNQcmVsb2FkKFxuICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5QcmVsb2FkLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMsXG4gICAgICApO1xuICAgICAgLy8gUHJlbG9hZCBib3RoIHRoZSBjb21wb25lbnQgY29kZSBhbmQgcHJlcGFyZWQgZGF0YSBmb3IgYSByb3V0ZVxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHByZXBhcmVNYXRjaChcbiAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBjcmVhdGVQcmVwYXJlRGVidWcoTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWMpLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgLy8gQWRkIGEgbmV3IHN1YnNjcmliZXIgYW5kIHJldHVybiB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLXN0eWxlXG4gICAgICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfTtcbiAgICAgIHN1YnNjcmliZXJzLnNldChpZCwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGRpc3Bvc2U7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSh7IHBhdGhuYW1lLCBxdWVyeSwgZmlsdGVyczogbmF2RmlsdGVycywgcmVwbGFjZSB9OiBhbnkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50RW50cnk7XG4gICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRhcmdldFBhdGhuYW1lID0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIH1cbiAgICAgIC8vIERldGVybWluZSBzY2hlbWEgb2YgZGVzdGluYXRpb24gKGlmIHNhbWUgcGF0aCBhbmQgd2UgaGF2ZSByb3V0ZSB3ZSBjYW4gcmV1c2UsIGVsc2UgcmVtYXRjaClcbiAgICAgIGxldCBkZXN0U2NoZW1hOiBhbnk7XG4gICAgICAvLyBBbHdheXMgYXR0ZW1wdCBmdWxsIG1hdGNoIGZvciBkZXN0aW5hdGlvbiB0byBlbnN1cmUgc2NoZW1hIHByZXNlbnQgZXZlbiBpZiBzYW1lIHBhdGhuYW1lXG4gICAgICBjb25zdCBkZXN0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGFzdFJvdXRlID0gZGVzdFJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgcXVlcnlTY2hlbWE/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCBudWxsXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGxhc3RSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIGRlc3RTY2hlbWEgPSBsYXN0Um91dGUucXVlcnlTY2hlbWE7XG4gICAgICB9XG4gICAgICAvLyBGYWxsYmFjayB0byBjdXJyZW50bHkgYWN0aXZlIHNjaGVtYSBpZiBkZXN0aW5hdGlvbiBzY2hlbWEgbm90IGZvdW5kIChlLmcuLCByYWNlIGNvbmRpdGlvbnMpXG4gICAgICBkZXN0U2NoZW1hID8/PSBjdXJyZW50LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuICAgICAgY29uc3QgdHlwZWROYXZGaWx0ZXJzID0gbmF2RmlsdGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcnMgPSB0eXBlZE5hdkZpbHRlcnMgPz8gY3VycmVudC5maWx0ZXJzO1xuICAgICAgLy8gVHJlYXQgbGVnYWN5IG5hdmlnYXRlKHsgcXVlcnkgfSkgYXMgZmlsdGVycyBpbiB1bmlmaWVkIG1vZGVsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCBmaWx0ZXJzSW5wdXQgPVxuICAgICAgICBlZmZlY3RpdmVGaWx0ZXJzID8/IChxdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc0lucHV0LFxuICAgICAgICBxdWVyeVNjaGVtYTogZGVzdFNjaGVtYSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSwgc2VhcmNoLCBoYXNoOiAnJyB9O1xuICAgICAgY29uc3Qgb3JpZ2luID0gTmF2aWdhdGlvbk9yaWdpbi5Qcm9ncmFtbWF0aWM7XG4gICAgICBkZWJ1Z0hlbHBlcnM/LnJlY29yZE5hdmlnYXRpb25JbnRlbnQob3JpZ2luKTtcbiAgICAgIGlmIChyZXBsYWNlID09PSB0cnVlKSB7XG4gICAgICAgIGRlYnVnSGVscGVycz8ucmVjb3JkSGlzdG9yeUFjdGlvbihcbiAgICAgICAgICBSb3V0ZXJEZWJ1Z0V2ZW50S2luZC5IaXN0b3J5UmVwbGFjZSxcbiAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgbG9jYXRpb25PYmosXG4gICAgICAgICAgeyB0cmlnZ2VyOiAncHJvZ3JhbW1hdGljJyB9LFxuICAgICAgICApO1xuICAgICAgICBsZXQgcHJvZ3JhbW1hdGljUmVwbGFjZUNvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgICAgICBwcm9ncmFtbWF0aWNSZXBsYWNlQ29udGV4dCA9IHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dDogcHJvZ3JhbW1hdGljUmVwbGFjZUNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWdIZWxwZXJzPy5yZWNvcmRIaXN0b3J5QWN0aW9uKFxuICAgICAgICAgIFJvdXRlckRlYnVnRXZlbnRLaW5kLkhpc3RvcnlQdXNoLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICBsb2NhdGlvbk9iaixcbiAgICAgICAgICB7IHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnIH0sXG4gICAgICAgICk7XG4gICAgICAgIGxldCBwcm9ncmFtbWF0aWNQdXNoQ29udGV4dDogSGlzdG9yeURlYnVnQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgICAgIHByb2dyYW1tYXRpY1B1c2hDb250ZXh0ID0ge1xuICAgICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBoaXN0b3J5LnB1c2goe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dDogcHJvZ3JhbW1hdGljUHVzaENvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQocGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBjdXJyZW50RW50cnk7XG4gICAgICAgIC8vIEZpbmQgbGFzdCBwcmVwYXJlZCByb3V0ZSB3aXRoIG1hdGNoaW5nIHBhdGhcbiAgICAgICAgZm9yIChjb25zdCBwciBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnJvdXRlcykge1xuICAgICAgICAgIGlmIChwci5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHIucHJlcGFyZWQgYXMgYW55O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBnZXRUeXBlZFF1ZXJ5IHJlbW92ZWRcbiAgICBfX2RlYnVnOiBkZWJ1Z0hlbHBlcnMsXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IGJyaWRnZVdpbmRvdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBfX1BMVU1JTEVfUk9VVEVSX18/OiBSb3V0ZXJHbG9iYWxCcmlkZ2U7XG4gICAgICAgIH07XG4gICAgICAgIHJvdXRlckdsb2JhbCA9IHtcbiAgICAgICAgICBnZXQ6IGNvbnRleHQuZ2V0LmJpbmQoY29udGV4dCksXG4gICAgICAgICAgc3Vic2NyaWJlOiBjb250ZXh0LnN1YnNjcmliZS5iaW5kKGNvbnRleHQpLFxuICAgICAgICAgIHN1YnNjcmliZURlYnVnKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpYmVycyA9IGRlYnVnU3Vic2NyaWJlcnM7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFkZWJ1Z0VuYWJsZWQgfHxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlcnMgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmliZXJzLmFkZChjYWxsYmFjayk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBicmlkZ2VXaW5kb3cuX19QTFVNSUxFX1JPVVRFUl9fID0gcm91dGVyR2xvYmFsO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIGRvd24gcm91dGVyIGxpc3RlbmVycyBhbmQgZGV0YWNoZXMgdGhlIGRlYnVnIGJyaWRnZSB3aGVuIG5lY2Vzc2FyeS5cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZCB7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBpZiAoZGVidWdTdWJzY3JpYmVycyAhPT0gbnVsbCkge1xuICAgICAgZGVidWdTdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBjb25zdCBicmlkZ2VXaW5kb3cgPSB3aW5kb3cgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBfX1BMVU1JTEVfUk9VVEVSX18/OiBSb3V0ZXJHbG9iYWxCcmlkZ2U7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoYnJpZGdlV2luZG93Ll9fUExVTUlMRV9ST1VURVJfXyA9PT0gcm91dGVyR2xvYmFsKSB7XG4gICAgICAgICAgICBkZWxldGUgYnJpZGdlV2luZG93Ll9fUExVTUlMRV9ST1VURVJfXztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9XG4gICAgcm91dGVyR2xvYmFsID0gbnVsbDtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==