@plumile/router 0.1.13 → 0.1.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"createRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/createRouter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EAEL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAKrB,MAAM,MAAM,kBAAkB,GAAG;IAE/B,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CAClC,CAAC;AAkCF,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACzB,IAAI,GAAE;IACJ,QAAQ,CAAC,EACL,OAAO,GACP;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE7D,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,kBAAkB,CAmuBpB"}
1
+ {"version":3,"file":"createRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/createRouter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EAEL,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAKrB,MAAM,MAAM,kBAAkB,GAAG;IAE/B,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CAClC,CAAC;AAkCF,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACzB,IAAI,GAAE;IACJ,QAAQ,CAAC,EACL,OAAO,GACP;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE7D,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,kBAAkB,CAkxBpB"}
@@ -8,6 +8,7 @@ export default function createRouter(routes, opts = {}) {
8
8
  let devtoolsGlobal;
9
9
  let devtoolsPanel = false;
10
10
  let devtoolsShortcut = 'Alt+Shift+R';
11
+ let devtoolsVerbose = false;
11
12
  if (typeof opts.devtools === 'object') {
12
13
  const baseEnabled = (() => {
13
14
  try {
@@ -24,6 +25,14 @@ export default function createRouter(routes, opts = {}) {
24
25
  opts.devtools.shortcut.trim() !== '') {
25
26
  devtoolsShortcut = opts.devtools.shortcut;
26
27
  }
28
+ try {
29
+ const maybeVerbose = opts.devtools
30
+ .verbose;
31
+ if (typeof maybeVerbose === 'boolean')
32
+ devtoolsVerbose = maybeVerbose;
33
+ }
34
+ catch {
35
+ }
27
36
  }
28
37
  else {
29
38
  const enabled = (() => {
@@ -312,6 +321,8 @@ export default function createRouter(routes, opts = {}) {
312
321
  if (list == null || list.length === 0) {
313
322
  return;
314
323
  }
324
+ const prevPath = currentEntry.location.pathname;
325
+ const prevSearch = currentEntry.rawSearch;
315
326
  const { search, pathname, replace: replaceFlag, nextEntry, } = coalesceNavigations(list);
316
327
  batchedMergedQuery = undefined;
317
328
  lastBatchQuery = undefined;
@@ -319,10 +330,26 @@ export default function createRouter(routes, opts = {}) {
319
330
  batchedFilterSchema = undefined;
320
331
  currentEntry = nextEntry;
321
332
  const loc = { pathname, search, hash: '' };
322
- if (replaceFlag)
323
- history.set(loc);
324
- else
325
- history.push(loc);
333
+ const sameAsBefore = prevPath === pathname && prevSearch === search;
334
+ if (sameAsBefore && devtoolsVerbose) {
335
+ subscribers.forEach((cb) => {
336
+ cb(currentEntry);
337
+ });
338
+ devtoolsOnNavEvent?.({
339
+ kind: 'batch-flush',
340
+ mode: batchMode ?? 'manual',
341
+ count: list.length,
342
+ pathname,
343
+ search,
344
+ timestamp: Date.now(),
345
+ });
346
+ }
347
+ else {
348
+ if (replaceFlag)
349
+ history.set(loc);
350
+ else
351
+ history.push(loc);
352
+ }
326
353
  let mode = 'manual';
327
354
  if (batchMode === 'auto') {
328
355
  mode = 'auto';
@@ -330,14 +357,16 @@ export default function createRouter(routes, opts = {}) {
330
357
  else if (batchMode === 'mixed') {
331
358
  mode = 'mixed';
332
359
  }
333
- devtoolsOnNavEvent?.({
334
- kind: 'batch-flush',
335
- mode,
336
- count: list.length,
337
- pathname,
338
- search,
339
- timestamp: Date.now(),
340
- });
360
+ if (!(sameAsBefore && devtoolsVerbose)) {
361
+ devtoolsOnNavEvent?.({
362
+ kind: 'batch-flush',
363
+ mode,
364
+ count: list.length,
365
+ pathname,
366
+ search,
367
+ timestamp: Date.now(),
368
+ });
369
+ }
341
370
  batchMode = undefined;
342
371
  }
343
372
  function applyProvisionalBatchUpdate(pathname) {
@@ -557,18 +586,35 @@ export default function createRouter(routes, opts = {}) {
557
586
  if (normImmediate === '')
558
587
  normImmediate = '/';
559
588
  const locationObj = { pathname: normImmediate, search, hash: '' };
560
- if (replace)
561
- history.set(locationObj);
562
- else
563
- history.push(locationObj);
564
- devtoolsOnNavEvent?.({
565
- kind: 'navigate',
566
- mode: 'immediate',
567
- count: 1,
568
- pathname: normImmediate,
569
- search,
570
- timestamp: Date.now(),
571
- });
589
+ const sameAsBefore = currentEntry.location.pathname === normImmediate &&
590
+ currentEntry.rawSearch === search;
591
+ if (sameAsBefore && devtoolsVerbose && !replace) {
592
+ subscribers.forEach((cb) => {
593
+ cb(currentEntry);
594
+ });
595
+ devtoolsOnNavEvent?.({
596
+ kind: 'navigate',
597
+ mode: 'immediate',
598
+ count: 1,
599
+ pathname: normImmediate,
600
+ search,
601
+ timestamp: Date.now(),
602
+ });
603
+ }
604
+ else {
605
+ if (replace)
606
+ history.set(locationObj);
607
+ else
608
+ history.push(locationObj);
609
+ devtoolsOnNavEvent?.({
610
+ kind: 'navigate',
611
+ mode: 'immediate',
612
+ count: 1,
613
+ pathname: normImmediate,
614
+ search,
615
+ timestamp: Date.now(),
616
+ });
617
+ }
572
618
  }
573
619
  catch {
574
620
  }
@@ -585,6 +631,7 @@ export default function createRouter(routes, opts = {}) {
585
631
  global: devtoolsGlobal,
586
632
  panel: devtoolsPanel,
587
633
  shortcut: devtoolsShortcut,
634
+ verbose: devtoolsVerbose,
588
635
  },
589
636
  });
590
637
  }
@@ -595,4 +642,4 @@ export default function createRouter(routes, opts = {}) {
595
642
  }
596
643
  return { cleanup, context };
597
644
  }
598
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFDckQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMs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QkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUdGLElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFFdkUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUdoRSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7d0JBQzFDLE9BQU87d0JBQ1AsT0FBTyxFQUFFOzRCQUNQLE1BQU0sRUFBRSxjQUFjOzRCQUN0QixLQUFLLEVBQUUsYUFBYTs0QkFDcEIsUUFBUSxFQUFFLGdCQUFnQjt5QkFDM0I7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO1lBRVQsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlVHlwZWRRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LWRzbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2ggfSBmcm9tICcuLi90b29scy9idWlsZFNlYXJjaC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlLFxuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55Pjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihcbiAgcm91dGVzOiBSb3V0ZTxhbnksIGFueT5bXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7IGdsb2JhbD86IGJvb2xlYW47IHBhbmVsPzogYm9vbGVhbjsgc2hvcnRjdXQ/OiBzdHJpbmcgfTtcbiAgICAvKiogV2hlbiB0cnVlLCBjb25zZWN1dGl2ZSBuYXZpZ2F0ZSgpIGNhbGxzIGluIHNhbWUgbWljcm90YXNrIGF1dG/igJFjb2FsZXNjZSAodW5sZXNzIGltbWVkaWF0ZTogdHJ1ZSkuICovXG4gICAgYXV0b0JhdGNoPzogYm9vbGVhbjtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvYyk7XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgbW9kZSxcbiAgICAgIGNvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIGJhdGNoTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBBZnRlciByZXNvbHZlRmlsdGVyU2NoZW1hIGlzIGRlZmluZWQgd2UgY2FuIGFwcGx5IGltcGxpY2l0IHNjaGVtYSBmb3IgYW55IHF1ZXVlZCBiYXRjaCAoaWYgc3RpbGwgcGVuZGluZylcbiAgLyoqIEFwcGx5IHByb3Zpc2lvbmFsIG1lcmdlZCBxdWVyeStmaWx0ZXJzIHVwZGF0ZSAoZHVyaW5nIGJhdGNoaW5nKVxuICAgKiB0byBjdXJyZW50RW50cnkgZm9yIHN5bmNocm9ub3VzIHJlYWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYShiYXNlUGF0aCk7XG4gICAgICBjb25zdCBtZXJnZWRRID0gYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/IGxhc3RCYXRjaFF1ZXJ5ID8/IHt9O1xuICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgZmlsdGVyU2NoZW1hOiBiYXRjaGVkRmlsdGVyU2NoZW1hLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHV0aW9uIGZvciBwcm92aXNpb25hbCB2aWV3XG4gICAgICAgIGxldCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByb3V0ZUNoYWluOlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9W11cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LnJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZGVzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBkZXN0Um91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlQ2hhaW4gIT0gbnVsbCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByb3V0ZUNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmcyA9IChcbiAgICAgICAgICAgICAgbm9kZSBhcyB7XG4gICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1lcmdlZCA/Pz0ge307XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBmcy5zY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2VkICE9IG51bGwpIHtcbiAgICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBiYXRjaGVkRmlsdGVycyxcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYTogbWVyZ2VkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcHJvdmlzaW9uYWxTZWFyY2ggPSBidWlsZFNlYXJjaChtZXJnZWRRLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICBjb25zdCBwYXRoQ2hhbmdlZCA9IGJhc2VQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBpZiAocHJvdmlzaW9uYWxTZWFyY2ggIT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2ggfHwgcGF0aENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoc2NoZW1hLCBtZXJnZWRRKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHByb3Zpc2lvbmFsU2VhcmNoKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2VhcmNoOiBwcm92aXNpb25hbFNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhd1NlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF1dG9CYXRjaCA9IG9wdHMuYXV0b0JhdGNoID09PSB0cnVlO1xuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lKTtcbiAgICB9LFxuICAgIGN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHJldHVybjtcbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZChwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiBTdWJzY3JpYmVDYWxsYmFjazxhbnk+KSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlcGxhY2UsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgYmF0Y2gsXG4gICAgICBpbW1lZGlhdGUsXG4gICAgICBpbmhlcml0LFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgIGJhdGNoPzogYm9vbGVhbjtcbiAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG4gICAgICBpbmhlcml0PzogYm9vbGVhbjtcbiAgICB9KTogdm9pZCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJbmhlcml0ID0gaW5oZXJpdCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd2FudHNCYXRjaCA9XG4gICAgICAgICAgYmF0Y2ggPT09IHRydWUgfHxcbiAgICAgICAgICAoYXV0b0JhdGNoICYmIGltbWVkaWF0ZSAhPT0gdHJ1ZSAmJiBiYXRjaCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAod2FudHNCYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG5hdjogUGVuZGluZ05hdiA9IHt9O1xuICAgICAgICAgIGlmIChwYXRobmFtZSAhPT0gdW5kZWZpbmVkKSBuYXYucGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkgbmF2LnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgaWYgKHJlcGxhY2UgIT09IHVuZGVmaW5lZCkgbmF2LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIG5hdi5pbmhlcml0ID0gdHJ1ZTtcbiAgICAgICAgICBwZW5kaW5nTmF2cyA/Pz0gW107XG4gICAgICAgICAgcGVuZGluZ05hdnMucHVzaChuYXYpO1xuICAgICAgICAgIGxldCB0aGlzTW9kZTogJ21hbnVhbCcgfCAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoID09PSB0cnVlKSB0aGlzTW9kZSA9ICdtYW51YWwnO1xuICAgICAgICAgIGVsc2UgdGhpc01vZGUgPSAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoTW9kZSA9PSBudWxsKSBiYXRjaE1vZGUgPSB0aGlzTW9kZTtcbiAgICAgICAgICBlbHNlIGlmIChiYXRjaE1vZGUgIT09IHRoaXNNb2RlKSBiYXRjaE1vZGUgPSAnbWl4ZWQnO1xuICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgY3VycmVudEVudHJ5LnF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4uYmFzZSwgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RCYXRjaFF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhdGNoZWRGaWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkgYmF0Y2hlZEZpbHRlclNjaGVtYSA9IGZpbHRlclNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmbHVzaFNjaGVkdWxlZCkge1xuICAgICAgICAgICAgZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaE5hdmlnYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lKTtcbiAgICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICAgICAgY2IoY3VycmVudEVudHJ5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW1tZWRpYXRlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IGJhc2U6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSB7XG4gICAgICAgICAgYmFzZSA9IHsgLi4uKGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fSkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIE9iamVjdC5hc3NpZ24oYmFzZSwgcXVlcnkpO1xuICAgICAgICAgIGVsc2UgYmFzZSA9IHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgPz89IGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcyA9IGZpbHRlclNjaGVtYSA/PyByZXNvbHZlRmlsdGVyU2NoZW1hKHRhcmdldFBhdGgpO1xuICAgICAgICAgIGlmIChmcyAhPSBudWxsKSBidWlsZE9wdHMgPSB7IGZpbHRlcnMsIGZpbHRlclNjaGVtYTogZnMgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICAgIGxldCB0YXJnZXRQYXRobmFtZSA9IHRhcmdldFBhdGg7XG4gICAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgIT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU2NoZW1hID0gc2NoZW1hID8/IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgICAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoZWZmZWN0aXZlU2NoZW1hLCByYXdRdWVyeU9iaik7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWQpO1xuICAgICAgICBjdXJyZW50RW50cnkgPSB7XG4gICAgICAgICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZWQsXG4gICAgICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgICAgbGV0IG5vcm1JbW1lZGlhdGUgPSB0YXJnZXRQYXRobmFtZTtcbiAgICAgICAgaWYgKG5vcm1JbW1lZGlhdGUgPT09ICcnKSBub3JtSW1tZWRpYXRlID0gJy8nO1xuICAgICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IG5vcm1JbW1lZGlhdGUsIHNlYXJjaCwgaGFzaDogJycgfTtcbiAgICAgICAgaWYgKHJlcGxhY2UpIGhpc3Rvcnkuc2V0KGxvY2F0aW9uT2JqKTtcbiAgICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICBtb2RlOiAnaW1tZWRpYXRlJyxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIER5bmFtaWMgZGV2dG9vbHMgbG9hZCAoZGV2IG9ubHkpIC0gc2VwYXJhdGUgY2h1bmsgZm9yIHRyZWUtc2hha2luZ1xuICBpZiAoKGRldnRvb2xzR2xvYmFsIHx8IGRldnRvb2xzUGFuZWwpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtb2Q6IGFueSA9IGF3YWl0IGltcG9ydCgnLi9kZXZ0b29scy5qcycpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCAmJiB0eXBlb2YgbW9kLmluaXRSb3V0ZXJEZXZ0b29scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljLWVzbGludC9tYXgtbGVuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50ID0gbW9kLmluaXRSb3V0ZXJEZXZ0b29scyh7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBnbG9iYWw6IGRldnRvb2xzR2xvYmFsLFxuICAgICAgICAgICAgICBwYW5lbDogZGV2dG9vbHNQYW5lbCxcbiAgICAgICAgICAgICAgc2hvcnRjdXQ6IGRldnRvb2xzU2hvcnRjdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
645
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDNUIsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FDTCxPQUFPLE9BQU8sS0FBSyxXQUFXO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQ3RDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ3JE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RUFBRSxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVR5cGVkUXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS1kc2wuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCB7IGJ1aWxkU2VhcmNoIH0gZnJvbSAnLi4vdG9vbHMvYnVpbGRTZWFyY2guanMnO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZSxcbiAgUm91dGVFbnRyeSxcbiAgUm91dGluZ0NvbnRleHRUeXBlLFxuICBTdWJzY3JpYmVDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoXG4gIHJvdXRlczogUm91dGU8YW55LCBhbnk+W10sXG4gIG9wdHM6IHtcbiAgICBkZXZ0b29scz86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgeyBnbG9iYWw/OiBib29sZWFuOyBwYW5lbD86IGJvb2xlYW47IHNob3J0Y3V0Pzogc3RyaW5nIH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgY29uc2VjdXRpdmUgbmF2aWdhdGUoKSBjYWxscyBpbiBzYW1lIG1pY3JvdGFzayBhdXRv4oCRY29hbGVzY2UgKHVubGVzcyBpbW1lZGlhdGU6IHRydWUpLiAqL1xuICAgIGF1dG9CYXRjaD86IGJvb2xlYW47XG4gIH0gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybiB7XG4gIC8vIE5vcm1hbGl6ZSBkZXZ0b29scyBvcHRpb25zIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGxldCBkZXZ0b29sc0dsb2JhbDogYm9vbGVhbjtcbiAgbGV0IGRldnRvb2xzUGFuZWwgPSBmYWxzZTtcbiAgbGV0IGRldnRvb2xzU2hvcnRjdXQgPSAnQWx0K1NoaWZ0K1InO1xuICBsZXQgZGV2dG9vbHNWZXJib3NlID0gZmFsc2U7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF5YmVWZXJib3NlOiB1bmtub3duID0gKG9wdHMuZGV2dG9vbHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIC52ZXJib3NlO1xuICAgICAgaWYgKHR5cGVvZiBtYXliZVZlcmJvc2UgPT09ICdib29sZWFuJykgZGV2dG9vbHNWZXJib3NlID0gbWF5YmVWZXJib3NlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlIHZlcmJvc2UgZXh0cmFjdGlvbiAqL1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZQYXRoID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHByZXZTZWFyY2ggPSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgY29uc3Qgc2FtZUFzQmVmb3JlID0gcHJldlBhdGggPT09IHBhdGhuYW1lICYmIHByZXZTZWFyY2ggPT09IHNlYXJjaDtcbiAgICBpZiAoc2FtZUFzQmVmb3JlICYmIGRldnRvb2xzVmVyYm9zZSkge1xuICAgICAgLy8gU3RpbGwgZmlyZSBkZXZ0b29scyArIHN1YnNjcmliZXJzIGV2ZW4gdGhvdWdoIGhpc3RvcnkgcHVzaCB3b3VsZCBiZSBpZ25vcmVkIGJ5IGxpc3RlbmVyXG4gICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICBjYihjdXJyZW50RW50cnkpO1xuICAgICAgfSk7XG4gICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgIGtpbmQ6ICdiYXRjaC1mbHVzaCcsXG4gICAgICAgIG1vZGU6IGJhdGNoTW9kZSA/PyAnbWFudWFsJyxcbiAgICAgICAgY291bnQ6IGxpc3QubGVuZ3RoLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jKTtcbiAgICB9XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBpZiAoIShzYW1lQXNCZWZvcmUgJiYgZGV2dG9vbHNWZXJib3NlKSkge1xuICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50Py4oe1xuICAgICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjb3VudDogbGlzdC5sZW5ndGgsXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgICBzZWFyY2gsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBiYXRjaE1vZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQWZ0ZXIgcmVzb2x2ZUZpbHRlclNjaGVtYSBpcyBkZWZpbmVkIHdlIGNhbiBhcHBseSBpbXBsaWNpdCBzY2hlbWEgZm9yIGFueSBxdWV1ZWQgYmF0Y2ggKGlmIHN0aWxsIHBlbmRpbmcpXG4gIC8qKiBBcHBseSBwcm92aXNpb25hbCBtZXJnZWQgcXVlcnkrZmlsdGVycyB1cGRhdGUgKGR1cmluZyBiYXRjaGluZylcbiAgICogdG8gY3VycmVudEVudHJ5IGZvciBzeW5jaHJvbm91cyByZWFkcy5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5UHJvdmlzaW9uYWxCYXRjaFVwZGF0ZShwYXRobmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEoYmFzZVBhdGgpO1xuICAgICAgY29uc3QgbWVyZ2VkUSA9IGJhdGNoZWRNZXJnZWRRdWVyeSA/PyBsYXN0QmF0Y2hRdWVyeSA/PyB7fTtcbiAgICAgIGxldCBidWlsZE9wdHM6XG4gICAgICAgIHwge1xuICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYmF0Y2hlZEZpbHRlcnMgIT0gbnVsbCAmJiBiYXRjaGVkRmlsdGVyU2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgYnVpbGRPcHRzID0ge1xuICAgICAgICAgIGZpbHRlcnM6IGJhdGNoZWRGaWx0ZXJzLFxuICAgICAgICAgIGZpbHRlclNjaGVtYTogYmF0Y2hlZEZpbHRlclNjaGVtYSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoYmF0Y2hlZEZpbHRlcnMgIT0gbnVsbCAmJiBiYXRjaGVkRmlsdGVyU2NoZW1hID09IG51bGwpIHtcbiAgICAgICAgLy8gSW1wbGljaXQgcmVzb2x1dGlvbiBmb3IgcHJvdmlzaW9uYWwgdmlld1xuICAgICAgICBsZXQgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcm91dGVDaGFpbjpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgfVtdXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChiYXNlUGF0aCA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZUNoYWluID0gY3VycmVudEVudHJ5LnJvdXRlLnJvdXRlLnJvdXRlcyBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRlc3RSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogYmFzZVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGRlc3RSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZUNoYWluID0gZGVzdFJvdXRlLnJvdXRlLnJvdXRlcyBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZUNoYWluICE9IG51bGwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygcm91dGVDaGFpbikge1xuICAgICAgICAgICAgY29uc3QgZnMgPSAoXG4gICAgICAgICAgICAgIG5vZGUgYXMge1xuICAgICAgICAgICAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtZXJnZWQgPz89IHt9O1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgZnMuc2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlZCAhPSBudWxsKSB7XG4gICAgICAgICAgYnVpbGRPcHRzID0ge1xuICAgICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgICBmaWx0ZXJTY2hlbWE6IHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3Zpc2lvbmFsU2VhcmNoID0gYnVpbGRTZWFyY2gobWVyZ2VkUSwgc2NoZW1hLCBidWlsZE9wdHMpO1xuICAgICAgY29uc3QgcGF0aENoYW5nZWQgPSBiYXNlUGF0aCAhPT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgaWYgKHByb3Zpc2lvbmFsU2VhcmNoICE9PSBjdXJyZW50RW50cnkucmF3U2VhcmNoIHx8IHBhdGhDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHR5cGVkID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgbWVyZ2VkUSk7XG4gICAgICAgIGNvbnN0IHJhd1F1ZXJ5T2JqID0gcGFyc2VSYXdRdWVyeShwcm92aXNpb25hbFNlYXJjaCk7XG4gICAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICAgIHNlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYXdTZWFyY2g6IHByb3Zpc2lvbmFsU2VhcmNoLFxuICAgICAgICAgIHF1ZXJ5OiByYXdRdWVyeU9iaixcbiAgICAgICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICAgICAgfSBhcyBSb3V0ZUVudHJ5PGFueT47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBjb25zdCBhdXRvQmF0Y2ggPSBvcHRzLmF1dG9CYXRjaCA9PT0gdHJ1ZTtcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcmVzb2x2ZUZpbHRlclNjaGVtYShwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShwYXRobmFtZSk7XG4gICAgfSxcbiAgICBjdXJyZW50TWVyZ2VkRmlsdGVyU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVGaWx0ZXJTY2hlbWEoY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSByZXR1cm47XG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHByZXBhcmVNYXRjaChtYXRjaGVzKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjazogU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pikge1xuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICBmdW5jdGlvbiBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZTtcbiAgICB9LFxuICAgIG5hdmlnYXRlKHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcXVlcnksXG4gICAgICByZXBsYWNlLFxuICAgICAgZmlsdGVycyxcbiAgICAgIGZpbHRlclNjaGVtYSxcbiAgICAgIGJhdGNoLFxuICAgICAgaW1tZWRpYXRlLFxuICAgICAgaW5oZXJpdCxcbiAgICB9OiB7XG4gICAgICBwYXRobmFtZT86IHN0cmluZztcbiAgICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICBiYXRjaD86IGJvb2xlYW47XG4gICAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xuICAgICAgaW5oZXJpdD86IGJvb2xlYW47XG4gICAgfSk6IHZvaWQge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5oZXJpdCA9IGluaGVyaXQgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IHdhbnRzQmF0Y2ggPVxuICAgICAgICAgIGJhdGNoID09PSB0cnVlIHx8XG4gICAgICAgICAgKGF1dG9CYXRjaCAmJiBpbW1lZGlhdGUgIT09IHRydWUgJiYgYmF0Y2ggIT09IGZhbHNlKTtcbiAgICAgICAgaWYgKHdhbnRzQmF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBuYXY6IFBlbmRpbmdOYXYgPSB7fTtcbiAgICAgICAgICBpZiAocGF0aG5hbWUgIT09IHVuZGVmaW5lZCkgbmF2LnBhdGhuYW1lID0gcGF0aG5hbWU7XG4gICAgICAgICAgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIG5hdi5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICAgIGlmIChyZXBsYWNlICE9PSB1bmRlZmluZWQpIG5hdi5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAgICAgICBpZiAoZmlsdGVycyAhPT0gdW5kZWZpbmVkKSBuYXYuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgaWYgKGZpbHRlclNjaGVtYSAhPT0gdW5kZWZpbmVkKSBuYXYuZmlsdGVyU2NoZW1hID0gZmlsdGVyU2NoZW1hO1xuICAgICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSBuYXYuaW5oZXJpdCA9IHRydWU7XG4gICAgICAgICAgcGVuZGluZ05hdnMgPz89IFtdO1xuICAgICAgICAgIHBlbmRpbmdOYXZzLnB1c2gobmF2KTtcbiAgICAgICAgICBsZXQgdGhpc01vZGU6ICdtYW51YWwnIHwgJ2F1dG8nO1xuICAgICAgICAgIGlmIChiYXRjaCA9PT0gdHJ1ZSkgdGhpc01vZGUgPSAnbWFudWFsJztcbiAgICAgICAgICBlbHNlIHRoaXNNb2RlID0gJ2F1dG8nO1xuICAgICAgICAgIGlmIChiYXRjaE1vZGUgPT0gbnVsbCkgYmF0Y2hNb2RlID0gdGhpc01vZGU7XG4gICAgICAgICAgZWxzZSBpZiAoYmF0Y2hNb2RlICE9PSB0aGlzTW9kZSkgYmF0Y2hNb2RlID0gJ21peGVkJztcbiAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZSA9XG4gICAgICAgICAgICAgICAgYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgbGFzdEJhdGNoUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5xdWVyeSA/P1xuICAgICAgICAgICAgICAgIHt9O1xuICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPSB7IC4uLmJhc2UsIC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPSB7IC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA9IHF1ZXJ5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYXRjaGVkRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9IG51bGwpIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZmx1c2hTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGZsdXNoU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZmx1c2hOYXZpZ2F0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFwcGx5UHJvdmlzaW9uYWxCYXRjaFVwZGF0ZShwYXRobmFtZSk7XG4gICAgICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgICAgICAgIGNiKGN1cnJlbnRFbnRyeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltbWVkaWF0ZSBuYXZpZ2F0aW9uXG4gICAgICAgIGxldCBiYXNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgIGJhc2UgPSB7IC4uLihjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/PyBjdXJyZW50RW50cnkucXVlcnkgPz8ge30pIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoYmFzZSAhPSBudWxsKSBPYmplY3QuYXNzaWduKGJhc2UsIHF1ZXJ5KTtcbiAgICAgICAgICBlbHNlIGJhc2UgPSBxdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlID8/PSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/PyBjdXJyZW50RW50cnkucXVlcnkgPz8ge307XG4gICAgICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRobmFtZSA/PyBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aCk7XG4gICAgICAgIGxldCBidWlsZE9wdHM6XG4gICAgICAgICAgfCB7XG4gICAgICAgICAgICAgIGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBmaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgYnVpbGRPcHRzID0geyBmaWx0ZXJzLCBmaWx0ZXJTY2hlbWE6IGZzIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gYnVpbGRTZWFyY2goYmFzZSwgc2NoZW1hLCBidWlsZE9wdHMpO1xuICAgICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSB0YXJnZXRQYXRoO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgPT09ICcnKSB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcbiAgICAgICAgaWYgKHRhcmdldFBhdGhuYW1lICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKHRhcmdldFBhdGhuYW1lKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHNlYXJjaCk7XG4gICAgICAgIGNvbnN0IHR5cGVkID0gcGFyc2VUeXBlZFF1ZXJ5KGVmZmVjdGl2ZVNjaGVtYSwgcmF3UXVlcnlPYmopO1xuICAgICAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgICAgIHJhd1NlYXJjaDogc2VhcmNoLFxuICAgICAgICAgIHF1ZXJ5OiByYXdRdWVyeU9iaixcbiAgICAgICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICAgICAgfSBhcyBSb3V0ZUVudHJ5PGFueT47XG4gICAgICAgIGxldCBub3JtSW1tZWRpYXRlID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgICAgIGlmIChub3JtSW1tZWRpYXRlID09PSAnJykgbm9ybUltbWVkaWF0ZSA9ICcvJztcbiAgICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiBub3JtSW1tZWRpYXRlLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICAgIGNvbnN0IHNhbWVBc0JlZm9yZSA9XG4gICAgICAgICAgY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lID09PSBub3JtSW1tZWRpYXRlICYmXG4gICAgICAgICAgY3VycmVudEVudHJ5LnJhd1NlYXJjaCA9PT0gc2VhcmNoO1xuICAgICAgICBpZiAoc2FtZUFzQmVmb3JlICYmIGRldnRvb2xzVmVyYm9zZSAmJiAhcmVwbGFjZSkge1xuICAgICAgICAgIC8vIEZvcmNlIG5vdGlmeSBzdWJzY3JpYmVycyArIGRldnRvb2xzIGV2ZW4gaWYgbGlzdGVuZXIgd291bGQgaWdub3JlXG4gICAgICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgICAgICAgIGNiKGN1cnJlbnRFbnRyeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50Py4oe1xuICAgICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICAgIG1vZGU6ICdpbW1lZGlhdGUnLFxuICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVwbGFjZSkgaGlzdG9yeS5zZXQobG9jYXRpb25PYmopO1xuICAgICAgICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvY2F0aW9uT2JqKTtcbiAgICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAgICBraW5kOiAnbmF2aWdhdGUnLFxuICAgICAgICAgICAgbW9kZTogJ2ltbWVkaWF0ZScsXG4gICAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICAgIHBhdGhuYW1lOiBub3JtSW1tZWRpYXRlLFxuICAgICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICAvLyBEeW5hbWljIGRldnRvb2xzIGxvYWQgKGRldiBvbmx5KSAtIHNlcGFyYXRlIGNodW5rIGZvciB0cmVlLXNoYWtpbmdcbiAgaWYgKChkZXZ0b29sc0dsb2JhbCB8fCBkZXZ0b29sc1BhbmVsKSAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW9kOiBhbnkgPSBhd2FpdCBpbXBvcnQoJy4vZGV2dG9vbHMuanMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBpZiAobW9kICE9IG51bGwgJiYgdHlwZW9mIG1vZC5pbml0Um91dGVyRGV2dG9vbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy1lc2xpbnQvbWF4LWxlblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgIGRldnRvb2xzT25OYXZFdmVudCA9IG1vZC5pbml0Um91dGVyRGV2dG9vbHMoe1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZ2xvYmFsOiBkZXZ0b29sc0dsb2JhbCxcbiAgICAgICAgICAgICAgcGFuZWw6IGRldnRvb2xzUGFuZWwsXG4gICAgICAgICAgICAgIHNob3J0Y3V0OiBkZXZ0b29sc1Nob3J0Y3V0LFxuICAgICAgICAgICAgICB2ZXJib3NlOiBkZXZ0b29sc1ZlcmJvc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
@@ -3,6 +3,7 @@ export interface InitRouterDevtoolsOptions {
3
3
  global: boolean;
4
4
  panel: boolean;
5
5
  shortcut: string;
6
+ verbose?: boolean;
6
7
  }
7
8
  export interface NavEventMetaPublic {
8
9
  kind: string;
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../../src/routing/devtools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAkvBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,yBAAyB,CAAC;CACpC,GAAG,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAgCrC;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../../src/routing/devtools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AACD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AA0vBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,yBAAyB,CAAC;CACpC,GAAG,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAoCrC;AAED,eAAe,kBAAkB,CAAC"}