@sumaris-net/ngx-components 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +257 -82
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +5 -0
  6. package/esm2015/src/app/core/auth/form/form-auth.js +2 -2
  7. package/esm2015/src/app/core/install/install-upgrade-card.component.js +3 -3
  8. package/esm2015/src/app/core/services/account.service.js +1 -3
  9. package/esm2015/src/app/core/services/base-entity-service.class.js +6 -3
  10. package/esm2015/src/app/core/services/config/core.config.js +7 -1
  11. package/esm2015/src/app/core/services/network.service.js +53 -4
  12. package/esm2015/src/app/core/services/network.utils.js +1 -1
  13. package/esm2015/src/app/core/services/platform.service.js +95 -8
  14. package/esm2015/src/app/shared/http/http.utils.js +14 -2
  15. package/esm2015/src/app/shared/observables.js +2 -12
  16. package/esm2015/src/app/shared/upload-file/upload-file.component.js +12 -7
  17. package/esm2015/src/app/shared/upload-file/upload-file.model.js +8 -1
  18. package/esm2015/src/app/shared/validator/validators.js +12 -21
  19. package/esm2015/src/app/shared/version/versions.js +5 -1
  20. package/esm2015/src/environments/environment.class.js +1 -1
  21. package/fesm2015/sumaris-net.ngx-components.js +199 -48
  22. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/app/core/services/config/core.config.d.ts +1 -0
  25. package/src/app/core/services/network.service.d.ts +10 -1
  26. package/src/app/core/services/network.utils.d.ts +15 -0
  27. package/src/app/core/services/platform.service.d.ts +6 -0
  28. package/src/app/shared/http/http.utils.d.ts +1 -0
  29. package/src/app/shared/observables.d.ts +0 -1
  30. package/src/app/shared/upload-file/upload-file.model.d.ts +5 -3
  31. package/src/app/shared/validator/validators.d.ts +0 -5
  32. package/src/app/shared/version/versions.d.ts +2 -0
  33. package/src/assets/i18n/en-US.json +2 -5
  34. package/src/assets/i18n/en.json +2 -5
  35. package/src/assets/i18n/fr.json +2 -1
  36. package/src/assets/manifest.json +5 -5
  37. package/src/environments/environment.class.d.ts +1 -0
  38. package/src/theme/_responsive.scss +7 -3
  39. package/sumaris-net.ngx-components.metadata.json +1 -1
  40. package/src/assets/manifest.sumaris.json +0 -17
@@ -10,7 +10,7 @@ import { CacheService } from 'ionic-cache';
10
10
  import { AudioProvider } from '../../shared/audio/audio';
11
11
  import { Platform as CdkPlatform } from '@angular/cdk/platform';
12
12
  import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
13
- import { isEmptyArray, isNil, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
13
+ import { isEmptyArray, isNil, isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
14
14
  import { Storage } from '@ionic/storage';
15
15
  import { EntitiesStorage } from './storage/entities-storage.service';
16
16
  import { StorageUtils } from '../../shared/services/storage.utils';
@@ -18,8 +18,8 @@ import { Toasts } from '../../shared/toast/toasts';
18
18
  import { TranslateService } from '@ngx-translate/core';
19
19
  import * as momentImported from 'moment';
20
20
  import { AccountService } from './account.service';
21
- import { from, of } from 'rxjs';
22
- import { catchError, distinctUntilChanged, filter, map, skip, tap } from 'rxjs/operators';
21
+ import { from, of, timer } from 'rxjs';
22
+ import { catchError, debounceTime, distinctUntilChanged, filter, map, skip, tap } from 'rxjs/operators';
23
23
  import { ENVIRONMENT } from '../../../environments/environment.class';
24
24
  import { ConfigService } from './config.service';
25
25
  import { CORE_CONFIG_OPTIONS } from './config/core.config';
@@ -27,6 +27,7 @@ import { MomentDateAdapter } from '@angular/material-moment-adapter';
27
27
  import { Downloader, NotificationVisibility } from '@ionic-native/downloader/ngx';
28
28
  import { StartableService } from '../../shared/services/startable-service.class';
29
29
  import { isMobile } from '../../shared/platforms';
30
+ import { VersionUtils } from '../../shared/version/versions';
30
31
  import * as i0 from "@angular/core";
31
32
  import * as i1 from "@ionic/angular";
32
33
  import * as i2 from "@angular/cdk/platform";
@@ -105,6 +106,9 @@ export class PlatformService extends StartableService {
105
106
  isApp() {
106
107
  return this._cordova && (this._android || this._ios);
107
108
  }
109
+ isMobileWeb() {
110
+ return isMobile(window) && this.isWeb();
111
+ }
108
112
  get canDownload() {
109
113
  return !!this.downloader && this.isAndroidCordova();
110
114
  }
@@ -118,6 +122,7 @@ export class PlatformService extends StartableService {
118
122
  return this.platform.height();
119
123
  }
120
124
  ngOnStart() {
125
+ var _a, _b;
121
126
  return __awaiter(this, void 0, void 0, function* () {
122
127
  const now = Date.now();
123
128
  this.accountService.tokenType = undefined;
@@ -138,16 +143,22 @@ export class PlatformService extends StartableService {
138
143
  // Start root services
139
144
  yield Promise.all([
140
145
  this.entitiesStorage.ready(),
141
- this.cache.ready().then(() => this.configureCache()),
146
+ this.cache.ready(),
142
147
  this.settings.ready(),
143
148
  this.networkService.ready(),
144
149
  this.audioProvider.ready()
145
150
  ]);
146
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
151
+ yield Promise.all([
152
+ this.configureCache(),
153
+ this.checkAppVersion({ canReload: true })
154
+ ]);
147
155
  // Update cache configuration when network changed
148
156
  this.networkService.onNetworkStatusChanges
149
- .pipe(skip(1)) // Skip the first event (behavior subject send event immediately)
150
- .subscribe(type => this.configureCache(type !== 'none'));
157
+ .pipe(skip(1), map(type => type !== 'none'), debounceTime(1000), distinctUntilChanged(),
158
+ // Configure the cache
159
+ tap(online => this.configureCache(online)))
160
+ .subscribe();
161
+ console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, web: ${this.isWeb()}, downloader: ${this.canDownload}, fileOpener: ${this.canOpenFile}} in ${Date.now() - now}ms`);
151
162
  // Update authentication type
152
163
  this.configService.config
153
164
  .pipe(map(config => config === null || config === void 0 ? void 0 : config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE)), filter(isNotNilOrBlank), distinctUntilChanged())
@@ -164,6 +175,15 @@ export class PlatformService extends StartableService {
164
175
  this.audioProvider.playStartupSound();
165
176
  }, 1000);
166
177
  }
178
+ // Check if new version, every 1 min
179
+ if (this.isWeb()) {
180
+ const intervalMs = (((_a = this.environment) === null || _a === void 0 ? void 0 : _a.checkAppVersionIntervalInSeconds) || 0) * 1000;
181
+ if (intervalMs > 0) {
182
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe();
183
+ this.checkAppVersionTimer = timer(intervalMs, intervalMs)
184
+ .subscribe(_ => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
185
+ }
186
+ }
167
187
  }
168
188
  catch (err) {
169
189
  // Manage startup error
@@ -285,6 +305,73 @@ export class PlatformService extends StartableService {
285
305
  this.cache.setDefaultTTL(cacheTTL);
286
306
  this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
287
307
  }
308
+ checkAppVersion(opts) {
309
+ var _a, _b, _c;
310
+ return __awaiter(this, void 0, void 0, function* () {
311
+ if (this.networkService.offline || !this.isWeb())
312
+ return; // Skip
313
+ const silent = (opts === null || opts === void 0 ? void 0 : opts.silent) === true;
314
+ const production = this.environment.production;
315
+ if (!silent)
316
+ console.info('[platform] Checking remote app version...');
317
+ const actualVersion = this.environment.version;
318
+ if (isNilOrBlank(actualVersion)) {
319
+ console.warn('[platform] Missing required value for \'environment.version\'. Cannot check remote app version.');
320
+ (_a = this.checkAppVersionTimer) === null || _a === void 0 ? void 0 : _a.unsubscribe(); // Stop timer if exists
321
+ return; // Skip
322
+ }
323
+ const peer = undefined; // location.origin + this.environment.baseUrl;
324
+ const remoteVersion = yield this.networkService.getAppVersion(peer);
325
+ if (isNilOrBlank(remoteVersion)) {
326
+ if (production && !silent)
327
+ console.error('[platform] Cannot load remote app version. Skipping version check');
328
+ (_b = this.checkAppVersionTimer) === null || _b === void 0 ? void 0 : _b.unsubscribe(); // Stop timer if exists
329
+ return;
330
+ }
331
+ if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
332
+ if (!silent)
333
+ console.info('[platform] Checking remote app version [OK]');
334
+ return;
335
+ }
336
+ // If newer version exists
337
+ const canAutoReload = !opts || opts.canReload !== false;
338
+ // Avoid infinite loop, if already reloaded
339
+ if (location.href.indexOf('?version=' + remoteVersion) !== -1) {
340
+ if (canAutoReload)
341
+ console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
342
+ (_c = this.checkAppVersionTimer) === null || _c === void 0 ? void 0 : _c.unsubscribe();
343
+ return;
344
+ }
345
+ console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
346
+ let reloadPath = location.href.replace(/[&?]{1}[a-z_-]=[0-9.]+/gi, ''); // Remove query params
347
+ reloadPath += (reloadPath.indexOf('?') === -1) ? '?' : '&'; // Add query param separator
348
+ reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
349
+ console.info('[platform] Will reloading at ' + reloadPath);
350
+ // Auto reload
351
+ if (canAutoReload) {
352
+ location.href = reloadPath;
353
+ // App stop
354
+ }
355
+ // Ask user to reload
356
+ else {
357
+ yield this.showToast({
358
+ message: 'CONFIRM.RELOAD_APP',
359
+ messageParams: { version: remoteVersion, name: this.environment.name },
360
+ type: 'info', duration: -1,
361
+ buttons: [
362
+ // Reload button
363
+ { text: this.translate.instant('COMMON.BTN_RELOAD'),
364
+ side: 'end',
365
+ handler: () => {
366
+ location.href = reloadPath;
367
+ return true;
368
+ }
369
+ }
370
+ ]
371
+ });
372
+ }
373
+ });
374
+ }
288
375
  storageReady() {
289
376
  return __awaiter(this, void 0, void 0, function* () {
290
377
  console.info(`[platform] Starting storage...`);
@@ -420,4 +507,4 @@ PlatformService.ctorParameters = () => [
420
507
  { type: InAppBrowser, decorators: [{ type: Optional }] },
421
508
  { type: Downloader, decorators: [{ type: Optional }] }
422
509
  ];
423
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDakcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFtQixNQUFN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QUM7b0JBQ25CLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRSxDQUFDLENBQUM7b0JBQ1osZUFBZSxFQUFFLElBQUk7b0JBQ3JCLE9BQU87aUJBQ1IsQ0FBQyxDQUFDO2FBQ0o7aUJBQ0ksSUFBSSxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxjQUFjLEVBQUU7b0JBQ2xCLE9BQU8sSUFBSSxnQkFBZ0IsY0FBYyxJQUFJLENBQUM7aUJBQy9DO2dCQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkI7aUJBQ0k7Z0JBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU87b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdEO1FBQ0gsQ0FBQztLQUFBOzs7O1lBemFGLFVBQVUsU0FBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OztZQWhDeEIsUUFBUTtZQVNJLFdBQVc7WUFUYixlQUFlO1lBaUJ6QixnQkFBZ0I7WUFRaEIsaUJBQWlCO1lBWGpCLGVBQWU7WUFSZixvQkFBb0I7WUFMTCxjQUFjO1lBa0I3QixjQUFjO1lBSWQsYUFBYTtZQWhCYixZQUFZO1lBTVosT0FBTztZQUxQLGFBQWE7NENBZ0RoQixNQUFNLFNBQUMsV0FBVztZQXBEZixTQUFTLHVCQXFEWixRQUFRO1lBcERMLFFBQVEsdUJBcURYLFFBQVE7WUF2REwsWUFBWSx1QkF3RGYsUUFBUTtZQWhETCxZQUFZLHVCQWlEZixRQUFRO1lBbENMLFVBQVUsdUJBbUNiLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge0F1dGhUb2tlblR5cGUsIE5ldHdvcmtTZXJ2aWNlfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge1BsYXRmb3Jtc30gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtTcGxhc2hTY3JlZW59IGZyb20gJ0Bpb25pYy1uYXRpdmUvc3BsYXNoLXNjcmVlbi9uZ3gnO1xuaW1wb3J0IHtTdGF0dXNCYXJ9IGZyb20gJ0Bpb25pYy1uYXRpdmUvc3RhdHVzLWJhci9uZ3gnO1xuaW1wb3J0IHtLZXlib2FyZH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9rZXlib2FyZC9uZ3gnO1xuaW1wb3J0IHtMb2NhbFNldHRpbmdzU2VydmljZX0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7Q2FjaGVTZXJ2aWNlfSBmcm9tICdpb25pYy1jYWNoZSc7XG5pbXBvcnQge0F1ZGlvUHJvdmlkZXJ9IGZyb20gJy4uLy4uL3NoYXJlZC9hdWRpby9hdWRpbyc7XG5pbXBvcnQge1BsYXRmb3JtIGFzIENka1BsYXRmb3JtfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuXG5pbXBvcnQge0luQXBwQnJvd3Nlcn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9pbi1hcHAtYnJvd3Nlci9uZ3gnO1xuaW1wb3J0IHtpc0VtcHR5QXJyYXksIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rLCB0b0Jvb2xlYW59IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtTdG9yYWdlfSBmcm9tICdAaW9uaWMvc3RvcmFnZSc7XG5pbXBvcnQge0VudGl0aWVzU3RvcmFnZX0gZnJvbSAnLi9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQge1N0b3JhZ2VVdGlsc30gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0b3JhZ2UudXRpbHMnO1xuaW1wb3J0IHtTaG93VG9hc3RPcHRpb25zLCBUb2FzdHN9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCAqIGFzIG1vbWVudEltcG9ydGVkIGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0FjY291bnRTZXJ2aWNlfSBmcm9tICcuL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQge2Zyb20sIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBza2lwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQge01vbWVudERhdGVBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQge0Rvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eX0gZnJvbSAnQGlvbmljLW5hdGl2ZS9kb3dubG9hZGVyL25neCc7XG5pbXBvcnQge1N0YXJ0YWJsZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2lzTW9iaWxlLCBpc1RvdWNoVWl9IGZyb20gJy4uLy4uL3NoYXJlZC9wbGF0Zm9ybXMnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1TZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfbW9iaWxlOiBib29sZWFuO1xuICBwcml2YXRlIF9jb3Jkb3ZhOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG4gIHByaXZhdGUgX2Rvd25sb2FkaW5nSm9iczogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbnRpdGllc1N0b3JhZ2U6IEVudGl0aWVzU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIGF1ZGlvUHJvdmlkZXI6IEF1ZGlvUHJvdmlkZXIsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3RhdHVzQmFyOiBTdGF0dXNCYXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBrZXlib2FyZDogS2V5Ym9hcmQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBzcGxhc2hTY3JlZW46IFNwbGFzaFNjcmVlbixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGJyb3dzZXI6IEluQXBwQnJvd3NlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRvd25sb2FkZXI6IERvd25sb2FkZXJcbiAgKSB7XG4gICAgc3VwZXIocGxhdGZvcm0pO1xuXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuICB9XG5cbiAgaXMocGxhdGZvcm1OYW1lOiBQbGF0Zm9ybXMpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtTmFtZSkge1xuICAgICAgY2FzZSAnbW9iaWxlJzpcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBtb2JpbGUgZGV0ZWN0aW9uIC0gc2VlIFNVTUFSSVMgaXNzdWUgIzMyM1xuICAgICAgICByZXR1cm4gaXNNb2JpbGUod2luZG93KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLmlzKHBsYXRmb3JtTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb3ROaWwodGhpcy5fbW9iaWxlKSA/IHRoaXMuX21vYmlsZSA6IGlzTW9iaWxlKHdpbmRvdyk7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YTtcbiAgfVxuXG4gIGlzQW5kcm9pZENvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5fY29yZG92YSB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzSU9TQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW9zICYmIHRoaXMuX2NvcmRvdmEgfHwgZmFsc2U7XG4gIH1cblxuICBpc1dlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2NvcmRvdmEgfHwgKCF0aGlzLl9hbmRyb2lkICYmICF0aGlzLl9pb3MpO1xuICB9XG5cbiAgaXNBcHAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmRvdmEgJiYgKHRoaXMuX2FuZHJvaWQgfHwgdGhpcy5faW9zKTtcbiAgfVxuXG4gIGdldCBjYW5Eb3dubG9hZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmRvd25sb2FkZXIgJiYgdGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCk7XG4gIH1cblxuICBnZXQgY2FuT3BlbkZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS53aWR0aCgpO1xuICB9XG5cbiAgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaGVpZ2h0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLmlzKCdtb2JpbGUnKTtcbiAgICAgIHRoaXMuX2NvcmRvdmEgPSB0aGlzLmlzKCdjb3Jkb3ZhJyk7XG4gICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5pcygnYW5kcm9pZCcpO1xuICAgICAgdGhpcy5faW9zID0gdGhpcy5pcygnaW9zJyk7XG5cbiAgICAgIHRoaXMuY29uZmlndXJlQ29yZG92YVBsdWdpbnMoKTtcblxuICAgICAgLy8gRm9yY2Ugc29tZSBzZXR0aW5nc1xuICAgICAgdGhpcy5zZXR0aW5ncy5tb2JpbGUgPSB0aGlzLl9tb2JpbGU7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSB0cmFuc2xhdGlvblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVUcmFuc2xhdGUoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHN0b3JhZ2VcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2VSZWFkeSgpO1xuICAgICAgYXdhaXQgdGhpcy5taWdyYXRlU3RvcmFnZShzdG9yYWdlKTtcblxuICAgICAgLy8gU3RhcnQgcm9vdCBzZXJ2aWNlc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLmVudGl0aWVzU3RvcmFnZS5yZWFkeSgpLFxuICAgICAgICB0aGlzLmNhY2hlLnJlYWR5KCkudGhlbigoKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKCkpLFxuICAgICAgICB0aGlzLnNldHRpbmdzLnJlYWR5KCksXG4gICAgICAgIHRoaXMubmV0d29ya1NlcnZpY2UucmVhZHkoKSxcbiAgICAgICAgdGhpcy5hdWRpb1Byb3ZpZGVyLnJlYWR5KClcbiAgICAgIF0pO1xuXG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0gW09LXSB7bW9iaWxlOiAke3RoaXMuX21vYmlsZX0sIGRvd25sb2FkZXI6ICR7dGhpcy5jYW5Eb3dubG9hZH0sIGZpbGVPcGVuZXI6ICR7dGhpcy5jYW5PcGVuRmlsZX19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBVcGRhdGUgY2FjaGUgY29uZmlndXJhdGlvbiB3aGVuIG5ldHdvcmsgY2hhbmdlZFxuICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKHNraXAoMSkpIC8vIFNraXAgdGhlIGZpcnN0IGV2ZW50IChiZWhhdmlvciBzdWJqZWN0IHNlbmQgZXZlbnQgaW1tZWRpYXRlbHkpXG4gICAgICAgIC5zdWJzY3JpYmUodHlwZSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKHR5cGUgIT09ICdub25lJykpO1xuXG4gICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZ1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoY29uZmlnID0+IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX1RPS0VOX1RZUEUpIGFzIEF1dGhUb2tlblR5cGUpLFxuICAgICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRva2VuVHlwZSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdG9rZW5UeXBlO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSGlkZSB0aGUgc3BsYXNoc2NyZWVuIChpZiBtb2JpbGUpIC0gYWZ0ZXIgMXMgLSBhbmQgcGxheSBzdGFydCBzb3VuZFxuICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3BsYXNoU2NyZWVuPy5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBNYW5hZ2Ugc3RhcnR1cCBlcnJvclxuICAgICAgcmV0dXJuIHRoaXMub25TdGFydHVwRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKHVybDogc3RyaW5nLCB0YXJnZXQ/OiBzdHJpbmcsIGZlYXR1cmVzPzogc3RyaW5nLCByZXBsYWNlPzogYm9vbGVhbikge1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBPcGVuaW5nIGxpbms6ICR7dXJsfWApO1xuICAgIGlmICh0aGlzLmJyb3dzZXIgJiYgdGhpcy5fbW9iaWxlKSB7XG4gICAgICB0aGlzLmJyb3dzZXIuY3JlYXRlKHVybCwgdGFyZ2V0LCBmZWF0dXJlcykuc2hvdygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgdGFyZ2V0LCBmZWF0dXJlcywgcmVwbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RG93bmxvYWRpbmdKb2IodXJpOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHVyaSk7XG4gIH1cblxuICBkb3dubG9hZChyZXF1ZXN0OiB7dXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4gKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXFwncmVxdWVzdFxcJyBvciBcXCdyZXF1ZXN0LnVyaVxcJycpO1xuXG4gICAgaWYgKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5kb3dubG9hZGVyKSB7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkaW5nIGZpbGVcbiAgICAgIGxldCBsb2NhdGlvbiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChsb2NhdGlvbiQpIHJldHVybiBsb2NhdGlvbiQ7XG5cbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIHRpdGxlOiByZXF1ZXN0LnRpdGxlIHx8IHJlcXVlc3QuZmlsZW5hbWUsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcjoge1xuICAgICAgICAgIGRpclR5cGU6ICdEb3dubG9hZHMnLFxuICAgICAgICAgIHN1YlBhdGg6IHJlcXVlc3QuZmlsZW5hbWUgfHwgcmVxdWVzdC50aXRsZSB8fCAnJyxcbiAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpclxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIERvd25sb2FkaW5nLCB1c2luZyByZXF1ZXN0OiAnICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCkpO1xuXG4gICAgICAvLyBTdGFydCBkb3dubG9hZFxuICAgICAgbG9jYXRpb24kID0gZnJvbSh0aGlzLmRvd25sb2FkZXIuZG93bmxvYWQocmVxdWVzdCkpO1xuXG4gICAgICAvLyBSZW1lbWJlciB0aGlzIHJlcXVlc3QgdXJpXG4gICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuc2V0KHJlcXVlc3QudXJpLCBsb2NhdGlvbiQpO1xuICAgICAgcmV0dXJuIGxvY2F0aW9uJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAobG9jYXRpb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLmRlbGV0ZShyZXF1ZXN0LnVyaSk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gZG93bmxvYWQ6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycikpO1xuICAgICAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXF1ZXN0XG4gICAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKHJlcXVlc3QudXJpKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ29yZG92YSk6IG9wZW5pbmcgdGhlIFVSSSB1c2luZyB0aGUgYnJvd3NlclxuICAgIC8vIFRPRE86IGZpbmQgYSB3YXkgdG8gZG93bmxvYWQgdW5kZXIgaU9TIChzZWUgaHR0cHM6Ly93d3cuYy1zaGFycGNvcm5lci5jb20vYXJ0aWNsZS9ob3ctdG8tZG93bmxvYWQtYS1maWxlLXVzaW5nLWZpbGUtdHJhbnNmZXItcGx1Z2luLWluLWlvbmljLTMvKVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhbm5vdCB1c2UgQ29yZG92YSBkb3dubG9hZGVyIHBsdWdpbjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihyZXF1ZXN0LnVyaSwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5GaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVNaW1lVHlwZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIE9wZW5pbmcgZmlsZTogJHtmaWxlUGF0aH0gKCR7ZmlsZU1pbWVUeXBlfSkgLi4uYCk7XG5cbiAgICAvL2lmICh0aGlzLmZpbGVPcGVuZXIpIHtcbiAgICAvLyAgcmV0dXJuIHRoaXMuZmlsZU9wZW5lci5vcGVuKGZpbGVQYXRoLCBmaWxlTWltZVR5cGUpO1xuICAgIC8vIH1cbiAgICAvL2Vsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhbm5vdCB1c2UgQ29yZG92YSBGaWxlT3BlbmVyIHBsdWdpbjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihmaWxlUGF0aCwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAvL31cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNvcmRvdmFQbHVnaW5zKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBDb3Jkb3ZhIHBsdWdpbnMuLi4nKTtcblxuICAgIGlmICh0aGlzLnN0YXR1c0Jhcikge1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc3R5bGVEZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhci5vdmVybGF5c1dlYlZpZXcoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlib2FyZCkge1xuICAgICAgdGhpcy5rZXlib2FyZC5oaWRlRm9ybUFjY2Vzc29yeUJhcih0cnVlKTtcbiAgICB9XG4gIH1cblxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICAvLyBXaGVuIGxvY2FsZSBjaGFuZ2VzLCBhcHBseSB0byBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG5cbiAgICAgICAgLy8gZm9yY2UgJ2VuJyBhcyAnZW5fR0InXG4gICAgICAgIGlmIChldmVudC5sYW5nID09PSAnZW4nKSB7XG4gICAgICAgICAgZXZlbnQubGFuZyA9ICdlbl9HQic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25maWcgbW9tZW50IGxpYlxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgZXZlbnQubGFuZyArICd9Jyk7XG4gICAgICAgIH1cbiAgICAgICAgICAvLyBJZiBlcnJvciwgZmFsbGJhY2sgdG8gZW5cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoJ2VuJyk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWwgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnQubG9jYWxlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxvY2FsZSAmJiBkYXRhLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGRhdGEubG9jYWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3Mgc2V0dGluZ3MsIChsaWtlIGxvY2FsZSksIHdoZW4gYWNjb3VudCBpbmhlcml0YW5jZSBlbmFibGVkXG4gICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZShhY2NvdW50ID0+IHtcbiAgICAgIGlmIChhY2NvdW50LnNldHRpbmdzICYmIHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MuYWNjb3VudEluaGVyaXRhbmNlKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRTZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MuYXNMb2NhbFNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYXBwbHkoYWNjb3VudFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVDYWNoZShvbmxpbmU/OiBib29sZWFuKSB7XG4gICAgb25saW5lID0gdG9Cb29sZWFuKG9ubGluZSwgdGhpcy5jYWNoZS5pc09ubGluZSgpKTtcbiAgICBjb25zdCBjYWNoZVRUTCA9IG9ubGluZSA/IDM2MDAgLyogMWggKi8gOiAzNjAwICogMjQgKiAzMDsgLyogMSBtb250aCAqL1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDb25maWd1cmluZyBjYWNoZSBbT0tdIHtvbmxpbmU6ICR7b25saW5lfSwgdGltZVRvTGl2ZTogJHtjYWNoZVRUTCAvIDM2MDB9aCwgb2ZmbGluZUludmFsaWRhdGU6IGZhbHNlfWApO1xuICAgIHRoaXMuY2FjaGUuc2V0RGVmYXVsdFRUTChjYWNoZVRUTCk7XG4gICAgdGhpcy5jYWNoZS5zZXRPZmZsaW5lSW52YWxpZGF0ZShmYWxzZSk7IC8vIERvIG5vdCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gb2ZmbGluZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0b3JhZ2VSZWFkeSgpOiBQcm9taXNlPExvY2FsRm9yYWdlPiB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UuLi5gKTtcbiAgICBjb25zdCBmb3JhZ2UgPSBhd2FpdCB0aGlzLnN0b3JhZ2UucmVhZHkoKTtcbiAgICBjb25zdCBkcml2ZXIgPSBmb3JhZ2UuZHJpdmVyKCk7XG5cbiAgICBpZiAoaXNOaWwoZHJpdmVyKSkge1xuICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBOTyBEUklWRVIgREVGSU5FRCBJTiBTVE9SQUdFLiBMb2NhbCBzdG9yYWdlIGNhbm5vdCBiZSB1c2VkICEnKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZm9yYWdlKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBbT0tdIHtuYW1lOiAnJHtmb3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke2ZvcmFnZS5kcml2ZXIoKX0nLCBzaXplOiAke2ZvcmFnZS5jb25maWcoKS5zaXplfWApO1xuICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gU3RvcmFnZSBzdXBwb3J0czogeyR7Zm9yYWdlLldFQlNRTH06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5XRUJTUUwpfSwgJHtmb3JhZ2UuSU5ERVhFRERCfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLklOREVYRUREQil9LCAke2ZvcmFnZS5MT0NBTFNUT1JBR0V9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuTE9DQUxTVE9SQUdFKX19YCk7XG5cbiAgICByZXR1cm4gZm9yYWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG1pZ3JhdGVTdG9yYWdlKHN0b3JhZ2U6IExvY2FsRm9yYWdlKSB7XG4gICAgY29uc3QgY2FuTWlncmF0ZSA9IHN0b3JhZ2UgJiZcbiAgICAgICgoc3RvcmFnZS5kcml2ZXIoKSA9PT0gJ2NvcmRvdmFTUUxpdGVEcml2ZXInICYmIChzdG9yYWdlLnN1cHBvcnRzKHN0b3JhZ2UuSU5ERVhFRERCKSB8fCBzdG9yYWdlLnN1cHBvcnRzKHN0b3JhZ2UuV0VCU1FMKSkpIHx8XG4gICAgICAgKHN0b3JhZ2UuZHJpdmVyKCkgPT09IHN0b3JhZ2UuV0VCU1FMICYmIHN0b3JhZ2Uuc3VwcG9ydHMoc3RvcmFnZS5JTkRFWEVEREIpKSk7XG5cbiAgICBpZiAoIWNhbk1pZ3JhdGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3Qgb2xkRm9yYWdlID0gc3RvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBuYW1lOiBzdG9yYWdlLmNvbmZpZygpLm5hbWUsXG4gICAgICBzdG9yZU5hbWU6IHN0b3JhZ2UuY29uZmlnKCkuc3RvcmVOYW1lLFxuICAgICAgZHJpdmVyOiBbc3RvcmFnZS5JTkRFWEVEREIsIHN0b3JhZ2UuV0VCU1FMXVxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IG9sZEZvcmFnZS5rZXlzKCk7XG5cbiAgICAvLyBObyBkYXRhIGluIHRoZSBvZGwgc3RvcmFnZTogc2tpcCBtaWdyYXRpb25cbiAgICBpZiAoaXNFbXB0eUFycmF5KGtleXMpKSB7XG4gICAgICAvLyBEcm9wIHRoZSBvbGQgaW5zdGFuY2UgKG5vdCBuZWVkIGFueW1vcmUpXG4gICAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIE9sZCBzdG9yYWdlIGlzIGVtcHR5OiBkcm9wcGluZyB1bnVzZWQgaW5zdGFuY2Uge25hbWU6ICcke3N0b3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke29sZEZvcmFnZS5kcml2ZXIoKX0nfWApO1xuICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAvLyBJRiBzb21lIGRhdGEgc3RvcmVkIGluIHRoZSBPTEQgc3RvcmFnZTogc3RhcnQgbWlncmF0aW9uXG4gICAgZWxzZSB7XG5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBtaWdyYXRpb24uLi5gKTtcblxuICAgICAgY29uc3QgdG9hc3QgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0lORk8uREFUQV9NSUdSQVRJT05fU1RBUlRFRCcsIHR5cGU6ICdpbmZvJywgZHVyYXRpb246IDMwMDAwfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBTdG9yYWdlVXRpbHMuY29weShvbGRGb3JhZ2UsIHN0b3JhZ2UsIHtrZXlzLCBkZWxldGVBZnRlckNvcHk6IGZhbHNlfSk7XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gbm93O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LmRpc21pc3MoKSwgIE1hdGgubWF4KDIwMDAgLSBkdXJhdGlvbiwgMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0lORk8uREFUQV9NSUdSQVRJT05fU1VDQ0VFRCcsXG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgbWlncmF0aW9uIFtPS10nKTtcblxuICAgICAgICAvLyBEcm9wIHRoZSBvbGQgaW5zdGFuY2VcbiAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIERyb3Agb2xkIHN0b3JhZ2Uge25hbWU6ICcke3N0b3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke29sZEZvcmFnZS5kcml2ZXIoKX0nfWApO1xuICAgICAgICBhd2FpdCBvbGRGb3JhZ2UuZHJvcEluc3RhbmNlKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciwgZXJyKTtcbiAgICAgICAgYXdhaXQgdG9hc3QuZGlzbWlzcygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0VSUk9SLkRBVEFfTUlHUkFUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxIVE1MSW9uVG9hc3RFbGVtZW50PiB7XG4gICAgaWYgKCF0aGlzLnRvYXN0Q29udHJvbGxlcikgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHRvYXN0Q29udHJvbGxlciBpbiBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiByZXNvbHZlKHQpXG4gICAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25TdGFydHVwRXJyb3IoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBGYWlsZWQgc3RhcnRpbmcgdGhlIHBsYXRmb3JtISAnLCBlcnIpO1xuICAgIGxldCBtZXNzYWdlID0gZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycjtcbiAgICBjb25zdCBkZXRhaWxzTWVzc2FnZSA9IGVyciAmJiAoZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubWVzc2FnZSB8fCBlcnIuZGV0YWlscyk7XG4gICAgLy8gU2V0IHNwZWNpZmljIGVycm9yIHdoZW4gRmlyZWZveCBpcyBpbiBwcml2YXRlIG1vZGUgb3IgaGlzdG9yeSBuZXZlciByZW1lbWJlcmVkIChzZWUgTWFudGlzIElmcmVtZXIgIzU2NDQxKVxuICAgIGlmIChlcnIuY29kZSA9PT0gMTEgJiYgdGhpcy5jZGtQbGF0Zm9ybS5GSVJFRk9YKSB7XG4gICAgICBtZXNzYWdlID0gJ0VSUk9SLkZJUkVGT1hfTk9fU1RPUkFHRSc7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZSkge1xuICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlLmdldChtZXNzYWdlKS50b1Byb21pc2UoKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIHtjb2RlOiAke2Vyci5jb2RlfX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBgRmF0YWwgZXJyb3I6IFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci5cXG5cXG57Y29kZTogJHtlcnIgJiYgZXJyLmNvZGUgfHwgJ251bGwnfSwgbWVzc2FnZTogXCIke21lc3NhZ2V9XCJ9YDtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9hc3RDb250cm9sbGVyKSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgPGJyLz48c21hbGw+JHtkZXRhaWxzTWVzc2FnZX08L3NtYWxsPmA7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBtZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2luZG93KSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxue2NhdXNlOiBcIiR7ZGV0YWlsc01lc3NhZ2V9XCJ9YDtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hbGVydChtZXNzYWdlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuZGV0YWlscykgY29uc29sZS5lcnJvcignY2F1c2UnLCBlcnIuZGV0YWlscyk7XG4gICAgfVxuICB9XG59XG5cbiJdfQ==
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFTLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3RILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pFLE9BQU8s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UUFBUSx1QkF3RFgsUUFBUTtZQTFETCxZQUFZLHVCQTJEZixRQUFRO1lBbkRMLFlBQVksdUJBb0RmLFFBQVE7WUFyQ0wsVUFBVSx1QkFzQ2IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BsYXRmb3JtLCBUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7QXV0aFRva2VuVHlwZSwgTmV0d29ya1NlcnZpY2V9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7UGxhdGZvcm1zfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1NwbGFzaFNjcmVlbn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zcGxhc2gtc2NyZWVuL25neCc7XG5pbXBvcnQge1N0YXR1c0Jhcn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zdGF0dXMtYmFyL25neCc7XG5pbXBvcnQge0tleWJvYXJkfSBmcm9tICdAaW9uaWMtbmF0aXZlL2tleWJvYXJkL25neCc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtDYWNoZVNlcnZpY2V9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7QXVkaW9Qcm92aWRlcn0gZnJvbSAnLi4vLi4vc2hhcmVkL2F1ZGlvL2F1ZGlvJztcbmltcG9ydCB7UGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm19IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7SW5BcHBCcm93c2VyfSBmcm9tICdAaW9uaWMtbmF0aXZlL2luLWFwcC1icm93c2VyL25neCc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWwsIGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgc2xlZXAsIHRvQm9vbGVhbn0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0Bpb25pYy9zdG9yYWdlJztcbmltcG9ydCB7RW50aXRpZXNTdG9yYWdlfSBmcm9tICcuL3N0b3JhZ2UvZW50aXRpZXMtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZVV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RvcmFnZS51dGlscyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7QWNjb3VudFNlcnZpY2V9IGZyb20gJy4vYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7ZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiwgdGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc2tpcCwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQge01vbWVudERhdGVBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQge0Rvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eX0gZnJvbSAnQGlvbmljLW5hdGl2ZS9kb3dubG9hZGVyL25neCc7XG5pbXBvcnQge1N0YXJ0YWJsZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7VmVyc2lvblV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvdmVyc2lvbi92ZXJzaW9ucyc7XG5pbXBvcnQge2Vudmlyb25tZW50fSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1TZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfbW9iaWxlOiBib29sZWFuO1xuICBwcml2YXRlIF9jb3Jkb3ZhOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG4gIHByaXZhdGUgX2Rvd25sb2FkaW5nSm9iczogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjaGVja0FwcFZlcnNpb25UaW1lcjogU3Vic2NyaXB0aW9uO1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBjZGtQbGF0Zm9ybTogQ2RrUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIGVudGl0aWVzU3RvcmFnZTogRW50aXRpZXNTdG9yYWdlLFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLFxuICAgIHByaXZhdGUgYXVkaW9Qcm92aWRlcjogQXVkaW9Qcm92aWRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBzdGF0dXNCYXI6IFN0YXR1c0JhcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGtleWJvYXJkOiBLZXlib2FyZCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHNwbGFzaFNjcmVlbjogU3BsYXNoU2NyZWVuLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgYnJvd3NlcjogSW5BcHBCcm93c2VyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlclxuICApIHtcbiAgICBzdXBlcihwbGF0Zm9ybSk7XG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBDcmVhdGluZyBzZXJ2aWNlJyk7XG4gIH1cblxuICBpcyhwbGF0Zm9ybU5hbWU6IFBsYXRmb3Jtcyk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocGxhdGZvcm1OYW1lKSB7XG4gICAgICBjYXNlICdtb2JpbGUnOlxuICAgICAgICAvLyBVc2UgY3VzdG9tIG1vYmlsZSBkZXRlY3Rpb24gLSBzZWUgU1VNQVJJUyBpc3N1ZSAjMzIzXG4gICAgICAgIHJldHVybiBpc01vYmlsZSh3aW5kb3cpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogaXNNb2JpbGUod2luZG93KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXkgaWYgb3BlbmVkIGhhcyBiZWVuIG9wZW5lZCBpbnNpZGUgYW4gQW5kcm9pZCBvciBpT3MgQXBwLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8ga25vd24gaWYgdGhlcmUgaXMgY29yZG92YSBmZWF0dXJlc1xuICAgKi9cbiAgaXNDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jb3Jkb3ZhO1xuICB9XG5cbiAgaXNBbmRyb2lkQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYW5kcm9pZCAmJiB0aGlzLl9jb3Jkb3ZhIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1NDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pb3MgJiYgdGhpcy5fY29yZG92YSB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzV2ViKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fY29yZG92YSB8fCAoIXRoaXMuX2FuZHJvaWQgJiYgIXRoaXMuX2lvcyk7XG4gIH1cblxuICBpc0FwcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YSAmJiAodGhpcy5fYW5kcm9pZCB8fCB0aGlzLl9pb3MpO1xuICB9XG5cbiAgaXNNb2JpbGVXZWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTW9iaWxlKHdpbmRvdykgJiYgdGhpcy5pc1dlYigpO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZG93bmxvYWRlciAmJiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKTtcbiAgfVxuXG4gIGdldCBjYW5PcGVuRmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5oZWlnaHQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX21vYmlsZSA9IHRoaXMuaXMoJ21vYmlsZScpO1xuICAgICAgdGhpcy5fY29yZG92YSA9IHRoaXMuaXMoJ2NvcmRvdmEnKTtcbiAgICAgIHRoaXMuX2FuZHJvaWQgPSB0aGlzLmlzKCdhbmRyb2lkJyk7XG4gICAgICB0aGlzLl9pb3MgPSB0aGlzLmlzKCdpb3MnKTtcblxuICAgICAgdGhpcy5jb25maWd1cmVDb3Jkb3ZhUGx1Z2lucygpO1xuXG4gICAgICAvLyBGb3JjZSBzb21lIHNldHRpbmdzXG4gICAgICB0aGlzLnNldHRpbmdzLm1vYmlsZSA9IHRoaXMuX21vYmlsZTtcblxuICAgICAgLy8gQ29uZmlndXJlIHRyYW5zbGF0aW9uXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVRyYW5zbGF0ZSgpO1xuXG4gICAgICAvLyBDb25maWd1cmUgc3RvcmFnZVxuICAgICAgY29uc3Qgc3RvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZVJlYWR5KCk7XG4gICAgICBhd2FpdCB0aGlzLm1pZ3JhdGVTdG9yYWdlKHN0b3JhZ2UpO1xuXG4gICAgICAvLyBTdGFydCByb290IHNlcnZpY2VzXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksXG4gICAgICAgIHRoaXMuY2FjaGUucmVhZHkoKSxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLFxuICAgICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLnJlYWR5KCksXG4gICAgICAgIHRoaXMuYXVkaW9Qcm92aWRlci5yZWFkeSgpXG4gICAgICBdKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZUNhY2hlKCksXG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uKHtjYW5SZWxvYWQ6IHRydWV9KVxuICAgICAgXSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZSBjb25maWd1cmF0aW9uIHdoZW4gbmV0d29yayBjaGFuZ2VkXG4gICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLm9uTmV0d29ya1N0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICBtYXAodHlwZSA9PiB0eXBlICE9PSAnbm9uZScpLFxuICAgICAgICAgIGRlYm91bmNlVGltZSgxMDAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgY2FjaGVcbiAgICAgICAgICB0YXAob25saW5lID0+IHRoaXMuY29uZmlndXJlQ2FjaGUob25saW5lKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgd2ViOiAke3RoaXMuaXNXZWIoKX0sIGRvd25sb2FkZXI6ICR7dGhpcy5jYW5Eb3dubG9hZH0sIGZpbGVPcGVuZXI6ICR7dGhpcy5jYW5PcGVuRmlsZX19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZ1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoY29uZmlnID0+IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX1RPS0VOX1RZUEUpIGFzIEF1dGhUb2tlblR5cGUpLFxuICAgICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRva2VuVHlwZSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdG9rZW5UeXBlO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gSGlkZSB0aGUgc3BsYXNoc2NyZWVuIChpZiBtb2JpbGUpIC0gYWZ0ZXIgMXMgLSBhbmQgcGxheSBzdGFydCBzb3VuZFxuICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc3BsYXNoU2NyZWVuPy5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgbmV3IHZlcnNpb24sIGV2ZXJ5IDEgbWluXG4gICAgICBpZiAodGhpcy5pc1dlYigpKSB7XG4gICAgICAgIGNvbnN0IGludGVydmFsTXMgPSAodGhpcy5lbnZpcm9ubWVudD8uY2hlY2tBcHBWZXJzaW9uSW50ZXJ2YWxJblNlY29uZHMgfHwgMCkgKiAxMDAwO1xuICAgICAgICBpZiAoaW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXIgPSB0aW1lcihpbnRlcnZhbE1zLCBpbnRlcnZhbE1zKVxuICAgICAgICAgICAgLnN1YnNjcmliZShfID0+IHRoaXMuY2hlY2tBcHBWZXJzaW9uKHtzaWxlbnQ6IHRydWUsIGNhblJlbG9hZDogZmFsc2UgLypkbyBOT1QgYXV0byByZWxvYWQsIHdoZW4gYXBwIGlzIHN0YXJ0ZWQqL30pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBNYW5hZ2Ugc3RhcnR1cCBlcnJvclxuICAgICAgcmV0dXJuIHRoaXMub25TdGFydHVwRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKHVybDogc3RyaW5nLCB0YXJnZXQ/OiBzdHJpbmcsIGZlYXR1cmVzPzogc3RyaW5nLCByZXBsYWNlPzogYm9vbGVhbikge1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBPcGVuaW5nIGxpbms6ICR7dXJsfWApO1xuICAgIGlmICh0aGlzLmJyb3dzZXIgJiYgdGhpcy5fbW9iaWxlKSB7XG4gICAgICB0aGlzLmJyb3dzZXIuY3JlYXRlKHVybCwgdGFyZ2V0LCBmZWF0dXJlcykuc2hvdygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgdGFyZ2V0LCBmZWF0dXJlcywgcmVwbGFjZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RG93bmxvYWRpbmdKb2IodXJpOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHVyaSk7XG4gIH1cblxuICBkb3dubG9hZChyZXF1ZXN0OiB7dXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4gKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXFwncmVxdWVzdFxcJyBvciBcXCdyZXF1ZXN0LnVyaVxcJycpO1xuXG4gICAgaWYgKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5kb3dubG9hZGVyKSB7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkaW5nIGZpbGVcbiAgICAgIGxldCBsb2NhdGlvbiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChsb2NhdGlvbiQpIHJldHVybiBsb2NhdGlvbiQ7XG5cbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIHRpdGxlOiByZXF1ZXN0LnRpdGxlIHx8IHJlcXVlc3QuZmlsZW5hbWUsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcjoge1xuICAgICAgICAgIGRpclR5cGU6ICdEb3dubG9hZHMnLFxuICAgICAgICAgIHN1YlBhdGg6IHJlcXVlc3QuZmlsZW5hbWUgfHwgcmVxdWVzdC50aXRsZSB8fCAnJyxcbiAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpclxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIERvd25sb2FkaW5nLCB1c2luZyByZXF1ZXN0OiAnICsgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCkpO1xuXG4gICAgICAvLyBTdGFydCBkb3dubG9hZFxuICAgICAgbG9jYXRpb24kID0gZnJvbSh0aGlzLmRvd25sb2FkZXIuZG93bmxvYWQocmVxdWVzdCkpO1xuXG4gICAgICAvLyBSZW1lbWJlciB0aGlzIHJlcXVlc3QgdXJpXG4gICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuc2V0KHJlcXVlc3QudXJpLCBsb2NhdGlvbiQpO1xuICAgICAgcmV0dXJuIGxvY2F0aW9uJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAobG9jYXRpb24gPT4ge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLmRlbGV0ZShyZXF1ZXN0LnVyaSk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICAgICAgfSksXG4gICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gZG93bmxvYWQ6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycikpO1xuICAgICAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXF1ZXN0XG4gICAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKHJlcXVlc3QudXJpKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ29yZG92YSk6IG9wZW5pbmcgdGhlIFVSSSB1c2luZyB0aGUgYnJvd3NlclxuICAgIC8vIFRPRE86IGZpbmQgYSB3YXkgdG8gZG93bmxvYWQgdW5kZXIgaU9TIChzZWUgaHR0cHM6Ly93d3cuYy1zaGFycGNvcm5lci5jb20vYXJ0aWNsZS9ob3ctdG8tZG93bmxvYWQtYS1maWxlLXVzaW5nLWZpbGUtdHJhbnNmZXItcGx1Z2luLWluLWlvbmljLTMvKVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhbm5vdCB1c2UgQ29yZG92YSBkb3dubG9hZGVyIHBsdWdpbjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihyZXF1ZXN0LnVyaSwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiBvZigpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5GaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGZpbGVNaW1lVHlwZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIE9wZW5pbmcgZmlsZTogJHtmaWxlUGF0aH0gKCR7ZmlsZU1pbWVUeXBlfSkgLi4uYCk7XG5cbiAgICAvL2lmICh0aGlzLmZpbGVPcGVuZXIpIHtcbiAgICAvLyAgcmV0dXJuIHRoaXMuZmlsZU9wZW5lci5vcGVuKGZpbGVQYXRoLCBmaWxlTWltZVR5cGUpO1xuICAgIC8vIH1cbiAgICAvL2Vsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhbm5vdCB1c2UgQ29yZG92YSBGaWxlT3BlbmVyIHBsdWdpbjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihmaWxlUGF0aCwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAvL31cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNvcmRvdmFQbHVnaW5zKCkge1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBDb3Jkb3ZhIHBsdWdpbnMuLi4nKTtcblxuICAgIGlmICh0aGlzLnN0YXR1c0Jhcikge1xuICAgICAgdGhpcy5zdGF0dXNCYXIuc3R5bGVEZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0YXR1c0Jhci5vdmVybGF5c1dlYlZpZXcoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXlib2FyZCkge1xuICAgICAgdGhpcy5rZXlib2FyZC5oaWRlRm9ybUFjY2Vzc29yeUJhcih0cnVlKTtcbiAgICB9XG4gIH1cblxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICAvLyBXaGVuIGxvY2FsZSBjaGFuZ2VzLCBhcHBseSB0byBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG5cbiAgICAgICAgLy8gZm9yY2UgJ2VuJyBhcyAnZW5fR0InXG4gICAgICAgIGlmIChldmVudC5sYW5nID09PSAnZW4nKSB7XG4gICAgICAgICAgZXZlbnQubGFuZyA9ICdlbl9HQic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25maWcgbW9tZW50IGxpYlxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgZXZlbnQubGFuZyArICd9Jyk7XG4gICAgICAgIH1cbiAgICAgICAgICAvLyBJZiBlcnJvciwgZmFsbGJhY2sgdG8gZW5cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoJ2VuJyk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWwgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnQubG9jYWxlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxvY2FsZSAmJiBkYXRhLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGRhdGEubG9jYWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3Mgc2V0dGluZ3MsIChsaWtlIGxvY2FsZSksIHdoZW4gYWNjb3VudCBpbmhlcml0YW5jZSBlbmFibGVkXG4gICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZShhY2NvdW50ID0+IHtcbiAgICAgIGlmIChhY2NvdW50LnNldHRpbmdzICYmIHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MuYWNjb3VudEluaGVyaXRhbmNlKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRTZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MuYXNMb2NhbFNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYXBwbHkoYWNjb3VudFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVDYWNoZShvbmxpbmU/OiBib29sZWFuKSB7XG4gICAgb25saW5lID0gdG9Cb29sZWFuKG9ubGluZSwgdGhpcy5jYWNoZS5pc09ubGluZSgpKTtcbiAgICBjb25zdCBjYWNoZVRUTCA9IG9ubGluZSA/IDM2MDAgLyogMWggKi8gOiAzNjAwICogMjQgKiAzMDsgLyogMSBtb250aCAqL1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDb25maWd1cmluZyBjYWNoZSBbT0tdIHtvbmxpbmU6ICR7b25saW5lfSwgdGltZVRvTGl2ZTogJHtjYWNoZVRUTCAvIDM2MDB9aCwgb2ZmbGluZUludmFsaWRhdGU6IGZhbHNlfWApO1xuICAgIHRoaXMuY2FjaGUuc2V0RGVmYXVsdFRUTChjYWNoZVRUTCk7XG4gICAgdGhpcy5jYWNoZS5zZXRPZmZsaW5lSW52YWxpZGF0ZShmYWxzZSk7IC8vIERvIG5vdCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gb2ZmbGluZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrQXBwVmVyc2lvbihvcHRzPzoge2NhblJlbG9hZD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW59KSB7XG4gICAgaWYgKHRoaXMubmV0d29ya1NlcnZpY2Uub2ZmbGluZSB8fCAhdGhpcy5pc1dlYigpKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IHNpbGVudCA9IG9wdHM/LnNpbGVudCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBwcm9kdWN0aW9uID0gdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuXG4gICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDaGVja2luZyByZW1vdGUgYXBwIHZlcnNpb24uLi4nKTtcblxuICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPSB0aGlzLmVudmlyb25tZW50LnZlcnNpb247XG4gICAgaWYgKGlzTmlsT3JCbGFuayhhY3R1YWxWZXJzaW9uKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIE1pc3NpbmcgcmVxdWlyZWQgdmFsdWUgZm9yIFxcJ2Vudmlyb25tZW50LnZlcnNpb25cXCcuIENhbm5vdCBjaGVjayByZW1vdGUgYXBwIHZlcnNpb24uJyk7XG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpOyAvLyBTdG9wIHRpbWVyIGlmIGV4aXN0c1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgY29uc3QgcGVlciA9IHVuZGVmaW5lZDsgLy8gbG9jYXRpb24ub3JpZ2luICsgdGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsO1xuICAgIGNvbnN0IHJlbW90ZVZlcnNpb24gPSBhd2FpdCB0aGlzLm5ldHdvcmtTZXJ2aWNlLmdldEFwcFZlcnNpb24ocGVlcik7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhyZW1vdGVWZXJzaW9uKSkge1xuICAgICAgaWYgKHByb2R1Y3Rpb24gJiYgIXNpbGVudCkgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBDYW5ub3QgbG9hZCByZW1vdGUgYXBwIHZlcnNpb24uIFNraXBwaW5nIHZlcnNpb24gY2hlY2snKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFZlcnNpb25VdGlscy5pc0NvbXBhdGlibGUocmVtb3RlVmVyc2lvbiwgYWN0dWFsVmVyc2lvbikpIHtcbiAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ2hlY2tpbmcgcmVtb3RlIGFwcCB2ZXJzaW9uIFtPS10nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBuZXdlciB2ZXJzaW9uIGV4aXN0c1xuICAgIGNvbnN0IGNhbkF1dG9SZWxvYWQgPSAhb3B0cyB8fCBvcHRzLmNhblJlbG9hZCAhPT0gZmFsc2U7XG5cbiAgICAvLyBBdm9pZCBpbmZpbml0ZSBsb29wLCBpZiBhbHJlYWR5IHJlbG9hZGVkXG4gICAgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignP3ZlcnNpb249JytyZW1vdGVWZXJzaW9uKSAhPT0gLTEpIHtcbiAgICAgIGlmIChjYW5BdXRvUmVsb2FkKSBjb25zb2xlLmVycm9yKGBbcGxhdGZvcm1dIFJlbG9hZGVkIHBhZ2UgZmFpbGVkLCBiZWNhdXNlIHZlcnNpb24gc3RpbGwgbWlzbWF0Y2ghIFBsZWFzZSBjaGVjayB2ZXJzaW9uLmFwcHVwIGZpbGUgKGV4cGVjdGVkIGFwcCB2ZXJzaW9uOiAke2FjdHVhbFZlcnNpb259KWApO1xuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFtwbGF0Zm9ybV0gTW9yZSByZWNlbnQgdmVyc2lvbiBkZXRlY3RlZCAocmVtb3RlOiAke3JlbW90ZVZlcnNpb259LCBhY3R1YWw6ICR7YWN0dWFsVmVyc2lvbn1gKTtcblxuICAgIGxldCByZWxvYWRQYXRoID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bJj9dezF9W2Etel8tXT1bMC05Ll0rL2dpLCAnJyk7IC8vIFJlbW92ZSBxdWVyeSBwYXJhbXNcbiAgICByZWxvYWRQYXRoICs9IChyZWxvYWRQYXRoLmluZGV4T2YoJz8nKSA9PT0gLTEpID8gJz8nIDogJyYnOyAvLyBBZGQgcXVlcnkgcGFyYW0gc2VwYXJhdG9yXG4gICAgcmVsb2FkUGF0aCArPSAndmVyc2lvbj0nICsgcmVtb3RlVmVyc2lvbjsgLy8gQWRkIHZlcnNpb24gKHRvIGF2b2lkIGEgcmVsb2FkIGluZmluaXRlIGxvb3ApXG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFdpbGwgcmVsb2FkaW5nIGF0ICcgKyByZWxvYWRQYXRoKTtcblxuICAgIC8vIEF1dG8gcmVsb2FkXG4gICAgaWYgKGNhbkF1dG9SZWxvYWQpIHtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgLy8gQXBwIHN0b3BcbiAgICB9XG4gICAgLy8gQXNrIHVzZXIgdG8gcmVsb2FkXG4gICAgZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdDT05GSVJNLlJFTE9BRF9BUFAnLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7dmVyc2lvbjogcmVtb3RlVmVyc2lvbiwgbmFtZTogdGhpcy5lbnZpcm9ubWVudC5uYW1lfSxcbiAgICAgICAgdHlwZTogJ2luZm8nLCBkdXJhdGlvbjogLTEsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAvLyBSZWxvYWQgYnV0dG9uXG4gICAgICAgICAge3RleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fUkVMT0FEJyksXG4gICAgICAgICAgICBzaWRlOiAnZW5kJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHJlbG9hZFBhdGg7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXX0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzdG9yYWdlUmVhZHkoKTogUHJvbWlzZTxMb2NhbEZvcmFnZT4ge1xuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlLi4uYCk7XG4gICAgY29uc3QgZm9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlLnJlYWR5KCk7XG4gICAgY29uc3QgZHJpdmVyID0gZm9yYWdlLmRyaXZlcigpO1xuXG4gICAgaWYgKGlzTmlsKGRyaXZlcikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gTk8gRFJJVkVSIERFRklORUQgSU4gU1RPUkFHRS4gTG9jYWwgc3RvcmFnZSBjYW5ub3QgYmUgdXNlZCAhJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZvcmFnZSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgW09LXSB7bmFtZTogJyR7Zm9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtmb3JhZ2UuZHJpdmVyKCl9Jywgc2l6ZTogJHtmb3JhZ2UuY29uZmlnKCkuc2l6ZX1gKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIFN0b3JhZ2Ugc3VwcG9ydHM6IHske2ZvcmFnZS5XRUJTUUx9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuV0VCU1FMKX0sICR7Zm9yYWdlLklOREVYRUREQn06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5JTkRFWEVEREIpfSwgJHtmb3JhZ2UuTE9DQUxTVE9SQUdFfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLkxPQ0FMU1RPUkFHRSl9fWApO1xuXG4gICAgcmV0dXJuIGZvcmFnZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBtaWdyYXRlU3RvcmFnZShzdG9yYWdlOiBMb2NhbEZvcmFnZSkge1xuICAgIGNvbnN0IGNhbk1pZ3JhdGUgPSBzdG9yYWdlICYmXG4gICAgICAoKHN0b3JhZ2UuZHJpdmVyKCkgPT09ICdjb3Jkb3ZhU1FMaXRlRHJpdmVyJyAmJiAoc3RvcmFnZS5zdXBwb3J0cyhzdG9yYWdlLklOREVYRUREQikgfHwgc3RvcmFnZS5zdXBwb3J0cyhzdG9yYWdlLldFQlNRTCkpKSB8fFxuICAgICAgIChzdG9yYWdlLmRyaXZlcigpID09PSBzdG9yYWdlLldFQlNRTCAmJiBzdG9yYWdlLnN1cHBvcnRzKHN0b3JhZ2UuSU5ERVhFRERCKSkpO1xuXG4gICAgaWYgKCFjYW5NaWdyYXRlKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IG9sZEZvcmFnZSA9IHN0b3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgbmFtZTogc3RvcmFnZS5jb25maWcoKS5uYW1lLFxuICAgICAgc3RvcmVOYW1lOiBzdG9yYWdlLmNvbmZpZygpLnN0b3JlTmFtZSxcbiAgICAgIGRyaXZlcjogW3N0b3JhZ2UuSU5ERVhFRERCLCBzdG9yYWdlLldFQlNRTF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBvbGRGb3JhZ2Uua2V5cygpO1xuXG4gICAgLy8gTm8gZGF0YSBpbiB0aGUgb2RsIHN0b3JhZ2U6IHNraXAgbWlncmF0aW9uXG4gICAgaWYgKGlzRW1wdHlBcnJheShrZXlzKSkge1xuICAgICAgLy8gRHJvcCB0aGUgb2xkIGluc3RhbmNlIChub3QgbmVlZCBhbnltb3JlKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBPbGQgc3RvcmFnZSBpcyBlbXB0eTogZHJvcHBpbmcgdW51c2VkIGluc3RhbmNlIHtuYW1lOiAnJHtzdG9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtvbGRGb3JhZ2UuZHJpdmVyKCl9J31gKTtcbiAgICAgIGF3YWl0IG9sZEZvcmFnZS5kcm9wSW5zdGFuY2UoKTtcbiAgICB9XG4gICAgLy8gSUYgc29tZSBkYXRhIHN0b3JlZCBpbiB0aGUgT0xEIHN0b3JhZ2U6IHN0YXJ0IG1pZ3JhdGlvblxuICAgIGVsc2Uge1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgbWlncmF0aW9uLi4uYCk7XG5cbiAgICAgIGNvbnN0IHRvYXN0ID0gYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdJTkZPLkRBVEFfTUlHUkFUSU9OX1NUQVJURUQnLCB0eXBlOiAnaW5mbycsIGR1cmF0aW9uOiAzMDAwMH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgU3RvcmFnZVV0aWxzLmNvcHkob2xkRm9yYWdlLCBzdG9yYWdlLCB7a2V5cywgZGVsZXRlQWZ0ZXJDb3B5OiBmYWxzZX0pO1xuXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0b2FzdC5kaXNtaXNzKCksICBNYXRoLm1heCgyMDAwIC0gZHVyYXRpb24sIDApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdJTkZPLkRBVEFfTUlHUkFUSU9OX1NVQ0NFRUQnLFxuICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlIG1pZ3JhdGlvbiBbT0tdJyk7XG5cbiAgICAgICAgLy8gRHJvcCB0aGUgb2xkIGluc3RhbmNlXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBEcm9wIG9sZCBzdG9yYWdlIHtuYW1lOiAnJHtzdG9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtvbGRGb3JhZ2UuZHJpdmVyKCl9J31gKTtcbiAgICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIGF3YWl0IHRvYXN0LmRpc21pc3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdFUlJPUi5EQVRBX01JR1JBVElPTl9GQUlMRUQnLFxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8SFRNTElvblRvYXN0RWxlbWVudD4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvbldpbGxQcmVzZW50OiAodCkgPT4gcmVzb2x2ZSh0KVxuICAgICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJywgZXJyKTtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgY29uc3QgZGV0YWlsc01lc3NhZ2UgPSBlcnIgJiYgKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQobWVzc2FnZSkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCB7Y29kZTogJHtlcnIuY29kZX19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYEZhdGFsIGVycm9yOiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuXFxuXFxue2NvZGU6ICR7ZXJyICYmIGVyci5jb2RlIHx8ICdudWxsJ30sIG1lc3NhZ2U6IFwiJHttZXNzYWdlfVwifWA7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvYXN0Q29udHJvbGxlcikge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDxici8+PHNtYWxsPiR7ZGV0YWlsc01lc3NhZ2V9PC9zbWFsbD5gO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICBkdXJhdGlvbjogLTEsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmRldGFpbHMpIGNvbnNvbGUuZXJyb3IoJ2NhdXNlJywgZXJyLmRldGFpbHMpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
@@ -1,9 +1,21 @@
1
1
  import { __awaiter } from "tslib";
2
+ import { HttpHeaders } from '@angular/common/http';
2
3
  export class HttpUtils {
3
4
  static getResource(http, uri, opts) {
4
5
  return __awaiter(this, void 0, void 0, function* () {
5
6
  // Add headers
6
- opts = Object.assign({}, opts);
7
+ opts = Object.assign({}, opts
8
+ //headers: new HttpHeaders(),
9
+ //.append('X-App-Name', environment.name)
10
+ //.append('X-App-Version', environment.version),
11
+ );
12
+ // Force no cache
13
+ if (opts.nocache === true) {
14
+ opts.headers = (opts.headers instanceof HttpHeaders ? opts.headers : new HttpHeaders(opts.headers));
15
+ opts.headers
16
+ .append('Cache-Control', 'no-cache')
17
+ .append('Pragma', 'no-cache');
18
+ }
7
19
  try {
8
20
  // Using web http client
9
21
  return (yield http.get(uri, opts).toPromise());
@@ -20,4 +32,4 @@ export class HttpUtils {
20
32
  });
21
33
  }
22
34
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL2h0dHAvaHR0cC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsTUFBTSxPQUFPLFNBQVM7SUFDcEIsTUFBTSxDQUFPLFdBQVcsQ0FBSSxJQUFnQixFQUNoQixHQUFXLEVBQ1gsSUFVQzs7WUFFM0IsY0FBYztZQUNkLElBQUkscUJBSUMsSUFBSSxDQUNSLENBQUM7WUFFRixJQUFJO2dCQUNGLHdCQUF3QjtnQkFDeEIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQU0sQ0FBQzthQUNyRDtZQUNELE9BQU8sR0FBRyxFQUFFO2dCQUNWLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7b0JBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEdBQUcsS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQzdFO3FCQUNJO29CQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0c7Z0JBQ0QsTUFBTSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSw2QkFBNkIsRUFBQyxDQUFDO2FBQ2xFO1FBQ0gsQ0FBQztLQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmV4cG9ydCBjbGFzcyBIdHRwVXRpbHMge1xuICBzdGF0aWMgYXN5bmMgZ2V0UmVzb3VyY2U8VD4oaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cz86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk6IFByb21pc2U8VD4ge1xuXG4gICAgLy8gQWRkIGhlYWRlcnNcbiAgICBvcHRzID0ge1xuICAgICAgLy9oZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKSxcbiAgICAgIC8vLmFwcGVuZCgnWC1BcHAtTmFtZScsIGVudmlyb25tZW50Lm5hbWUpXG4gICAgICAvLy5hcHBlbmQoJ1gtQXBwLVZlcnNpb24nLCBlbnZpcm9ubWVudC52ZXJzaW9uKSxcbiAgICAgIC4uLm9wdHNcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzaW5nIHdlYiBodHRwIGNsaWVudFxuICAgICAgcmV0dXJuIChhd2FpdCBodHRwLmdldCh1cmksIG9wdHMpLnRvUHJvbWlzZSgpKSBhcyBUO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtuZXR3b3JrXSBFcnJvciBvbiBnZXQgcmVxdWVzdCAke3VyaX06ICR7ZXJyLm1lc3NhZ2V9YCwgZXJyKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbbmV0d29ya10gRXJyb3Igb24gZ2V0IHJlcXVlc3QgJHt1cml9OiAke2VyciAmJiBlcnIuc3RhdHVzVGV4dH0gLSAke0pTT04uc3RyaW5naWZ5KGVycil9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyB7Y29kZTogZXJyLnN0YXR1cywgbWVzc2FnZTogJ0VSUk9SLlVOS05PV05fTkVUV09SS19FUlJPUid9O1xuICAgIH1cbiAgfVxufVxuXG5cblxuIl19
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL2h0dHAvaHR0cC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBYSxNQUFNLHNCQUFzQixDQUFDO0FBRXpFLE1BQU0sT0FBTyxTQUFTO0lBQ3BCLE1BQU0sQ0FBTyxXQUFXLENBQUksSUFBZ0IsRUFDaEIsR0FBVyxFQUNYLElBV0M7O1lBRTNCLGNBQWM7WUFDZCxJQUFJLHFCQUNDLElBQUk7WUFDUCw2QkFBNkI7WUFDN0IseUNBQXlDO1lBQ3pDLGdEQUFnRDthQUNqRCxDQUFDO1lBRUYsaUJBQWlCO1lBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3BHLElBQUksQ0FBQyxPQUFPO3FCQUNULE1BQU0sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDO3FCQUNuQyxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsSUFBSTtnQkFDRix3QkFBd0I7Z0JBQ3hCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFNLENBQUM7YUFDckQ7WUFDRCxPQUFPLEdBQUcsRUFBRTtnQkFDVixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxHQUFHLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUM3RTtxQkFDSTtvQkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzNHO2dCQUNELE1BQU0sRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsNkJBQTZCLEVBQUMsQ0FBQzthQUNsRTtRQUNILENBQUM7S0FBQTtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5leHBvcnQgY2xhc3MgSHR0cFV0aWxzIHtcbiAgc3RhdGljIGFzeW5jIGdldFJlc291cmNlPFQ+KGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmk6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHM/OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vY2FjaGU/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IEh0dHBQYXJhbXMgfCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTogUHJvbWlzZTxUPiB7XG5cbiAgICAvLyBBZGQgaGVhZGVyc1xuICAgIG9wdHMgPSB7XG4gICAgICAuLi5vcHRzXG4gICAgICAvL2hlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLFxuICAgICAgLy8uYXBwZW5kKCdYLUFwcC1OYW1lJywgZW52aXJvbm1lbnQubmFtZSlcbiAgICAgIC8vLmFwcGVuZCgnWC1BcHAtVmVyc2lvbicsIGVudmlyb25tZW50LnZlcnNpb24pLFxuICAgIH07XG5cbiAgICAvLyBGb3JjZSBubyBjYWNoZVxuICAgIGlmIChvcHRzLm5vY2FjaGUgPT09IHRydWUpIHtcbiAgICAgIG9wdHMuaGVhZGVycyA9IChvcHRzLmhlYWRlcnMgaW5zdGFuY2VvZiBIdHRwSGVhZGVycyA/IG9wdHMuaGVhZGVycyA6IG5ldyBIdHRwSGVhZGVycyhvcHRzLmhlYWRlcnMpKTtcbiAgICAgIG9wdHMuaGVhZGVyc1xuICAgICAgICAuYXBwZW5kKCdDYWNoZS1Db250cm9sJywgJ25vLWNhY2hlJylcbiAgICAgICAgLmFwcGVuZCgnUHJhZ21hJywgJ25vLWNhY2hlJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzaW5nIHdlYiBodHRwIGNsaWVudFxuICAgICAgcmV0dXJuIChhd2FpdCBodHRwLmdldCh1cmksIG9wdHMpLnRvUHJvbWlzZSgpKSBhcyBUO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyICYmIGVyci5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtuZXR3b3JrXSBFcnJvciBvbiBnZXQgcmVxdWVzdCAke3VyaX06ICR7ZXJyLm1lc3NhZ2V9YCwgZXJyKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbbmV0d29ya10gRXJyb3Igb24gZ2V0IHJlcXVlc3QgJHt1cml9OiAke2VyciAmJiBlcnIuc3RhdHVzVGV4dH0gLSAke0pTT04uc3RyaW5naWZ5KGVycil9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyB7Y29kZTogZXJyLnN0YXR1cywgbWVzc2FnZTogJ0VSUk9SLlVOS05PV05fTkVUV09SS19FUlJPUid9O1xuICAgIH1cbiAgfVxufVxuXG5cblxuIl19
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from "tslib";
2
- import { merge, Subject, timer } from 'rxjs';
2
+ import { merge, timer } from 'rxjs';
3
3
  import { filter, first, map, switchMap, takeUntil } from 'rxjs/operators';
4
4
  import { isNotNil } from './functions';
5
5
  export function filterNotNil(obs) {
@@ -95,14 +95,4 @@ export function waitForTrue(observable, opts) {
95
95
  return firstTrueObservable.toPromise();
96
96
  });
97
97
  }
98
- export function fromPromise(promise) {
99
- const $observable = new Subject();
100
- promise
101
- .then((errors) => {
102
- $observable.next(errors);
103
- $observable.complete();
104
- })
105
- .catch(err => $observable.error(err));
106
- return $observable;
107
- }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9vYnNlcnZhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLEtBQUssRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl2QyxNQUFNLFVBQVUsWUFBWSxDQUFVLEdBQWtCO0lBQ3RELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLFdBQVcsQ0FBVSxHQUFrQjtJQUNyRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNELE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBd0I7SUFDakQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUNELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBd0I7SUFDbEQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUNELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUF3QjtJQUN2RCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FB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LEVBQUUsQ0FBQztJQUN6QyxDQUFDO0NBQUE7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFJLE9BQW1CO0lBQ2hELE1BQU0sV0FBVyxHQUFHLElBQUksT0FBTyxFQUFLLENBQUM7SUFDckMsT0FBTztTQUNKLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2YsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4QixXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDO1NBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICcuL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlck5vdE5pbDxUID0gYW55PihvYnM6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpbHRlcihpc05vdE5pbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0Tm90TmlsPFQgPSBhbnk+KG9iczogT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICByZXR1cm4gb2JzLnBpcGUoZmlyc3QoaXNOb3ROaWwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJUcnVlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICByZXR1cm4gb2JzLnBpcGUoZmlsdGVyKCh2KSA9PiB2ID09PSB0cnVlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRmFsc2Uob2JzOiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gIHJldHVybiBvYnMucGlwZShmaWx0ZXIoKHYpID0+IHYgPT09IGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RUcnVlUHJvbWlzZShvYnM6IE9ic2VydmFibGU8Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpcnN0KCh2KSA9PiB2ID09PSB0cnVlKSkudG9Qcm9taXNlKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RGYWxzZVByb21pc2Uob2JzOiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBvYnMucGlwZShmaXJzdCgodikgPT4gdiA9PT0gZmFsc2UpKS50b1Byb21pc2UoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE5vdE5pbFByb21pc2U8VCA9IGFueT4ob2JzOiBPYnNlcnZhYmxlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBmaXJzdE5vdE5pbChvYnMpLnRvUHJvbWlzZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoYWluUHJvbWlzZXM8VCA9IGFueT4oZGVmZXJzOiAoKCkgPT4gUHJvbWlzZTxhbnk+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIChkZWZlcnMgfHwgW10pLnJlZHVjZSgocHJldmlvdXM6IFByb21pc2U8YW55PiB8IG51bGwsIGRlZmVyKSA9PiB7XG4gICAgLy8gRmlyc3Qgam9iXG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIGRlZmVyKClcbiAgICAgICAgLy8gSW5pdCB0aGUgZmluYWwgcmVzdWx0IGFycmF5LCB3aXRoIHRoZSBmaXJzdCByZXN1bHRcbiAgICAgICAgLnRoZW4oam9iUmVzID0+IFtqb2JSZXNdKTtcbiAgICB9XG4gICAgLy8gT3RoZXIgam9ic1xuICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgLnRoZW4oKGZpbmFsUmVzdWx0KSA9PiBkZWZlcigpXG4gICAgICAgIC8vIEFkZCBqb2IgcmVzdWx0IHRvIGZpbmFsIHJlc3VsdCBhcnJheVxuICAgICAgICAudGhlbihqb2JSZXMgPT4gZmluYWxSZXN1bHQuY29uY2F0KGpvYlJlcykpKTtcbiAgfSwgbnVsbCk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBXYWl0Rm9yT3B0aW9ucyB7XG4gIGR1ZVRpbWU/OiBudW1iZXI7XG4gIGNoZWNrUGVyaW9kPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlyc3RUcnVlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gb2JzLnBpcGUoXG4gICAgZmlyc3QoKHYpID0+IHYgPT09IHRydWUpLFxuICAgIG1hcChfID0+IHt9KSAvLyBDb252ZXJ0IHRvIHZvaWRcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEZhbHNlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gb2JzLnBpcGUoXG4gICAgZmlyc3QoKHYpID0+IHYgPT09IGZhbHNlKSxcbiAgICBtYXAoXyA9PiB7fSkgLy8gQ29udmVydCB0byB2b2lkXG4gICk7XG59XG5cbi8qKlxuICogV2FpdCBmb3JtIGEgcHJlZGljYXRlIHJldHVybiB0cnVlLiBUaGlzIG5lZWQgdG8gaW1wbGVtZW50IEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKCksIEFwcEZvcm1VdGlscy53YWl0SWRsZSgpXG4gKiBAcGFyYW0gcHJlZGljYXRlXG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvcihwcmVkaWNhdGU6IFByZWRpY2F0ZTx2b2lkPiwgb3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwcmVkaWNhdGUoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIGNvbnN0IHBlcmlvZCA9IG9wdHMgJiYgb3B0cy5jaGVja1BlcmlvZCB8fCAzMDA7XG4gIGNvbnN0IGR1ZVRpbWUgPSBvcHRzICYmIG9wdHMuZHVlVGltZSB8fCBwZXJpb2Q7XG4gIGxldCB3YWl0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRpbWVyKGR1ZVRpbWUsIHBlcmlvZClcbiAgICAucGlwZShcbiAgICAgIC8vIEZvciBERUJVRyA6XG4gICAgICAvL3RhcCgoKSA9PiBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBmb3JtIGlkbGUuLi5cIiwgZm9ybSkpLFxuICAgICAgZmlsdGVyKF8gPT4gcHJlZGljYXRlKCkpLFxuICAgICAgbWFwKF8gPT4gdHJ1ZSlcbiAgICApO1xuXG4gIC8vIEFkZCB0aW1lb3V0XG4gIGlmIChvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgIGNvbnN0ICR0aW1lb3V0ID0gdGltZXIob3B0cy50aW1lb3V0KTtcbiAgICB3YWl0JCA9IG1lcmdlKFxuICAgICAgd2FpdCQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKCR0aW1lb3V0KVxuICAgICAgKSxcbiAgICAgICR0aW1lb3V0XG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lb3V0IHdhaXRJZGxlKCkgLSBhZnRlciAke29wdHMudGltZW91dH1tc2ApO1xuICAgICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHdhaXQkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JUcnVlKG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4sIG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaXJzdFRydWVPYnNlcnZhYmxlID0gZmlyc3RUcnVlKG9ic2VydmFibGUpO1xuXG4gIC8vIFRpbWVvdXQgKCsgZHVlVGltZSlcbiAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgIGNvbnN0ICR0aW1lb3V0ID0gdGltZXIob3B0cy50aW1lb3V0KTtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aW1lcihvcHRzLmR1ZVRpbWUgfHwgMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZpcnN0VHJ1ZU9ic2VydmFibGUpLFxuICAgICAgICAgIHRha2VVbnRpbCgkdGltZW91dClcbiAgICAgICAgKSxcbiAgICAgICR0aW1lb3V0XG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lb3V0IHJlYWR5KCkgLSBhZnRlciAke29wdHMudGltZW91dH1tc2ApO1xuICAgICAgICB9KSlcbiAgICApXG4gICAgLnRvUHJvbWlzZSgpO1xuICB9XG4gIC8vIGR1ZVRpbWUgKHdpdGhvdXQgdGltZW91dClcbiAgaWYgKG9wdHMgJiYgb3B0cy5kdWVUaW1lID4gMCkge1xuICAgIHJldHVybiB0aW1lcihvcHRzLmR1ZVRpbWUpXG4gICAgICAucGlwZShzd2l0Y2hNYXAoKCkgPT4gZmlyc3RUcnVlT2JzZXJ2YWJsZSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0VHJ1ZU9ic2VydmFibGUudG9Qcm9taXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUHJvbWlzZTxUPihwcm9taXNlOiBQcm9taXNlPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIGNvbnN0ICRvYnNlcnZhYmxlID0gbmV3IFN1YmplY3Q8VD4oKTtcbiAgcHJvbWlzZVxuICAgIC50aGVuKChlcnJvcnMpID0+IHtcbiAgICAgICRvYnNlcnZhYmxlLm5leHQoZXJyb3JzKVxuICAgICAgJG9ic2VydmFibGUuY29tcGxldGUoKTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnIgPT4gJG9ic2VydmFibGUuZXJyb3IoZXJyKSk7XG4gIHJldHVybiAkb2JzZXJ2YWJsZTtcbn1cbiJdfQ==
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9vYnNlcnZhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLEtBQUssRUFBdUIsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl2QyxNQUFNLFVBQVUsWUFBWSxDQUFVLEdBQWtCO0lBQ3RELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLFdBQVcsQ0FBVSxHQUFrQjtJQUNyRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNELE1BQU0sVUFBVSxVQUFVLENBQUMsR0FBd0I7SUFDakQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUNELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBd0I7SUFDbEQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUNELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUF3QjtJQUN2RCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtB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QztJQUN6QyxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge21lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICcuL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlck5vdE5pbDxUID0gYW55PihvYnM6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpbHRlcihpc05vdE5pbCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0Tm90TmlsPFQgPSBhbnk+KG9iczogT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICByZXR1cm4gb2JzLnBpcGUoZmlyc3QoaXNOb3ROaWwpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJUcnVlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICByZXR1cm4gb2JzLnBpcGUoZmlsdGVyKCh2KSA9PiB2ID09PSB0cnVlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRmFsc2Uob2JzOiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gIHJldHVybiBvYnMucGlwZShmaWx0ZXIoKHYpID0+IHYgPT09IGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RUcnVlUHJvbWlzZShvYnM6IE9ic2VydmFibGU8Ym9vbGVhbj4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpcnN0KCh2KSA9PiB2ID09PSB0cnVlKSkudG9Qcm9taXNlKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmlyc3RGYWxzZVByb21pc2Uob2JzOiBPYnNlcnZhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBvYnMucGlwZShmaXJzdCgodikgPT4gdiA9PT0gZmFsc2UpKS50b1Byb21pc2UoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE5vdE5pbFByb21pc2U8VCA9IGFueT4ob2JzOiBPYnNlcnZhYmxlPFQ+KTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBmaXJzdE5vdE5pbChvYnMpLnRvUHJvbWlzZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoYWluUHJvbWlzZXM8VCA9IGFueT4oZGVmZXJzOiAoKCkgPT4gUHJvbWlzZTxhbnk+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIChkZWZlcnMgfHwgW10pLnJlZHVjZSgocHJldmlvdXM6IFByb21pc2U8YW55PiB8IG51bGwsIGRlZmVyKSA9PiB7XG4gICAgLy8gRmlyc3Qgam9iXG4gICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgcmV0dXJuIGRlZmVyKClcbiAgICAgICAgLy8gSW5pdCB0aGUgZmluYWwgcmVzdWx0IGFycmF5LCB3aXRoIHRoZSBmaXJzdCByZXN1bHRcbiAgICAgICAgLnRoZW4oam9iUmVzID0+IFtqb2JSZXNdKTtcbiAgICB9XG4gICAgLy8gT3RoZXIgam9ic1xuICAgIHJldHVybiBwcmV2aW91c1xuICAgICAgLnRoZW4oKGZpbmFsUmVzdWx0KSA9PiBkZWZlcigpXG4gICAgICAgIC8vIEFkZCBqb2IgcmVzdWx0IHRvIGZpbmFsIHJlc3VsdCBhcnJheVxuICAgICAgICAudGhlbihqb2JSZXMgPT4gZmluYWxSZXN1bHQuY29uY2F0KGpvYlJlcykpKTtcbiAgfSwgbnVsbCk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBXYWl0Rm9yT3B0aW9ucyB7XG4gIGR1ZVRpbWU/OiBudW1iZXI7XG4gIGNoZWNrUGVyaW9kPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlyc3RUcnVlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gb2JzLnBpcGUoXG4gICAgZmlyc3QoKHYpID0+IHYgPT09IHRydWUpLFxuICAgIG1hcChfID0+IHt9KSAvLyBDb252ZXJ0IHRvIHZvaWRcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEZhbHNlKG9iczogT2JzZXJ2YWJsZTxib29sZWFuPik6IE9ic2VydmFibGU8dm9pZD4ge1xuICByZXR1cm4gb2JzLnBpcGUoXG4gICAgZmlyc3QoKHYpID0+IHYgPT09IGZhbHNlKSxcbiAgICBtYXAoXyA9PiB7fSkgLy8gQ29udmVydCB0byB2b2lkXG4gICk7XG59XG5cbi8qKlxuICogV2FpdCBmb3JtIGEgcHJlZGljYXRlIHJldHVybiB0cnVlLiBUaGlzIG5lZWQgdG8gaW1wbGVtZW50IEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKCksIEFwcEZvcm1VdGlscy53YWl0SWRsZSgpXG4gKiBAcGFyYW0gcHJlZGljYXRlXG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvcihwcmVkaWNhdGU6IFByZWRpY2F0ZTx2b2lkPiwgb3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwcmVkaWNhdGUoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIGNvbnN0IHBlcmlvZCA9IG9wdHMgJiYgb3B0cy5jaGVja1BlcmlvZCB8fCAzMDA7XG4gIGNvbnN0IGR1ZVRpbWUgPSBvcHRzICYmIG9wdHMuZHVlVGltZSB8fCBwZXJpb2Q7XG4gIGxldCB3YWl0JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRpbWVyKGR1ZVRpbWUsIHBlcmlvZClcbiAgICAucGlwZShcbiAgICAgIC8vIEZvciBERUJVRyA6XG4gICAgICAvL3RhcCgoKSA9PiBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBmb3JtIGlkbGUuLi5cIiwgZm9ybSkpLFxuICAgICAgZmlsdGVyKF8gPT4gcHJlZGljYXRlKCkpLFxuICAgICAgbWFwKF8gPT4gdHJ1ZSlcbiAgICApO1xuXG4gIC8vIEFkZCB0aW1lb3V0XG4gIGlmIChvcHRzICYmIG9wdHMudGltZW91dCkge1xuICAgIGNvbnN0ICR0aW1lb3V0ID0gdGltZXIob3B0cy50aW1lb3V0KTtcbiAgICB3YWl0JCA9IG1lcmdlKFxuICAgICAgd2FpdCQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKCR0aW1lb3V0KVxuICAgICAgKSxcbiAgICAgICR0aW1lb3V0XG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lb3V0IHdhaXRJZGxlKCkgLSBhZnRlciAke29wdHMudGltZW91dH1tc2ApO1xuICAgICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHdhaXQkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JUcnVlKG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4sIG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaXJzdFRydWVPYnNlcnZhYmxlID0gZmlyc3RUcnVlKG9ic2VydmFibGUpO1xuXG4gIC8vIFRpbWVvdXQgKCsgZHVlVGltZSlcbiAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgIGNvbnN0ICR0aW1lb3V0ID0gdGltZXIob3B0cy50aW1lb3V0KTtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aW1lcihvcHRzLmR1ZVRpbWUgfHwgMClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZpcnN0VHJ1ZU9ic2VydmFibGUpLFxuICAgICAgICAgIHRha2VVbnRpbCgkdGltZW91dClcbiAgICAgICAgKSxcbiAgICAgICR0aW1lb3V0XG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lb3V0IHJlYWR5KCkgLSBhZnRlciAke29wdHMudGltZW91dH1tc2ApO1xuICAgICAgICB9KSlcbiAgICApXG4gICAgLnRvUHJvbWlzZSgpO1xuICB9XG4gIC8vIGR1ZVRpbWUgKHdpdGhvdXQgdGltZW91dClcbiAgaWYgKG9wdHMgJiYgb3B0cy5kdWVUaW1lID4gMCkge1xuICAgIHJldHVybiB0aW1lcihvcHRzLmR1ZVRpbWUpXG4gICAgICAucGlwZShzd2l0Y2hNYXAoKCkgPT4gZmlyc3RUcnVlT2JzZXJ2YWJsZSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0VHJ1ZU9ic2VydmFibGUudG9Qcm9taXNlKCk7XG59XG4iXX0=
@@ -1,10 +1,10 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { ChangeDetectorRef, Component, Input, ViewChild } from '@angular/core';
3
- import { HttpEventType, HttpResponse } from '@angular/common/http';
3
+ import { HttpEventType } from '@angular/common/http';
4
4
  import { catchError, debounceTime, filter, first, map, switchMap, tap } from 'rxjs/operators';
5
5
  import { BehaviorSubject, forkJoin, of, Subject } from 'rxjs';
6
6
  import { TranslateService } from '@ngx-translate/core';
7
- import { FileResponse } from './upload-file.model';
7
+ import { isProgressEvent, isResponseEvent } from './upload-file.model';
8
8
  import { isNil, isNotNil } from '../functions';
9
9
  import { waitFor } from '../observables';
10
10
  export class UploadFileComponent {
@@ -141,7 +141,7 @@ export class UploadFileComponent {
141
141
  switchMap(file => this.uploadFn(file)
142
142
  .pipe(map((event) => {
143
143
  // Progress event
144
- if ((event === null || event === void 0 ? void 0 : event.type) === HttpEventType.UploadProgress || event.type === HttpEventType.User) {
144
+ if (isProgressEvent(event)) {
145
145
  if (isNotNil(event.loaded) && event.loaded >= 0) {
146
146
  file.progress = Math.min(1, event.loaded / (event.total || 1));
147
147
  }
@@ -149,15 +149,20 @@ export class UploadFileComponent {
149
149
  file.progress = -1; // Indeterminate progression
150
150
  }
151
151
  }
152
+ // User event
153
+ else if (event.type === HttpEventType.User) {
154
+ file.progress = -1; // Indeterminate progression
155
+ }
152
156
  // Response event
153
- else if (event instanceof HttpResponse || event instanceof FileResponse) {
157
+ else if (isResponseEvent(event)) {
154
158
  file.progress = 1;
155
159
  file.response = event;
156
160
  console.debug(`[upload-file] ${file.name}: ${event.statusText || 'OK'}`, file.response);
157
161
  }
158
- // Other events
162
+ // Other events: ignore
159
163
  else {
160
- console.warn('[upload-file] Unknown event, returned by uploadFn\'s observable:', event);
164
+ // DEBUG
165
+ console.debug('[upload-file] Ignoring a file event: ', event);
161
166
  }
162
167
  return file;
163
168
  }), catchError((err) => {
@@ -199,4 +204,4 @@ UploadFileComponent.propDecorators = {
199
204
  deleteFn: [{ type: Input }],
200
205
  maxParallelUpload: [{ type: Input }]
201
206
  };
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFDLGVBQWUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWUsWUFBWSxFQUEyQixNQUFNLHFCQUFxQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxPQUFPLEVBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFPdkQsTUFBTSxPQUFPLG1CQUFtQjtJQXlCOUIsWUFBc0IsRUFBcUIsRUFBWSxTQUEyQjtRQUE1RCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUFZLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBcEJ6RSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSy9CLFVBQUssR0FBc0IsRUFBRSxDQUFDO0lBY3VELENBQUM7SUFadEYsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxN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QUFDLEdBQUcsRUFBRTtnQkFDUCxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUNKLENBQUMsQ0FBQztZQUVILHNCQUFzQjtZQUN0QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7aUJBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztpQkFDbkMsU0FBUyxFQUFFLENBQUM7UUFDakIsQ0FBQztLQUFBO0lBRUQsUUFBUSxDQUFDLElBQXFCO1FBQzVCLE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQzs7O1lBN01GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixreERBQTJDOzthQUU1Qzs7O1lBYk8saUJBQWlCO1lBSWpCLGdCQUFnQjs7O3lCQVlyQixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs0QkFFMUMsS0FBSzt5QkFDTCxLQUFLOzRCQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLO2dDQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXZlbnRUeXBlLCBIdHRwUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZpbGVEZWxldGVGbiwgRmlsZVJlc3BvbnNlLCBGaWxlVXBsb2FkRm4sIFVwbG9hZEZpbGV9IGZyb20gJy4vdXBsb2FkLWZpbGUubW9kZWwnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge3dhaXRGb3IsIFdhaXRGb3JPcHRpb25zfSBmcm9tICcuLi9vYnNlcnZhYmxlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11cGxvYWQtZmlsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZmlsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC1maWxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZEZpbGVDb21wb25lbnQge1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVEcm9wUmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVEcm9wRWw6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgZmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICBASW5wdXQoKSB1bmlxdWVGaWxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIGluc3RhbnRVcGxvYWQgPSBmYWxzZTtcbiAgQElucHV0KCkgdXBsb2FkRm46IEZpbGVVcGxvYWRGbjxhbnk+O1xuICBASW5wdXQoKSBkZWxldGVGbjogRmlsZURlbGV0ZUZuPGFueT47XG4gIEBJbnB1dCgpIG1heFBhcmFsbGVsVXBsb2FkOiBudW1iZXI7XG5cbiAgZmlsZXM6IFVwbG9hZEZpbGU8YW55PltdID0gW107XG5cbiAgZ2V0IHByb2Nlc3NpbmdGaWxlcygpOiBVcGxvYWRGaWxlPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGYgPT4gIWYuZGVsZXRpbmcgJiYgaXNOb3ROaWwoZi5wcm9ncmVzcykgJiYgZi5wcm9ncmVzcyA8IDEpXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkRmlsZXMoKTogVXBsb2FkRmlsZTxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLmZpbGVzLmZpbHRlcihmID0+ICFmLmRlbGV0aW5nICYmIGYucHJvZ3Jlc3MgPT09IDEpO1xuICB9XG5cbiAgZ2V0IHByb2Nlc3NpbmdGaWxlc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc2luZ0ZpbGVzLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIG9uIGZpbGUgZHJvcCBoYW5kbGVyXG4gICAqL1xuICBvbkZpbGVEcm9wcGVkKGV2ZW50KSB7XG4gICAgdGhpcy5wcmVwYXJlRmlsZXNMaXN0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBoYW5kbGUgZmlsZSBmcm9tIGJyb3dzaW5nXG4gICAqL1xuICBmaWxlQnJvd3NlSGFuZGxlcihmaWxlcykge1xuICAgIHRoaXMucHJlcGFyZUZpbGVzTGlzdChmaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGZpbGUgZnJvbSBmaWxlcyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCAoRmlsZSBpbmRleClcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUZpbGUoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGZpbGUgPSB0aGlzLmZpbGVzW2luZGV4XTtcblxuICAgIGlmIChmaWxlLnByb2dyZXNzID09PSAxICYmIHRoaXMuZGVsZXRlRm4pIHtcbiAgICAgIGlmIChmaWxlLmRlbGV0aW5nKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3VwbG9hZC1maWxlXSBUaGlzIGZpbGUgYWxyZWFkeSBkZWxldGluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBmaWxlLmRlbGV0aW5nID0gdHJ1ZVxuICAgICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5kZWxldGVGbihmaWxlKTtcbiAgICAgICAgaWYgKCFkZWxldGVkKSByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7XG4gICAgICAgIGZpbGUuZGVsZXRpbmcgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIGluZGV4IG5vdCBjaGFuZ2VkXG4gICAgICBpbmRleCA9IHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gTm90IGZvdW5kIChhbHJlYWR5IHJlbW92ZWQgPylcbiAgICB9XG4gICAgZWxzZSBpZiAoZmlsZS5wcm9ncmVzcyA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3VwbG9hZC1maWxlXSBDYW5ub3QgcmVtb3ZlIHRoaXMgZmlsZSB3aGlsZSB1cGxvYWRpbmdgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IEZpbGVzIGxpc3QgdG8gbm9ybWFsIGFycmF5IGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIChGaWxlcyBMaXN0KVxuICAgKi9cbiAgcHJlcGFyZUZpbGVzTGlzdChmaWxlczogRmlsZUxpc3QgfCBGaWxlW10pIHtcbiAgICBsZXQgaXRlbXM6IEZpbGVbXTtcbiAgICBpZiAoZmlsZXMgaW5zdGFuY2VvZiBGaWxlTGlzdCkge1xuICAgICAgaXRlbXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGZpbGVzLml0ZW0oaSk7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaXRlbXMgPSBmaWxlcztcbiAgICB9XG4gICAgdGhpcy5maWxlcy5wdXNoKC4uLml0ZW1zKTtcblxuICAgIHRoaXMuZmlsZURyb3BFbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG5cbiAgICAvLyBTdGFydCB1cGxvYWRcbiAgICBpZiAodGhpcy5pbnN0YW50VXBsb2FkKSB7XG4gICAgICB0aGlzLnVwbG9hZEZpbGVzKGl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB1cGxvYWRcbiAgICovXG4gIGFzeW5jIHVwbG9hZEZpbGVzKGZpbGVzPzogRmlsZVtdKTogUHJvbWlzZTxVcGxvYWRGaWxlPGFueT5bXT4ge1xuXG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgY29uc29sZS5pbmZvKCdbdXBsb2FkLWZpbGVdIFVwbG9hZGluZyBhbGwgZmlsZXMuLi4nKTtcbiAgICAgIGZpbGVzID0gdGhpcy5maWxlcztcbiAgICB9XG5cbiAgICBjb25zdCAkcHJvY2Vzc2luZ0ZpbGVDb3VudENoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3QodGhpcy5wcm9jZXNzaW5nRmlsZXNDb3VudCk7XG4gICAgY29uc3QgJGNoYW5nZXMgPSBuZXcgU3ViamVjdCgpO1xuICAgICRjaGFuZ2VzLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAkcHJvY2Vzc2luZ0ZpbGVDb3VudENoYW5nZS5uZXh0KHRoaXMucHJvY2Vzc2luZ0ZpbGVzQ291bnQpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgam9iczogT2JzZXJ2YWJsZTxVcGxvYWRGaWxlPGFueT4+W10gPSBmaWxlc1xuICAgICAgLm1hcChmID0+IGYgYXMgVXBsb2FkRmlsZTxhbnk+KVxuICAgICAgLmZpbHRlcihmaWxlID0+IGlzTmlsKGZpbGUucHJvZ3Jlc3MpICYmICFmaWxlLmVycm9yKSAvLyBTa2lwIGlmIGFscmVhZHkgc3RhcnRlZCBvciBpbiBlcnJvclxuICAgICAgLm1hcCgoZmlsZSwgaSkgPT4ge1xuICAgICAgICAgIC8vIFdhaXQgaWYgbmVlZFxuICAgICAgICAgIGlmIChpc05vdE5pbCh0aGlzLm1heFBhcmFsbGVsVXBsb2FkKSkge1xuICAgICAgICAgICAgcmV0dXJuICRwcm9jZXNzaW5nRmlsZUNvdW50Q2hhbmdlLnBpcGUoXG4gICAgICAgICAgICAgIGRlYm91bmNlVGltZShpKSwgLy8gY2FsbCBvZiBmaWx0ZXIoKSBtdXN0IGJlIGRpZmZlcmVudCBmb3Igd2FpdGluZyBqb2JcbiAgICAgICAgICAgICAgZmlsdGVyKGNvdW50ID0+IGNvdW50IDwgdGhpcy5tYXhQYXJhbGxlbFVwbG9hZCksXG4gICAgICAgICAgICAgIG1hcChfID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCB1cGxvYWRpbmdcbiAgICAgICAgICAgICAgICBpZiAoaXNOaWwoZmlsZS5wcm9ncmVzcykpIGZpbGUucHJvZ3Jlc3MgPSAwO1xuICAgICAgICAgICAgICAgICRjaGFuZ2VzLm5leHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFN0YXJ0IHVwbG9hZGluZ1xuICAgICAgICAgIGlmIChpc05pbChmaWxlLnByb2dyZXNzKSkgZmlsZS5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgcmV0dXJuIG9mKGZpbGUpO1xuICAgICAgICB9KVxuXG4gICAgICAubWFwKGZpbGUkID0+IGZpbGUkLnBpcGUoXG4gICAgICAgIC8vIExvZ1xuICAgICAgICB0YXAoZmlsZSA9PiBjb25zb2xlLmRlYnVnKGBbdXBsb2FkLWZpbGVdICR7ZmlsZS5uYW1lfTogdXBsb2FkaW5nLi4uYCkpLFxuXG4gICAgICAgIC8vIFN0YXJ0IHVwbG9hZGluZ1xuICAgICAgICBzd2l0Y2hNYXAoZmlsZSA9PiB0aGlzLnVwbG9hZEZuKGZpbGUpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgICAgLy8gUHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgICAgICAgaWYgKGV2ZW50Py50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXNlcikge1xuICAgICAgICAgICAgICAgIGlmIChpc05vdE5pbChldmVudC5sb2FkZWQpICYmIGV2ZW50LmxvYWRlZCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICBmaWxlLnByb2dyZXNzID0gTWF0aC5taW4oMSwgZXZlbnQubG9hZGVkIC8gKGV2ZW50LnRvdGFsIHx8IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmaWxlLnByb2dyZXNzID0gLTE7IC8vIEluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3Npb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNwb25zZSBldmVudFxuICAgICAgICAgICAgICBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSB8fCBldmVudCBpbnN0YW5jZW9mIEZpbGVSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSAxO1xuICAgICAgICAgICAgICAgIGZpbGUucmVzcG9uc2UgPSBldmVudDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbdXBsb2FkLWZpbGVdICR7ZmlsZS5uYW1lfTogJHtldmVudC5zdGF0dXNUZXh0IHx8ICdPSyd9YCwgZmlsZS5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBPdGhlciBldmVudHNcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbdXBsb2FkLWZpbGVdIFVua25vd24gZXZlbnQsIHJldHVybmVkIGJ5IHVwbG9hZEZuXFwncyBvYnNlcnZhYmxlOicsIGV2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IGVyciAmJiAoZXJyLm1lc3NhZ2UgfHwgZXJyLmVycm9yPy5tZXNzYWdlKSB8fCAnRklMRS5VUExPQUQuRVJST1InO1xuICAgICAgICAgICAgICByZXR1cm4gb2YoZmlsZSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICRjaGFuZ2VzLm5leHQoKTtcbiAgICAgICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgKSk7XG5cbiAgICAvLyBXYWl0IGpvYnMgdG8gZmluaXNoXG4gICAgcmV0dXJuIGZvcmtKb2luKGpvYnMpXG4gICAgICAucGlwZSh0YXAoXyA9PiAkY2hhbmdlcy5jb21wbGV0ZSgpKSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHdhaXRJZGxlKG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB3YWl0Rm9yKCgpID0+IHRoaXMucHJvY2Vzc2luZ0ZpbGVzQ291bnQgPT09IDAsIG9wdHMpO1xuICB9XG59XG4iXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RixPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBNkIsZUFBZSxFQUFFLGVBQWUsRUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBQzdHLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxPQUFPLEVBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFPdkQsTUFBTSxPQUFPLG1CQUFtQjtJQXlCOUIsWUFBc0IsRUFBcUIsRUFBWSxTQUEyQjtRQUE1RCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUFZLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBcEJ6RSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBSy9CLFVBQUssR0FBc0IsRUFBRSxDQUFDO0lBY3VELENBQUM7SUFadEYsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFJRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNHLFVBQVUsQ0FBQyxLQUFhOztZQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7b0JBQ3pELE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSTtvQkFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtvQkFDcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQyxJQUFJLENBQUMsT0FBTzt3QkFBRSxPQUFPO2lCQUN0QjtnQkFDRCxPQUFNLEdBQUcsRUFBRTtvQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO29CQUN6QyxPQUFPO2lCQUNSO3dCQUNPO29CQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2lCQUN2QjtnQkFFRCw4QkFBOEI7Z0JBQzlCLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO29CQUFFLE9BQU8sQ0FBQyxnQ0FBZ0M7YUFDM0Q7aUJBQ0ksSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO2dCQUN0RSxPQUFPO2FBQ1I7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixDQUFDO0tBQUE7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsS0FBd0I7UUFDdkMsSUFBSSxLQUFhLENBQUM7UUFDbEIsSUFBSSxLQUFLLFlBQVksUUFBUSxFQUFFO1lBQzdCLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNsQjtTQUNGO2FBQ0k7WUFDSCxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ2Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFekMsZUFBZTtRQUNmLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0csV0FBVyxDQUFDLEtBQWM7O1lBRTlCLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUNyRCxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNwQjtZQUVELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMvQixRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QiwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBa0MsS0FBSztpQkFDOUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBb0IsQ0FBQztpQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxzQ0FBc0M7aUJBQzFGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDYixlQUFlO2dCQUNmLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO29CQUNwQyxPQUFPLDBCQUEwQixDQUFDLElBQUksQ0FDcEMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFEQUFxRDtvQkFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ04sa0JBQWtCO3dCQUNsQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDOzRCQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO3dCQUM1QyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2hCLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNSLENBQUM7aUJBQ0g7Z0JBQ0Qsa0JBQWtCO2dCQUNsQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO29CQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUM7aUJBRUgsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDdEIsTUFBTTtZQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUM7WUFFdEUsa0JBQWtCO1lBQ2xCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO2lCQUNsQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBRVosaUJBQWlCO2dCQUNqQixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO3dCQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ2hFO3lCQUNJO3dCQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7cUJBQ2pEO2lCQUNGO2dCQUVELGFBQWE7cUJBQ1IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxJQUFJLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7aUJBQ2pEO2dCQUVELGlCQUFpQjtxQkFDWixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO29CQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN6RjtnQkFFRCx1QkFBdUI7cUJBQ2xCO29CQUNILFFBQVE7b0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDL0Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTs7Z0JBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sV0FBSSxHQUFHLENBQUMsS0FBSywwQ0FBRSxPQUFPLENBQUEsQ0FBQyxJQUFJLG1CQUFtQixDQUFDO2dCQUMvRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNQLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FDSCxDQUNGLENBQ0osQ0FBQyxDQUFDO1lBRUgsc0JBQXNCO1lBQ3RCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUNuQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixDQUFDO0tBQUE7SUFFRCxRQUFRLENBQUMsSUFBcUI7UUFDNUIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7WUFuTkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLGt4REFBMkM7O2FBRTVDOzs7WUFiTyxpQkFBaUI7WUFJakIsZ0JBQWdCOzs7eUJBWXJCLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzRCQUUxQyxLQUFLO3lCQUNMLEtBQUs7NEJBQ0wsS0FBSzt1QkFDTCxLQUFLO3VCQUNMLEtBQUs7Z0NBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBFdmVudFR5cGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpcnN0LCBtYXAsIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0ZpbGVEZWxldGVGbiwgRmlsZVVwbG9hZEZuLCBpc1Byb2dyZXNzRXZlbnQsIGlzUmVzcG9uc2VFdmVudCwgVXBsb2FkRmlsZX0gZnJvbSAnLi91cGxvYWQtZmlsZS5tb2RlbCc7XG5pbXBvcnQge2lzTmlsLCBpc05vdE5pbH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7d2FpdEZvciwgV2FpdEZvck9wdGlvbnN9IGZyb20gJy4uL29ic2VydmFibGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVwbG9hZC1maWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBsb2FkLWZpbGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkRmlsZUNvbXBvbmVudCB7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZURyb3BSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmlsZURyb3BFbDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBmaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVuaXF1ZUZpbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5zdGFudFVwbG9hZCA9IGZhbHNlO1xuICBASW5wdXQoKSB1cGxvYWRGbjogRmlsZVVwbG9hZEZuPGFueT47XG4gIEBJbnB1dCgpIGRlbGV0ZUZuOiBGaWxlRGVsZXRlRm48YW55PjtcbiAgQElucHV0KCkgbWF4UGFyYWxsZWxVcGxvYWQ6IG51bWJlcjtcblxuICBmaWxlczogVXBsb2FkRmlsZTxhbnk+W10gPSBbXTtcblxuICBnZXQgcHJvY2Vzc2luZ0ZpbGVzKCk6IFVwbG9hZEZpbGU8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiAhZi5kZWxldGluZyAmJiBpc05vdE5pbChmLnByb2dyZXNzKSAmJiBmLnByb2dyZXNzIDwgMSlcbiAgfVxuXG4gIGdldCBwcm9jZXNzZWRGaWxlcygpOiBVcGxvYWRGaWxlPGFueT5bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXMuZmlsdGVyKGYgPT4gIWYuZGVsZXRpbmcgJiYgZi5wcm9ncmVzcyA9PT0gMSk7XG4gIH1cblxuICBnZXQgcHJvY2Vzc2luZ0ZpbGVzQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nRmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge31cblxuICAvKipcbiAgICogb24gZmlsZSBkcm9wIGhhbmRsZXJcbiAgICovXG4gIG9uRmlsZURyb3BwZWQoZXZlbnQpIHtcbiAgICB0aGlzLnByZXBhcmVGaWxlc0xpc3QoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGhhbmRsZSBmaWxlIGZyb20gYnJvd3NpbmdcbiAgICovXG4gIGZpbGVCcm93c2VIYW5kbGVyKGZpbGVzKSB7XG4gICAgdGhpcy5wcmVwYXJlRmlsZXNMaXN0KGZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZmlsZSBmcm9tIGZpbGVzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGluZGV4IChGaWxlIGluZGV4KVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRmlsZShpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXNbaW5kZXhdO1xuXG4gICAgaWYgKGZpbGUucHJvZ3Jlc3MgPT09IDEgJiYgdGhpcy5kZWxldGVGbikge1xuICAgICAgaWYgKGZpbGUuZGVsZXRpbmcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbdXBsb2FkLWZpbGVdIFRoaXMgZmlsZSBhbHJlYWR5IGRlbGV0aW5nYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbGUuZGVsZXRpbmcgPSB0cnVlXG4gICAgICAgIGNvbnN0IGRlbGV0ZWQgPSBhd2FpdCB0aGlzLmRlbGV0ZUZuKGZpbGUpO1xuICAgICAgICBpZiAoIWRlbGV0ZWQpIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhdGNoKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgZmlsZS5kZWxldGluZyA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgaW5kZXggbm90IGNoYW5nZWRcbiAgICAgIGluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKGZpbGUpO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuOyAvLyBOb3QgZm91bmQgKGFscmVhZHkgcmVtb3ZlZCA/KVxuICAgIH1cbiAgICBlbHNlIGlmIChmaWxlLnByb2dyZXNzID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKGBbdXBsb2FkLWZpbGVdIENhbm5vdCByZW1vdmUgdGhpcyBmaWxlIHdoaWxlIHVwbG9hZGluZ2ApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgRmlsZXMgbGlzdCB0byBub3JtYWwgYXJyYXkgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0gZmlsZXMgKEZpbGVzIExpc3QpXG4gICAqL1xuICBwcmVwYXJlRmlsZXNMaXN0KGZpbGVzOiBGaWxlTGlzdCB8IEZpbGVbXSkge1xuICAgIGxldCBpdGVtczogRmlsZVtdO1xuICAgIGlmIChmaWxlcyBpbnN0YW5jZW9mIEZpbGVMaXN0KSB7XG4gICAgICBpdGVtcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gZmlsZXMuaXRlbShpKTtcbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpdGVtcyA9IGZpbGVzO1xuICAgIH1cbiAgICB0aGlzLmZpbGVzLnB1c2goLi4uaXRlbXMpO1xuXG4gICAgdGhpcy5maWxlRHJvcEVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcblxuICAgIC8vIFN0YXJ0IHVwbG9hZFxuICAgIGlmICh0aGlzLmluc3RhbnRVcGxvYWQpIHtcbiAgICAgIHRoaXMudXBsb2FkRmlsZXMoaXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHVwbG9hZFxuICAgKi9cbiAgYXN5bmMgdXBsb2FkRmlsZXMoZmlsZXM/OiBGaWxlW10pOiBQcm9taXNlPFVwbG9hZEZpbGU8YW55PltdPiB7XG5cbiAgICBpZiAoIWZpbGVzKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1t1cGxvYWQtZmlsZV0gVXBsb2FkaW5nIGFsbCBmaWxlcy4uLicpO1xuICAgICAgZmlsZXMgPSB0aGlzLmZpbGVzO1xuICAgIH1cblxuICAgIGNvbnN0ICRwcm9jZXNzaW5nRmlsZUNvdW50Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLnByb2Nlc3NpbmdGaWxlc0NvdW50KTtcbiAgICBjb25zdCAkY2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7XG4gICAgJGNoYW5nZXMuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICRwcm9jZXNzaW5nRmlsZUNvdW50Q2hhbmdlLm5leHQodGhpcy5wcm9jZXNzaW5nRmlsZXNDb3VudCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBqb2JzOiBPYnNlcnZhYmxlPFVwbG9hZEZpbGU8YW55Pj5bXSA9IGZpbGVzXG4gICAgICAubWFwKGYgPT4gZiBhcyBVcGxvYWRGaWxlPGFueT4pXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gaXNOaWwoZmlsZS5wcm9ncmVzcykgJiYgIWZpbGUuZXJyb3IpIC8vIFNraXAgaWYgYWxyZWFkeSBzdGFydGVkIG9yIGluIGVycm9yXG4gICAgICAubWFwKChmaWxlLCBpKSA9PiB7XG4gICAgICAgICAgLy8gV2FpdCBpZiBuZWVkXG4gICAgICAgICAgaWYgKGlzTm90TmlsKHRoaXMubWF4UGFyYWxsZWxVcGxvYWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gJHByb2Nlc3NpbmdGaWxlQ291bnRDaGFuZ2UucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKGkpLCAvLyBjYWxsIG9mIGZpbHRlcigpIG11c3QgYmUgZGlmZmVyZW50IGZvciB3YWl0aW5nIGpvYlxuICAgICAgICAgICAgICBmaWx0ZXIoY291bnQgPT4gY291bnQgPCB0aGlzLm1heFBhcmFsbGVsVXBsb2FkKSxcbiAgICAgICAgICAgICAgbWFwKF8gPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHVwbG9hZGluZ1xuICAgICAgICAgICAgICAgIGlmIChpc05pbChmaWxlLnByb2dyZXNzKSkgZmlsZS5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICAgICAgJGNoYW5nZXMubmV4dCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3RhcnQgdXBsb2FkaW5nXG4gICAgICAgICAgaWYgKGlzTmlsKGZpbGUucHJvZ3Jlc3MpKSBmaWxlLnByb2dyZXNzID0gMDtcbiAgICAgICAgICByZXR1cm4gb2YoZmlsZSk7XG4gICAgICAgIH0pXG5cbiAgICAgIC5tYXAoZmlsZSQgPT4gZmlsZSQucGlwZShcbiAgICAgICAgLy8gTG9nXG4gICAgICAgIHRhcChmaWxlID0+IGNvbnNvbGUuZGVidWcoYFt1cGxvYWQtZmlsZV0gJHtmaWxlLm5hbWV9OiB1cGxvYWRpbmcuLi5gKSksXG5cbiAgICAgICAgLy8gU3RhcnQgdXBsb2FkaW5nXG4gICAgICAgIHN3aXRjaE1hcChmaWxlID0+IHRoaXMudXBsb2FkRm4oZmlsZSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1hcCgoZXZlbnQpID0+IHtcblxuICAgICAgICAgICAgICAvLyBQcm9ncmVzcyBldmVudFxuICAgICAgICAgICAgICBpZiAoaXNQcm9ncmVzc0V2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChpc05vdE5pbChldmVudC5sb2FkZWQpICYmIGV2ZW50LmxvYWRlZCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICBmaWxlLnByb2dyZXNzID0gTWF0aC5taW4oMSwgZXZlbnQubG9hZGVkIC8gKGV2ZW50LnRvdGFsIHx8IDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmaWxlLnByb2dyZXNzID0gLTE7IC8vIEluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3Npb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBVc2VyIGV2ZW50XG4gICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXNlcikge1xuICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSAtMTsgLy8gSW5kZXRlcm1pbmF0ZSBwcm9ncmVzc2lvblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVzcG9uc2UgZXZlbnRcbiAgICAgICAgICAgICAgZWxzZSBpZiAoaXNSZXNwb25zZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIGZpbGUucHJvZ3Jlc3MgPSAxO1xuICAgICAgICAgICAgICAgIGZpbGUucmVzcG9uc2UgPSBldmVudDtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbdXBsb2FkLWZpbGVdICR7ZmlsZS5uYW1lfTogJHtldmVudC5zdGF0dXNUZXh0IHx8ICdPSyd9YCwgZmlsZS5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBPdGhlciBldmVudHM6IGlnbm9yZVxuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBERUJVR1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1t1cGxvYWQtZmlsZV0gSWdub3JpbmcgYSBmaWxlIGV2ZW50OiAnLCBldmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSBlcnIgJiYgKGVyci5tZXNzYWdlIHx8IGVyci5lcnJvcj8ubWVzc2FnZSkgfHwgJ0ZJTEUuVVBMT0FELkVSUk9SJztcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGZpbGUpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAkY2hhbmdlcy5uZXh0KCk7XG4gICAgICAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICkpO1xuXG4gICAgLy8gV2FpdCBqb2JzIHRvIGZpbmlzaFxuICAgIHJldHVybiBmb3JrSm9pbihqb2JzKVxuICAgICAgLnBpcGUodGFwKF8gPT4gJGNoYW5nZXMuY29tcGxldGUoKSkpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICB3YWl0SWRsZShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gd2FpdEZvcigoKSA9PiB0aGlzLnByb2Nlc3NpbmdGaWxlc0NvdW50ID09PSAwLCBvcHRzKTtcbiAgfVxufVxuIl19