valtech-components 4.0.254 → 4.0.255

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.
@@ -7,8 +7,7 @@
7
7
  */
8
8
  import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
9
9
  import { isPlatformBrowser } from '@angular/common';
10
- import { getToken, deleteToken, onMessage } from '@angular/fire/messaging';
11
- import { isSupported as fcmIsSupported, getMessaging as fcmGetMessaging } from 'firebase/messaging';
10
+ import { deleteToken, getToken, isSupported as fcmIsSupported, getMessaging as fcmGetMessaging, onMessage, } from 'firebase/messaging';
12
11
  import { getApp, getApps, initializeApp } from 'firebase/app';
13
12
  import { Subject, BehaviorSubject } from 'rxjs';
14
13
  import { VALTECH_FIREBASE_CONFIG } from './config';
@@ -67,6 +66,8 @@ export class MessagingService {
67
66
  * Es un *optimistic hint* — la verdad la confirma el siguiente `getToken()`.
68
67
  */
69
68
  this.TOKEN_STORAGE_KEY = 'valtech_fcm_token';
69
+ this.FCM_SW_URL = '/firebase-messaging-sw.js';
70
+ this.FCM_SW_SCOPE = '/firebase-cloud-messaging-push-scope';
70
71
  /**
71
72
  * Timeout (ms) para `navigator.serviceWorker.ready` dentro de `getToken()`.
72
73
  *
@@ -75,6 +76,14 @@ export class MessagingService {
75
76
  * de colgarse indefinidamente.
76
77
  */
77
78
  this.SW_READY_TIMEOUT_MS = 10_000;
79
+ /**
80
+ * Timeout duro para la llamada de Firebase `getToken()`.
81
+ *
82
+ * En Chromium puede quedar pendiente sin resolver si la registración FCM no
83
+ * responde (VAPID/proyecto/API/red). Sin este timeout, el watchdog externo
84
+ * fuerza un reload que no corrige la causa y deja un diagnóstico pobre.
85
+ */
86
+ this.FCM_GET_TOKEN_TIMEOUT_MS = 15_000;
78
87
  /**
79
88
  * Timeout (ms) del watchdog de `enable()` antes de auto-recargar la página.
80
89
  *
@@ -83,10 +92,10 @@ export class MessagingService {
83
92
  * cold load. El timeout de `getToken()` (SW_READY_TIMEOUT_MS) no cubre eso;
84
93
  * por eso `enable()` envuelve el flujo completo en este watchdog.
85
94
  *
86
- * Un flujo exitoso real llega a token+device en ~4s; 15s es holgado y no
95
+ * Un flujo exitoso real llega a token+device en ~4s; 25s es holgado y no
87
96
  * atrapa un éxito lento.
88
97
  */
89
- this.ENABLE_WATCHDOG_MS = 15_000;
98
+ this.ENABLE_WATCHDOG_MS = 25_000;
90
99
  /**
91
100
  * Key de sessionStorage — garantiza un solo auto-reload por sesión. Si el
92
101
  * flujo se cuelga una 2ª vez tras el reload, NO se recarga de nuevo (anti-loop).
@@ -112,8 +121,8 @@ export class MessagingService {
112
121
  try {
113
122
  const app = getApps().length > 0 ? getApp() : initializeApp(this.config.firebase);
114
123
  // Cast a Messaging (token de AngularFire) — el tipo subyacente del SDK
115
- // es el mismo. Las funciones getToken/deleteToken/onMessage de
116
- // @angular/fire/messaging son re-exports del SDK y aceptan esta instance.
124
+ // es el mismo. Las funciones getToken/deleteToken/onMessage se llaman
125
+ // desde `firebase/messaging` directo para evitar wrappers de Zone.
117
126
  return fcmGetMessaging(app);
118
127
  }
119
128
  catch (err) {
@@ -431,10 +440,10 @@ export class MessagingService {
431
440
  // queda listo en SW_READY_TIMEOUT_MS, esta promesa rechaza limpio.
432
441
  await this.waitForServiceWorkerReady();
433
442
  console.log('[Messaging] SW ready, calling Firebase getToken()...');
434
- const token = await getToken(messaging, {
443
+ const token = await this.withTimeout(getToken(messaging, {
435
444
  vapidKey,
436
445
  serviceWorkerRegistration: registration,
437
- });
446
+ }), this.FCM_GET_TOKEN_TIMEOUT_MS, `[Messaging] Firebase getToken no respondió en ${this.FCM_GET_TOKEN_TIMEOUT_MS / 1000}s`);
438
447
  console.log('[Messaging] Firebase getToken returned:', token ? `${token.slice(0, 16)}…` : 'null/empty');
439
448
  this.stateSubject.next({
440
449
  ...this.stateSubject.value,
@@ -455,18 +464,28 @@ export class MessagingService {
455
464
  /**
456
465
  * Resuelve el `ServiceWorkerRegistration` del SW de FCM.
457
466
  *
458
- * El SW `/firebase-messaging-sw.js` ya se registra una vez en el bootstrap de
459
- * la app (`config.ts`). Reutilizamos ese registro en lugar de re-registrarlo
467
+ * El SW de FCM ya se registra una vez en el bootstrap de la app (`config.ts`)
468
+ * con un scope dedicado. Reutilizamos ese registro en lugar de re-registrarlo
460
469
  * en cada `getToken()` — re-registrar repetidamente dispara revalidaciones del
461
470
  * SW en iOS PWA. Solo registramos como fallback si todavía no existe.
462
471
  */
463
472
  async resolveServiceWorkerRegistration() {
464
- const existing = await navigator.serviceWorker.getRegistration('/firebase-messaging-sw.js');
473
+ const existing = await this.findFcmServiceWorkerRegistration();
465
474
  if (existing) {
475
+ console.log('[Messaging] SW registration resolved:', existing.scope, existing.active?.scriptURL || existing.installing?.scriptURL || existing.waiting?.scriptURL);
466
476
  return existing;
467
477
  }
468
478
  console.warn('[Messaging] SW not registered yet, registering as fallback');
469
- return navigator.serviceWorker.register('/firebase-messaging-sw.js');
479
+ const registration = await navigator.serviceWorker.register(this.FCM_SW_URL, {
480
+ scope: this.FCM_SW_SCOPE,
481
+ });
482
+ console.log('[Messaging] SW registration created:', registration.scope, registration.active?.scriptURL || registration.installing?.scriptURL || registration.waiting?.scriptURL);
483
+ return registration;
484
+ }
485
+ async findFcmServiceWorkerRegistration() {
486
+ const expectedScope = new URL(this.FCM_SW_SCOPE, window.location.origin).href;
487
+ const registrations = await navigator.serviceWorker.getRegistrations();
488
+ return registrations.find(registration => registration.scope === expectedScope);
470
489
  }
471
490
  /**
472
491
  * Espera a que el Service Worker quede activo (`navigator.serviceWorker.ready`)
@@ -482,17 +501,35 @@ export class MessagingService {
482
501
  * El timer se limpia en ambas ramas para no dejar timers colgando.
483
502
  */
484
503
  waitForServiceWorkerReady() {
504
+ return this.withTimeout(this.findFcmServiceWorkerRegistration().then(registration => {
505
+ if (!registration) {
506
+ throw new Error('[Messaging] service worker FCM no registrado');
507
+ }
508
+ if (registration.active) {
509
+ return undefined;
510
+ }
511
+ return new Promise((resolve, reject) => {
512
+ const worker = registration.installing || registration.waiting;
513
+ if (!worker) {
514
+ reject(new Error('[Messaging] service worker FCM sin worker activo'));
515
+ return;
516
+ }
517
+ worker.addEventListener('statechange', () => {
518
+ if (worker.state === 'activated')
519
+ resolve();
520
+ if (worker.state === 'redundant') {
521
+ reject(new Error('[Messaging] service worker FCM quedó redundante'));
522
+ }
523
+ });
524
+ });
525
+ }), this.SW_READY_TIMEOUT_MS, `[Messaging] service worker no quedó listo en ${this.SW_READY_TIMEOUT_MS / 1000}s`);
526
+ }
527
+ withTimeout(promise, ms, message) {
485
528
  let timer;
486
- const ready = navigator.serviceWorker.ready.then(() => {
487
- if (timer !== undefined)
488
- clearTimeout(timer);
489
- });
490
529
  const timeout = new Promise((_, reject) => {
491
- timer = setTimeout(() => {
492
- reject(new Error(`[Messaging] service worker no quedó listo en ${this.SW_READY_TIMEOUT_MS / 1000}s`));
493
- }, this.SW_READY_TIMEOUT_MS);
530
+ timer = setTimeout(() => reject(new Error(message)), ms);
494
531
  });
495
- return Promise.race([ready, timeout]).finally(() => {
532
+ return Promise.race([promise, timeout]).finally(() => {
496
533
  if (timer !== undefined)
497
534
  clearTimeout(timer);
498
535
  });
@@ -927,4 +964,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
927
964
  type: Inject,
928
965
  args: [PLATFORM_ID]
929
966
  }] }, { type: i0.NgZone }] });
930
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL21lc3NhZ2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFvQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFhLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsSUFBSSxjQUFjLEVBQUUsWUFBWSxJQUFJLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5RCxPQUFPLEVBQWMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBeUNuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBcUQzQixZQUNVLFFBQWtCLEVBQ2UsTUFBNkIsRUFDekMsVUFBa0IsRUFDdkMsTUFBYztRQUhkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZSxXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQUN6QyxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUF4RGhCLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFDcEQsNkJBQXdCLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7UUFDakUsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FB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a0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOytHQXg5QlUsZ0JBQWdCLDBDQXVEakIsdUJBQXVCLGFBQ3ZCLFdBQVc7bUhBeERWLGdCQUFnQixjQURILE1BQU07OzRGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkF3RDdCLE1BQU07MkJBQUMsdUJBQXVCOzswQkFDOUIsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZXNzYWdpbmcgU2VydmljZSAoRkNNKVxuICpcbiAqIFNlcnZpY2lvIHBhcmEgRmlyZWJhc2UgQ2xvdWQgTWVzc2FnaW5nIChQdXNoIE5vdGlmaWNhdGlvbnMpLlxuICogUGVybWl0ZSBzb2xpY2l0YXIgcGVybWlzb3MsIG9idGVuZXIgdG9rZW5zLCBlc2N1Y2hhciBtZW5zYWplcyB5IG1hbmVqYXJcbiAqIG5hdmVnYWNpw7NuIChkZWVwIGxpbmtpbmcpIGN1YW5kbyBlbCB1c3VhcmlvIHRvY2EgdW5hIG5vdGlmaWNhY2nDs24uXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWVzc2FnaW5nLCBnZXRUb2tlbiwgZGVsZXRlVG9rZW4sIG9uTWVzc2FnZSB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvbWVzc2FnaW5nJztcbmltcG9ydCB7IGlzU3VwcG9ydGVkIGFzIGZjbUlzU3VwcG9ydGVkLCBnZXRNZXNzYWdpbmcgYXMgZmNtR2V0TWVzc2FnaW5nIH0gZnJvbSAnZmlyZWJhc2UvbWVzc2FnaW5nJztcbmltcG9ydCB7IGdldEFwcCwgZ2V0QXBwcywgaW5pdGlhbGl6ZUFwcCB9IGZyb20gJ2ZpcmViYXNlL2FwcCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBFbmFibGVQdXNoUmVzdWx0LFxuICBOb3RpZmljYXRpb25BY3Rpb24sXG4gIE5vdGlmaWNhdGlvbkNsaWNrRXZlbnQsXG4gIE5vdGlmaWNhdGlvblBheWxvYWQsXG4gIE5vdGlmaWNhdGlvblBlcm1pc3Npb24sXG4gIFZhbHRlY2hGaXJlYmFzZUNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ2FsbGJhY2sgb3BjaW9uYWwgZGUgcmVnaXN0cm8gZGUgZGV2aWNlIHBhcmEgYE1lc3NhZ2luZ1NlcnZpY2UuZW5hYmxlKClgLlxuICpcbiAqIEVsIHJlZ2lzdHJvIGRlbCBkZXZpY2Ugdml2ZSBlbiBgQXV0aFNlcnZpY2VgIChuZWNlc2l0YSBlbCBKV1QgKyBlbCBlbmRwb2ludFxuICogZGVsIGJhY2tlbmQpLiBgTWVzc2FnaW5nU2VydmljZWAgTk8gcHVlZGUgZGVwZW5kZXIgZGUgYEF1dGhTZXJ2aWNlYCBzaW5cbiAqIGNyZWFyIHVuIGNpY2xvIChBdXRoU2VydmljZSDihpIgTWVzc2FnaW5nU2VydmljZSkuIFBvciBlc28gZWwgY2FsbGVyIGxlIHBhc2FcbiAqIGVsIHBhc28gZGUgcmVnaXN0cm8gY29tbyBjYWxsYmFjay4gUmVjaWJlIGVsIHRva2VuIEZDTSB5IGRldnVlbHZlIHNpIGVsXG4gKiBkZXZpY2UgcXVlZMOzIHJlZ2lzdHJhZG8uXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2lzdGVyRGV2aWNlRm4gPSAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBPcGNpb25lcyBkZSBgTWVzc2FnaW5nU2VydmljZS5lbmFibGUoKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHVzaE9wdGlvbnMge1xuICAvKipcbiAgICogUGFzbyBvcGNpb25hbCBkZSByZWdpc3RybyBkZSBkZXZpY2UgZW4gZWwgYmFja2VuZC4gU2kgc2Ugb21pdGUsIGBlbmFibGUoKWBcbiAgICogcmVzdWVsdmUgY29uIGBzdGF0dXM6ICdlbmFibGVkJ2AgYXBlbmFzIG9idGllbmUgZWwgdG9rZW4gKHNpbiByZWdpc3RyYXIpLlxuICAgKi9cbiAgcmVnaXN0ZXJEZXZpY2U/OiBSZWdpc3RlckRldmljZUZuO1xufVxuXG4vKipcbiAqIEVzdGFkbyBpbnRlcm5vIGRlbCBzZXJ2aWNpbyBkZSBtZXNzYWdpbmdcbiAqL1xuaW50ZXJmYWNlIE1lc3NhZ2luZ1N0YXRlIHtcbiAgdG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHBlcm1pc3Npb246IE5vdGlmaWNhdGlvblBlcm1pc3Npb247XG4gIGlzU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNlcnZpY2lvIHBhcmEgRmlyZWJhc2UgQ2xvdWQgTWVzc2FnaW5nIChGQ00pLlxuICpcbiAqIFBlcm1pdGUgcmVjaWJpciBub3RpZmljYWNpb25lcyBwdXNoIGVuIGxhIGFwbGljYWNpw7NuIHdlYi5cbiAqIFJlcXVpZXJlIFZBUElEIGtleSBjb25maWd1cmFkYSBlbiBWYWx0ZWNoRmlyZWJhc2VDb25maWcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBtZXNzYWdpbmcgPSBpbmplY3QoTWVzc2FnaW5nU2VydmljZSk7XG4gKlxuICogICB0b2tlbiA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAqXG4gKiAgIGFzeW5jIGVuYWJsZU5vdGlmaWNhdGlvbnMoKSB7XG4gKiAgICAgLy8gU29saWNpdGFyIHBlcm1pc28geSBvYnRlbmVyIHRva2VuXG4gKiAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLm1lc3NhZ2luZy5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICpcbiAqICAgICBpZiAodG9rZW4pIHtcbiAqICAgICAgIHRoaXMudG9rZW4uc2V0KHRva2VuKTtcbiAqICAgICAgIC8vIEVudmlhciB0b2tlbiBhIHR1IGJhY2tlbmQgcGFyYSBhbG1hY2VuYXJsb1xuICogICAgICAgYXdhaXQgdGhpcy5iYWNrZW5kLnJlZ2lzdGVyRGV2aWNlVG9rZW4odG9rZW4pO1xuICogICAgIH1cbiAqICAgfVxuICpcbiAqICAgLy8gRXNjdWNoYXIgbWVuc2FqZXMgZW4gZm9yZWdyb3VuZFxuICogICBtZXNzYWdlcyQgPSB0aGlzLm1lc3NhZ2luZy5vbk1lc3NhZ2UoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2luZ1NlcnZpY2Uge1xuICBwcml2YXRlIG1lc3NhZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Tm90aWZpY2F0aW9uUGF5bG9hZD4oKTtcbiAgcHJpdmF0ZSBub3RpZmljYXRpb25DbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDxOb3RpZmljYXRpb25DbGlja0V2ZW50PigpO1xuICBwcml2YXRlIHN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWVzc2FnaW5nU3RhdGU+KHtcbiAgICB0b2tlbjogbnVsbCxcbiAgICBwZXJtaXNzaW9uOiAnZGVmYXVsdCcsXG4gICAgaXNTdXBwb3J0ZWQ6IGZhbHNlLFxuICB9KTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlT25NZXNzYWdlPzogKCkgPT4gdm9pZDtcblxuICAvKiogRmxhZyBwYXJhIHBlcnNpc3RpciBtZW5zYWplcyBGQ00gZW4gbG9jYWxTdG9yYWdlIChkZWJ1Z2dpbmcpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVidWdQZXJzaXN0ZW5jZTogYm9vbGVhbjtcbiAgLyoqIEtleSBwYXJhIGxvY2FsU3RvcmFnZSBkZSBtZW5zYWplcyBGQ00gKGRlYnVnZ2luZykgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBERUJVR19TVE9SQUdFX0tFWSA9ICdmY21fZGVidWdfbWVzc2FnZXMnO1xuICAvKipcbiAgICogS2V5IGRlIGxvY2FsU3RvcmFnZSBkb25kZSBzZSBwZXJzaXN0ZSBlbCB0b2tlbiBGQ00uXG4gICAqXG4gICAqIEVsIHRva2VuIHZpdmUgZW4gdW4gYEJlaGF2aW9yU3ViamVjdGAgZW4gbWVtb3JpYSB5IHNlIHBpZXJkZSBlbiBjYWRhXG4gICAqIHJlY2FyZ2EgLyBzdXNwZW5zacOzbiBkZSBsYSBQV0EgKGlPUyByZWluaWNpYSBQV0FzIGNvbiBmcmVjdWVuY2lhKS4gUGVyc2lzdGlyXG4gICAqIGVsIHRva2VuIHBlcm1pdGUgaGlkcmF0YXIgZWwgZXN0YWRvIGVuIGNvbGQgc3RhcnQgeSBxdWUgbGEgVUkgbm8gcGFycGFkZWUuXG4gICAqIEVzIHVuICpvcHRpbWlzdGljIGhpbnQqIOKAlCBsYSB2ZXJkYWQgbGEgY29uZmlybWEgZWwgc2lndWllbnRlIGBnZXRUb2tlbigpYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgVE9LRU5fU1RPUkFHRV9LRVkgPSAndmFsdGVjaF9mY21fdG9rZW4nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IChtcykgcGFyYSBgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHlgIGRlbnRybyBkZSBgZ2V0VG9rZW4oKWAuXG4gICAqXG4gICAqIEVuIHVuIGNvbGQgbG9hZCBlbCBTVyBwdWVkZSBubyBlc3RhciBhY3RpdmFkbyBhw7puIHkgYHNlcnZpY2VXb3JrZXIucmVhZHlgXG4gICAqIG5vIHJlc29sdmVyIG51bmNhLiBQYXNhZG8gZXN0ZSB0aWVtcG8sIGBnZXRUb2tlbigpYCByZWNoYXphIGxpbXBpbyBlbiBsdWdhclxuICAgKiBkZSBjb2xnYXJzZSBpbmRlZmluaWRhbWVudGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNXX1JFQURZX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgKG1zKSBkZWwgd2F0Y2hkb2cgZGUgYGVuYWJsZSgpYCBhbnRlcyBkZSBhdXRvLXJlY2FyZ2FyIGxhIHDDoWdpbmEuXG4gICAqXG4gICAqIEVsIGZsdWpvIGRlIGFjdGl2YWNpw7NuIGEgdmVjZXMgc2UgY3VlbGdhIEFOVEVTIGRlIGBnZXRUb2tlbigpYCDigJQgY2Fzb1xuICAgKiB0w61waWNvOiBgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKClgIG5vIG11ZXN0cmEgZWwgcG9wdXAgZGVsIFNPIGVuIHVuXG4gICAqIGNvbGQgbG9hZC4gRWwgdGltZW91dCBkZSBgZ2V0VG9rZW4oKWAgKFNXX1JFQURZX1RJTUVPVVRfTVMpIG5vIGN1YnJlIGVzbztcbiAgICogcG9yIGVzbyBgZW5hYmxlKClgIGVudnVlbHZlIGVsIGZsdWpvIGNvbXBsZXRvIGVuIGVzdGUgd2F0Y2hkb2cuXG4gICAqXG4gICAqIFVuIGZsdWpvIGV4aXRvc28gcmVhbCBsbGVnYSBhIHRva2VuK2RldmljZSBlbiB+NHM7IDE1cyBlcyBob2xnYWRvIHkgbm9cbiAgICogYXRyYXBhIHVuIMOpeGl0byBsZW50by5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgRU5BQkxFX1dBVENIRE9HX01TID0gMTVfMDAwO1xuXG4gIC8qKlxuICAgKiBLZXkgZGUgc2Vzc2lvblN0b3JhZ2Ug4oCUIGdhcmFudGl6YSB1biBzb2xvIGF1dG8tcmVsb2FkIHBvciBzZXNpw7NuLiBTaSBlbFxuICAgKiBmbHVqbyBzZSBjdWVsZ2EgdW5hIDLCqiB2ZXogdHJhcyBlbCByZWxvYWQsIE5PIHNlIHJlY2FyZ2EgZGUgbnVldm8gKGFudGktbG9vcCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IEFVVE9SRUxPQURfRkxBRyA9ICdub3RpZi1lbmFibGUtYXV0b3JlbG9hZCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZyxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuZGVidWdQZXJzaXN0ZW5jZSA9IHRoaXMuY29uZmlnPy5kZWJ1Z01lc3NhZ2VQZXJzaXN0ZW5jZSA/PyBmYWxzZTtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGluc3RhbmNpYSBkZSBNZXNzYWdpbmcgdmlhIEZpcmViYXNlIFNESyBkaXJlY3RvIChOTyBBbmd1bGFyRmlyZSBESSkuXG4gICAqXG4gICAqICoqUG9yIHF1w6kgbm8gdXNhbW9zIGBpbmplY3Rvci5nZXQoTWVzc2FnaW5nKWA6KipcbiAgICogQW5ndWxhckZpcmUgYHByb3ZpZGVNZXNzYWdpbmdgIHJlZ2lzdHJhIHVuIEFQUF9JTklUSUFMSVpFUiBxdWUgaW50ZXJuYW1lbnRlXG4gICAqIHJlc3VlbHZlIGBhd2FpdCBpc1N1cHBvcnRlZCgpYC4gU2kgYGluamVjdG9yLmdldChNZXNzYWdpbmcpYCBzZSBsbGFtYSBhbnRlc1xuICAgKiBxdWUgZXNlIEFQUF9JTklUSUFMSVpFUiB0ZXJtaW5lIChlai4gb3Ryb3MgQVBQX0lOSVRJQUxJWkVSIGRlbCBjbGllbnRlXG4gICAqIGNvbnN0cnV5ZW4gQXV0aFNlcnZpY2Ug4oaSIE1lc3NhZ2luZ1NlcnZpY2Ug4oaSIHRvY2EgTWVzc2FnaW5nIHRlbXByYW5vKSxcbiAgICogQW5ndWxhckZpcmUgbGFuemEgZWwgZXJyb3IgXCJBUFBfSU5JVElBTElaRVIgLi4uIGhhcyBub3QgcmVzb2x2ZWRcIi4gQW5ndWxhclxuICAgKiBESSAqKmNhY2hlYSBlcnJvcmVzIGRlIGZhY3RvcnkqKiDigJQgdW5hIHZleiBxdWUgZmFsbMOzLCB0b2RvcyBsb3NcbiAgICogYGluamVjdG9yLmdldGAgc2lndWllbnRlcyByZXRvcm5hbiBlbCBtaXNtbyBlcnJvciBjYWNoZWFkby4gUmV0cnkgbG9vcHNcbiAgICogbm8gZnVuY2lvbmFuLlxuICAgKlxuICAgKiAqKldvcmthcm91bmQ6KiogYnlwYXNzIEFuZ3VsYXJGaXJlIGVudGlyZWx5IHkgdXNhciBGaXJlYmFzZSBTREsgZGlyZWN0b1xuICAgKiAoYGZpcmViYXNlL21lc3NhZ2luZy5nZXRNZXNzYWdpbmcoZ2V0QXBwKCkpYCkuIEFuZ3VsYXJGaXJlIGVzIHVuIHdyYXBwZXJcbiAgICogc29icmUgZWwgbWlzbW8gU0RLIOKAlCBsYSBpbnN0YW5jaWEgcXVlIG9idGVuZW1vcyBlcyBmdW5jaW9uYWxtZW50ZSBpZMOpbnRpY2EuXG4gICAqIGBnZXRBcHAoKWAgcmV0b3JuYSBsYSBkZWZhdWx0IEZpcmViYXNlIGFwcCBpbmljaWFsaXphZGEgcG9yXG4gICAqIGBwcm92aWRlRmlyZWJhc2VBcHAoKCkgPT4gaW5pdGlhbGl6ZUFwcChjb25maWcuZmlyZWJhc2UpKWAuIFNpIHBvciBhbGd1bmFcbiAgICogcmF6w7NuIG5vIGVzdMOhIGluaWNpYWxpemFkYSBhw7puLCBoYWNlbW9zIGluaXRpYWxpemVBcHAgaWRlbXBvdGVudGUuXG4gICAqL1xuICBwcml2YXRlIGZjbVN1cHBvcnRQcm9taXNlPzogUHJvbWlzZTxib29sZWFuPjtcblxuICBwcml2YXRlIGFzeW5jIGdldE1lc3NhZ2luZ0luc3RhbmNlKCk6IFByb21pc2U8TWVzc2FnaW5nIHwgbnVsbD4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoIXRoaXMuZmNtU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIHRoaXMuZmNtU3VwcG9ydFByb21pc2UgPSBmY21Jc1N1cHBvcnRlZCgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gZmNtSXNTdXBwb3J0ZWQgdGhyZXc6JywgZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGF3YWl0IHRoaXMuZmNtU3VwcG9ydFByb21pc2U7XG4gICAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gRkNNIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwID0gZ2V0QXBwcygpLmxlbmd0aCA+IDAgPyBnZXRBcHAoKSA6IGluaXRpYWxpemVBcHAodGhpcy5jb25maWcuZmlyZWJhc2UpO1xuICAgICAgLy8gQ2FzdCBhIE1lc3NhZ2luZyAodG9rZW4gZGUgQW5ndWxhckZpcmUpIOKAlCBlbCB0aXBvIHN1YnlhY2VudGUgZGVsIFNES1xuICAgICAgLy8gZXMgZWwgbWlzbW8uIExhcyBmdW5jaW9uZXMgZ2V0VG9rZW4vZGVsZXRlVG9rZW4vb25NZXNzYWdlIGRlXG4gICAgICAvLyBAYW5ndWxhci9maXJlL21lc3NhZ2luZyBzb24gcmUtZXhwb3J0cyBkZWwgU0RLIHkgYWNlcHRhbiBlc3RhIGluc3RhbmNlLlxuICAgICAgcmV0dXJuIGZjbUdldE1lc3NhZ2luZyhhcHApIGFzIE1lc3NhZ2luZztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNZXNzYWdpbmddIGZpcmViYXNlIGdldE1lc3NhZ2luZygpIHRocmV3OicsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIG1lc3NhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplTWVzc2FnaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZHJhdGFyIGVsIHRva2VuIGRlc2RlIGxvY2FsU3RvcmFnZSBBTlRFUyBkZWwgY2hlY2sgZGUgc29wb3J0ZTogZWwgdG9rZW5cbiAgICAvLyBjYWNoZWFkbyBlcyB1biBoaW50IG9wdGltaXN0YSBwYXJhIGxhIFVJIHRyYXMgcmVjYXJnYXMgLyBzdXNwZW5zaW9uZXMgZGVcbiAgICAvLyBsYSBQV0EuIExhIHZhbGlkZXogcmVhbCBzZSBjb25maXJtYSBlbiBlbCBwcsOzeGltbyBnZXRUb2tlbigpLlxuICAgIHRoaXMuaHlkcmF0ZVRva2VuRnJvbVN0b3JhZ2UoKTtcblxuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGF3YWl0IHRoaXMuY2hlY2tTdXBwb3J0KCk7XG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG5cbiAgICB0aGlzLnN0YXRlU3ViamVjdC5uZXh0KHtcbiAgICAgIC4uLnRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLFxuICAgICAgaXNTdXBwb3J0ZWQ6IHN1cHBvcnRlZCxcbiAgICAgIHBlcm1pc3Npb24sXG4gICAgfSk7XG5cbiAgICAvLyBTaSB5YSB0aWVuZSBwZXJtaXNvLCBjb25maWd1cmFyIGxpc3RlbmVyc1xuICAgIGlmIChzdXBwb3J0ZWQgJiYgcGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSB7XG4gICAgICB0aGlzLnNldHVwTWVzc2FnZUxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgLy8gRXNjdWNoYXIgbWVuc2FqZXMgZGVsIFNlcnZpY2UgV29ya2VyIChjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMgYmFja2dyb3VuZClcbiAgICB0aGlzLnNldHVwU2VydmljZVdvcmtlckxpc3RlbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJhIGxpc3RlbmVyIHBhcmEgbWVuc2FqZXMgZGVsIFNlcnZpY2UgV29ya2VyLlxuICAgKiBSZWNpYmUgZXZlbnRvcyBjdWFuZG8gZWwgdXN1YXJpbyBoYWNlIGNsaWNrIGVuIHVuYSBub3RpZmljYWNpw7NuIGJhY2tncm91bmQuXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2VydmljZVdvcmtlckxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCAhKCdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgIC8vIFNvbG8gcHJvY2VzYXIgbWVuc2FqZXMgZGUgbm90aWZpY2FjacOzbiBjbGljayBiaWVuIGZvcm1hZG9zLlxuICAgICAgLy8gRW4gYXBwcyBjb24gbcO6bHRpcGxlcyBTVyAoUFdBIG5nc3ctd29ya2VyICsgZmlyZWJhc2UtbWVzc2FnaW5nLXN3KSxcbiAgICAgIC8vIG8gdmFyaWFudGVzIGRlbCBwYXlsb2FkLCBgbm90aWZpY2F0aW9uYCBwdWVkZSBubyBleGlzdGlyIGF1bnF1ZVxuICAgICAgLy8gYGRhdGEudHlwZWAgY29pbmNpZGEg4oaSIGd1YXJkIGRlZmVuc2l2byBldml0YSBUeXBlRXJyb3IuXG4gICAgICBpZiAoZXZlbnQuZGF0YT8udHlwZSAhPT0gJ05PVElGSUNBVElPTl9DTElDSycpIHJldHVybjtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGV2ZW50LmRhdGEubm90aWZpY2F0aW9uIGFzIE5vdGlmaWNhdGlvblBheWxvYWQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW5vdGlmaWNhdGlvbikgcmV0dXJuO1xuXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmV4dHJhY3RBY3Rpb25Gcm9tRGF0YShub3RpZmljYXRpb24uZGF0YSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2xpY2tTdWJqZWN0Lm5leHQoe1xuICAgICAgICAgIG5vdGlmaWNhdGlvbixcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG8gZW4gZWwgbmF2ZWdhZG9yIGFjdHVhbFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1N1cHBvcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2FyIEFQSXMgbmVjZXNhcmlhc1xuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFZlcmlmaWNhciBxdWUgbWVzc2FnaW5nIGVzdMOpIGRpc3BvbmlibGUgKGFzeW5jIOKAlCBlc3BlcmEgQVBQX0lOSVRJQUxJWkVSKVxuICAgIGlmICghKGF3YWl0IHRoaXMuZ2V0TWVzc2FnaW5nSW5zdGFuY2UoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJNSVNPUyBZIFRPS0VOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTb2xpY2l0YSBwZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIHkgb2J0aWVuZSBlbCB0b2tlbiBGQ00uXG4gICAqXG4gICAqIEByZXR1cm5zIFRva2VuIEZDTSBzaSBzZSBvdG9yZ8OzIHBlcm1pc28sIG51bGwgc2kgc2UgZGVuZWfDs1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VuID0gYXdhaXQgbWVzc2FnaW5nLnJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAqIGlmICh0b2tlbikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdUb2tlbiBGQ006JywgdG9rZW4pO1xuICAgKiAgIC8vIEVudmlhciBhIGJhY2tlbmRcbiAgICogfSBlbHNlIHtcbiAgICogICBjb25zb2xlLmxvZygnUGVybWlzbyBkZW5lZ2FkbyBvIG5vIHNvcG9ydGFkbycpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFBlcm1pc3Npb24oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdGQ00gbm8gZXN0w6Egc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU29saWNpdGFyIHBlcm1pc28gZGUgbm90aWZpY2FjaW9uZXNcbiAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSBhd2FpdCBOb3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKTtcblxuICAgICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dCh7XG4gICAgICAgIC4uLnRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLFxuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uIGFzIE5vdGlmaWNhdGlvblBlcm1pc3Npb24sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1Blcm1pc28gZGUgbm90aWZpY2FjaW9uZXMgZGVuZWdhZG8nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIE9idGVuZXIgdG9rZW4gRkNNXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcblxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIENvbmZpZ3VyYXIgbGlzdGVuZXIgZGUgbWVuc2FqZXNcbiAgICAgICAgdGhpcy5zZXR1cE1lc3NhZ2VMaXN0ZW5lcigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNvbGljaXRhbmRvIHBlcm1pc28gZGUgbm90aWZpY2FjaW9uZXM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdWpvIGNvbXBsZXRvIGRlIGFjdGl2YWNpw7NuIGRlIHB1c2gsIHJvYnVzdG8sIGNyb3NzLWFwcC5cbiAgICpcbiAgICogT3JxdWVzdGE6IHBlZGlyIHBlcm1pc28g4oaSIFNXIHJlYWR5IOKGkiBvYnRlbmVyIHRva2VuIEZDTSDihpIgKG9wY2lvbmFsKVxuICAgKiByZWdpc3RyYXIgZWwgZGV2aWNlIGVuIGJhY2tlbmQuIEVzIGVsIHB1bnRvIGRlIG9ycXVlc3RhY2nDs24gw7puaWNvIHF1ZSBjYWRhXG4gICAqIGFwcCBkZWwgZmFjdG9yeSBjb25zdW1lIOKAlCBsYSBsw7NnaWNhIGRlIHJvYnVzdGV6IHZpdmUgYXF1w60sIG5vIGVuIGNhZGEgcMOhZ2luYS5cbiAgICpcbiAgICogKipXYXRjaGRvZyBkZSBhdXRvLXJlbG9hZC4qKiBFbCBmbHVqbyBhIHZlY2VzIHNlIGN1ZWxnYSBBTlRFUyBkZSBgZ2V0VG9rZW4oKWBcbiAgICogKGVqLiBgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKClgIHF1ZSBubyBtdWVzdHJhIGVsIHBvcHVwIGVuIHVuIGNvbGRcbiAgICogbG9hZCkg4oCUIGVsIHRpbWVvdXQgaW50ZXJubyBkZSBgZ2V0VG9rZW4oKWAgbm8gY3VicmUgZXNlIGNhc28uIFBvciBlc29cbiAgICogYGVuYWJsZSgpYCBlbnZ1ZWx2ZSBlbCBmbHVqbyBlbnRlcm8gZW4gdW4gd2F0Y2hkb2c6IHNpIG5vIGFsY2FuemEgdW4gZXN0YWRvXG4gICAqIHRlcm1pbmFsIGVuIGBFTkFCTEVfV0FUQ0hET0dfTVNgICgxNXMpOlxuICAgKiAgLSAxwqogdmV6IGVuIGxhIHNlc2nDs24g4oaSIG1hcmNhIHVuIGZsYWcgZW4gYHNlc3Npb25TdG9yYWdlYCB5IGhhY2VcbiAgICogICAgYHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKWAgKHVuIGZyZXNoIGxvYWQgc3VlbGUgdGVuZXIgZWwgU1cgYWN0aXZvKS5cbiAgICogICAgUmVzdWVsdmUgY29uIGB7IHN0YXR1czogJ3RpbWVvdXQnLCByZWxvYWRlZDogdHJ1ZSB9YC5cbiAgICogIC0geWEgc2UgYXV0by1yZWNhcmfDsyBhbnRlcyDihpIgTk8gcmVjYXJnYSAoYW50aS1sb29wKTogbGltcGlhIGVsIGZsYWcgeVxuICAgKiAgICByZXN1ZWx2ZSBjb24gYHsgc3RhdHVzOiAndGltZW91dCcsIHJlbG9hZGVkOiBmYWxzZSB9YCBwYXJhIHF1ZSBsYSBhcHBcbiAgICogICAgbXVlc3RyZSB1biBlcnJvci5cbiAgICpcbiAgICogTk8gaGFjZSB0aHJvdyDigJQgc2llbXByZSByZXN1ZWx2ZSBjb24gdW4gYEVuYWJsZVB1c2hSZXN1bHRgIGRlc2NyaXB0aXZvIHF1ZVxuICAgKiBsYSBww6FnaW5hIGNvbnN1bWlkb3JhIGluc3BlY2Npb25hIHBhcmEgZGVjaWRpciBxdcOpIHRvYXN0IG1vc3RyYXIuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZ2lzdGVyRGV2aWNlIENhbGxiYWNrIG9wY2lvbmFsIHF1ZSByZWdpc3RyYSBlbCBkZXZpY2UgZW5cbiAgICogICBlbCBiYWNrZW5kICh2aXZlIGVuIGBBdXRoU2VydmljZWAg4oCUIHNlIHBhc2EgY29tbyBjYWxsYmFjayBwYXJhIGV2aXRhciBlbFxuICAgKiAgIGNpY2xvIGRlIERJIEF1dGhTZXJ2aWNlIOKGlCBNZXNzYWdpbmdTZXJ2aWNlKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBtZXNzYWdpbmcuZW5hYmxlKHtcbiAgICogICByZWdpc3RlckRldmljZTogKHRva2VuKSA9PiBhdXRoLnJlZ2lzdGVyRGV2aWNlKHRva2VuKS50aGVuKHIgPT4gci5yZWdpc3RlcmVkKSxcbiAgICogfSk7XG4gICAqIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZW5hYmxlZCcpIHtcbiAgICogICAvLyByZXN1bHQudG9rZW4gZGlzcG9uaWJsZSDigJQgcHVzaCBhY3Rpdm9cbiAgICogfSBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSAndGltZW91dCcgJiYgIXJlc3VsdC5yZWxvYWRlZCkge1xuICAgKiAgIC8vIG1vc3RyYXIgZXJyb3I6IGVsIGZsdWpvIHNlIGNvbGfDsyB5IHlhIHNlIGNvbnN1bWnDsyBlbCBhdXRvLXJlbG9hZFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlKG9wdGlvbnM6IEVuYWJsZVB1c2hPcHRpb25zID0ge30pOiBQcm9taXNlPEVuYWJsZVB1c2hSZXN1bHQ+IHtcbiAgICBjb25zb2xlLmxvZygnW01lc3NhZ2luZ10gZW5hYmxlKCkgc3RhcnQnKTtcblxuICAgIGxldCB3YXRjaGRvZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBFbCB3YXRjaGRvZyBjb3JyZSBlbiBwYXJhbGVsbyBhbCBmbHVqbyByZWFsLiBMbyBxdWUgZ2FuZSBlbCByYWNlIGRlZmluZVxuICAgIC8vIGVsIHJlc3VsdGFkby4gRWwgZmx1am8gcmVhbCwgc2kgZ2FuYSwgbGltcGlhIGVsIHdhdGNoZG9nIGVuIGVsIGBmaW5hbGx5YC5cbiAgICBjb25zdCB3YXRjaGRvZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTxFbmFibGVQdXNoUmVzdWx0PihyZXNvbHZlID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuOyAvLyBTU1Ig4oCUIHNpbiB3YXRjaGRvZy5cbiAgICAgIHdhdGNoZG9nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdhdGNoZG9nID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zb2xlLndhcm4oYFtNZXNzYWdpbmddIGVuYWJsZSgpIGNvbGdhZG8gPiR7dGhpcy5FTkFCTEVfV0FUQ0hET0dfTVN9bXMg4oCUIHdhdGNoZG9nYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQXV0b1JlbG9hZGVkKCkpIHtcbiAgICAgICAgICAvLyBBbnRpLWxvb3A6IHlhIHJlY2FyZ2Ftb3MgdW5hIHZleiBlc3RhIHNlc2nDs24geSB2b2x2acOzIGEgY29sZ2FyLlxuICAgICAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gYXV0by1yZWxvYWQgeWEgY29uc3VtaWRvIOKAlCBubyBzZSByZWNhcmdhIGRlIG51ZXZvJyk7XG4gICAgICAgICAgdGhpcy5jbGVhckF1dG9SZWxvYWRGbGFnKCk7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBzdGF0dXM6ICd0aW1lb3V0JyxcbiAgICAgICAgICAgIHJlbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogYEZsdWpvIGRlIGFjdGl2YWNpw7NuIGNvbGdhZG8gPiR7dGhpcy5FTkFCTEVfV0FUQ0hET0dfTVMgLyAxMDAwfXNgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDHCqiB2ZXo6IG1hcmNhciB5IHJlY2FyZ2FyLiBVbiBmcmVzaCBsb2FkIHN1ZWxlIHRlbmVyIGVsIFNXIGFjdGl2by5cbiAgICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBhdXRvLXJlY2FyZ2FuZG8gbGEgcMOhZ2luYSAoMS8xIHBvciBzZXNpw7NuKScpO1xuICAgICAgICB0aGlzLm1hcmtBdXRvUmVsb2FkZWQoKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgc3RhdHVzOiAndGltZW91dCcsXG4gICAgICAgICAgcmVsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiAnQXV0by1yZWNhcmdhbmRvIHBhcmEgcmVpbnRlbnRhciBsYSBhY3RpdmFjacOzbicsXG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LCB0aGlzLkVOQUJMRV9XQVRDSERPR19NUyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmbG93ID0gdGhpcy5ydW5FbmFibGVGbG93KG9wdGlvbnMpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHdhdGNoZG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHdhdGNoZG9nKTtcbiAgICAgICAgd2F0Y2hkb2cgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtmbG93LCB3YXRjaGRvZ1Byb21pc2VdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVqbyByZWFsIGRlIGFjdGl2YWNpw7NuLCBzaW4gZWwgd2F0Y2hkb2cgKGxvIGVudnVlbHZlIGBlbmFibGUoKWApLlxuICAgKiBSZXN1ZWx2ZSBzaWVtcHJlIGNvbiB1biBgRW5hYmxlUHVzaFJlc3VsdGAg4oCUIG5vIGhhY2UgdGhyb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuYWJsZUZsb3cob3B0aW9uczogRW5hYmxlUHVzaE9wdGlvbnMpOiBQcm9taXNlPEVuYWJsZVB1c2hSZXN1bHQ+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tNZXNzYWdpbmddIGVuYWJsZTogRkNNIG5vIHNvcG9ydGFkbycpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiAndW5zdXBwb3J0ZWQnLCByZWFzb246ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBwZXJtaXNzaW9uIOKGkiBTVyByZWFkeSDihpIgZ2V0VG9rZW4gKHJlcXVlc3RQZXJtaXNzaW9uIGVuY2FkZW5hIGxhcyAzKS5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbigpO1xuXG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIC8vIHJlcXVlc3RQZXJtaXNzaW9uIGRldnVlbHZlIG51bGwgdGFudG8gcG9yIHBlcm1pc28gZGVuZWdhZG8gY29tbyBwb3JcbiAgICAgICAgLy8gZmFsbG8gYWwgb2J0ZW5lciBlbCB0b2tlbi4gRGlzdGl2ZHNtb3MgcG9yIGVsIGVzdGFkbyBkZWwgcGVybWlzby5cbiAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uID09PSAnZGVuaWVkJyB8fCBwZXJtaXNzaW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICdkZW5pZWQnLCByZWFzb246ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIGRlbmVnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogJ2Vycm9yJywgcmVhc29uOiAnTm8gc2UgcHVkbyBvYnRlbmVyIGVsIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cm8gZGUgZGV2aWNlIGVuIGJhY2tlbmQgKG9wY2lvbmFsIOKAlCBlbCBjYWxsZXIgcGFzYSBlbCBjYWxsYmFjaykuXG4gICAgICBpZiAob3B0aW9ucy5yZWdpc3RlckRldmljZSkge1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgb3B0aW9ucy5yZWdpc3RlckRldmljZSh0b2tlbik7XG4gICAgICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogJ2Vycm9yJywgdG9rZW4sIHJlYXNvbjogJ05vIHNlIHB1ZG8gcmVnaXN0cmFyIGVsIGRpc3Bvc2l0aXZvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIMOJeGl0bzogZXN0YWRvIHRlcm1pbmFsLiBMaW1waWFyIGVsIGZsYWcgYW50aS1sb29wIHBhcmEgZnV0dXJvcyBpbnRlbnRvcy5cbiAgICAgIHRoaXMuY2xlYXJBdXRvUmVsb2FkRmxhZygpO1xuICAgICAgY29uc29sZS5sb2coJ1tNZXNzYWdpbmddIGVuYWJsZSgpIHN1Y2Nlc3MnKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogJ2VuYWJsZWQnLCB0b2tlbiB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNZXNzYWdpbmddIGVuYWJsZSgpIGVycm9yOicsIHJlYXNvbiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiAnZXJyb3InLCByZWFzb24gfTtcbiAgICB9XG4gIH1cblxuICAvKiogVHJ1ZSBzaSB5YSBzZSBhdXRvLXJlY2FyZ8OzIHVuYSB2ZXogZW4gZXN0YSBzZXNpw7NuLiAqL1xuICBwcml2YXRlIGhhc0F1dG9SZWxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5BVVRPUkVMT0FEX0ZMQUcpID09PSAnMSc7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBzZXNzaW9uU3RvcmFnZSBwdWVkZSBubyBlc3RhciBkaXNwb25pYmxlIChtb2RvIHByaXZhZG8gZXN0cmljdG8sIFNTUikuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1hcmNhIHF1ZSBzZSBjb25zdW1pw7MgZWwgYXV0by1yZWxvYWQgZGUgZXN0YSBzZXNpw7NuLiAqL1xuICBwcml2YXRlIG1hcmtBdXRvUmVsb2FkZWQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5BVVRPUkVMT0FEX0ZMQUcsICcxJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzZXNzaW9uU3RvcmFnZSBubyBkaXNwb25pYmxlIOKAlCBiZXN0LWVmZm9ydC4gKi9cbiAgICB9XG4gIH1cblxuICAvKiogTGltcGlhIGVsIGZsYWcgYW50aS1sb29wIOKAlCB0cmFzIHVuIMOpeGl0byBvIHVuIGZhbGxvIGRlZmluaXRpdm8uICovXG4gIHByaXZhdGUgY2xlYXJBdXRvUmVsb2FkRmxhZygpOiB2b2lkIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkFVVE9SRUxPQURfRkxBRyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzZXNzaW9uU3RvcmFnZSBubyBkaXNwb25pYmxlIOKAlCBuYWRhIHF1ZSBsaW1waWFyLiAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHRva2VuIEZDTSBhY3R1YWwgKHNpbiBzb2xpY2l0YXIgcGVybWlzbykuXG4gICAqXG4gICAqIEByZXR1cm5zIFRva2VuIEZDTSBzaSBlc3TDoSBkaXNwb25pYmxlLCBudWxsIHNpIG5vXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCBtZXNzYWdpbmcuZ2V0VG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zb2xlLmxvZygnW01lc3NhZ2luZ10gZ2V0VG9rZW4oKSBzdGFydCcpO1xuICAgIGNvbnN0IG1lc3NhZ2luZyA9IGF3YWl0IHRoaXMuZ2V0TWVzc2FnaW5nSW5zdGFuY2UoKTtcbiAgICBpZiAoIW1lc3NhZ2luZykge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBnZXRUb2tlbiBhYm9ydGVkOiBubyBNZXNzYWdpbmcgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcGlkS2V5ID0gdGhpcy5jb25maWcubWVzc2FnaW5nVmFwaWRLZXk7XG4gICAgaWYgKCF2YXBpZEtleSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW01lc3NhZ2luZ10gVkFQSUQga2V5IG5vIGNvbmZpZ3VyYWRhIChjb25maWcubWVzc2FnaW5nVmFwaWRLZXkpLiBGQ00gbm8gZnVuY2lvbmFyw6EuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXV0aWxpemFyIGVsIFNXIHlhIHJlZ2lzdHJhZG8gKGVuIGNvbmZpZy50cyBkdXJhbnRlIGVsIGJvb3RzdHJhcCkgZW5cbiAgICAgIC8vIGx1Z2FyIGRlIHJlLXJlZ2lzdHJhcmxvIGVuIGNhZGEgbGxhbWFkYSDigJQgcmUtcmVnaXN0cmFyIGRpc3BhcmFcbiAgICAgIC8vIHJldmFsaWRhY2lvbmVzIGRlbCBTVyBlbiBpT1MgUFdBLiBTb2xvIHJlZ2lzdHJhbW9zIHNpIG5vIGV4aXN0ZSBhw7puLlxuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZXNvbHZlU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbigpO1xuICAgICAgY29uc29sZS5sb2coJ1tNZXNzYWdpbmddIFNXIHJlc29sdmVkLCB3YWl0aW5nIHJlYWR5Li4uJyk7XG4gICAgICAvLyBFc3BlcmFyIGEgcXVlIGVsIFNXIGVzdMOpIGFjdGl2bywgY29uIHRpbWVvdXQ6IGBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeWBcbiAgICAgIC8vIHB1ZWRlIG5vIHJlc29sdmVyIE5VTkNBIGVuIHVuIGNvbGQgbG9hZCAoU1cgYcO6biBubyBhY3RpdmFkbykg4oaSIHNpbiBlbFxuICAgICAgLy8gdGltZW91dCBgZ2V0VG9rZW4oKWAgc2UgY3VlbGdhIGluZGVmaW5pZGFtZW50ZS4gQ29uIGVsIHJhY2UsIHNpIGVsIFNXIG5vXG4gICAgICAvLyBxdWVkYSBsaXN0byBlbiBTV19SRUFEWV9USU1FT1VUX01TLCBlc3RhIHByb21lc2EgcmVjaGF6YSBsaW1waW8uXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTZXJ2aWNlV29ya2VyUmVhZHkoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdbTWVzc2FnaW5nXSBTVyByZWFkeSwgY2FsbGluZyBGaXJlYmFzZSBnZXRUb2tlbigpLi4uJyk7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0VG9rZW4obWVzc2FnaW5nLCB7XG4gICAgICAgIHZhcGlkS2V5LFxuICAgICAgICBzZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uOiByZWdpc3RyYXRpb24sXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdbTWVzc2FnaW5nXSBGaXJlYmFzZSBnZXRUb2tlbiByZXR1cm5lZDonLFxuICAgICAgICB0b2tlbiA/IGAke3Rva2VuLnNsaWNlKDAsIDE2KX3igKZgIDogJ251bGwvZW1wdHknXG4gICAgICApO1xuXG4gICAgICB0aGlzLnN0YXRlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgLi4udGhpcy5zdGF0ZVN1YmplY3QudmFsdWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFBlcnNpc3RpciBlbCB0b2tlbiBwYXJhIGhpZHJhdGFyIGVsIGVzdGFkbyBlbiBmdXR1cm9zIGNvbGQgc3RhcnRzLlxuICAgICAgdGhpcy5wZXJzaXN0VG9rZW4odG9rZW4pO1xuXG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE5vIHRyYWdhbW9zIGxhIGNhdXNhOiBsb2d1ZWFtb3MgZWwgZGV0YWxsZSBwYXJhIGRpYWduw7NzdGljby4gTGEgZmlybWFcbiAgICAgIC8vIHNpZ3VlIHNpZW5kbyBQcm9taXNlPHN0cmluZyB8IG51bGw+IHBhcmEgbm8gcm9tcGVyIGNhbGxlcnMuXG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNZXNzYWdpbmddIGdldFRva2VuIGVycm9yOicsIHJlYXNvbiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VlbHZlIGVsIGBTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uYCBkZWwgU1cgZGUgRkNNLlxuICAgKlxuICAgKiBFbCBTVyBgL2ZpcmViYXNlLW1lc3NhZ2luZy1zdy5qc2AgeWEgc2UgcmVnaXN0cmEgdW5hIHZleiBlbiBlbCBib290c3RyYXAgZGVcbiAgICogbGEgYXBwIChgY29uZmlnLnRzYCkuIFJldXRpbGl6YW1vcyBlc2UgcmVnaXN0cm8gZW4gbHVnYXIgZGUgcmUtcmVnaXN0cmFybG9cbiAgICogZW4gY2FkYSBgZ2V0VG9rZW4oKWAg4oCUIHJlLXJlZ2lzdHJhciByZXBldGlkYW1lbnRlIGRpc3BhcmEgcmV2YWxpZGFjaW9uZXMgZGVsXG4gICAqIFNXIGVuIGlPUyBQV0EuIFNvbG8gcmVnaXN0cmFtb3MgY29tbyBmYWxsYmFjayBzaSB0b2RhdsOtYSBubyBleGlzdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKCk6IFByb21pc2U8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9uKCcvZmlyZWJhc2UtbWVzc2FnaW5nLXN3LmpzJyk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gU1cgbm90IHJlZ2lzdGVyZWQgeWV0LCByZWdpc3RlcmluZyBhcyBmYWxsYmFjaycpO1xuICAgIHJldHVybiBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWdpc3RlcignL2ZpcmViYXNlLW1lc3NhZ2luZy1zdy5qcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzcGVyYSBhIHF1ZSBlbCBTZXJ2aWNlIFdvcmtlciBxdWVkZSBhY3Rpdm8gKGBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeWApXG4gICAqIHBlcm8gY29uIHVuIHRpbWVvdXQgZHVyby5cbiAgICpcbiAgICogYG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5YCByZXN1ZWx2ZSBjdWFuZG8gaGF5IHVuIFNXICphY3Rpdm8qLiBFbiB1blxuICAgKiBjb2xkIGxvYWQgKHByaW1lcmEgdmlzaXRhLCBTVyByZWNpw6luIHJlZ2lzdHJhZG8sIGlPUyBQV0EgcmVjacOpbiBhYmllcnRhKSBlbFxuICAgKiBTVyBwdWVkZSBxdWVkYXIgZW4gZXN0YWRvIGBpbnN0YWxsaW5nYC9gd2FpdGluZ2AgeSBgcmVhZHlgIG5vIHJlc29sdmVyIG51bmNhXG4gICAqIOKGkiBgZ2V0VG9rZW4oKWAgc2UgY3VlbGdhLiBFbCBgUHJvbWlzZS5yYWNlYCBjb250cmEgdW4gYHNldFRpbWVvdXRgIGdhcmFudGl6YVxuICAgKiBxdWUgZXN0YSBlc3BlcmEgdGVybWluYTogbyBnYW5hIGByZWFkeWAgKGNhc28gbm9ybWFsKSBvIGdhbmEgZWwgdGltZW91dCB5XG4gICAqIGxhbnphbW9zIHVuIGVycm9yIGNsYXJvIHBhcmEgcXVlIGBnZXRUb2tlbigpYCByZWNoYWNlIGVuIHZleiBkZSBjb2xnYXJzZS5cbiAgICpcbiAgICogRWwgdGltZXIgc2UgbGltcGlhIGVuIGFtYmFzIHJhbWFzIHBhcmEgbm8gZGVqYXIgdGltZXJzIGNvbGdhbmRvLlxuICAgKi9cbiAgcHJpdmF0ZSB3YWl0Rm9yU2VydmljZVdvcmtlclJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWFkeSA9IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5LnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgW01lc3NhZ2luZ10gc2VydmljZSB3b3JrZXIgbm8gcXVlZMOzIGxpc3RvIGVuICR7dGhpcy5TV19SRUFEWV9USU1FT1VUX01TIC8gMTAwMH1zYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0sIHRoaXMuU1dfUkVBRFlfVElNRU9VVF9NUyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtyZWFkeSwgdGltZW91dF0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGUgZWwgdG9rZW4gRkNNIGVuIGxvY2FsU3RvcmFnZSAobyBsbyBsaW1waWEgc2kgZXMgbnVsbC9lbXB0eSkuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RUb2tlbih0b2tlbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSwgdG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSB0b2tlbiBwZXJzaXN0ZW5jZSBmYWlsZWQ6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZHJhdGEgZWwgZXN0YWRvIGRlbCB0b2tlbiBkZXNkZSBsb2NhbFN0b3JhZ2UgZW4gZWwgYXJyYW5xdWUgZGVsIHNlcnZpY2lvLlxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlVG9rZW5Gcm9tU3RvcmFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHRoaXMuc2V0VG9rZW5Gcm9tU3RvcmFnZShjYWNoZWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gdG9rZW4gaHlkcmF0aW9uIGZhaWxlZDonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCB0b2tlbiBGQ00gYWN0dWFsICh1bnN1YnNjcmliZSBkZSBub3RpZmljYWNpb25lcykuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgbWVzc2FnaW5nLmRlbGV0ZVRva2VuKCk7XG4gICAqIGNvbnNvbGUubG9nKCdUb2tlbiBlbGltaW5hZG8sIG5vIHJlY2liaXLDoSBtw6FzIG5vdGlmaWNhY2lvbmVzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWVzc2FnaW5nID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdpbmdJbnN0YW5jZSgpO1xuICAgIGlmICghbWVzc2FnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRlbGV0ZVRva2VuKG1lc3NhZ2luZyk7XG5cbiAgICAgIHRoaXMuc3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICAuLi50aGlzLnN0YXRlU3ViamVjdC52YWx1ZSxcbiAgICAgICAgdG9rZW46IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgLy8gTGltcGlhciBlbCB0b2tlbiBwZXJzaXN0aWRvIOKAlCB5YSBubyBlc3RhbW9zIHN1c2NyaXRvcy5cbiAgICAgIHRoaXMucGVyc2lzdFRva2VuKG51bGwpO1xuXG4gICAgICAvLyBMaW1waWFyIGxpc3RlbmVyIGRlIG1lbnNhamVzXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZU9uTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlT25NZXNzYWdlKCk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVPbk1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGVsaW1pbmFuZG8gdG9rZW4gRkNNOicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgcHVkbyBlbGltaW5hciBlbCB0b2tlbiBkZSBub3RpZmljYWNpb25lcycpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRU5TQUpFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBkZSBtZW5zYWplcyByZWNpYmlkb3MgZW4gZm9yZWdyb3VuZC5cbiAgICpcbiAgICogSU1QT1JUQU5URTogTG9zIG1lbnNhamVzIGVuIGJhY2tncm91bmQgc29uIG1hbmVqYWRvcyBwb3IgZWwgU2VydmljZSBXb3JrZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIGN1YW5kbyBsbGVnYSB1biBtZW5zYWplIGVuIGZvcmVncm91bmRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBtZXNzYWdpbmcub25NZXNzYWdlKCkuc3Vic2NyaWJlKHBheWxvYWQgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdNZW5zYWplIHJlY2liaWRvOicsIHBheWxvYWQpO1xuICAgKiAgIC8vIE1vc3RyYXIgbm90aWZpY2FjacOzbiBjdXN0b20gbyBhY3R1YWxpemFyIFVJXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uTWVzc2FnZSgpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgZWwgbGlzdGVuZXIgZGUgbWVuc2FqZXMgZW4gZm9yZWdyb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cE1lc3NhZ2VMaXN0ZW5lcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXNzYWdpbmcgPSBhd2FpdCB0aGlzLmdldE1lc3NhZ2luZ0luc3RhbmNlKCk7XG4gICAgaWYgKCFtZXNzYWdpbmcgfHwgdGhpcy51bnN1YnNjcmliZU9uTWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmVPbk1lc3NhZ2UgPSBvbk1lc3NhZ2UobWVzc2FnaW5nLCBwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUGF5bG9hZCA9IHtcbiAgICAgICAgdGl0bGU6IHBheWxvYWQubm90aWZpY2F0aW9uPy50aXRsZSxcbiAgICAgICAgYm9keTogcGF5bG9hZC5ub3RpZmljYXRpb24/LmJvZHksXG4gICAgICAgIGltYWdlOiBwYXlsb2FkLm5vdGlmaWNhdGlvbj8uaW1hZ2UsXG4gICAgICAgIGRhdGE6IHBheWxvYWQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBtZXNzYWdlSWQ6IHBheWxvYWQubWVzc2FnZUlkLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5tZXNzYWdlU3ViamVjdC5uZXh0KG5vdGlmaWNhdGlvbik7XG5cbiAgICAgIC8vIFBlcnNpc3RpciBlbiBsb2NhbFN0b3JhZ2UgcGFyYSBkZWJ1Z2dpbmcgc2kgZXN0w6EgaGFiaWxpdGFkb1xuICAgICAgaWYgKHRoaXMuZGVidWdQZXJzaXN0ZW5jZSkge1xuICAgICAgICB0aGlzLnBlcnNpc3RNZXNzYWdlRm9yRGVidWcobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0ZSB1biBtZW5zYWplIEZDTSBlbiBsb2NhbFN0b3JhZ2UgcGFyYSBkZWJ1Z2dpbmcuXG4gICAqIFNvbG8gc2UgdXNhIGN1YW5kbyBkZWJ1Z01lc3NhZ2VQZXJzaXN0ZW5jZSBlc3TDoSBoYWJpbGl0YWRvLlxuICAgKiBNYW50aWVuZSBsb3Mgw7psdGltb3MgNTAgbWVuc2FqZXMuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RNZXNzYWdlRm9yRGVidWcobWVzc2FnZTogTm90aWZpY2F0aW9uUGF5bG9hZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkRFQlVHX1NUT1JBR0VfS0VZKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogW107XG4gICAgICBtZXNzYWdlcy51bnNoaWZ0KHsgLi4ubWVzc2FnZSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pO1xuICAgICAgLy8gTWFudGVuZXIgc29sbyDDumx0aW1vcyA1MFxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5ERUJVR19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMuc2xpY2UoMCwgNTApKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBEZWJ1ZyBwZXJzaXN0ZW5jZSBmYWlsZWQ6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBZIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgZXN0YWRvIGFjdHVhbCBkZWwgcGVybWlzbyBkZSBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogQHJldHVybnMgJ2dyYW50ZWQnIHwgJ2RlbmllZCcgfCAnZGVmYXVsdCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwZXJtaXNzaW9uID0gbWVzc2FnaW5nLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgKiBpZiAocGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSB7XG4gICAqICAgLy8gWWEgdGllbmUgcGVybWlzb1xuICAgKiB9IGVsc2UgaWYgKHBlcm1pc3Npb24gPT09ICdkZWZhdWx0Jykge1xuICAgKiAgIC8vIFB1ZWRlIHNvbGljaXRhciBwZXJtaXNvXG4gICAqIH0gZWxzZSB7XG4gICAqICAgLy8gRGVuZWdhZG8sIGRlYmUgaGFiaWxpdGFyIG1hbnVhbG1lbnRlXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRQZXJtaXNzaW9uU3RhdGUoKTogTm90aWZpY2F0aW9uUGVybWlzc2lvbiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJ2RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHtcbiAgICAgIHJldHVybiAnZGVuaWVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gYXMgTm90aWZpY2F0aW9uUGVybWlzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBGQ00gZXN0w6Egc29wb3J0YWRvIGVuIGVsIG5hdmVnYWRvciBhY3R1YWwuXG4gICAqIFVzYSBsw7NnaWNhIGludGVsaWdlbnRlIHBhcmEgZXZpdGFyIGZhbHNvcyBuZWdhdGl2b3MgcG9yIHRpbWluZyBkZWwgSW5qZWN0b3IuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgc2kgRkNNIGVzdMOhIHNvcG9ydGFkb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChhd2FpdCBtZXNzYWdpbmcuaXNTdXBwb3J0ZWQoKSkge1xuICAgKiAgIC8vIFB1ZWRlIHVzYXIgbm90aWZpY2FjaW9uZXMgcHVzaFxuICAgKiB9IGVsc2Uge1xuICAgKiAgIC8vIE5hdmVnYWRvciBubyBzb3BvcnRhIG8gbm8gdGllbmUgU2VydmljZSBXb3JrZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzU3VwcG9ydGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNpIHlhIHRlbmVtb3MgdG9rZW4gZW4gZXN0YWRvLCBjbGFyYW1lbnRlIEZDTSBmdW5jaW9uYVxuICAgIGlmICh0aGlzLnN0YXRlU3ViamVjdC52YWx1ZS50b2tlbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU2kgeWEgY2FsY3VsYW1vcyBzb3BvcnRlIGV4aXRvc2FtZW50ZSwgdXNhcmxvXG4gICAgaWYgKHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYWNpb25lcyBiw6FzaWNhcyDigJQgQVBJcyBkZWwgYnJvd3NlclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoISgnTm90aWZpY2F0aW9uJyBpbiB3aW5kb3cpIHx8ICEoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpT1Mg4oCUIHNvbG8gc29wb3J0YSBwdXNoIHdlYiBjdWFuZG8gbGEgUFdBIGVzdMOhIGluc3RhbGFkYSBlbiBob21lIHNjcmVlblxuICAgIC8vIChpT1MgMTYuNCspLiBFZGdlL0Nocm9tZS9GaXJlZm94IGVuIGlPUyBjb21wYXJ0ZW4gZXN0YSBsaW1pdGFjacOzbiBwb3JxdWVcbiAgICAvLyBlc3TDoW4gb2JsaWdhZG9zIGEgdXNhciBXZWJLaXQuIFJldG9ybmFtb3MgZmFsc2UgYXF1w60gcGFyYSBxdWUgbGEgVUkgbXVlc3RyZVxuICAgIC8vIGVsIGZsdWpvIFwiaW5zdGFsYSBsYSBhcHBcIiBlbiBsdWdhciBkZSB1biBDVEEgcXVlIHZhIGEgZmFsbGFyLlxuICAgIGlmICh0aGlzLmlzSU9TV2l0aG91dFN0YW5kYWxvbmUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE5PVEE6IGRlbGliZXJhZGFtZW50ZSBOTyBjaGVxdWVhbW9zIGBnZXRNZXNzYWdpbmdJbnN0YW5jZSgpYCBhcXXDrSBwb3JxdWVcbiAgICAvLyBlbCBmYWN0b3J5IGBwcm92aWRlTWVzc2FnaW5nKCgpID0+IGdldE1lc3NhZ2luZygpKWAgZXMgbGF6eSBlbiBBbmd1bGFyXG4gICAgLy8gRmlyZSB5IHB1ZWRlIG5vIGVzdGFyIHJlc3VlbHRvIGN1YW5kbyBlc3RhIGZ1bmNpw7NuIHNlIGxsYW1hIHRlbXByYW5vXG4gICAgLy8gZW4gZWwgY2ljbG8gZGUgdmlkYS4gRXNvIGNhdXNhYmEgZmFsc29zIG5lZ2F0aXZvcy4gU2kgRkNNIHJlYWxtZW50ZSBub1xuICAgIC8vIGVzdMOhIGRpc3BvbmlibGUgKHByb3llY3RvIHNpbiBNZXNzYWdpbmcgaGFiaWxpdGFkbywgVkFQSUQgaW52w6FsaWRvKSwgZWxcbiAgICAvLyBmbG93IGRvd25zdHJlYW0gKGBnZXRUb2tlbmAvYHJlcXVlc3RQZXJtaXNzaW9uYCkgZmFsbGFyw6EgY29uIGVycm9yIHJlYWwsXG4gICAgLy8gcXVlIGVzIG1lam9yIFVYIHF1ZSB1biBcIm5vIHNvcG9ydGFkb1wiIHByZW1hdHVyby5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpT1Mgc2luIGVzdGFyIGluc3RhbGFkbyBjb21vIFBXQSBzdGFuZGFsb25lIOKAlCBwdXNoIHdlYiBubyBkaXNwb25pYmxlLlxuICAgKiBBcGxpY2EgYSBTYWZhcmkgeSBhIEVkZ2UvQ2hyb21lL0ZpcmVmb3ggZW4gaU9TICh0b2RvcyBXZWJLaXQgcG9yIG1hbmRhdG8gQXBwbGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0lPU1dpdGhvdXRTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHVhID0gKG5hdmlnYXRvciBhcyBOYXZpZ2F0b3IpLnVzZXJBZ2VudCB8fCAnJztcbiAgICBjb25zdCBpc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVhKTtcbiAgICBpZiAoIWlzSU9TKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaXNTdGFuZGFsb25lID1cbiAgICAgIHdpbmRvdy5tYXRjaE1lZGlhPy4oJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykubWF0Y2hlcyB8fFxuICAgICAgKG5hdmlnYXRvciBhcyB1bmtub3duIGFzIHsgc3RhbmRhbG9uZT86IGJvb2xlYW4gfSkuc3RhbmRhbG9uZSA9PT0gdHJ1ZTtcbiAgICByZXR1cm4gIWlzU3RhbmRhbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHRva2VuIGFjdHVhbCBzaW4gaGFjZXIgcmVxdWVzdC5cbiAgICpcbiAgICogQHJldHVybnMgVG9rZW4gYWxtYWNlbmFkbyBvIG51bGxcbiAgICovXG4gIGdldCBjdXJyZW50VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLnRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgZGVsIGVzdGFkbyBjb21wbGV0byBkZWwgc2VydmljaW8gZGUgbWVzc2FnaW5nLlxuICAgKi9cbiAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPE1lc3NhZ2luZ1N0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8geWEgb3RvcmfDsyBwZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzLlxuICAgKi9cbiAgZ2V0IGhhc1Blcm1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLnBlcm1pc3Npb24gPT09ICdncmFudGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRyYXRhIGVsIGVzdGFkbyBkZWwgdG9rZW4gZGVzZGUgdW4gdmFsb3IgZXh0ZXJubyAoZWo6IGxvY2FsU3RvcmFnZSkuXG4gICAqIMOadGlsIGN1YW5kbyBlbCB0b2tlbiB5YSBleGlzdGUgcGVybyBlbCBNZXNzYWdpbmdTZXJ2aWNlIG5vIGxvIHRpZW5lIGVuIG1lbW9yaWEuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiBUb2tlbiBGQ00gYSBzZXRlYXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdG9yZWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmY21fdG9rZW4nKTtcbiAgICogaWYgKHN0b3JlZFRva2VuKSB7XG4gICAqICAgbWVzc2FnaW5nLnNldFRva2VuRnJvbVN0b3JhZ2Uoc3RvcmVkVG9rZW4pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0VG9rZW5Gcm9tU3RvcmFnZSh0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dCh7XG4gICAgICAuLi50aGlzLnN0YXRlU3ViamVjdC52YWx1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgaXNTdXBwb3J0ZWQ6IHRydWUsIC8vIFNpIGhheSB0b2tlbiwgY2xhcmFtZW50ZSBGQ00gZnVuY2lvbmFcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBERUVQIExJTktJTkcgLyBOQVZFR0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBkZSBjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMuXG4gICAqXG4gICAqIEVtaXRlIGN1YW5kbyBlbCB1c3VhcmlvIGhhY2UgY2xpY2sgZW4gdW5hIG5vdGlmaWNhY2nDs24gKGZvcmVncm91bmQgbyBiYWNrZ3JvdW5kKS5cbiAgICogVXNhIGVzdGUgb2JzZXJ2YWJsZSBwYXJhIG5hdmVnYXIgYSBsYSBww6FnaW5hIGNvcnJlc3BvbmRpZW50ZS5cbiAgICpcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBxdWUgZW1pdGUgTm90aWZpY2F0aW9uQ2xpY2tFdmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBDb21wb25lbnQoey4uLn0pXG4gICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgKiAgIHByaXZhdGUgbWVzc2FnaW5nID0gaW5qZWN0KE1lc3NhZ2luZ1NlcnZpY2UpO1xuICAgKiAgIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAqICAgICB0aGlzLm1lc3NhZ2luZy5vbk5vdGlmaWNhdGlvbkNsaWNrKCkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICogICAgICAgaWYgKGV2ZW50LmFjdGlvbi5yb3V0ZSkge1xuICAgKiAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtldmVudC5hY3Rpb24ucm91dGVdLCB7XG4gICAqICAgICAgICAgICBxdWVyeVBhcmFtczogZXZlbnQuYWN0aW9uLnF1ZXJ5UGFyYW1zXG4gICAqICAgICAgICAgfSk7XG4gICAqICAgICAgIH1cbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG9uTm90aWZpY2F0aW9uQ2xpY2soKTogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25DbGlja0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uQ2xpY2tTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhZSBsYSBhY2Npw7NuIGRlIG5hdmVnYWNpw7NuIGRlIGxvcyBkYXRvcyBkZSB1bmEgbm90aWZpY2FjacOzbi5cbiAgICpcbiAgICogQnVzY2EgY2FtcG9zIGVzcGVjw61maWNvcyBlbiBlbCBwYXlsb2FkIGRlIGRhdG9zOlxuICAgKiAtIGByb3V0ZWA6IFJ1dGEgaW50ZXJuYSBkZSBsYSBhcHAgKGVqOiAnL29yZGVycy8xMjMnKVxuICAgKiAtIGB1cmxgOiBVUkwgZXh0ZXJuYSAoZWo6ICdodHRwczovL2V4YW1wbGUuY29tJylcbiAgICogLSBgYWN0aW9uX3R5cGVgOiBUaXBvIGRlIGFjY2nDs24gcGVyc29uYWxpemFkYVxuICAgKiAtIENhbXBvcyBjb24gcHJlZmlqbyBgYWN0aW9uX2A6IERhdG9zIGFkaWNpb25hbGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gRGF0b3MgZGVsIHBheWxvYWQgZGUgbGEgbm90aWZpY2FjacOzblxuICAgKiBAcmV0dXJucyBBY2Npw7NuIGRlIG5hdmVnYWNpw7NuIGV4dHJhw61kYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFBheWxvYWQgZGVzZGUgZWwgYmFja2VuZDpcbiAgICogLy8geyByb3V0ZTogJy9vcmRlcnMvMTIzJywgYWN0aW9uX3R5cGU6ICd2aWV3X29yZGVyJywgYWN0aW9uX29yZGVySWQ6ICcxMjMnIH1cbiAgICpcbiAgICogY29uc3QgYWN0aW9uID0gbWVzc2FnaW5nLmV4dHJhY3RBY3Rpb25Gcm9tRGF0YShub3RpZmljYXRpb24uZGF0YSk7XG4gICAqIC8vIHsgcm91dGU6ICcvb3JkZXJzLzEyMycsIGFjdGlvblR5cGU6ICd2aWV3X29yZGVyJywgYWN0aW9uRGF0YTogeyBvcmRlcklkOiAnMTIzJyB9IH1cbiAgICogYGBgXG4gICAqL1xuICBleHRyYWN0QWN0aW9uRnJvbURhdGEoZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBOb3RpZmljYXRpb25BY3Rpb24ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbjogTm90aWZpY2F0aW9uQWN0aW9uID0ge307XG5cbiAgICAvLyBSdXRhIGludGVybmFcbiAgICBpZiAoZGF0YVsncm91dGUnXSkge1xuICAgICAgYWN0aW9uLnJvdXRlID0gZGF0YVsncm91dGUnXTtcbiAgICB9XG5cbiAgICAvLyBVUkwgZXh0ZXJuYVxuICAgIGlmIChkYXRhWyd1cmwnXSkge1xuICAgICAgYWN0aW9uLnVybCA9IGRhdGFbJ3VybCddO1xuICAgIH1cblxuICAgIC8vIFRpcG8gZGUgYWNjacOzblxuICAgIGlmIChkYXRhWydhY3Rpb25fdHlwZSddKSB7XG4gICAgICBhY3Rpb24uYWN0aW9uVHlwZSA9IGRhdGFbJ2FjdGlvbl90eXBlJ107XG4gICAgfVxuXG4gICAgLy8gUXVlcnkgcGFyYW1zIChwdWVkZSB2ZW5pciBjb21vIEpTT04gc3RyaW5nKVxuICAgIGlmIChkYXRhWydxdWVyeV9wYXJhbXMnXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aW9uLnF1ZXJ5UGFyYW1zID0gSlNPTi5wYXJzZShkYXRhWydxdWVyeV9wYXJhbXMnXSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2kgbm8gZXMgSlNPTiB2w6FsaWRvLCBpbnRlbnRhciBwYXJzZWFyIGNvbW8ga2V5PXZhbHVlXG4gICAgICAgIGFjdGlvbi5xdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVN0cmluZyhkYXRhWydxdWVyeV9wYXJhbXMnXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGF0b3MgYWRpY2lvbmFsZXMgY29uIHByZWZpam8gYWN0aW9uX1xuICAgIGNvbnN0IGFjdGlvbkRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnYWN0aW9uXycpICYmIGtleSAhPT0gJ2FjdGlvbl90eXBlJykge1xuICAgICAgICBjb25zdCBjbGVhbktleSA9IGtleS5yZXBsYWNlKCdhY3Rpb25fJywgJycpO1xuICAgICAgICAvLyBJbnRlbnRhciBwYXJzZWFyIEpTT04gc2kgZXMgcG9zaWJsZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGFjdGlvbkRhdGFbY2xlYW5LZXldID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGFjdGlvbkRhdGFbY2xlYW5LZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWN0aW9uRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgYWN0aW9uLmFjdGlvbkRhdGEgPSBhY3Rpb25EYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogRW1pdGUgbWFudWFsbWVudGUgdW4gZXZlbnRvIGRlIGNsaWNrIGVuIG5vdGlmaWNhY2nDs24uXG4gICAqXG4gICAqIMOadGlsIHBhcmEgbWFuZWphciBjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMgZm9yZWdyb3VuZCBkb25kZVxuICAgKiBsYSBhcHAgZGVjaWRlIG1vc3RyYXIgdW4gYmFubmVyIGN1c3RvbS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGlmaWNhdGlvbiAtIFBheWxvYWQgZGUgbGEgbm90aWZpY2FjacOzblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG1lc3NhZ2luZy5vbk1lc3NhZ2UoKS5zdWJzY3JpYmUobm90aWZpY2F0aW9uID0+IHtcbiAgICogICAvLyBNb3N0cmFyIGJhbm5lciBjdXN0b21cbiAgICogICB0aGlzLnNob3dCYW5uZXIobm90aWZpY2F0aW9uLCAoKSA9PiB7XG4gICAqICAgICAvLyBVc3VhcmlvIGhpem8gY2xpY2sgZW4gZWwgYmFubmVyXG4gICAqICAgICBtZXNzYWdpbmcuaGFuZGxlTm90aWZpY2F0aW9uQ2xpY2sobm90aWZpY2F0aW9uKTtcbiAgICogICB9KTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGFuZGxlTm90aWZpY2F0aW9uQ2xpY2sobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25QYXlsb2FkKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5leHRyYWN0QWN0aW9uRnJvbURhdGEobm90aWZpY2F0aW9uLmRhdGEpO1xuXG4gICAgdGhpcy5ub3RpZmljYXRpb25DbGlja1N1YmplY3QubmV4dCh7XG4gICAgICBub3RpZmljYXRpb24sXG4gICAgICBhY3Rpb24sXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdW5hIG5vdGlmaWNhY2nDs24gdGllbmUgYWNjacOzbiBkZSBuYXZlZ2FjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBEYXRvcyBkZWwgcGF5bG9hZFxuICAgKiBAcmV0dXJucyB0cnVlIHNpIHRpZW5lIHJvdXRlIG8gdXJsXG4gICAqL1xuICBoYXNOYXZpZ2F0aW9uQWN0aW9uKGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhKGRhdGFbJ3JvdXRlJ10gfHwgZGF0YVsndXJsJ10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlYSB1biBxdWVyeSBzdHJpbmcgZW4gdW4gb2JqZXRvLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHJldHVybiBwYXJhbXM7XG5cbiAgICAvLyBSZW1vdmVyID8gaW5pY2lhbCBzaSBleGlzdGVcbiAgICBjb25zdCBjbGVhblF1ZXJ5ID0gcXVlcnlTdHJpbmcuc3RhcnRzV2l0aCgnPycpID8gcXVlcnlTdHJpbmcuc2xpY2UoMSkgOiBxdWVyeVN0cmluZztcblxuICAgIGZvciAoY29uc3QgcGFpciBvZiBjbGVhblF1ZXJ5LnNwbGl0KCcmJykpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSB8fCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuIl19
967
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL21lc3NhZ2luZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFvQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxRQUFRLEVBQ1IsV0FBVyxJQUFJLGNBQWMsRUFDN0IsWUFBWSxJQUFJLGVBQWUsRUFDL0IsU0FBUyxHQUNWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlELE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUF5Q25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFnRTNCLFlBQ1UsUUFBa0IsRUFDZSxNQUE2QixFQUN6QyxVQUFrQixFQUN2QyxNQUFjO1FBSGQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNlLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBQ3pDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDdkMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5FaEIsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBdUIsQ0FBQztRQUNwRCw2QkFBd0IsR0FBRyxJQUFJLE9BQU8sRUFBMEIsQ0FBQztRQUNqRSxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFpQjtZQUN6RCxLQUFLLEVBQUUsSUFBSTtZQUNYLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFdBQVcsRUFBRSxLQUFLO1NBQ25CLENBQUMsQ0FBQztRQU1ILHdEQUF3RDtRQUN2QyxzQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztRQUMxRDs7Ozs7OztXQU9HO1FBQ2Msc0JBQWlCLEdBQUcsbUJBQW1CLENBQUM7UUFDeEMsZUFBVSxHQUFHLDJCQUEyQixDQUFDO1FBQ3pDLGlCQUFZLEdBQUcsc0NBQXNDLENBQUM7UUFFdkU7Ozs7OztXQU1HO1FBQ2Msd0JBQW1CLEdBQUcsTUFBTSxDQUFDO1FBRTlDOzs7Ozs7V0FNRztRQUNjLDZCQUF3QixHQUFHLE1BQU0sQ0FBQztRQUVuRDs7Ozs7Ozs7OztXQVVHO1FBQ2MsdUJBQWtCLEdBQUcsTUFBTSxDQUFDO1FBRTdDOzs7V0FHRztRQUNjLG9CQUFlLEdBQUcseUJBQXlCLENBQUM7UUFRM0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLElBQUksS0FBSyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUF3Qk8sS0FBSyxDQUFDLG9CQUFvQjtRQUNoQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXJELElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNwRCxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUM5RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEYsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSxtRUFBbUU7WUFDbkUsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFjLENBQUM7UUFDM0MsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsaUJBQWlCO0lBQ2pCLDhFQUE4RTtJQUU5RTs7T0FFRztJQUNLLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDMUIsV0FBVyxFQUFFLFNBQVM7WUFDdEIsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILDRDQUE0QztRQUM1QyxJQUFJLFNBQVMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssMEJBQTBCO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNFLE9BQU87UUFDVCxDQUFDO1FBRUQsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDMUQsOERBQThEO1lBQzlELHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsMERBQTBEO1lBQzFELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssb0JBQW9CO2dCQUFFLE9BQU87WUFDdEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUErQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU87WUFFMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNuQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDO29CQUNqQyxZQUFZO29CQUNaLE1BQU07b0JBQ04sU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVk7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLG1CQUFtQjtJQUNuQiw4RUFBOEU7SUFFOUU7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHNDQUFzQztZQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFNLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTFELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNyQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztnQkFDMUIsVUFBVSxFQUFFLFVBQW9DO2FBQ2pELENBQUMsQ0FBQztZQUVILElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELG9CQUFvQjtZQUNwQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVwQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLGtDQUFrQztnQkFDbEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXFDRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBNkIsRUFBRTtRQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFMUMsSUFBSSxRQUFtRCxDQUFDO1FBRXhELDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQW1CLE9BQU8sQ0FBQyxFQUFFO1lBQzlELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztnQkFBRSxPQUFPLENBQUMsc0JBQXNCO1lBQ2pFLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUN6QixRQUFRLEdBQUcsU0FBUyxDQUFDO2dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxJQUFJLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxDQUFDO2dCQUV0RixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO29CQUMzQixrRUFBa0U7b0JBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztvQkFDOUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzNCLE9BQU8sQ0FBQzt3QkFDTixNQUFNLEVBQUUsU0FBUzt3QkFDakIsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsTUFBTSxFQUFFLGdDQUFnQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHO3FCQUMxRSxDQUFDLENBQUM7b0JBQ0gsT0FBTztnQkFDVCxDQUFDO2dCQUVELHFFQUFxRTtnQkFDckUsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDO29CQUNOLE1BQU0sRUFBRSxTQUFTO29CQUNqQixRQUFRLEVBQUUsSUFBSTtvQkFDZCxNQUFNLEVBQUUsK0NBQStDO2lCQUN4RCxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzQixDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDcEQsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNCLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkIsUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUEwQjtRQUNwRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSxDQUFDO1FBQ2pGLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCx1RUFBdUU7WUFDdkUsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUU3QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsc0VBQXNFO2dCQUN0RSxvRUFBb0U7Z0JBQ3BFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsb0NBQW9DLEVBQUUsQ0FBQztnQkFDNUUsQ0FBQztnQkFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsaUNBQWlDLEVBQUUsQ0FBQztZQUN4RSxDQUFDO1lBRUQseUVBQXlFO1lBQ3pFLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxxQ0FBcUMsRUFBRSxDQUFDO2dCQUNuRixDQUFDO1lBQ0gsQ0FBQztZQUVELDJFQUEyRTtZQUMzRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUYsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCx5REFBeUQ7SUFDakQsZUFBZTtRQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQztZQUNILE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDO1FBQzlELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCx5RUFBeUU7WUFDekUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELDJEQUEyRDtJQUNuRCxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPO1FBQ2hELElBQUksQ0FBQztZQUNILGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaURBQWlEO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQsc0VBQXNFO0lBQzlELG1CQUFtQjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDO1lBQ0gsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHNEQUFzRDtRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLElBQUksQ0FDVixxRkFBcUYsQ0FDdEYsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHdFQUF3RTtZQUN4RSxpRUFBaUU7WUFDakUsdUVBQXVFO1lBQ3ZFLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7WUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ3pELGdGQUFnRjtZQUNoRix3RUFBd0U7WUFDeEUsMkVBQTJFO1lBQzNFLG1FQUFtRTtZQUNuRSxNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUVwRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQ2xDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLFFBQVE7Z0JBQ1IseUJBQXlCLEVBQUUsWUFBWTthQUN4QyxDQUFDLEVBQ0YsSUFBSSxDQUFDLHdCQUF3QixFQUM3QixpREFBaUQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksR0FBRyxDQUN6RixDQUFDO1lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FDVCx5Q0FBeUMsRUFDekMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FDaEQsQ0FBQztZQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUNyQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztnQkFDMUIsS0FBSzthQUNOLENBQUMsQ0FBQztZQUVILHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXpCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZix3RUFBd0U7WUFDeEUsOERBQThEO1lBQzlELE1BQU0sTUFBTSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRixPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLEtBQUssQ0FBQyxnQ0FBZ0M7UUFDNUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUMvRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FDVCx1Q0FBdUMsRUFDdkMsUUFBUSxDQUFDLEtBQUssRUFDZCxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FDNUYsQ0FBQztZQUNGLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDM0UsTUFBTSxZQUFZLEdBQUcsTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzNFLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtTQUN6QixDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUNULHNDQUFzQyxFQUN0QyxZQUFZLENBQUMsS0FBSyxFQUNsQixZQUFZLENBQUMsTUFBTSxFQUFFLFNBQVMsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FDeEcsQ0FBQztRQUNGLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0NBQWdDO1FBQzVDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkUsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0sseUJBQXlCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDckIsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFDRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzNDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQztnQkFDL0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNaLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDLENBQUM7b0JBQ3RFLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtvQkFDMUMsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVc7d0JBQUUsT0FBTyxFQUFFLENBQUM7b0JBQzVDLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUMsQ0FBQztvQkFDdkUsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixnREFBZ0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUNuRixDQUFDO0lBQ0osQ0FBQztJQUVPLFdBQVcsQ0FBSSxPQUFtQixFQUFFLEVBQVUsRUFBRSxPQUFlO1FBQ3JFLElBQUksS0FBZ0QsQ0FBQztRQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBUSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMvQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNuRCxJQUFJLEtBQUssS0FBSyxTQUFTO2dCQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FBQyxLQUFnQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFPO1FBQ2hELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhCLCtCQUErQjtZQUMvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxXQUFXO0lBQ1gsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsb0JBQW9CO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3pELE1BQU0sWUFBWSxHQUF3QjtnQkFDeEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSztnQkFDbEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSTtnQkFDaEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSztnQkFDbEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUE4QjtnQkFDNUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2FBQzdCLENBQUM7WUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUV2Qyw4REFBOEQ7WUFDOUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssc0JBQXNCLENBQUMsT0FBNEI7UUFDekQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUM1RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLDJCQUEyQjtZQUMzQixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUU5RTs7Ozs7Ozs7Ozs7Ozs7OztPQWdCRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQyxVQUFvQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2YseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsZ0RBQWdEO1FBQ2hELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ25FLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsOEVBQThFO1FBQzlFLGdFQUFnRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUM7WUFDbEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSx1RUFBdUU7UUFDdkUseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsbURBQW1EO1FBQ25ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHNCQUFzQjtRQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxHQUFJLFNBQXVCLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QixNQUFNLFlBQVksR0FDaEIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUMsT0FBTztZQUN4RCxTQUFpRCxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUM7UUFDekUsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxtQkFBbUIsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUVuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNyQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUMxQixLQUFLO1lBQ0wsV0FBVyxFQUFFLElBQUksRUFBRSx3Q0FBd0M7U0FDNUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSw0QkFBNEI7SUFDNUIsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBCRztJQUNILG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gscUJBQXFCLENBQUMsSUFBNkI7UUFDakQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUV0QyxlQUFlO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsY0FBYztRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELGlCQUFpQjtRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asd0RBQXdEO2dCQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0gsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO1FBQy9DLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzVDLHNDQUFzQztnQkFDdEMsSUFBSSxDQUFDO29CQUNILFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNILHVCQUF1QixDQUFDLFlBQWlDO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQztZQUNqQyxZQUFZO1lBQ1osTUFBTTtZQUNOLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtTQUN0QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxJQUE2QjtRQUMvQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLFdBQW1CO1FBQzFDLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUM7UUFFMUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUVoQyw4QkFBOEI7UUFDOUIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBRXBGLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBMWdDVSxnQkFBZ0IsMENBa0VqQix1QkFBdUIsYUFDdkIsV0FBVzttSEFuRVYsZ0JBQWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQW1FN0IsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUM5QixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lc3NhZ2luZyBTZXJ2aWNlIChGQ00pXG4gKlxuICogU2VydmljaW8gcGFyYSBGaXJlYmFzZSBDbG91ZCBNZXNzYWdpbmcgKFB1c2ggTm90aWZpY2F0aW9ucykuXG4gKiBQZXJtaXRlIHNvbGljaXRhciBwZXJtaXNvcywgb2J0ZW5lciB0b2tlbnMsIGVzY3VjaGFyIG1lbnNhamVzIHkgbWFuZWphclxuICogbmF2ZWdhY2nDs24gKGRlZXAgbGlua2luZykgY3VhbmRvIGVsIHVzdWFyaW8gdG9jYSB1bmEgbm90aWZpY2FjacOzbi5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBOZ1pvbmUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNZXNzYWdpbmcgfSBmcm9tICdAYW5ndWxhci9maXJlL21lc3NhZ2luZyc7XG5pbXBvcnQge1xuICBkZWxldGVUb2tlbixcbiAgZ2V0VG9rZW4sXG4gIGlzU3VwcG9ydGVkIGFzIGZjbUlzU3VwcG9ydGVkLFxuICBnZXRNZXNzYWdpbmcgYXMgZmNtR2V0TWVzc2FnaW5nLFxuICBvbk1lc3NhZ2UsXG59IGZyb20gJ2ZpcmViYXNlL21lc3NhZ2luZyc7XG5pbXBvcnQgeyBnZXRBcHAsIGdldEFwcHMsIGluaXRpYWxpemVBcHAgfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfRklSRUJBU0VfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtcbiAgRW5hYmxlUHVzaFJlc3VsdCxcbiAgTm90aWZpY2F0aW9uQWN0aW9uLFxuICBOb3RpZmljYXRpb25DbGlja0V2ZW50LFxuICBOb3RpZmljYXRpb25QYXlsb2FkLFxuICBOb3RpZmljYXRpb25QZXJtaXNzaW9uLFxuICBWYWx0ZWNoRmlyZWJhc2VDb25maWcsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENhbGxiYWNrIG9wY2lvbmFsIGRlIHJlZ2lzdHJvIGRlIGRldmljZSBwYXJhIGBNZXNzYWdpbmdTZXJ2aWNlLmVuYWJsZSgpYC5cbiAqXG4gKiBFbCByZWdpc3RybyBkZWwgZGV2aWNlIHZpdmUgZW4gYEF1dGhTZXJ2aWNlYCAobmVjZXNpdGEgZWwgSldUICsgZWwgZW5kcG9pbnRcbiAqIGRlbCBiYWNrZW5kKS4gYE1lc3NhZ2luZ1NlcnZpY2VgIE5PIHB1ZWRlIGRlcGVuZGVyIGRlIGBBdXRoU2VydmljZWAgc2luXG4gKiBjcmVhciB1biBjaWNsbyAoQXV0aFNlcnZpY2Ug4oaSIE1lc3NhZ2luZ1NlcnZpY2UpLiBQb3IgZXNvIGVsIGNhbGxlciBsZSBwYXNhXG4gKiBlbCBwYXNvIGRlIHJlZ2lzdHJvIGNvbW8gY2FsbGJhY2suIFJlY2liZSBlbCB0b2tlbiBGQ00geSBkZXZ1ZWx2ZSBzaSBlbFxuICogZGV2aWNlIHF1ZWTDsyByZWdpc3RyYWRvLlxuICovXG5leHBvcnQgdHlwZSBSZWdpc3RlckRldmljZUZuID0gKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogT3BjaW9uZXMgZGUgYE1lc3NhZ2luZ1NlcnZpY2UuZW5hYmxlKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuYWJsZVB1c2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhc28gb3BjaW9uYWwgZGUgcmVnaXN0cm8gZGUgZGV2aWNlIGVuIGVsIGJhY2tlbmQuIFNpIHNlIG9taXRlLCBgZW5hYmxlKClgXG4gICAqIHJlc3VlbHZlIGNvbiBgc3RhdHVzOiAnZW5hYmxlZCdgIGFwZW5hcyBvYnRpZW5lIGVsIHRva2VuIChzaW4gcmVnaXN0cmFyKS5cbiAgICovXG4gIHJlZ2lzdGVyRGV2aWNlPzogUmVnaXN0ZXJEZXZpY2VGbjtcbn1cblxuLyoqXG4gKiBFc3RhZG8gaW50ZXJubyBkZWwgc2VydmljaW8gZGUgbWVzc2FnaW5nXG4gKi9cbmludGVyZmFjZSBNZXNzYWdpbmdTdGF0ZSB7XG4gIHRva2VuOiBzdHJpbmcgfCBudWxsO1xuICBwZXJtaXNzaW9uOiBOb3RpZmljYXRpb25QZXJtaXNzaW9uO1xuICBpc1N1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyAoRkNNKS5cbiAqXG4gKiBQZXJtaXRlIHJlY2liaXIgbm90aWZpY2FjaW9uZXMgcHVzaCBlbiBsYSBhcGxpY2FjacOzbiB3ZWIuXG4gKiBSZXF1aWVyZSBWQVBJRCBrZXkgY29uZmlndXJhZGEgZW4gVmFsdGVjaEZpcmViYXNlQ29uZmlnLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkNvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgbWVzc2FnaW5nID0gaW5qZWN0KE1lc3NhZ2luZ1NlcnZpY2UpO1xuICpcbiAqICAgdG9rZW4gPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gKlxuICogICBhc3luYyBlbmFibGVOb3RpZmljYXRpb25zKCkge1xuICogICAgIC8vIFNvbGljaXRhciBwZXJtaXNvIHkgb2J0ZW5lciB0b2tlblxuICogICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5tZXNzYWdpbmcucmVxdWVzdFBlcm1pc3Npb24oKTtcbiAqXG4gKiAgICAgaWYgKHRva2VuKSB7XG4gKiAgICAgICB0aGlzLnRva2VuLnNldCh0b2tlbik7XG4gKiAgICAgICAvLyBFbnZpYXIgdG9rZW4gYSB0dSBiYWNrZW5kIHBhcmEgYWxtYWNlbmFybG9cbiAqICAgICAgIGF3YWl0IHRoaXMuYmFja2VuZC5yZWdpc3RlckRldmljZVRva2VuKHRva2VuKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIC8vIEVzY3VjaGFyIG1lbnNhamVzIGVuIGZvcmVncm91bmRcbiAqICAgbWVzc2FnZXMkID0gdGhpcy5tZXNzYWdpbmcub25NZXNzYWdlKCk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdpbmdTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBtZXNzYWdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PE5vdGlmaWNhdGlvblBheWxvYWQ+KCk7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uQ2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Tm90aWZpY2F0aW9uQ2xpY2tFdmVudD4oKTtcbiAgcHJpdmF0ZSBzdGF0ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lc3NhZ2luZ1N0YXRlPih7XG4gICAgdG9rZW46IG51bGwsXG4gICAgcGVybWlzc2lvbjogJ2RlZmF1bHQnLFxuICAgIGlzU3VwcG9ydGVkOiBmYWxzZSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZU9uTWVzc2FnZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqIEZsYWcgcGFyYSBwZXJzaXN0aXIgbWVuc2FqZXMgRkNNIGVuIGxvY2FsU3RvcmFnZSAoZGVidWdnaW5nKSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnUGVyc2lzdGVuY2U6IGJvb2xlYW47XG4gIC8qKiBLZXkgcGFyYSBsb2NhbFN0b3JhZ2UgZGUgbWVuc2FqZXMgRkNNIChkZWJ1Z2dpbmcpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgREVCVUdfU1RPUkFHRV9LRVkgPSAnZmNtX2RlYnVnX21lc3NhZ2VzJztcbiAgLyoqXG4gICAqIEtleSBkZSBsb2NhbFN0b3JhZ2UgZG9uZGUgc2UgcGVyc2lzdGUgZWwgdG9rZW4gRkNNLlxuICAgKlxuICAgKiBFbCB0b2tlbiB2aXZlIGVuIHVuIGBCZWhhdmlvclN1YmplY3RgIGVuIG1lbW9yaWEgeSBzZSBwaWVyZGUgZW4gY2FkYVxuICAgKiByZWNhcmdhIC8gc3VzcGVuc2nDs24gZGUgbGEgUFdBIChpT1MgcmVpbmljaWEgUFdBcyBjb24gZnJlY3VlbmNpYSkuIFBlcnNpc3RpclxuICAgKiBlbCB0b2tlbiBwZXJtaXRlIGhpZHJhdGFyIGVsIGVzdGFkbyBlbiBjb2xkIHN0YXJ0IHkgcXVlIGxhIFVJIG5vIHBhcnBhZGVlLlxuICAgKiBFcyB1biAqb3B0aW1pc3RpYyBoaW50KiDigJQgbGEgdmVyZGFkIGxhIGNvbmZpcm1hIGVsIHNpZ3VpZW50ZSBgZ2V0VG9rZW4oKWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFRPS0VOX1NUT1JBR0VfS0VZID0gJ3ZhbHRlY2hfZmNtX3Rva2VuJztcbiAgcHJpdmF0ZSByZWFkb25seSBGQ01fU1dfVVJMID0gJy9maXJlYmFzZS1tZXNzYWdpbmctc3cuanMnO1xuICBwcml2YXRlIHJlYWRvbmx5IEZDTV9TV19TQ09QRSA9ICcvZmlyZWJhc2UtY2xvdWQtbWVzc2FnaW5nLXB1c2gtc2NvcGUnO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IChtcykgcGFyYSBgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHlgIGRlbnRybyBkZSBgZ2V0VG9rZW4oKWAuXG4gICAqXG4gICAqIEVuIHVuIGNvbGQgbG9hZCBlbCBTVyBwdWVkZSBubyBlc3RhciBhY3RpdmFkbyBhw7puIHkgYHNlcnZpY2VXb3JrZXIucmVhZHlgXG4gICAqIG5vIHJlc29sdmVyIG51bmNhLiBQYXNhZG8gZXN0ZSB0aWVtcG8sIGBnZXRUb2tlbigpYCByZWNoYXphIGxpbXBpbyBlbiBsdWdhclxuICAgKiBkZSBjb2xnYXJzZSBpbmRlZmluaWRhbWVudGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNXX1JFQURZX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgZHVybyBwYXJhIGxhIGxsYW1hZGEgZGUgRmlyZWJhc2UgYGdldFRva2VuKClgLlxuICAgKlxuICAgKiBFbiBDaHJvbWl1bSBwdWVkZSBxdWVkYXIgcGVuZGllbnRlIHNpbiByZXNvbHZlciBzaSBsYSByZWdpc3RyYWNpw7NuIEZDTSBub1xuICAgKiByZXNwb25kZSAoVkFQSUQvcHJveWVjdG8vQVBJL3JlZCkuIFNpbiBlc3RlIHRpbWVvdXQsIGVsIHdhdGNoZG9nIGV4dGVybm9cbiAgICogZnVlcnphIHVuIHJlbG9hZCBxdWUgbm8gY29ycmlnZSBsYSBjYXVzYSB5IGRlamEgdW4gZGlhZ27Ds3N0aWNvIHBvYnJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBGQ01fR0VUX1RPS0VOX1RJTUVPVVRfTVMgPSAxNV8wMDA7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgKG1zKSBkZWwgd2F0Y2hkb2cgZGUgYGVuYWJsZSgpYCBhbnRlcyBkZSBhdXRvLXJlY2FyZ2FyIGxhIHDDoWdpbmEuXG4gICAqXG4gICAqIEVsIGZsdWpvIGRlIGFjdGl2YWNpw7NuIGEgdmVjZXMgc2UgY3VlbGdhIEFOVEVTIGRlIGBnZXRUb2tlbigpYCDigJQgY2Fzb1xuICAgKiB0w61waWNvOiBgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKClgIG5vIG11ZXN0cmEgZWwgcG9wdXAgZGVsIFNPIGVuIHVuXG4gICAqIGNvbGQgbG9hZC4gRWwgdGltZW91dCBkZSBgZ2V0VG9rZW4oKWAgKFNXX1JFQURZX1RJTUVPVVRfTVMpIG5vIGN1YnJlIGVzbztcbiAgICogcG9yIGVzbyBgZW5hYmxlKClgIGVudnVlbHZlIGVsIGZsdWpvIGNvbXBsZXRvIGVuIGVzdGUgd2F0Y2hkb2cuXG4gICAqXG4gICAqIFVuIGZsdWpvIGV4aXRvc28gcmVhbCBsbGVnYSBhIHRva2VuK2RldmljZSBlbiB+NHM7IDI1cyBlcyBob2xnYWRvIHkgbm9cbiAgICogYXRyYXBhIHVuIMOpeGl0byBsZW50by5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgRU5BQkxFX1dBVENIRE9HX01TID0gMjVfMDAwO1xuXG4gIC8qKlxuICAgKiBLZXkgZGUgc2Vzc2lvblN0b3JhZ2Ug4oCUIGdhcmFudGl6YSB1biBzb2xvIGF1dG8tcmVsb2FkIHBvciBzZXNpw7NuLiBTaSBlbFxuICAgKiBmbHVqbyBzZSBjdWVsZ2EgdW5hIDLCqiB2ZXogdHJhcyBlbCByZWxvYWQsIE5PIHNlIHJlY2FyZ2EgZGUgbnVldm8gKGFudGktbG9vcCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IEFVVE9SRUxPQURfRkxBRyA9ICdub3RpZi1lbmFibGUtYXV0b3JlbG9hZCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChWQUxURUNIX0ZJUkVCQVNFX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZyxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuZGVidWdQZXJzaXN0ZW5jZSA9IHRoaXMuY29uZmlnPy5kZWJ1Z01lc3NhZ2VQZXJzaXN0ZW5jZSA/PyBmYWxzZTtcbiAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGluc3RhbmNpYSBkZSBNZXNzYWdpbmcgdmlhIEZpcmViYXNlIFNESyBkaXJlY3RvIChOTyBBbmd1bGFyRmlyZSBESSkuXG4gICAqXG4gICAqICoqUG9yIHF1w6kgbm8gdXNhbW9zIGBpbmplY3Rvci5nZXQoTWVzc2FnaW5nKWA6KipcbiAgICogQW5ndWxhckZpcmUgYHByb3ZpZGVNZXNzYWdpbmdgIHJlZ2lzdHJhIHVuIEFQUF9JTklUSUFMSVpFUiBxdWUgaW50ZXJuYW1lbnRlXG4gICAqIHJlc3VlbHZlIGBhd2FpdCBpc1N1cHBvcnRlZCgpYC4gU2kgYGluamVjdG9yLmdldChNZXNzYWdpbmcpYCBzZSBsbGFtYSBhbnRlc1xuICAgKiBxdWUgZXNlIEFQUF9JTklUSUFMSVpFUiB0ZXJtaW5lIChlai4gb3Ryb3MgQVBQX0lOSVRJQUxJWkVSIGRlbCBjbGllbnRlXG4gICAqIGNvbnN0cnV5ZW4gQXV0aFNlcnZpY2Ug4oaSIE1lc3NhZ2luZ1NlcnZpY2Ug4oaSIHRvY2EgTWVzc2FnaW5nIHRlbXByYW5vKSxcbiAgICogQW5ndWxhckZpcmUgbGFuemEgZWwgZXJyb3IgXCJBUFBfSU5JVElBTElaRVIgLi4uIGhhcyBub3QgcmVzb2x2ZWRcIi4gQW5ndWxhclxuICAgKiBESSAqKmNhY2hlYSBlcnJvcmVzIGRlIGZhY3RvcnkqKiDigJQgdW5hIHZleiBxdWUgZmFsbMOzLCB0b2RvcyBsb3NcbiAgICogYGluamVjdG9yLmdldGAgc2lndWllbnRlcyByZXRvcm5hbiBlbCBtaXNtbyBlcnJvciBjYWNoZWFkby4gUmV0cnkgbG9vcHNcbiAgICogbm8gZnVuY2lvbmFuLlxuICAgKlxuICAgKiAqKldvcmthcm91bmQ6KiogYnlwYXNzIEFuZ3VsYXJGaXJlIGVudGlyZWx5IHkgdXNhciBGaXJlYmFzZSBTREsgZGlyZWN0b1xuICAgKiAoYGZpcmViYXNlL21lc3NhZ2luZy5nZXRNZXNzYWdpbmcoZ2V0QXBwKCkpYCkuIEFuZ3VsYXJGaXJlIGVzIHVuIHdyYXBwZXJcbiAgICogc29icmUgZWwgbWlzbW8gU0RLIOKAlCBsYSBpbnN0YW5jaWEgcXVlIG9idGVuZW1vcyBlcyBmdW5jaW9uYWxtZW50ZSBpZMOpbnRpY2EuXG4gICAqIGBnZXRBcHAoKWAgcmV0b3JuYSBsYSBkZWZhdWx0IEZpcmViYXNlIGFwcCBpbmljaWFsaXphZGEgcG9yXG4gICAqIGBwcm92aWRlRmlyZWJhc2VBcHAoKCkgPT4gaW5pdGlhbGl6ZUFwcChjb25maWcuZmlyZWJhc2UpKWAuIFNpIHBvciBhbGd1bmFcbiAgICogcmF6w7NuIG5vIGVzdMOhIGluaWNpYWxpemFkYSBhw7puLCBoYWNlbW9zIGluaXRpYWxpemVBcHAgaWRlbXBvdGVudGUuXG4gICAqL1xuICBwcml2YXRlIGZjbVN1cHBvcnRQcm9taXNlPzogUHJvbWlzZTxib29sZWFuPjtcblxuICBwcml2YXRlIGFzeW5jIGdldE1lc3NhZ2luZ0luc3RhbmNlKCk6IFByb21pc2U8TWVzc2FnaW5nIHwgbnVsbD4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoIXRoaXMuZmNtU3VwcG9ydFByb21pc2UpIHtcbiAgICAgIHRoaXMuZmNtU3VwcG9ydFByb21pc2UgPSBmY21Jc1N1cHBvcnRlZCgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gZmNtSXNTdXBwb3J0ZWQgdGhyZXc6JywgZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGF3YWl0IHRoaXMuZmNtU3VwcG9ydFByb21pc2U7XG4gICAgaWYgKCFzdXBwb3J0ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gRkNNIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwID0gZ2V0QXBwcygpLmxlbmd0aCA+IDAgPyBnZXRBcHAoKSA6IGluaXRpYWxpemVBcHAodGhpcy5jb25maWcuZmlyZWJhc2UpO1xuICAgICAgLy8gQ2FzdCBhIE1lc3NhZ2luZyAodG9rZW4gZGUgQW5ndWxhckZpcmUpIOKAlCBlbCB0aXBvIHN1YnlhY2VudGUgZGVsIFNES1xuICAgICAgLy8gZXMgZWwgbWlzbW8uIExhcyBmdW5jaW9uZXMgZ2V0VG9rZW4vZGVsZXRlVG9rZW4vb25NZXNzYWdlIHNlIGxsYW1hblxuICAgICAgLy8gZGVzZGUgYGZpcmViYXNlL21lc3NhZ2luZ2AgZGlyZWN0byBwYXJhIGV2aXRhciB3cmFwcGVycyBkZSBab25lLlxuICAgICAgcmV0dXJuIGZjbUdldE1lc3NhZ2luZyhhcHApIGFzIE1lc3NhZ2luZztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNZXNzYWdpbmddIGZpcmViYXNlIGdldE1lc3NhZ2luZygpIHRocmV3OicsIGVycik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5JQ0lBTElaQUNJw5NOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbmljaWFsaXphIGVsIHNlcnZpY2lvIGRlIG1lc3NhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplTWVzc2FnaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZHJhdGFyIGVsIHRva2VuIGRlc2RlIGxvY2FsU3RvcmFnZSBBTlRFUyBkZWwgY2hlY2sgZGUgc29wb3J0ZTogZWwgdG9rZW5cbiAgICAvLyBjYWNoZWFkbyBlcyB1biBoaW50IG9wdGltaXN0YSBwYXJhIGxhIFVJIHRyYXMgcmVjYXJnYXMgLyBzdXNwZW5zaW9uZXMgZGVcbiAgICAvLyBsYSBQV0EuIExhIHZhbGlkZXogcmVhbCBzZSBjb25maXJtYSBlbiBlbCBwcsOzeGltbyBnZXRUb2tlbigpLlxuICAgIHRoaXMuaHlkcmF0ZVRva2VuRnJvbVN0b3JhZ2UoKTtcblxuICAgIGNvbnN0IHN1cHBvcnRlZCA9IGF3YWl0IHRoaXMuY2hlY2tTdXBwb3J0KCk7XG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG5cbiAgICB0aGlzLnN0YXRlU3ViamVjdC5uZXh0KHtcbiAgICAgIC4uLnRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLFxuICAgICAgaXNTdXBwb3J0ZWQ6IHN1cHBvcnRlZCxcbiAgICAgIHBlcm1pc3Npb24sXG4gICAgfSk7XG5cbiAgICAvLyBTaSB5YSB0aWVuZSBwZXJtaXNvLCBjb25maWd1cmFyIGxpc3RlbmVyc1xuICAgIGlmIChzdXBwb3J0ZWQgJiYgcGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSB7XG4gICAgICB0aGlzLnNldHVwTWVzc2FnZUxpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgLy8gRXNjdWNoYXIgbWVuc2FqZXMgZGVsIFNlcnZpY2UgV29ya2VyIChjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMgYmFja2dyb3VuZClcbiAgICB0aGlzLnNldHVwU2VydmljZVdvcmtlckxpc3RlbmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJhIGxpc3RlbmVyIHBhcmEgbWVuc2FqZXMgZGVsIFNlcnZpY2UgV29ya2VyLlxuICAgKiBSZWNpYmUgZXZlbnRvcyBjdWFuZG8gZWwgdXN1YXJpbyBoYWNlIGNsaWNrIGVuIHVuYSBub3RpZmljYWNpw7NuIGJhY2tncm91bmQuXG4gICAqL1xuICBwcml2YXRlIHNldHVwU2VydmljZVdvcmtlckxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCAhKCdzZXJ2aWNlV29ya2VyJyBpbiBuYXZpZ2F0b3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgIC8vIFNvbG8gcHJvY2VzYXIgbWVuc2FqZXMgZGUgbm90aWZpY2FjacOzbiBjbGljayBiaWVuIGZvcm1hZG9zLlxuICAgICAgLy8gRW4gYXBwcyBjb24gbcO6bHRpcGxlcyBTVyAoUFdBIG5nc3ctd29ya2VyICsgZmlyZWJhc2UtbWVzc2FnaW5nLXN3KSxcbiAgICAgIC8vIG8gdmFyaWFudGVzIGRlbCBwYXlsb2FkLCBgbm90aWZpY2F0aW9uYCBwdWVkZSBubyBleGlzdGlyIGF1bnF1ZVxuICAgICAgLy8gYGRhdGEudHlwZWAgY29pbmNpZGEg4oaSIGd1YXJkIGRlZmVuc2l2byBldml0YSBUeXBlRXJyb3IuXG4gICAgICBpZiAoZXZlbnQuZGF0YT8udHlwZSAhPT0gJ05PVElGSUNBVElPTl9DTElDSycpIHJldHVybjtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGV2ZW50LmRhdGEubm90aWZpY2F0aW9uIGFzIE5vdGlmaWNhdGlvblBheWxvYWQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW5vdGlmaWNhdGlvbikgcmV0dXJuO1xuXG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmV4dHJhY3RBY3Rpb25Gcm9tRGF0YShub3RpZmljYXRpb24uZGF0YSk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2xpY2tTdWJqZWN0Lm5leHQoe1xuICAgICAgICAgIG5vdGlmaWNhdGlvbixcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIEZDTSBlc3TDoSBzb3BvcnRhZG8gZW4gZWwgbmF2ZWdhZG9yIGFjdHVhbFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1N1cHBvcnQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2FyIEFQSXMgbmVjZXNhcmlhc1xuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoISgnc2VydmljZVdvcmtlcicgaW4gbmF2aWdhdG9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFZlcmlmaWNhciBxdWUgbWVzc2FnaW5nIGVzdMOpIGRpc3BvbmlibGUgKGFzeW5jIOKAlCBlc3BlcmEgQVBQX0lOSVRJQUxJWkVSKVxuICAgIGlmICghKGF3YWl0IHRoaXMuZ2V0TWVzc2FnaW5nSW5zdGFuY2UoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQRVJNSVNPUyBZIFRPS0VOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTb2xpY2l0YSBwZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIHkgb2J0aWVuZSBlbCB0b2tlbiBGQ00uXG4gICAqXG4gICAqIEByZXR1cm5zIFRva2VuIEZDTSBzaSBzZSBvdG9yZ8OzIHBlcm1pc28sIG51bGwgc2kgc2UgZGVuZWfDs1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VuID0gYXdhaXQgbWVzc2FnaW5nLnJlcXVlc3RQZXJtaXNzaW9uKCk7XG4gICAqIGlmICh0b2tlbikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdUb2tlbiBGQ006JywgdG9rZW4pO1xuICAgKiAgIC8vIEVudmlhciBhIGJhY2tlbmRcbiAgICogfSBlbHNlIHtcbiAgICogICBjb25zb2xlLmxvZygnUGVybWlzbyBkZW5lZ2FkbyBvIG5vIHNvcG9ydGFkbycpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFBlcm1pc3Npb24oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1N1cHBvcnRlZCgpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdGQ00gbm8gZXN0w6Egc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU29saWNpdGFyIHBlcm1pc28gZGUgbm90aWZpY2FjaW9uZXNcbiAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSBhd2FpdCBOb3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKTtcblxuICAgICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dCh7XG4gICAgICAgIC4uLnRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLFxuICAgICAgICBwZXJtaXNzaW9uOiBwZXJtaXNzaW9uIGFzIE5vdGlmaWNhdGlvblBlcm1pc3Npb24sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHBlcm1pc3Npb24gIT09ICdncmFudGVkJykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1Blcm1pc28gZGUgbm90aWZpY2FjaW9uZXMgZGVuZWdhZG8nKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIE9idGVuZXIgdG9rZW4gRkNNXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcblxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIC8vIENvbmZpZ3VyYXIgbGlzdGVuZXIgZGUgbWVuc2FqZXNcbiAgICAgICAgdGhpcy5zZXR1cE1lc3NhZ2VMaXN0ZW5lcigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNvbGljaXRhbmRvIHBlcm1pc28gZGUgbm90aWZpY2FjaW9uZXM6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdWpvIGNvbXBsZXRvIGRlIGFjdGl2YWNpw7NuIGRlIHB1c2gsIHJvYnVzdG8sIGNyb3NzLWFwcC5cbiAgICpcbiAgICogT3JxdWVzdGE6IHBlZGlyIHBlcm1pc28g4oaSIFNXIHJlYWR5IOKGkiBvYnRlbmVyIHRva2VuIEZDTSDihpIgKG9wY2lvbmFsKVxuICAgKiByZWdpc3RyYXIgZWwgZGV2aWNlIGVuIGJhY2tlbmQuIEVzIGVsIHB1bnRvIGRlIG9ycXVlc3RhY2nDs24gw7puaWNvIHF1ZSBjYWRhXG4gICAqIGFwcCBkZWwgZmFjdG9yeSBjb25zdW1lIOKAlCBsYSBsw7NnaWNhIGRlIHJvYnVzdGV6IHZpdmUgYXF1w60sIG5vIGVuIGNhZGEgcMOhZ2luYS5cbiAgICpcbiAgICogKipXYXRjaGRvZyBkZSBhdXRvLXJlbG9hZC4qKiBFbCBmbHVqbyBhIHZlY2VzIHNlIGN1ZWxnYSBBTlRFUyBkZSBgZ2V0VG9rZW4oKWBcbiAgICogKGVqLiBgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKClgIHF1ZSBubyBtdWVzdHJhIGVsIHBvcHVwIGVuIHVuIGNvbGRcbiAgICogbG9hZCkg4oCUIGVsIHRpbWVvdXQgaW50ZXJubyBkZSBgZ2V0VG9rZW4oKWAgbm8gY3VicmUgZXNlIGNhc28uIFBvciBlc29cbiAgICogYGVuYWJsZSgpYCBlbnZ1ZWx2ZSBlbCBmbHVqbyBlbnRlcm8gZW4gdW4gd2F0Y2hkb2c6IHNpIG5vIGFsY2FuemEgdW4gZXN0YWRvXG4gICAqIHRlcm1pbmFsIGVuIGBFTkFCTEVfV0FUQ0hET0dfTVNgICgxNXMpOlxuICAgKiAgLSAxwqogdmV6IGVuIGxhIHNlc2nDs24g4oaSIG1hcmNhIHVuIGZsYWcgZW4gYHNlc3Npb25TdG9yYWdlYCB5IGhhY2VcbiAgICogICAgYHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKWAgKHVuIGZyZXNoIGxvYWQgc3VlbGUgdGVuZXIgZWwgU1cgYWN0aXZvKS5cbiAgICogICAgUmVzdWVsdmUgY29uIGB7IHN0YXR1czogJ3RpbWVvdXQnLCByZWxvYWRlZDogdHJ1ZSB9YC5cbiAgICogIC0geWEgc2UgYXV0by1yZWNhcmfDsyBhbnRlcyDihpIgTk8gcmVjYXJnYSAoYW50aS1sb29wKTogbGltcGlhIGVsIGZsYWcgeVxuICAgKiAgICByZXN1ZWx2ZSBjb24gYHsgc3RhdHVzOiAndGltZW91dCcsIHJlbG9hZGVkOiBmYWxzZSB9YCBwYXJhIHF1ZSBsYSBhcHBcbiAgICogICAgbXVlc3RyZSB1biBlcnJvci5cbiAgICpcbiAgICogTk8gaGFjZSB0aHJvdyDigJQgc2llbXByZSByZXN1ZWx2ZSBjb24gdW4gYEVuYWJsZVB1c2hSZXN1bHRgIGRlc2NyaXB0aXZvIHF1ZVxuICAgKiBsYSBww6FnaW5hIGNvbnN1bWlkb3JhIGluc3BlY2Npb25hIHBhcmEgZGVjaWRpciBxdcOpIHRvYXN0IG1vc3RyYXIuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZ2lzdGVyRGV2aWNlIENhbGxiYWNrIG9wY2lvbmFsIHF1ZSByZWdpc3RyYSBlbCBkZXZpY2UgZW5cbiAgICogICBlbCBiYWNrZW5kICh2aXZlIGVuIGBBdXRoU2VydmljZWAg4oCUIHNlIHBhc2EgY29tbyBjYWxsYmFjayBwYXJhIGV2aXRhciBlbFxuICAgKiAgIGNpY2xvIGRlIERJIEF1dGhTZXJ2aWNlIOKGlCBNZXNzYWdpbmdTZXJ2aWNlKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBtZXNzYWdpbmcuZW5hYmxlKHtcbiAgICogICByZWdpc3RlckRldmljZTogKHRva2VuKSA9PiBhdXRoLnJlZ2lzdGVyRGV2aWNlKHRva2VuKS50aGVuKHIgPT4gci5yZWdpc3RlcmVkKSxcbiAgICogfSk7XG4gICAqIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZW5hYmxlZCcpIHtcbiAgICogICAvLyByZXN1bHQudG9rZW4gZGlzcG9uaWJsZSDigJQgcHVzaCBhY3Rpdm9cbiAgICogfSBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSAndGltZW91dCcgJiYgIXJlc3VsdC5yZWxvYWRlZCkge1xuICAgKiAgIC8vIG1vc3RyYXIgZXJyb3I6IGVsIGZsdWpvIHNlIGNvbGfDsyB5IHlhIHNlIGNvbnN1bWnDsyBlbCBhdXRvLXJlbG9hZFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZW5hYmxlKG9wdGlvbnM6IEVuYWJsZVB1c2hPcHRpb25zID0ge30pOiBQcm9taXNlPEVuYWJsZVB1c2hSZXN1bHQ+IHtcbiAgICBjb25zb2xlLmxvZygnW01lc3NhZ2luZ10gZW5hYmxlKCkgc3RhcnQnKTtcblxuICAgIGxldCB3YXRjaGRvZzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBFbCB3YXRjaGRvZyBjb3JyZSBlbiBwYXJhbGVsbyBhbCBmbHVqbyByZWFsLiBMbyBxdWUgZ2FuZSBlbCByYWNlIGRlZmluZVxuICAgIC8vIGVsIHJlc3VsdGFkby4gRWwgZmx1am8gcmVhbCwgc2kgZ2FuYSwgbGltcGlhIGVsIHdhdGNoZG9nIGVuIGVsIGBmaW5hbGx5YC5cbiAgICBjb25zdCB3YXRjaGRvZ1Byb21pc2UgPSBuZXcgUHJvbWlzZTxFbmFibGVQdXNoUmVzdWx0PihyZXNvbHZlID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykgcmV0dXJuOyAvLyBTU1Ig4oCUIHNpbiB3YXRjaGRvZy5cbiAgICAgIHdhdGNoZG9nID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdhdGNoZG9nID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zb2xlLndhcm4oYFtNZXNzYWdpbmddIGVuYWJsZSgpIGNvbGdhZG8gPiR7dGhpcy5FTkFCTEVfV0FUQ0hET0dfTVN9bXMg4oCUIHdhdGNoZG9nYCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQXV0b1JlbG9hZGVkKCkpIHtcbiAgICAgICAgICAvLyBBbnRpLWxvb3A6IHlhIHJlY2FyZ2Ftb3MgdW5hIHZleiBlc3RhIHNlc2nDs24geSB2b2x2acOzIGEgY29sZ2FyLlxuICAgICAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gYXV0by1yZWxvYWQgeWEgY29uc3VtaWRvIOKAlCBubyBzZSByZWNhcmdhIGRlIG51ZXZvJyk7XG4gICAgICAgICAgdGhpcy5jbGVhckF1dG9SZWxvYWRGbGFnKCk7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBzdGF0dXM6ICd0aW1lb3V0JyxcbiAgICAgICAgICAgIHJlbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogYEZsdWpvIGRlIGFjdGl2YWNpw7NuIGNvbGdhZG8gPiR7dGhpcy5FTkFCTEVfV0FUQ0hET0dfTVMgLyAxMDAwfXNgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDHCqiB2ZXo6IG1hcmNhciB5IHJlY2FyZ2FyLiBVbiBmcmVzaCBsb2FkIHN1ZWxlIHRlbmVyIGVsIFNXIGFjdGl2by5cbiAgICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBhdXRvLXJlY2FyZ2FuZG8gbGEgcMOhZ2luYSAoMS8xIHBvciBzZXNpw7NuKScpO1xuICAgICAgICB0aGlzLm1hcmtBdXRvUmVsb2FkZWQoKTtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgc3RhdHVzOiAndGltZW91dCcsXG4gICAgICAgICAgcmVsb2FkZWQ6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiAnQXV0by1yZWNhcmdhbmRvIHBhcmEgcmVpbnRlbnRhciBsYSBhY3RpdmFjacOzbicsXG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LCB0aGlzLkVOQUJMRV9XQVRDSERPR19NUyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBmbG93ID0gdGhpcy5ydW5FbmFibGVGbG93KG9wdGlvbnMpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHdhdGNoZG9nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHdhdGNoZG9nKTtcbiAgICAgICAgd2F0Y2hkb2cgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtmbG93LCB3YXRjaGRvZ1Byb21pc2VdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVqbyByZWFsIGRlIGFjdGl2YWNpw7NuLCBzaW4gZWwgd2F0Y2hkb2cgKGxvIGVudnVlbHZlIGBlbmFibGUoKWApLlxuICAgKiBSZXN1ZWx2ZSBzaWVtcHJlIGNvbiB1biBgRW5hYmxlUHVzaFJlc3VsdGAg4oCUIG5vIGhhY2UgdGhyb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuYWJsZUZsb3cob3B0aW9uczogRW5hYmxlUHVzaE9wdGlvbnMpOiBQcm9taXNlPEVuYWJsZVB1c2hSZXN1bHQ+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzU3VwcG9ydGVkKCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tNZXNzYWdpbmddIGVuYWJsZTogRkNNIG5vIHNvcG9ydGFkbycpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiAndW5zdXBwb3J0ZWQnLCByZWFzb246ICdGQ00gbm8gc29wb3J0YWRvIGVuIGVzdGUgbmF2ZWdhZG9yJyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBwZXJtaXNzaW9uIOKGkiBTVyByZWFkeSDihpIgZ2V0VG9rZW4gKHJlcXVlc3RQZXJtaXNzaW9uIGVuY2FkZW5hIGxhcyAzKS5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbigpO1xuXG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIC8vIHJlcXVlc3RQZXJtaXNzaW9uIGRldnVlbHZlIG51bGwgdGFudG8gcG9yIHBlcm1pc28gZGVuZWdhZG8gY29tbyBwb3JcbiAgICAgICAgLy8gZmFsbG8gYWwgb2J0ZW5lciBlbCB0b2tlbi4gRGlzdGl2ZHNtb3MgcG9yIGVsIGVzdGFkbyBkZWwgcGVybWlzby5cbiAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHRoaXMuZ2V0UGVybWlzc2lvblN0YXRlKCk7XG4gICAgICAgIGlmIChwZXJtaXNzaW9uID09PSAnZGVuaWVkJyB8fCBwZXJtaXNzaW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICdkZW5pZWQnLCByZWFzb246ICdQZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzIGRlbmVnYWRvJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogJ2Vycm9yJywgcmVhc29uOiAnTm8gc2UgcHVkbyBvYnRlbmVyIGVsIHRva2VuIEZDTScgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVnaXN0cm8gZGUgZGV2aWNlIGVuIGJhY2tlbmQgKG9wY2lvbmFsIOKAlCBlbCBjYWxsZXIgcGFzYSBlbCBjYWxsYmFjaykuXG4gICAgICBpZiAob3B0aW9ucy5yZWdpc3RlckRldmljZSkge1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gYXdhaXQgb3B0aW9ucy5yZWdpc3RlckRldmljZSh0b2tlbik7XG4gICAgICAgIGlmICghcmVnaXN0ZXJlZCkge1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogJ2Vycm9yJywgdG9rZW4sIHJlYXNvbjogJ05vIHNlIHB1ZG8gcmVnaXN0cmFyIGVsIGRpc3Bvc2l0aXZvJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIMOJeGl0bzogZXN0YWRvIHRlcm1pbmFsLiBMaW1waWFyIGVsIGZsYWcgYW50aS1sb29wIHBhcmEgZnV0dXJvcyBpbnRlbnRvcy5cbiAgICAgIHRoaXMuY2xlYXJBdXRvUmVsb2FkRmxhZygpO1xuICAgICAgY29uc29sZS5sb2coJ1tNZXNzYWdpbmddIGVuYWJsZSgpIHN1Y2Nlc3MnKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogJ2VuYWJsZWQnLCB0b2tlbiB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNZXNzYWdpbmddIGVuYWJsZSgpIGVycm9yOicsIHJlYXNvbiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiAnZXJyb3InLCByZWFzb24gfTtcbiAgICB9XG4gIH1cblxuICAvKiogVHJ1ZSBzaSB5YSBzZSBhdXRvLXJlY2FyZ8OzIHVuYSB2ZXogZW4gZXN0YSBzZXNpw7NuLiAqL1xuICBwcml2YXRlIGhhc0F1dG9SZWxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5BVVRPUkVMT0FEX0ZMQUcpID09PSAnMSc7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBzZXNzaW9uU3RvcmFnZSBwdWVkZSBubyBlc3RhciBkaXNwb25pYmxlIChtb2RvIHByaXZhZG8gZXN0cmljdG8sIFNTUikuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1hcmNhIHF1ZSBzZSBjb25zdW1pw7MgZWwgYXV0by1yZWxvYWQgZGUgZXN0YSBzZXNpw7NuLiAqL1xuICBwcml2YXRlIG1hcmtBdXRvUmVsb2FkZWQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5BVVRPUkVMT0FEX0ZMQUcsICcxJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzZXNzaW9uU3RvcmFnZSBubyBkaXNwb25pYmxlIOKAlCBiZXN0LWVmZm9ydC4gKi9cbiAgICB9XG4gIH1cblxuICAvKiogTGltcGlhIGVsIGZsYWcgYW50aS1sb29wIOKAlCB0cmFzIHVuIMOpeGl0byBvIHVuIGZhbGxvIGRlZmluaXRpdm8uICovXG4gIHByaXZhdGUgY2xlYXJBdXRvUmVsb2FkRmxhZygpOiB2b2lkIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLkFVVE9SRUxPQURfRkxBRyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBzZXNzaW9uU3RvcmFnZSBubyBkaXNwb25pYmxlIOKAlCBuYWRhIHF1ZSBsaW1waWFyLiAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHRva2VuIEZDTSBhY3R1YWwgKHNpbiBzb2xpY2l0YXIgcGVybWlzbykuXG4gICAqXG4gICAqIEByZXR1cm5zIFRva2VuIEZDTSBzaSBlc3TDoSBkaXNwb25pYmxlLCBudWxsIHNpIG5vXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCBtZXNzYWdpbmcuZ2V0VG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zb2xlLmxvZygnW01lc3NhZ2luZ10gZ2V0VG9rZW4oKSBzdGFydCcpO1xuICAgIGNvbnN0IG1lc3NhZ2luZyA9IGF3YWl0IHRoaXMuZ2V0TWVzc2FnaW5nSW5zdGFuY2UoKTtcbiAgICBpZiAoIW1lc3NhZ2luZykge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBnZXRUb2tlbiBhYm9ydGVkOiBubyBNZXNzYWdpbmcgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcGlkS2V5ID0gdGhpcy5jb25maWcubWVzc2FnaW5nVmFwaWRLZXk7XG4gICAgaWYgKCF2YXBpZEtleSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW01lc3NhZ2luZ10gVkFQSUQga2V5IG5vIGNvbmZpZ3VyYWRhIChjb25maWcubWVzc2FnaW5nVmFwaWRLZXkpLiBGQ00gbm8gZnVuY2lvbmFyw6EuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXV0aWxpemFyIGVsIFNXIHlhIHJlZ2lzdHJhZG8gKGVuIGNvbmZpZy50cyBkdXJhbnRlIGVsIGJvb3RzdHJhcCkgZW5cbiAgICAgIC8vIGx1Z2FyIGRlIHJlLXJlZ2lzdHJhcmxvIGVuIGNhZGEgbGxhbWFkYSDigJQgcmUtcmVnaXN0cmFyIGRpc3BhcmFcbiAgICAgIC8vIHJldmFsaWRhY2lvbmVzIGRlbCBTVyBlbiBpT1MgUFdBLiBTb2xvIHJlZ2lzdHJhbW9zIHNpIG5vIGV4aXN0ZSBhw7puLlxuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgdGhpcy5yZXNvbHZlU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbigpO1xuICAgICAgY29uc29sZS5sb2coJ1tNZXNzYWdpbmddIFNXIHJlc29sdmVkLCB3YWl0aW5nIHJlYWR5Li4uJyk7XG4gICAgICAvLyBFc3BlcmFyIGEgcXVlIGVsIFNXIGVzdMOpIGFjdGl2bywgY29uIHRpbWVvdXQ6IGBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5yZWFkeWBcbiAgICAgIC8vIHB1ZWRlIG5vIHJlc29sdmVyIE5VTkNBIGVuIHVuIGNvbGQgbG9hZCAoU1cgYcO6biBubyBhY3RpdmFkbykg4oaSIHNpbiBlbFxuICAgICAgLy8gdGltZW91dCBgZ2V0VG9rZW4oKWAgc2UgY3VlbGdhIGluZGVmaW5pZGFtZW50ZS4gQ29uIGVsIHJhY2UsIHNpIGVsIFNXIG5vXG4gICAgICAvLyBxdWVkYSBsaXN0byBlbiBTV19SRUFEWV9USU1FT1VUX01TLCBlc3RhIHByb21lc2EgcmVjaGF6YSBsaW1waW8uXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTZXJ2aWNlV29ya2VyUmVhZHkoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdbTWVzc2FnaW5nXSBTVyByZWFkeSwgY2FsbGluZyBGaXJlYmFzZSBnZXRUb2tlbigpLi4uJyk7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy53aXRoVGltZW91dChcbiAgICAgICAgZ2V0VG9rZW4obWVzc2FnaW5nLCB7XG4gICAgICAgICAgdmFwaWRLZXksXG4gICAgICAgICAgc2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbjogcmVnaXN0cmF0aW9uLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy5GQ01fR0VUX1RPS0VOX1RJTUVPVVRfTVMsXG4gICAgICAgIGBbTWVzc2FnaW5nXSBGaXJlYmFzZSBnZXRUb2tlbiBubyByZXNwb25kacOzIGVuICR7dGhpcy5GQ01fR0VUX1RPS0VOX1RJTUVPVVRfTVMgLyAxMDAwfXNgXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ1tNZXNzYWdpbmddIEZpcmViYXNlIGdldFRva2VuIHJldHVybmVkOicsXG4gICAgICAgIHRva2VuID8gYCR7dG9rZW4uc2xpY2UoMCwgMTYpfeKApmAgOiAnbnVsbC9lbXB0eSdcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuc3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICAuLi50aGlzLnN0YXRlU3ViamVjdC52YWx1ZSxcbiAgICAgICAgdG9rZW4sXG4gICAgICB9KTtcblxuICAgICAgLy8gUGVyc2lzdGlyIGVsIHRva2VuIHBhcmEgaGlkcmF0YXIgZWwgZXN0YWRvIGVuIGZ1dHVyb3MgY29sZCBzdGFydHMuXG4gICAgICB0aGlzLnBlcnNpc3RUb2tlbih0b2tlbik7XG5cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTm8gdHJhZ2Ftb3MgbGEgY2F1c2E6IGxvZ3VlYW1vcyBlbCBkZXRhbGxlIHBhcmEgZGlhZ27Ds3N0aWNvLiBMYSBmaXJtYVxuICAgICAgLy8gc2lndWUgc2llbmRvIFByb21pc2U8c3RyaW5nIHwgbnVsbD4gcGFyYSBubyByb21wZXIgY2FsbGVycy5cbiAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc29sZS5lcnJvcignW01lc3NhZ2luZ10gZ2V0VG9rZW4gZXJyb3I6JywgcmVhc29uLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzdWVsdmUgZWwgYFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb25gIGRlbCBTVyBkZSBGQ00uXG4gICAqXG4gICAqIEVsIFNXIGRlIEZDTSB5YSBzZSByZWdpc3RyYSB1bmEgdmV6IGVuIGVsIGJvb3RzdHJhcCBkZSBsYSBhcHAgKGBjb25maWcudHNgKVxuICAgKiBjb24gdW4gc2NvcGUgZGVkaWNhZG8uIFJldXRpbGl6YW1vcyBlc2UgcmVnaXN0cm8gZW4gbHVnYXIgZGUgcmUtcmVnaXN0cmFybG9cbiAgICogZW4gY2FkYSBgZ2V0VG9rZW4oKWAg4oCUIHJlLXJlZ2lzdHJhciByZXBldGlkYW1lbnRlIGRpc3BhcmEgcmV2YWxpZGFjaW9uZXMgZGVsXG4gICAqIFNXIGVuIGlPUyBQV0EuIFNvbG8gcmVnaXN0cmFtb3MgY29tbyBmYWxsYmFjayBzaSB0b2RhdsOtYSBubyBleGlzdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVTZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKCk6IFByb21pc2U8U2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kRmNtU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbigpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdbTWVzc2FnaW5nXSBTVyByZWdpc3RyYXRpb24gcmVzb2x2ZWQ6JyxcbiAgICAgICAgZXhpc3Rpbmcuc2NvcGUsXG4gICAgICAgIGV4aXN0aW5nLmFjdGl2ZT8uc2NyaXB0VVJMIHx8IGV4aXN0aW5nLmluc3RhbGxpbmc/LnNjcmlwdFVSTCB8fCBleGlzdGluZy53YWl0aW5nPy5zY3JpcHRVUkxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gU1cgbm90IHJlZ2lzdGVyZWQgeWV0LCByZWdpc3RlcmluZyBhcyBmYWxsYmFjaycpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlZ2lzdGVyKHRoaXMuRkNNX1NXX1VSTCwge1xuICAgICAgc2NvcGU6IHRoaXMuRkNNX1NXX1NDT1BFLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ1tNZXNzYWdpbmddIFNXIHJlZ2lzdHJhdGlvbiBjcmVhdGVkOicsXG4gICAgICByZWdpc3RyYXRpb24uc2NvcGUsXG4gICAgICByZWdpc3RyYXRpb24uYWN0aXZlPy5zY3JpcHRVUkwgfHwgcmVnaXN0cmF0aW9uLmluc3RhbGxpbmc/LnNjcmlwdFVSTCB8fCByZWdpc3RyYXRpb24ud2FpdGluZz8uc2NyaXB0VVJMXG4gICAgKTtcbiAgICByZXR1cm4gcmVnaXN0cmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRmNtU2VydmljZVdvcmtlclJlZ2lzdHJhdGlvbigpOiBQcm9taXNlPFNlcnZpY2VXb3JrZXJSZWdpc3RyYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBleHBlY3RlZFNjb3BlID0gbmV3IFVSTCh0aGlzLkZDTV9TV19TQ09QRSwgd2luZG93LmxvY2F0aW9uLm9yaWdpbikuaHJlZjtcbiAgICBjb25zdCByZWdpc3RyYXRpb25zID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIuZ2V0UmVnaXN0cmF0aW9ucygpO1xuICAgIHJldHVybiByZWdpc3RyYXRpb25zLmZpbmQocmVnaXN0cmF0aW9uID0+IHJlZ2lzdHJhdGlvbi5zY29wZSA9PT0gZXhwZWN0ZWRTY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogRXNwZXJhIGEgcXVlIGVsIFNlcnZpY2UgV29ya2VyIHF1ZWRlIGFjdGl2byAoYG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5YClcbiAgICogcGVybyBjb24gdW4gdGltZW91dCBkdXJvLlxuICAgKlxuICAgKiBgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHlgIHJlc3VlbHZlIGN1YW5kbyBoYXkgdW4gU1cgKmFjdGl2byouIEVuIHVuXG4gICAqIGNvbGQgbG9hZCAocHJpbWVyYSB2aXNpdGEsIFNXIHJlY2nDqW4gcmVnaXN0cmFkbywgaU9TIFBXQSByZWNpw6luIGFiaWVydGEpIGVsXG4gICAqIFNXIHB1ZWRlIHF1ZWRhciBlbiBlc3RhZG8gYGluc3RhbGxpbmdgL2B3YWl0aW5nYCB5IGByZWFkeWAgbm8gcmVzb2x2ZXIgbnVuY2FcbiAgICog4oaSIGBnZXRUb2tlbigpYCBzZSBjdWVsZ2EuIEVsIGBQcm9taXNlLnJhY2VgIGNvbnRyYSB1biBgc2V0VGltZW91dGAgZ2FyYW50aXphXG4gICAqIHF1ZSBlc3RhIGVzcGVyYSB0ZXJtaW5hOiBvIGdhbmEgYHJlYWR5YCAoY2FzbyBub3JtYWwpIG8gZ2FuYSBlbCB0aW1lb3V0IHlcbiAgICogbGFuemFtb3MgdW4gZXJyb3IgY2xhcm8gcGFyYSBxdWUgYGdldFRva2VuKClgIHJlY2hhY2UgZW4gdmV6IGRlIGNvbGdhcnNlLlxuICAgKlxuICAgKiBFbCB0aW1lciBzZSBsaW1waWEgZW4gYW1iYXMgcmFtYXMgcGFyYSBubyBkZWphciB0aW1lcnMgY29sZ2FuZG8uXG4gICAqL1xuICBwcml2YXRlIHdhaXRGb3JTZXJ2aWNlV29ya2VyUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aFRpbWVvdXQoXG4gICAgICB0aGlzLmZpbmRGY21TZXJ2aWNlV29ya2VyUmVnaXN0cmF0aW9uKCkudGhlbihyZWdpc3RyYXRpb24gPT4ge1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW01lc3NhZ2luZ10gc2VydmljZSB3b3JrZXIgRkNNIG5vIHJlZ2lzdHJhZG8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVnaXN0cmF0aW9uLmFjdGl2ZSkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCB3b3JrZXIgPSByZWdpc3RyYXRpb24uaW5zdGFsbGluZyB8fCByZWdpc3RyYXRpb24ud2FpdGluZztcbiAgICAgICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignW01lc3NhZ2luZ10gc2VydmljZSB3b3JrZXIgRkNNIHNpbiB3b3JrZXIgYWN0aXZvJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAod29ya2VyLnN0YXRlID09PSAnYWN0aXZhdGVkJykgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgaWYgKHdvcmtlci5zdGF0ZSA9PT0gJ3JlZHVuZGFudCcpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignW01lc3NhZ2luZ10gc2VydmljZSB3b3JrZXIgRkNNIHF1ZWTDsyByZWR1bmRhbnRlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5TV19SRUFEWV9USU1FT1VUX01TLFxuICAgICAgYFtNZXNzYWdpbmddIHNlcnZpY2Ugd29ya2VyIG5vIHF1ZWTDsyBsaXN0byBlbiAke3RoaXMuU1dfUkVBRFlfVElNRU9VVF9NUyAvIDEwMDB9c2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoVGltZW91dDxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IobWVzc2FnZSkpLCBtcyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZW91dF0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGUgZWwgdG9rZW4gRkNNIGVuIGxvY2FsU3RvcmFnZSAobyBsbyBsaW1waWEgc2kgZXMgbnVsbC9lbXB0eSkuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RUb2tlbih0b2tlbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSwgdG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSB0b2tlbiBwZXJzaXN0ZW5jZSBmYWlsZWQ6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZHJhdGEgZWwgZXN0YWRvIGRlbCB0b2tlbiBkZXNkZSBsb2NhbFN0b3JhZ2UgZW4gZWwgYXJyYW5xdWUgZGVsIHNlcnZpY2lvLlxuICAgKi9cbiAgcHJpdmF0ZSBoeWRyYXRlVG9rZW5Gcm9tU3RvcmFnZSgpOiB2b2lkIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5UT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHRoaXMuc2V0VG9rZW5Gcm9tU3RvcmFnZShjYWNoZWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW01lc3NhZ2luZ10gdG9rZW4gaHlkcmF0aW9uIGZhaWxlZDonLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRWxpbWluYSBlbCB0b2tlbiBGQ00gYWN0dWFsICh1bnN1YnNjcmliZSBkZSBub3RpZmljYWNpb25lcykuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgbWVzc2FnaW5nLmRlbGV0ZVRva2VuKCk7XG4gICAqIGNvbnNvbGUubG9nKCdUb2tlbiBlbGltaW5hZG8sIG5vIHJlY2liaXLDoSBtw6FzIG5vdGlmaWNhY2lvbmVzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWVzc2FnaW5nID0gYXdhaXQgdGhpcy5nZXRNZXNzYWdpbmdJbnN0YW5jZSgpO1xuICAgIGlmICghbWVzc2FnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRlbGV0ZVRva2VuKG1lc3NhZ2luZyk7XG5cbiAgICAgIHRoaXMuc3RhdGVTdWJqZWN0Lm5leHQoe1xuICAgICAgICAuLi50aGlzLnN0YXRlU3ViamVjdC52YWx1ZSxcbiAgICAgICAgdG9rZW46IG51bGwsXG4gICAgICB9KTtcblxuICAgICAgLy8gTGltcGlhciBlbCB0b2tlbiBwZXJzaXN0aWRvIOKAlCB5YSBubyBlc3RhbW9zIHN1c2NyaXRvcy5cbiAgICAgIHRoaXMucGVyc2lzdFRva2VuKG51bGwpO1xuXG4gICAgICAvLyBMaW1waWFyIGxpc3RlbmVyIGRlIG1lbnNhamVzXG4gICAgICBpZiAodGhpcy51bnN1YnNjcmliZU9uTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlT25NZXNzYWdlKCk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVPbk1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGVsaW1pbmFuZG8gdG9rZW4gRkNNOicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc2UgcHVkbyBlbGltaW5hciBlbCB0b2tlbiBkZSBub3RpZmljYWNpb25lcycpO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRU5TQUpFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBkZSBtZW5zYWplcyByZWNpYmlkb3MgZW4gZm9yZWdyb3VuZC5cbiAgICpcbiAgICogSU1QT1JUQU5URTogTG9zIG1lbnNhamVzIGVuIGJhY2tncm91bmQgc29uIG1hbmVqYWRvcyBwb3IgZWwgU2VydmljZSBXb3JrZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIGN1YW5kbyBsbGVnYSB1biBtZW5zYWplIGVuIGZvcmVncm91bmRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBtZXNzYWdpbmcub25NZXNzYWdlKCkuc3Vic2NyaWJlKHBheWxvYWQgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdNZW5zYWplIHJlY2liaWRvOicsIHBheWxvYWQpO1xuICAgKiAgIC8vIE1vc3RyYXIgbm90aWZpY2FjacOzbiBjdXN0b20gbyBhY3R1YWxpemFyIFVJXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIG9uTWVzc2FnZSgpOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblBheWxvYWQ+IHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmEgZWwgbGlzdGVuZXIgZGUgbWVuc2FqZXMgZW4gZm9yZWdyb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cE1lc3NhZ2VMaXN0ZW5lcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXNzYWdpbmcgPSBhd2FpdCB0aGlzLmdldE1lc3NhZ2luZ0luc3RhbmNlKCk7XG4gICAgaWYgKCFtZXNzYWdpbmcgfHwgdGhpcy51bnN1YnNjcmliZU9uTWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudW5zdWJzY3JpYmVPbk1lc3NhZ2UgPSBvbk1lc3NhZ2UobWVzc2FnaW5nLCBwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUGF5bG9hZCA9IHtcbiAgICAgICAgdGl0bGU6IHBheWxvYWQubm90aWZpY2F0aW9uPy50aXRsZSxcbiAgICAgICAgYm9keTogcGF5bG9hZC5ub3RpZmljYXRpb24/LmJvZHksXG4gICAgICAgIGltYWdlOiBwYXlsb2FkLm5vdGlmaWNhdGlvbj8uaW1hZ2UsXG4gICAgICAgIGRhdGE6IHBheWxvYWQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgICAgICBtZXNzYWdlSWQ6IHBheWxvYWQubWVzc2FnZUlkLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5tZXNzYWdlU3ViamVjdC5uZXh0KG5vdGlmaWNhdGlvbik7XG5cbiAgICAgIC8vIFBlcnNpc3RpciBlbiBsb2NhbFN0b3JhZ2UgcGFyYSBkZWJ1Z2dpbmcgc2kgZXN0w6EgaGFiaWxpdGFkb1xuICAgICAgaWYgKHRoaXMuZGVidWdQZXJzaXN0ZW5jZSkge1xuICAgICAgICB0aGlzLnBlcnNpc3RNZXNzYWdlRm9yRGVidWcobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJzaXN0ZSB1biBtZW5zYWplIEZDTSBlbiBsb2NhbFN0b3JhZ2UgcGFyYSBkZWJ1Z2dpbmcuXG4gICAqIFNvbG8gc2UgdXNhIGN1YW5kbyBkZWJ1Z01lc3NhZ2VQZXJzaXN0ZW5jZSBlc3TDoSBoYWJpbGl0YWRvLlxuICAgKiBNYW50aWVuZSBsb3Mgw7psdGltb3MgNTAgbWVuc2FqZXMuXG4gICAqL1xuICBwcml2YXRlIHBlcnNpc3RNZXNzYWdlRm9yRGVidWcobWVzc2FnZTogTm90aWZpY2F0aW9uUGF5bG9hZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkRFQlVHX1NUT1JBR0VfS0VZKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogW107XG4gICAgICBtZXNzYWdlcy51bnNoaWZ0KHsgLi4ubWVzc2FnZSwgcmVjZWl2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pO1xuICAgICAgLy8gTWFudGVuZXIgc29sbyDDumx0aW1vcyA1MFxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5ERUJVR19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkobWVzc2FnZXMuc2xpY2UoMCwgNTApKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdbTWVzc2FnaW5nXSBEZWJ1ZyBwZXJzaXN0ZW5jZSBmYWlsZWQ6JywgZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTVEFETyBZIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZWwgZXN0YWRvIGFjdHVhbCBkZWwgcGVybWlzbyBkZSBub3RpZmljYWNpb25lcy5cbiAgICpcbiAgICogQHJldHVybnMgJ2dyYW50ZWQnIHwgJ2RlbmllZCcgfCAnZGVmYXVsdCdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwZXJtaXNzaW9uID0gbWVzc2FnaW5nLmdldFBlcm1pc3Npb25TdGF0ZSgpO1xuICAgKiBpZiAocGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSB7XG4gICAqICAgLy8gWWEgdGllbmUgcGVybWlzb1xuICAgKiB9IGVsc2UgaWYgKHBlcm1pc3Npb24gPT09ICdkZWZhdWx0Jykge1xuICAgKiAgIC8vIFB1ZWRlIHNvbGljaXRhciBwZXJtaXNvXG4gICAqIH0gZWxzZSB7XG4gICAqICAgLy8gRGVuZWdhZG8sIGRlYmUgaGFiaWxpdGFyIG1hbnVhbG1lbnRlXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRQZXJtaXNzaW9uU3RhdGUoKTogTm90aWZpY2F0aW9uUGVybWlzc2lvbiB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJ2RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHtcbiAgICAgIHJldHVybiAnZGVuaWVkJztcbiAgICB9XG5cbiAgICByZXR1cm4gTm90aWZpY2F0aW9uLnBlcm1pc3Npb24gYXMgTm90aWZpY2F0aW9uUGVybWlzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBGQ00gZXN0w6Egc29wb3J0YWRvIGVuIGVsIG5hdmVnYWRvciBhY3R1YWwuXG4gICAqIFVzYSBsw7NnaWNhIGludGVsaWdlbnRlIHBhcmEgZXZpdGFyIGZhbHNvcyBuZWdhdGl2b3MgcG9yIHRpbWluZyBkZWwgSW5qZWN0b3IuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgc2kgRkNNIGVzdMOhIHNvcG9ydGFkb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChhd2FpdCBtZXNzYWdpbmcuaXNTdXBwb3J0ZWQoKSkge1xuICAgKiAgIC8vIFB1ZWRlIHVzYXIgbm90aWZpY2FjaW9uZXMgcHVzaFxuICAgKiB9IGVsc2Uge1xuICAgKiAgIC8vIE5hdmVnYWRvciBubyBzb3BvcnRhIG8gbm8gdGllbmUgU2VydmljZSBXb3JrZXJcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzU3VwcG9ydGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFNpIHlhIHRlbmVtb3MgdG9rZW4gZW4gZXN0YWRvLCBjbGFyYW1lbnRlIEZDTSBmdW5jaW9uYVxuICAgIGlmICh0aGlzLnN0YXRlU3ViamVjdC52YWx1ZS50b2tlbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gU2kgeWEgY2FsY3VsYW1vcyBzb3BvcnRlIGV4aXRvc2FtZW50ZSwgdXNhcmxvXG4gICAgaWYgKHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLmlzU3VwcG9ydGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYWNpb25lcyBiw6FzaWNhcyDigJQgQVBJcyBkZWwgYnJvd3NlclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoISgnTm90aWZpY2F0aW9uJyBpbiB3aW5kb3cpIHx8ICEoJ3NlcnZpY2VXb3JrZXInIGluIG5hdmlnYXRvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpT1Mg4oCUIHNvbG8gc29wb3J0YSBwdXNoIHdlYiBjdWFuZG8gbGEgUFdBIGVzdMOhIGluc3RhbGFkYSBlbiBob21lIHNjcmVlblxuICAgIC8vIChpT1MgMTYuNCspLiBFZGdlL0Nocm9tZS9GaXJlZm94IGVuIGlPUyBjb21wYXJ0ZW4gZXN0YSBsaW1pdGFjacOzbiBwb3JxdWVcbiAgICAvLyBlc3TDoW4gb2JsaWdhZG9zIGEgdXNhciBXZWJLaXQuIFJldG9ybmFtb3MgZmFsc2UgYXF1w60gcGFyYSBxdWUgbGEgVUkgbXVlc3RyZVxuICAgIC8vIGVsIGZsdWpvIFwiaW5zdGFsYSBsYSBhcHBcIiBlbiBsdWdhciBkZSB1biBDVEEgcXVlIHZhIGEgZmFsbGFyLlxuICAgIGlmICh0aGlzLmlzSU9TV2l0aG91dFN0YW5kYWxvbmUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE5PVEE6IGRlbGliZXJhZGFtZW50ZSBOTyBjaGVxdWVhbW9zIGBnZXRNZXNzYWdpbmdJbnN0YW5jZSgpYCBhcXXDrSBwb3JxdWVcbiAgICAvLyBlbCBmYWN0b3J5IGBwcm92aWRlTWVzc2FnaW5nKCgpID0+IGdldE1lc3NhZ2luZygpKWAgZXMgbGF6eSBlbiBBbmd1bGFyXG4gICAgLy8gRmlyZSB5IHB1ZWRlIG5vIGVzdGFyIHJlc3VlbHRvIGN1YW5kbyBlc3RhIGZ1bmNpw7NuIHNlIGxsYW1hIHRlbXByYW5vXG4gICAgLy8gZW4gZWwgY2ljbG8gZGUgdmlkYS4gRXNvIGNhdXNhYmEgZmFsc29zIG5lZ2F0aXZvcy4gU2kgRkNNIHJlYWxtZW50ZSBub1xuICAgIC8vIGVzdMOhIGRpc3BvbmlibGUgKHByb3llY3RvIHNpbiBNZXNzYWdpbmcgaGFiaWxpdGFkbywgVkFQSUQgaW52w6FsaWRvKSwgZWxcbiAgICAvLyBmbG93IGRvd25zdHJlYW0gKGBnZXRUb2tlbmAvYHJlcXVlc3RQZXJtaXNzaW9uYCkgZmFsbGFyw6EgY29uIGVycm9yIHJlYWwsXG4gICAgLy8gcXVlIGVzIG1lam9yIFVYIHF1ZSB1biBcIm5vIHNvcG9ydGFkb1wiIHByZW1hdHVyby5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpT1Mgc2luIGVzdGFyIGluc3RhbGFkbyBjb21vIFBXQSBzdGFuZGFsb25lIOKAlCBwdXNoIHdlYiBubyBkaXNwb25pYmxlLlxuICAgKiBBcGxpY2EgYSBTYWZhcmkgeSBhIEVkZ2UvQ2hyb21lL0ZpcmVmb3ggZW4gaU9TICh0b2RvcyBXZWJLaXQgcG9yIG1hbmRhdG8gQXBwbGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0lPU1dpdGhvdXRTdGFuZGFsb25lKCk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHVhID0gKG5hdmlnYXRvciBhcyBOYXZpZ2F0b3IpLnVzZXJBZ2VudCB8fCAnJztcbiAgICBjb25zdCBpc0lPUyA9IC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVhKTtcbiAgICBpZiAoIWlzSU9TKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgaXNTdGFuZGFsb25lID1cbiAgICAgIHdpbmRvdy5tYXRjaE1lZGlhPy4oJyhkaXNwbGF5LW1vZGU6IHN0YW5kYWxvbmUpJykubWF0Y2hlcyB8fFxuICAgICAgKG5hdmlnYXRvciBhcyB1bmtub3duIGFzIHsgc3RhbmRhbG9uZT86IGJvb2xlYW4gfSkuc3RhbmRhbG9uZSA9PT0gdHJ1ZTtcbiAgICByZXR1cm4gIWlzU3RhbmRhbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGVsIHRva2VuIGFjdHVhbCBzaW4gaGFjZXIgcmVxdWVzdC5cbiAgICpcbiAgICogQHJldHVybnMgVG9rZW4gYWxtYWNlbmFkbyBvIG51bGxcbiAgICovXG4gIGdldCBjdXJyZW50VG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLnRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgZGVsIGVzdGFkbyBjb21wbGV0byBkZWwgc2VydmljaW8gZGUgbWVzc2FnaW5nLlxuICAgKi9cbiAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPE1lc3NhZ2luZ1N0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIGVsIHVzdWFyaW8geWEgb3RvcmfDsyBwZXJtaXNvIGRlIG5vdGlmaWNhY2lvbmVzLlxuICAgKi9cbiAgZ2V0IGhhc1Blcm1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTdWJqZWN0LnZhbHVlLnBlcm1pc3Npb24gPT09ICdncmFudGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRyYXRhIGVsIGVzdGFkbyBkZWwgdG9rZW4gZGVzZGUgdW4gdmFsb3IgZXh0ZXJubyAoZWo6IGxvY2FsU3RvcmFnZSkuXG4gICAqIMOadGlsIGN1YW5kbyBlbCB0b2tlbiB5YSBleGlzdGUgcGVybyBlbCBNZXNzYWdpbmdTZXJ2aWNlIG5vIGxvIHRpZW5lIGVuIG1lbW9yaWEuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiBUb2tlbiBGQ00gYSBzZXRlYXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdG9yZWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmY21fdG9rZW4nKTtcbiAgICogaWYgKHN0b3JlZFRva2VuKSB7XG4gICAqICAgbWVzc2FnaW5nLnNldFRva2VuRnJvbVN0b3JhZ2Uoc3RvcmVkVG9rZW4pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0VG9rZW5Gcm9tU3RvcmFnZSh0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dCh7XG4gICAgICAuLi50aGlzLnN0YXRlU3ViamVjdC52YWx1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgaXNTdXBwb3J0ZWQ6IHRydWUsIC8vIFNpIGhheSB0b2tlbiwgY2xhcmFtZW50ZSBGQ00gZnVuY2lvbmFcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBERUVQIExJTktJTkcgLyBOQVZFR0FDScOTTlxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBkZSBjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMuXG4gICAqXG4gICAqIEVtaXRlIGN1YW5kbyBlbCB1c3VhcmlvIGhhY2UgY2xpY2sgZW4gdW5hIG5vdGlmaWNhY2nDs24gKGZvcmVncm91bmQgbyBiYWNrZ3JvdW5kKS5cbiAgICogVXNhIGVzdGUgb2JzZXJ2YWJsZSBwYXJhIG5hdmVnYXIgYSBsYSBww6FnaW5hIGNvcnJlc3BvbmRpZW50ZS5cbiAgICpcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBxdWUgZW1pdGUgTm90aWZpY2F0aW9uQ2xpY2tFdmVudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBDb21wb25lbnQoey4uLn0pXG4gICAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgKiAgIHByaXZhdGUgbWVzc2FnaW5nID0gaW5qZWN0KE1lc3NhZ2luZ1NlcnZpY2UpO1xuICAgKiAgIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAqICAgICB0aGlzLm1lc3NhZ2luZy5vbk5vdGlmaWNhdGlvbkNsaWNrKCkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICogICAgICAgaWYgKGV2ZW50LmFjdGlvbi5yb3V0ZSkge1xuICAgKiAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtldmVudC5hY3Rpb24ucm91dGVdLCB7XG4gICAqICAgICAgICAgICBxdWVyeVBhcmFtczogZXZlbnQuYWN0aW9uLnF1ZXJ5UGFyYW1zXG4gICAqICAgICAgICAgfSk7XG4gICAqICAgICAgIH1cbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG9uTm90aWZpY2F0aW9uQ2xpY2soKTogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25DbGlja0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uQ2xpY2tTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhZSBsYSBhY2Npw7NuIGRlIG5hdmVnYWNpw7NuIGRlIGxvcyBkYXRvcyBkZSB1bmEgbm90aWZpY2FjacOzbi5cbiAgICpcbiAgICogQnVzY2EgY2FtcG9zIGVzcGVjw61maWNvcyBlbiBlbCBwYXlsb2FkIGRlIGRhdG9zOlxuICAgKiAtIGByb3V0ZWA6IFJ1dGEgaW50ZXJuYSBkZSBsYSBhcHAgKGVqOiAnL29yZGVycy8xMjMnKVxuICAgKiAtIGB1cmxgOiBVUkwgZXh0ZXJuYSAoZWo6ICdodHRwczovL2V4YW1wbGUuY29tJylcbiAgICogLSBgYWN0aW9uX3R5cGVgOiBUaXBvIGRlIGFjY2nDs24gcGVyc29uYWxpemFkYVxuICAgKiAtIENhbXBvcyBjb24gcHJlZmlqbyBgYWN0aW9uX2A6IERhdG9zIGFkaWNpb25hbGVzXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gRGF0b3MgZGVsIHBheWxvYWQgZGUgbGEgbm90aWZpY2FjacOzblxuICAgKiBAcmV0dXJucyBBY2Npw7NuIGRlIG5hdmVnYWNpw7NuIGV4dHJhw61kYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFBheWxvYWQgZGVzZGUgZWwgYmFja2VuZDpcbiAgICogLy8geyByb3V0ZTogJy9vcmRlcnMvMTIzJywgYWN0aW9uX3R5cGU6ICd2aWV3X29yZGVyJywgYWN0aW9uX29yZGVySWQ6ICcxMjMnIH1cbiAgICpcbiAgICogY29uc3QgYWN0aW9uID0gbWVzc2FnaW5nLmV4dHJhY3RBY3Rpb25Gcm9tRGF0YShub3RpZmljYXRpb24uZGF0YSk7XG4gICAqIC8vIHsgcm91dGU6ICcvb3JkZXJzLzEyMycsIGFjdGlvblR5cGU6ICd2aWV3X29yZGVyJywgYWN0aW9uRGF0YTogeyBvcmRlcklkOiAnMTIzJyB9IH1cbiAgICogYGBgXG4gICAqL1xuICBleHRyYWN0QWN0aW9uRnJvbURhdGEoZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBOb3RpZmljYXRpb25BY3Rpb24ge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbjogTm90aWZpY2F0aW9uQWN0aW9uID0ge307XG5cbiAgICAvLyBSdXRhIGludGVybmFcbiAgICBpZiAoZGF0YVsncm91dGUnXSkge1xuICAgICAgYWN0aW9uLnJvdXRlID0gZGF0YVsncm91dGUnXTtcbiAgICB9XG5cbiAgICAvLyBVUkwgZXh0ZXJuYVxuICAgIGlmIChkYXRhWyd1cmwnXSkge1xuICAgICAgYWN0aW9uLnVybCA9IGRhdGFbJ3VybCddO1xuICAgIH1cblxuICAgIC8vIFRpcG8gZGUgYWNjacOzblxuICAgIGlmIChkYXRhWydhY3Rpb25fdHlwZSddKSB7XG4gICAgICBhY3Rpb24uYWN0aW9uVHlwZSA9IGRhdGFbJ2FjdGlvbl90eXBlJ107XG4gICAgfVxuXG4gICAgLy8gUXVlcnkgcGFyYW1zIChwdWVkZSB2ZW5pciBjb21vIEpTT04gc3RyaW5nKVxuICAgIGlmIChkYXRhWydxdWVyeV9wYXJhbXMnXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0aW9uLnF1ZXJ5UGFyYW1zID0gSlNPTi5wYXJzZShkYXRhWydxdWVyeV9wYXJhbXMnXSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU2kgbm8gZXMgSlNPTiB2w6FsaWRvLCBpbnRlbnRhciBwYXJzZWFyIGNvbW8ga2V5PXZhbHVlXG4gICAgICAgIGFjdGlvbi5xdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVN0cmluZyhkYXRhWydxdWVyeV9wYXJhbXMnXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGF0b3MgYWRpY2lvbmFsZXMgY29uIHByZWZpam8gYWN0aW9uX1xuICAgIGNvbnN0IGFjdGlvbkRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnYWN0aW9uXycpICYmIGtleSAhPT0gJ2FjdGlvbl90eXBlJykge1xuICAgICAgICBjb25zdCBjbGVhbktleSA9IGtleS5yZXBsYWNlKCdhY3Rpb25fJywgJycpO1xuICAgICAgICAvLyBJbnRlbnRhciBwYXJzZWFyIEpTT04gc2kgZXMgcG9zaWJsZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGFjdGlvbkRhdGFbY2xlYW5LZXldID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGFjdGlvbkRhdGFbY2xlYW5LZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYWN0aW9uRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgYWN0aW9uLmFjdGlvbkRhdGEgPSBhY3Rpb25EYXRhO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogRW1pdGUgbWFudWFsbWVudGUgdW4gZXZlbnRvIGRlIGNsaWNrIGVuIG5vdGlmaWNhY2nDs24uXG4gICAqXG4gICAqIMOadGlsIHBhcmEgbWFuZWphciBjbGlja3MgZW4gbm90aWZpY2FjaW9uZXMgZm9yZWdyb3VuZCBkb25kZVxuICAgKiBsYSBhcHAgZGVjaWRlIG1vc3RyYXIgdW4gYmFubmVyIGN1c3RvbS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGlmaWNhdGlvbiAtIFBheWxvYWQgZGUgbGEgbm90aWZpY2FjacOzblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG1lc3NhZ2luZy5vbk1lc3NhZ2UoKS5zdWJzY3JpYmUobm90aWZpY2F0aW9uID0+IHtcbiAgICogICAvLyBNb3N0cmFyIGJhbm5lciBjdXN0b21cbiAgICogICB0aGlzLnNob3dCYW5uZXIobm90aWZpY2F0aW9uLCAoKSA9PiB7XG4gICAqICAgICAvLyBVc3VhcmlvIGhpem8gY2xpY2sgZW4gZWwgYmFubmVyXG4gICAqICAgICBtZXNzYWdpbmcuaGFuZGxlTm90aWZpY2F0aW9uQ2xpY2sobm90aWZpY2F0aW9uKTtcbiAgICogICB9KTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaGFuZGxlTm90aWZpY2F0aW9uQ2xpY2sobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb25QYXlsb2FkKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5leHRyYWN0QWN0aW9uRnJvbURhdGEobm90aWZpY2F0aW9uLmRhdGEpO1xuXG4gICAgdGhpcy5ub3RpZmljYXRpb25DbGlja1N1YmplY3QubmV4dCh7XG4gICAgICBub3RpZmljYXRpb24sXG4gICAgICBhY3Rpb24sXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpY2Egc2kgdW5hIG5vdGlmaWNhY2nDs24gdGllbmUgYWNjacOzbiBkZSBuYXZlZ2FjacOzbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBEYXRvcyBkZWwgcGF5bG9hZFxuICAgKiBAcmV0dXJucyB0cnVlIHNpIHRpZW5lIHJvdXRlIG8gdXJsXG4gICAqL1xuICBoYXNOYXZpZ2F0aW9uQWN0aW9uKGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhKGRhdGFbJ3JvdXRlJ10gfHwgZGF0YVsndXJsJ10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlYSB1biBxdWVyeSBzdHJpbmcgZW4gdW4gb2JqZXRvLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmICghcXVlcnlTdHJpbmcpIHJldHVybiBwYXJhbXM7XG5cbiAgICAvLyBSZW1vdmVyID8gaW5pY2lhbCBzaSBleGlzdGVcbiAgICBjb25zdCBjbGVhblF1ZXJ5ID0gcXVlcnlTdHJpbmcuc3RhcnRzV2l0aCgnPycpID8gcXVlcnlTdHJpbmcuc2xpY2UoMSkgOiBxdWVyeVN0cmluZztcblxuICAgIGZvciAoY29uc3QgcGFpciBvZiBjbGVhblF1ZXJ5LnNwbGl0KCcmJykpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSB8fCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxufVxuIl19
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.254';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4yNTQnO1xuIl19
5
+ export const VERSION = '4.0.255';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4yNTUnO1xuIl19