ng-easycommerce 0.0.658-beta.1 → 0.0.660-beta.1

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 (48) hide show
  1. package/README.md +58 -22
  2. package/assets/ec-i18n/en.json +1 -3
  3. package/assets/ec-i18n/es.json +1 -3
  4. package/bundles/ng-easycommerce.umd.js +515 -181
  5. package/bundles/ng-easycommerce.umd.js.map +1 -1
  6. package/bundles/ng-easycommerce.umd.min.js +1 -1
  7. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  8. package/esm2015/lib/core.consts.js +1 -6
  9. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +3 -5
  10. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +5 -8
  11. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +8 -13
  12. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +450 -14
  13. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +3 -30
  14. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +2 -1
  15. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +5 -8
  16. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +3 -1
  17. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
  18. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +1 -2
  19. package/esm2015/lib/services/cart.service.js +12 -27
  20. package/esm2015/lib/services/currency.service.js +7 -43
  21. package/esm5/lib/core.consts.js +1 -6
  22. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +3 -5
  23. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +5 -8
  24. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +8 -13
  25. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +458 -13
  26. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +3 -48
  27. package/esm5/lib/ec-component/product-ec/product-ec.component.js +2 -1
  28. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +5 -8
  29. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +3 -1
  30. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
  31. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +1 -2
  32. package/esm5/lib/services/cart.service.js +12 -27
  33. package/esm5/lib/services/currency.service.js +7 -43
  34. package/fesm2015/ng-easycommerce.js +502 -159
  35. package/fesm2015/ng-easycommerce.js.map +1 -1
  36. package/fesm5/ng-easycommerce.js +516 -182
  37. package/fesm5/ng-easycommerce.js.map +1 -1
  38. package/lib/core.consts.d.ts +0 -5
  39. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +0 -1
  40. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +0 -1
  41. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +1 -1
  42. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +34 -4
  43. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +0 -3
  44. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +0 -1
  45. package/lib/services/cart.service.d.ts +2 -2
  46. package/lib/services/currency.service.d.ts +2 -14
  47. package/ng-easycommerce.metadata.json +1 -1
  48. package/package.json +1 -1
@@ -4,8 +4,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Component, Input } from '@angular/core';
8
- import { ActivatedRoute } from '@angular/router';
7
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
8
+ return function (target, key) { decorator(target, key, paramIndex); }
9
+ };
10
+ var CollectionEcComponent_1;
11
+ import { Component, Input, Inject, PLATFORM_ID } from '@angular/core';
12
+ import { ActivatedRoute, Router } from '@angular/router';
13
+ import { isPlatformBrowser } from '@angular/common';
9
14
  // import { Constants, Filter, OptionsService, Product, ProductsService } from 'ng-easycommerce';
10
15
  import { combineLatest } from 'rxjs';
11
16
  import { ComponentHelper } from '../../classes/component-helper';
@@ -17,8 +22,8 @@ import { FiltersService } from '../../services/filters.service';
17
22
  import { OptionsService } from '../../services/options.service';
18
23
  import { ParametersService } from '../../services/parameters.service';
19
24
  import { ProductsService } from '../../services/products/products.service';
20
- let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper {
21
- constructor(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService) {
25
+ let CollectionEcComponent = CollectionEcComponent_1 = class CollectionEcComponent extends ComponentHelper {
26
+ constructor(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService, router, platformId) {
22
27
  super();
23
28
  this.productsService = productsService;
24
29
  this.paramsSrv = paramsSrv;
@@ -29,12 +34,21 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
29
34
  this.cartService = cartService;
30
35
  this.consts = consts;
31
36
  this.filtersService = filtersService;
37
+ this.router = router;
32
38
  this.filters = [];
33
39
  this.filtersConfig = { filters: [] };
34
40
  this.finished = false;
35
41
  this.loading = true;
36
42
  this.breadcrumb = [];
37
43
  this.isCollection = true;
44
+ this.usingCachedProducts = false;
45
+ this.allCachedProducts = [];
46
+ this.subscriptionsConfigured = false;
47
+ this.isScrolling = false;
48
+ this.pendingScrollPosition = null;
49
+ this.expectedProductCount = 0;
50
+ this.filtersFromCache = false; // Flag para indicar si los filtros vienen del cache
51
+ this.isCategoryChange = false; // Flag para indicar si es un cambio de categoría
38
52
  this.productsWithUniqueVariant = false;
39
53
  this.optionsFilters = ['all'];
40
54
  /**
@@ -103,23 +117,113 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
103
117
  this.getObjectWithVariant = () => {
104
118
  return this.consts.getParamsProductsWithUniqueVariant();
105
119
  };
120
+ // Método personalizado para manejar selección de filtros que invalidará cache
121
+ this.customSetFilterSelected = (filter, filterElement) => {
122
+ // Invalidar cache completamente cuando se selecciona un filtro
123
+ this.usingCachedProducts = false;
124
+ this.allCachedProducts = [];
125
+ this.filtersFromCache = false; // Ya no usamos filtros del cache
126
+ this.isCategoryChange = true; // Marcar como cambio para reemplazar productos
127
+ CollectionEcComponent_1.stateCache.delete(this.stateKey);
128
+ console.log('🔄 Filtro seleccionado, invalidando cache y recargando desde endpoint para:', this.stateKey);
129
+ // Solo limpiar productos, NO limpiar filtros para que no desaparezcan
130
+ this.products = [];
131
+ this.loading = true;
132
+ // Llamar al método original del ProductsService que iniciará una carga completa
133
+ const result = this.productsService.setFilterSelected(filter, filterElement);
134
+ // La suscripción principal automáticamente actualizará los filtros
135
+ // porque filtersFromCache = false y usingCachedProducts = false
136
+ return result;
137
+ };
106
138
  this.paramsSrv.parameters.subscribe(param => this.params = param);
107
139
  this.defaultFilters = this.consts.getDefaultFilters();
108
140
  this.filtersConfig.filters = this.consts.getFilterConfig();
109
141
  this.productsService.filtersInView$.subscribe(res => this.filterInView = res);
142
+ // Inicializar propiedades de scroll y cache
143
+ this.platformId = platformId;
144
+ this.isRestoringState = false;
145
+ this.usingCachedProducts = false;
146
+ this.allCachedProducts = [];
147
+ this.subscriptionsConfigured = false;
148
+ this.isScrolling = false;
149
+ this.pendingScrollPosition = null;
150
+ this.expectedProductCount = 0;
151
+ this.filtersFromCache = false;
110
152
  this.ecOnConstruct();
111
153
  }
112
154
  ngOnInit() {
113
- window.scroll(0, 0);
114
- this.products = [];
115
- this.ecOnInit();
116
- this.getProductsAndSubscribe();
155
+ this.stateKey = this.router.url.split('?')[0];
156
+ // Verificar si hay estado guardado ANTES de scroll(0,0)
157
+ const savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
158
+ if (savedState && savedState.products.length > 0) {
159
+ // NO llamar window.scroll(0, 0) para preservar posición
160
+ this.products = [];
161
+ this.ecOnInit();
162
+ this.getProductsAndSubscribe(); // Llamar directamente
163
+ }
164
+ else {
165
+ // Comportamiento normal con scroll al inicio
166
+ window.scroll(0, 0);
167
+ this.products = [];
168
+ this.ecOnInit();
169
+ this.getProductsAndSubscribe();
170
+ }
171
+ // Configurar manejo de estado
172
+ this.setupBeforeUnloadHandler();
117
173
  }
118
174
  getProductsAndSubscribe() {
175
+ // Verificar PRIMERO si hay estado guardado
176
+ const savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
177
+ if (savedState && savedState.products.length > 0) {
178
+ console.log('📦 Restaurando desde cache:', savedState.products.length, 'productos');
179
+ // Configurar modo cache ANTES de restaurar
180
+ this.usingCachedProducts = true;
181
+ this.allCachedProducts = [...savedState.products];
182
+ this.isRestoringState = true;
183
+ // Restaurar productos inmediatamente
184
+ this.products = [...savedState.products];
185
+ this.finished = savedState.finished;
186
+ this.loading = false;
187
+ // Restaurar filtros si están disponibles
188
+ if (savedState.filters) {
189
+ this.filters = [...savedState.filters];
190
+ this.filtersFromCache = true; // Marcar que estos filtros vienen del cache
191
+ console.log('📦 Filtros restaurados desde cache:', this.filters.length);
192
+ }
193
+ if (savedState.filters_top) {
194
+ this.filters_top = [...savedState.filters_top];
195
+ console.log('📦 Filtros top restaurados desde cache:', this.filters_top.length);
196
+ }
197
+ if (savedState.breadcrumb) {
198
+ this.breadcrumb = [...savedState.breadcrumb];
199
+ console.log('📦 Breadcrumb restaurado desde cache:', this.breadcrumb);
200
+ }
201
+ // IMPORTANTE: Configurar TODAS las suscripciones del padre (filtros, breadcrumb, etc.)
202
+ // pero SIN resetear productos ni hacer petición inicial
203
+ this.setupParentSubscriptionsOnly();
204
+ // Configurar suscripción personalizada para detectar cambios de categoría
205
+ this.setupCustomSubscription();
206
+ this.subscriptionsConfigured = true;
207
+ // Restaurar scroll después de que los productos se rendericen
208
+ this.waitForProductRendering(savedState.scrollPosition);
209
+ return;
210
+ }
211
+ console.log('🔄 No hay cache, carga normal');
212
+ // Si no hay estado guardado, comportamiento normal
213
+ this.usingCachedProducts = false;
214
+ this.allCachedProducts = [];
215
+ this.filtersFromCache = false; // No hay filtros del cache
216
+ // Llamar al comportamiento original
217
+ this.originalGetProductsAndSubscribe();
218
+ this.subscriptionsConfigured = true;
219
+ }
220
+ originalGetProductsAndSubscribe() {
119
221
  combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(([params, ready, queryParams]) => {
120
222
  if (ready.readyAll) {
121
223
  let cambio = false;
122
224
  this.products = [];
225
+ // Marcar como cambio de categoría para la carga inicial
226
+ this.isCategoryChange = true;
123
227
  if (!params['type'] || !params['value']) {
124
228
  this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
125
229
  }
@@ -149,7 +253,16 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
149
253
  }
150
254
  else {
151
255
  res = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
152
- this.products.push(...res);
256
+ // Filtrar productos duplicados antes de agregar
257
+ const existingIds = new Set(this.products.map(p => p.id));
258
+ const uniqueProducts = res.filter(p => !existingIds.has(p.id));
259
+ if (uniqueProducts.length > 0) {
260
+ console.log('➕ CollectionEC (variants): Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
261
+ this.products.push(...uniqueProducts);
262
+ }
263
+ else {
264
+ console.log('⚠️ CollectionEC (variants): Todos los productos ya existen - ignorando', res.length, 'productos');
265
+ }
153
266
  this.applyFiltersInView();
154
267
  }
155
268
  ;
@@ -161,7 +274,16 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
161
274
  cambio = false;
162
275
  }
163
276
  else {
164
- this.products.push(...res);
277
+ // Filtrar productos duplicados antes de agregar
278
+ const existingIds = new Set(this.products.map(p => p.id));
279
+ const uniqueProducts = res.filter(p => !existingIds.has(p.id));
280
+ if (uniqueProducts.length > 0) {
281
+ console.log('➕ CollectionEC: Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
282
+ this.products.push(...uniqueProducts);
283
+ }
284
+ else {
285
+ console.log('⚠️ CollectionEC: Todos los productos ya existen - ignorando', res.length, 'productos');
286
+ }
165
287
  this.applyFiltersInView();
166
288
  }
167
289
  }
@@ -178,6 +300,141 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
178
300
  }
179
301
  });
180
302
  }
303
+ setupParentSubscriptionsOnly() {
304
+ var _a;
305
+ // Desuscribir cualquier suscripción anterior
306
+ try {
307
+ (_a = this.suscripcion) === null || _a === void 0 ? void 0 : _a.unsubscribe();
308
+ }
309
+ catch (e) { }
310
+ // IMPORTANTE: Configurar suscripción a productos para navegación posterior
311
+ this.suscripcion = this.productsService.products$.subscribe(res => {
312
+ var _a;
313
+ console.log('📦 Suscripción products$ (desde cache):', (_a = res) === null || _a === void 0 ? void 0 : _a.length, 'productos');
314
+ this.loading = false;
315
+ if (res && res.length > 0) {
316
+ // Si estamos usando cache, agregar solo productos nuevos únicos
317
+ if (this.usingCachedProducts) {
318
+ const existingIds = new Set(this.products.map(p => p.id));
319
+ const uniqueProducts = res.filter(p => !existingIds.has(p.id));
320
+ if (uniqueProducts.length > 0) {
321
+ console.log('➕ Cache: Agregando', uniqueProducts.length, 'productos adicionales');
322
+ this.products.push(...uniqueProducts);
323
+ this.usingCachedProducts = false; // Ya no solo cache
324
+ }
325
+ }
326
+ else {
327
+ // Determinar si es cambio de categoría o scroll infinito
328
+ if (this.isCategoryChange) {
329
+ // Cambio de categoría: reemplazar completamente
330
+ console.log('🔄 Cambio de categoría: Reemplazando productos completamente');
331
+ if (this.productsWithUniqueVariant) {
332
+ this.products = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
333
+ }
334
+ else {
335
+ this.products = res;
336
+ }
337
+ this.applyFiltersInView();
338
+ this.isCategoryChange = false; // Resetear bandera
339
+ }
340
+ else {
341
+ // Scroll infinito: agregar productos únicos
342
+ console.log('📜 Scroll infinito: Agregando productos únicos');
343
+ const existingIds = new Set(this.products.map(p => p.id));
344
+ let newProducts = res;
345
+ if (this.productsWithUniqueVariant) {
346
+ newProducts = this.productsService.getProductsWithUniqueVariant(res, this.getObjectWithVariant());
347
+ }
348
+ const uniqueProducts = newProducts.filter(p => !existingIds.has(p.id));
349
+ if (uniqueProducts.length > 0) {
350
+ console.log('➕ Agregando', uniqueProducts.length, 'productos únicos por scroll');
351
+ this.products.push(...uniqueProducts);
352
+ }
353
+ else {
354
+ console.log('⚠️ Todos los productos del scroll ya existen');
355
+ }
356
+ this.applyFiltersInView();
357
+ }
358
+ }
359
+ }
360
+ else if (res && res.length === 0) {
361
+ // Si recibimos array vacío y no estamos usando cache, limpiar productos
362
+ if (!this.usingCachedProducts) {
363
+ this.products = [];
364
+ }
365
+ }
366
+ this.finished = this.productsService.isFinished();
367
+ this.analyticsService.callEvent('view_item_list', { products: this.products, item_list_name: 'Collection', item_list_id: 0 });
368
+ });
369
+ // Configurar suscripciones de filtros
370
+ this.productsService.filters$.subscribe(res => {
371
+ // IMPORTANTE: Solo actualizar filtros si NO vienen del cache
372
+ if (!this.filtersFromCache) {
373
+ console.log('🔄 Actualizando filtros desde server');
374
+ this.breadcrumb = this.optionsService.getBreadcrumbByFilters(res);
375
+ this.filters = this.getSpecificFilters(res, this.filtersConfig.filters);
376
+ this.filters_top = this.getSpecificFilters(res, ['sort']);
377
+ }
378
+ else {
379
+ console.log('🚫 Saltando actualización de filtros (usando cache)');
380
+ // Una vez que han sido utilizados, resetear el flag
381
+ this.filtersFromCache = false;
382
+ }
383
+ });
384
+ this.productsService.finished().subscribe(res => this.finished = res);
385
+ }
386
+ setupCustomSubscription() {
387
+ // Suscripción personalizada para detectar cambios de categoría/búsqueda
388
+ combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(([params, ready, queryParams]) => {
389
+ if (ready.readyAll && this.subscriptionsConfigured) {
390
+ const currentKey = this.generateStateKey();
391
+ // Si la clave cambió, significa que navegamos a una categoría diferente
392
+ if (currentKey !== this.stateKey) {
393
+ console.log('🔄 Cambio de categoría detectado, invalidando cache y recargando');
394
+ this.stateKey = currentKey;
395
+ // Limpiar cache y recargar normalmente
396
+ this.invalidateCache();
397
+ this.usingCachedProducts = false;
398
+ this.allCachedProducts = [];
399
+ this.filtersFromCache = false;
400
+ // IMPORTANTE: Marcar que es cambio de categoría y resetear estado
401
+ this.isCategoryChange = true;
402
+ this.loading = true;
403
+ this.products = [];
404
+ // Recargar normalmente - pero solo la petición, no reconfigurar suscripciones
405
+ this.loadNewCategory(params, queryParams);
406
+ }
407
+ }
408
+ });
409
+ }
410
+ loadNewCategory(params, queryParams) {
411
+ // Hacer solo la petición de productos sin reconfigurar todas las suscripciones
412
+ let cambio = false;
413
+ if (!params['type'] || !params['value']) {
414
+ this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
415
+ }
416
+ else {
417
+ this.productsService.getProductsForFilter({ type: params.type, value: params.value }, this.optionsFilters, queryParams.search, this.defaultFilters);
418
+ cambio = true;
419
+ this.type = params['type'];
420
+ this.value = params['value'];
421
+ }
422
+ console.log('🔄 Nueva petición enviada para categoría:', params.type, params.value);
423
+ }
424
+ generateStateKey() {
425
+ // Incluir ruta y parámetros para generar clave única
426
+ const route = this.router.url.split('?')[0]; // Sin query params
427
+ const params = this.activeRoute.snapshot.params;
428
+ return `${route}_${JSON.stringify(params)}`;
429
+ }
430
+ invalidateCache() {
431
+ // Limpiar cache específico y sessionStorage
432
+ console.log('🗑️ Invalidando cache para:', this.stateKey);
433
+ CollectionEcComponent_1.stateCache.delete(this.stateKey);
434
+ if (isPlatformBrowser(this.platformId)) {
435
+ sessionStorage.removeItem(`collection_scroll_${this.stateKey}`);
436
+ }
437
+ }
181
438
  onScroll() {
182
439
  this.loading = true;
183
440
  if (!this.productsService.isWaiting() && !this.productsService.getNext()) {
@@ -185,7 +442,183 @@ let CollectionEcComponent = class CollectionEcComponent extends ComponentHelper
185
442
  this.loading = false;
186
443
  }
187
444
  }
445
+ // Métodos de ciclo de vida requeridos
446
+ ngAfterViewChecked() {
447
+ // Solo verificar si hay un scroll pendiente
448
+ if (this.pendingScrollPosition !== null && isPlatformBrowser(this.platformId)) {
449
+ const productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
450
+ const currentProductCount = productElements.length;
451
+ // Verificar si se han renderizado suficientes productos
452
+ if (currentProductCount >= Math.min(this.expectedProductCount, 10)) {
453
+ const targetPosition = this.pendingScrollPosition;
454
+ this.pendingScrollPosition = null; // Limpiar para evitar loops
455
+ // Usar requestAnimationFrame para asegurar que el rendering esté completo
456
+ requestAnimationFrame(() => {
457
+ requestAnimationFrame(() => {
458
+ this.restoreScrollWithRetries(targetPosition);
459
+ this.isRestoringState = false;
460
+ });
461
+ });
462
+ }
463
+ }
464
+ }
465
+ ngOnDestroy() {
466
+ var _a;
467
+ (_a = this.routerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
468
+ this.saveCurrentState();
469
+ // Limpiar scroll pendiente
470
+ this.pendingScrollPosition = null;
471
+ // Limpiar event listeners
472
+ if (this.clickHandler) {
473
+ document.removeEventListener('click', this.clickHandler);
474
+ }
475
+ }
476
+ // Métodos de manejo de scroll y cache
477
+ setupBeforeUnloadHandler() {
478
+ if (isPlatformBrowser(this.platformId)) {
479
+ // Interceptar clics en productos para guardar estado
480
+ this.clickHandler = (event) => {
481
+ const target = event.target;
482
+ // Buscar si el clic es en un enlace a producto
483
+ const link = target.closest('a[href*="/product/"]');
484
+ if (link && this.router.url.includes('/collection/')) {
485
+ console.log('🎯 Clic en producto detectado, guardando estado');
486
+ this.saveCurrentState();
487
+ }
488
+ };
489
+ document.addEventListener('click', this.clickHandler);
490
+ // Guardar durante scroll en la página de colección
491
+ let scrollTimer;
492
+ window.addEventListener('scroll', () => {
493
+ // Solo guardar si estamos en una página de colección
494
+ if (this.router.url.includes('/collection/')) {
495
+ clearTimeout(scrollTimer);
496
+ scrollTimer = setTimeout(() => this.saveCurrentState(), 300);
497
+ }
498
+ });
499
+ // Guardar antes de que el usuario salga de la página
500
+ window.addEventListener('beforeunload', () => {
501
+ if (this.router.url.includes('/collection/')) {
502
+ this.saveCurrentState();
503
+ }
504
+ });
505
+ }
506
+ }
507
+ saveCurrentState() {
508
+ if (isPlatformBrowser(this.platformId) && this.products && this.products.length > 0) {
509
+ // Obtener posición de scroll de múltiples fuentes
510
+ const scrollPos = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop || 0, document.body.scrollTop || 0);
511
+ // Solo guardar si tenemos una posición significativa o productos suficientes
512
+ if (scrollPos > 10 || this.products.length > 10) {
513
+ const state = {
514
+ products: [...this.products],
515
+ scrollPosition: scrollPos,
516
+ finished: this.finished,
517
+ loading: this.loading,
518
+ page: Math.ceil(this.products.length / 10),
519
+ allCachedProducts: this.usingCachedProducts ? [...this.allCachedProducts] : [...this.products],
520
+ filters: this.filters ? [...this.filters] : undefined,
521
+ filters_top: this.filters_top ? [...this.filters_top] : undefined,
522
+ breadcrumb: this.breadcrumb ? [...this.breadcrumb] : undefined
523
+ };
524
+ CollectionEcComponent_1.stateCache.set(this.stateKey, state);
525
+ // También guardar en sessionStorage como backup
526
+ try {
527
+ sessionStorage.setItem(`collection_scroll_${this.stateKey}`, scrollPos.toString());
528
+ sessionStorage.setItem(`collection_products_${this.stateKey}`, this.products.length.toString());
529
+ }
530
+ catch (e) { }
531
+ }
532
+ }
533
+ }
534
+ restoreScrollWithRetries(targetPosition) {
535
+ if (this.isScrolling) {
536
+ return;
537
+ }
538
+ // Verificar si el target es mayor que la altura del documento
539
+ const documentHeight = document.documentElement.scrollHeight;
540
+ if (targetPosition > documentHeight) {
541
+ targetPosition = Math.max(0, documentHeight - window.innerHeight);
542
+ }
543
+ // Solo verificar si el usuario ha hecho scroll muy lejos
544
+ const currentPos = window.pageYOffset || document.documentElement.scrollTop;
545
+ if (currentPos > 500 && Math.abs(currentPos - targetPosition) > 1000) {
546
+ return;
547
+ }
548
+ this.isScrolling = true;
549
+ // Intentar encontrar una posición más precisa basada en elementos del DOM
550
+ const improvedPosition = this.tryScrollToProductByIndex(targetPosition);
551
+ if (improvedPosition !== targetPosition) {
552
+ targetPosition = improvedPosition;
553
+ }
554
+ let attempts = 0;
555
+ const maxAttempts = 15;
556
+ const tryScroll = () => {
557
+ attempts++;
558
+ // Usar scroll más agresivo si es necesario
559
+ if (attempts < 3) {
560
+ // Primeros intentos con smooth
561
+ window.scrollTo({
562
+ top: targetPosition,
563
+ behavior: 'smooth'
564
+ });
565
+ }
566
+ else {
567
+ // Intentos posteriores más directos
568
+ window.scrollTo(0, targetPosition);
569
+ document.documentElement.scrollTop = targetPosition;
570
+ document.body.scrollTop = targetPosition;
571
+ }
572
+ // Verificar después de un momento
573
+ setTimeout(() => {
574
+ const currentPos = window.pageYOffset || document.documentElement.scrollTop;
575
+ const difference = Math.abs(currentPos - targetPosition);
576
+ if (difference > 50 && attempts < maxAttempts) {
577
+ const delay = attempts < 5 ? 100 : attempts < 10 ? 200 : 300;
578
+ setTimeout(tryScroll, delay);
579
+ }
580
+ else {
581
+ this.isScrolling = false; // Liberar flag cuando termine
582
+ }
583
+ }, 100);
584
+ };
585
+ // Intentar solo una vez inicialmente
586
+ tryScroll();
587
+ }
588
+ tryScrollToProductByIndex(targetPosition) {
589
+ // Intentar calcular a qué producto corresponde la posición
590
+ const approximateIndex = Math.floor(targetPosition / 400); // Asumiendo ~400px por producto
591
+ // Buscar elementos de producto
592
+ const productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
593
+ if (productElements.length > approximateIndex && approximateIndex >= 0) {
594
+ const targetElement = productElements[approximateIndex];
595
+ const elementPosition = targetElement.offsetTop;
596
+ // Usar la posición del elemento si es razonable
597
+ if (Math.abs(elementPosition - targetPosition) < 800) {
598
+ return elementPosition;
599
+ }
600
+ }
601
+ return targetPosition; // Usar posición original si no encuentra elemento adecuado
602
+ }
603
+ waitForProductRendering(targetPosition) {
604
+ var _a;
605
+ // Configurar el scroll pendiente para que ngAfterViewChecked lo maneje
606
+ this.pendingScrollPosition = targetPosition;
607
+ this.expectedProductCount = ((_a = this.products) === null || _a === void 0 ? void 0 : _a.length) || 0;
608
+ // Timeout de seguridad en caso de que ngAfterViewChecked no se ejecute
609
+ setTimeout(() => {
610
+ if (this.pendingScrollPosition !== null) {
611
+ const targetPos = this.pendingScrollPosition;
612
+ this.pendingScrollPosition = null;
613
+ this.restoreScrollWithRetries(targetPos);
614
+ this.isRestoringState = false;
615
+ }
616
+ }, 2000);
617
+ }
188
618
  };
619
+ // Propiedades para scroll y cache
620
+ CollectionEcComponent.stateCache = new Map();
621
+ CollectionEcComponent.maxCacheSize = 10;
189
622
  CollectionEcComponent.ctorParameters = () => [
190
623
  { type: ProductsService },
191
624
  { type: ParametersService },
@@ -195,7 +628,9 @@ CollectionEcComponent.ctorParameters = () => [
195
628
  { type: AnalyticsService },
196
629
  { type: CartService },
197
630
  { type: Constants },
198
- { type: FiltersService }
631
+ { type: FiltersService },
632
+ { type: Router },
633
+ { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
199
634
  ];
200
635
  __decorate([
201
636
  Input()
@@ -209,12 +644,13 @@ __decorate([
209
644
  __decorate([
210
645
  Input()
211
646
  ], CollectionEcComponent.prototype, "optionsFilters", void 0);
212
- CollectionEcComponent = __decorate([
647
+ CollectionEcComponent = CollectionEcComponent_1 = __decorate([
213
648
  Component({
214
649
  selector: 'app-collection-ec',
215
650
  template: "\r\n<div>\r\n <div class=\"collection\">\r\n <ng-content select=\"[collection]\"> </ng-content>\r\n </div>\r\n\r\n <div class=\"all\">\r\n <ng-content select=\"[all]\"> </ng-content>\r\n </div>\r\n</div>\r\n\r\n<app-blocks-ec [section]=\"'collection'\"></app-blocks-ec>",
216
651
  styles: [".h1-custom{color:#00f}"]
217
- })
652
+ }),
653
+ __param(10, Inject(PLATFORM_ID))
218
654
  ], CollectionEcComponent);
219
655
  export { CollectionEcComponent };
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxpR0FBaUc7QUFDakcsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBUTNFLElBQWEscUJBQXFCLEdBQWxDLE1BQWEscUJBQXNCLFNBQVEsZUFBZTtJQXNCdEQsWUFBbUIsZUFBZ0MsRUFDckMsU0FBNEIsRUFDNUIsV0FBMkIsRUFDM0IsY0FBOEIsRUFDakMsV0FBd0IsRUFDdkIsZ0JBQWtDLEVBQ25DLFdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2pCLGNBQThCO1FBQ3JDLEtBQUssRUFBRSxDQUFDO1FBVE8sb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ3JDLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTVCbEMsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUd0QixrQkFBYSxHQUFpQixFQUFDLE9BQU8sRUFBQyxFQUFFLEVBQUMsQ0FBQztRQUc1QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixlQUFVLEdBQWEsRUFBRSxDQUFBO1FBQ3pCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBT2xCLDhCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMzQyxtQkFBYyxHQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBcUZoRDs7Ozs7O1dBTUc7UUFDSCxpQkFBWSxHQUFHLENBQUMsQ0FBSyxFQUFFLENBQUssRUFBRSxPQUFZLEtBQUssRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUUxRixJQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUU7Z0JBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFakMsUUFBTyxJQUFJLEVBQUM7b0JBQ1IsS0FBSyxNQUFNO3dCQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFDLE1BQUs7b0JBQ25ELEtBQUssS0FBSzt3QkFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFBQyxNQUFLO29CQUNsRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtpQkFDcEI7YUFDSjtpQkFBSTtnQkFDRCxPQUFPLENBQUMsQ0FBQTthQUNYO1FBQ0wsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCx1QkFBa0IsR0FBRyxHQUFHLEVBQUU7O1lBRXRCLFVBQUksSUFBSSxDQUFDLFlBQVksMENBQUUsS0FBSyxFQUFFO2dCQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDNUYsSUFBSSxDQUFDLE9BQU8sR0FBRSxLQUFLLENBQUE7YUFDdEI7UUFDTCxDQUFDLENBQUE7UUFFRCx1QkFBa0IsR0FBRyxDQUFDLE9BQWlCLEVBQUUsS0FBbUIsRUFBWSxFQUFFO1lBQ3RFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQixJQUFJLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLGFBQWE7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxNQUFNLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLENBQUE7UUFVRCxnQkFBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxnQkFBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBR3pDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUE7UUFFRCwwQkFBcUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsRUFBRTs7WUFDeEMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM5RixLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBRSxDQUFBO1lBQ3pGLE9BQUEsS0FBSywwQ0FBRSxNQUFNLEtBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekQsQ0FBQyxDQUFBO1FBRUQseUJBQW9CLEdBQUcsR0FBb0MsRUFBRTtZQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsa0NBQWtDLEVBQUUsQ0FBQTtRQUMzRCxDQUFDLENBQUE7UUFwSkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQTtRQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDOUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3hCLENBQUM7SUFFRCxRQUFRO1FBQ0osTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQ2YsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUNELHVCQUF1QjtRQUNuQixhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUU7WUFDekksSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNoQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDeEk7cUJBQ0k7b0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDckosTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2hDO2dCQUNELElBQUk7b0JBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztpQkFBRTtnQkFBQyxPQUFPLENBQUMsRUFBRSxHQUFHO2dCQUFBLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUN2RCxHQUFHLENBQUMsRUFBRTtvQkFDRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDckIsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7d0JBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztxQkFDckQ7eUJBQU07d0JBQ0gsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7NEJBQ2hDLElBQUksTUFBTSxFQUFFO2dDQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUUsQ0FBQztnQ0FDckcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7Z0NBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7NkJBQ2xCO2lDQUNJO2dDQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBRSxDQUFDO2dDQUMzRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFBO2dDQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs2QkFDN0I7NEJBQUEsQ0FBQzt5QkFDTDs2QkFBTTs0QkFDSCxJQUFJLE1BQU0sRUFBRTtnQ0FDUixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQ0FDcEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0NBQzFCLE1BQU0sR0FBRyxLQUFLLENBQUM7NkJBQ2xCO2lDQUNJO2dDQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOzZCQUU3Qjt5QkFFSjtxQkFDSjtvQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDakksQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBaURELFFBQVE7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7U0FDeEI7SUFDTCxDQUFDO0NBd0JKLENBQUE7O1lBaEt1QyxlQUFlO1lBQzFCLGlCQUFpQjtZQUNmLGNBQWM7WUFDWCxjQUFjO1lBQ3BCLFdBQVc7WUFDTCxnQkFBZ0I7WUFDdEIsV0FBVztZQUNoQixTQUFTO1lBQ0QsY0FBYzs7QUFiaEM7SUFBUixLQUFLLEVBQUU7bURBQU07QUFDTDtJQUFSLEtBQUssRUFBRTtvREFBTztBQUNOO0lBQVIsS0FBSyxFQUFFO3dFQUE0QztBQUMzQztJQUFSLEtBQUssRUFBRTs2REFBd0M7QUFwQnZDLHFCQUFxQjtJQUxqQyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsbUJBQW1CO1FBQzdCLG1UQUE2Qzs7S0FFaEQsQ0FBQztHQUNXLHFCQUFxQixDQXNMakM7U0F0TFkscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEZpbHRlckVsZW1lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ZpbHRlcic7XHJcbi8vIGltcG9ydCB7IENvbnN0YW50cywgRmlsdGVyLCBPcHRpb25zU2VydmljZSwgUHJvZHVjdCwgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnbmctZWFzeWNvbW1lcmNlJztcclxuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XHJcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZmlsdGVycy9GaWx0ZXInO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XHJcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckNvbmZpZywgRmlsdGVyVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcclxuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XHJcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3Muc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWx0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbHRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3B0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0cy5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLWNvbGxlY3Rpb24tZWMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbGxlY3Rpb24tZWMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29sbGVjdGlvbi1lYy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIHB1YmxpYyBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgcHVibGljIGZpbHRlcnNfdG9wOiBGaWx0ZXJbXTtcclxuICAgIHByaXZhdGUgZGVmYXVsdEZpbHRlcnM6IERlZmF1bHRGaWx0ZXJbXTtcclxuICAgIHByaXZhdGUgZmlsdGVyc0NvbmZpZzogRmlsdGVyQ29uZmlnID0ge2ZpbHRlcnM6W119O1xyXG4gICAgLy8gcHVibGljIG9wdGlvbnNGaWx0ZXJzOiBbJ2FsbCddO1xyXG4gICAgcHVibGljIHByb2R1Y3RzOiBQcm9kdWN0W107XHJcbiAgICBwdWJsaWMgZmluaXNoZWQgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBzdXNjcmlwY2lvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xyXG4gICAgcHVibGljIGJyZWFkY3J1bWI6IHN0cmluZ1tdID0gW11cclxuICAgIHB1YmxpYyBpc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgcHVibGljIHBhcmFtczogYW55O1xyXG5cclxuICAgIHB1YmxpYyBmaWx0ZXJJblZpZXc6RmlsdGVyRWxlbWVudDtcclxuXHJcbiAgICBASW5wdXQoKSB0eXBlO1xyXG4gICAgQElucHV0KCkgdmFsdWU7XHJcbiAgICBASW5wdXQoKSBwcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBvcHRpb25zRmlsdGVyczogRmlsdGVyVHlwZVtdID0gWydhbGwnXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvZHVjdHNTZXJ2aWNlOiBQcm9kdWN0c1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIHBhcmFtc1NydjogUGFyYW1ldGVyc1NlcnZpY2UsXHJcbiAgICAgICAgcHJvdGVjdGVkIGFjdGl2ZVJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcm90ZWN0ZWQgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxyXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJzU2VydmljZTogRmlsdGVyc1NlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFyYW1zU3J2LnBhcmFtZXRlcnMuc3Vic2NyaWJlKHBhcmFtID0+IHRoaXMucGFyYW1zID0gcGFyYW0pXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IHRoaXMuY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcclxuICAgICAgICB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyA9IHRoaXMuY29uc3RzLmdldEZpbHRlckNvbmZpZygpXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVyc0luVmlldyQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5maWx0ZXJJblZpZXcgPSByZXMpXHJcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB3aW5kb3cuc2Nyb2xsKDAsIDApO1xyXG4gICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmVjT25Jbml0KClcclxuICAgICAgICB0aGlzLmdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtcywgdGhpcy5vcHRpb25zU2VydmljZS5yZWFkeSwgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc10pLnN1YnNjcmliZSgoW3BhcmFtcywgcmVhZHksIHF1ZXJ5UGFyYW1zXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhZHkucmVhZHlBbGwpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjYW1iaW8gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmICghcGFyYW1zWyd0eXBlJ10gfHwgIXBhcmFtc1sndmFsdWUnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgbGF0ZXN0OiB0cnVlLCBsaW1pdDogMTAgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCB0aGlzLmRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgdHlwZTogcGFyYW1zLnR5cGUsIHZhbHVlOiBwYXJhbXMudmFsdWUgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCAgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBwYXJhbXNbJ3R5cGUnXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyYW1zWyd2YWx1ZSddO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJ5IHsgdGhpcy5zdXNjcmlwY2lvbi51bnN1YnNjcmliZSgpOyB9IGNhdGNoIChlKSB7IH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN1c2NyaXBjaW9uID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UucHJvZHVjdHMkLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KHJlcywgdGhpcy5nZXRPYmplY3RXaXRoVmFyaWFudCgpICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KHJlcywgdGhpcy5nZXRPYmplY3RXaXRoVmFyaWFudCgpICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi5yZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykgeyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHJlczsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi5yZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW1fbGlzdCcsIHsgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsIGl0ZW1fbGlzdF9uYW1lOiAnQ29sbGVjdGlvbicsIGl0ZW1fbGlzdF9pZDogMCB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVycyQuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iID0gdGhpcy5vcHRpb25zU2VydmljZS5nZXRCcmVhZGNydW1iQnlGaWx0ZXJzKHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gdGhpcy5nZXRTcGVjaWZpY0ZpbHRlcnMocmVzLCB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzX3RvcCA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgWydzb3J0J10pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maW5pc2hlZCgpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5maW5pc2hlZCA9IHJlcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVhbGl6YSB1biBzb3J0IGRlIHByb2R1Y3RvcyBwb3IgZWwgY2FtcG8gZGF0ZUNyZWF0ZSBkZSBsYSB2YXJpYW50ZVxyXG4gICAgICogQHBhcmFtIGEgUHJvZHVjdG8gYVxyXG4gICAgICogQHBhcmFtIGIgUHJvZHVjdG8gYlxyXG4gICAgICogQHBhcmFtIHR5cGUgc2kgZXMgYGFzY2AgfCBgZGVzY2BcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9ICoqMSoqIHBhcmEgYHRydWVgIHwgKiowKiogcGFyYSBgZmFsc2VgXHJcbiAgICAgKi9cclxuICAgIHNvcnRQcm9kdWN0cyA9IChhOmFueSwgYjphbnksIHR5cGU6c3RyaW5nPSdhc2MnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQSA9IGEudmFyaWFudHMgJiYgYS52YXJpYW50cy5sZW5ndGggPiAwID8gYS52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQiA9IGIudmFyaWFudHMgJiYgYi52YXJpYW50cy5sZW5ndGggPiAwID8gYi52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYodG9Db21wYXJlQSAmJiB0b0NvbXBhcmVCKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlQSA9IG5ldyBEYXRlKHRvQ29tcGFyZUEpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUIgPSBuZXcgRGF0ZSh0b0NvbXBhcmVCKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOiByZXR1cm4gKGRhdGVBID49IGRhdGVCKSA/IDEgOiAwOyBicmVha1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYXNjJzogcmV0dXJuIChkYXRlQSA8PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYXBsaWNhIGVsIGZpbHRybyBlbiBsYSB2aXN0YS4gXHJcbiAgICAgKi9cclxuICAgIGFwcGx5RmlsdGVyc0luVmlldyA9ICgpID0+IHtcclxuICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluVmlldz8ubm9VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHMuc29ydCgoYSwgYikgPT4gdGhpcy5zb3J0UHJvZHVjdHMoYSxiLHRoaXMuZmlsdGVySW5WaWV3LnZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID1mYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyW10sIHR5cGVzOiBGaWx0ZXJUeXBlW10pOiBGaWx0ZXJbXSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRfZmlsdGVyID0gZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IHR5cGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0X2ZpbHRlcikgcmVzdWx0LnB1c2gocmVzdWx0X2ZpbHRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvblNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCkgJiYgIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldE5leHQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFyZVByb2R1Y3RzID0gKCkgPT4gdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwO1xyXG4gICAgaXNXYWl0aW5nID0gKCkgPT4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCk7XHJcbiAgICBzZXRGaW5pc2hlZCA9ICgpID0+IHRoaXMuZmluaXNoZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICBjaGFuZ2VGaWx0ZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGxQcm9kdWN0b3NUb0NhcnQgPSAocHJvZHVjdHMgPSBudWxsKSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcbiAgICAgICAgKHByb2R1Y3RzIHx8IHRoaXMucHJvZHVjdHMpLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50Lm1hcChwID0+IGl0ZW1zLnB1c2gocCkpKVxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSkubWFwKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSApXHJcbiAgICAgICAgaXRlbXM/Lmxlbmd0aCAmJiB0aGlzLmNhcnRTZXJ2aWNlLmFkZEFsbFRvQ2FydChpdGVtcylcclxuICAgIH1cclxuXHJcbiAgICBnZXRPYmplY3RXaXRoVmFyaWFudCA9ICgpOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9IFxyXG5cclxufVxyXG4iXX0=
656
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsV0FBVyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUN0SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBELGlHQUFpRztBQUNqRyxPQUFPLEVBQUUsYUFBYSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBSTlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFvQjNFLElBQWEscUJBQXFCLDZCQUFsQyxNQUFhLHFCQUFzQixTQUFRLGVBQWU7SUF5Q3RELFlBQW1CLGVBQWdDLEVBQ3JDLFNBQTRCLEVBQzVCLFdBQTJCLEVB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QixHQUFHLElBQUksQ0FBQztnQkFDbEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2FBQ2pDO1FBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQTBCSixDQUFBO0FBdnBCRyxrQ0FBa0M7QUFDbkIsZ0NBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztBQUNoRCxrQ0FBWSxHQUFHLEVBQUUsQ0FBQzs7WUFzQkcsZUFBZTtZQUMxQixpQkFBaUI7WUFDZixjQUFjO1lBQ1gsY0FBYztZQUNwQixXQUFXO1lBQ0wsZ0JBQWdCO1lBQ3RCLFdBQVc7WUFDaEIsU0FBUztZQUNELGNBQWM7WUFDbkIsTUFBTTtZQUNTLE1BQU0sdUJBQXRDLE1BQU0sU0FBQyxXQUFXOztBQWZkO0lBQVIsS0FBSyxFQUFFO21EQUFNO0FBQ0w7SUFBUixLQUFLLEVBQUU7b0RBQU87QUFDTjtJQUFSLEtBQUssRUFBRTt3RUFBNEM7QUFDM0M7SUFBUixLQUFLLEVBQUU7NkRBQXdDO0FBdkN2QyxxQkFBcUI7SUFMakMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixtVEFBNkM7O0tBRWhELENBQUM7SUFvRE8sWUFBQSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7R0FuRGYscUJBQXFCLENBd3FCakM7U0F4cUJZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIEluamVjdCwgUExBVEZPUk1fSUQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuLy8gaW1wb3J0IHsgQ29uc3RhbnRzLCBGaWx0ZXIsIE9wdGlvbnNTZXJ2aWNlLCBQcm9kdWN0LCBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICduZy1lYXN5Y29tbWVyY2UnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9maWx0ZXJzL0ZpbHRlcic7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyQ29uZmlnLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsdGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vcHRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2R1Y3RzL3Byb2R1Y3RzLnNlcnZpY2UnO1xyXG5cclxuLy8gSW50ZXJmYWNlIHBhcmEgZWwgZXN0YWRvIGRlbCBjYWNoZVxyXG5pbnRlcmZhY2UgQ29sbGVjdGlvblN0YXRlIHtcclxuICBwcm9kdWN0czogYW55W107XHJcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcclxuICBmaW5pc2hlZDogYm9vbGVhbjtcclxuICBsb2FkaW5nOiBib29sZWFuO1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBhbGxDYWNoZWRQcm9kdWN0cz86IGFueVtdO1xyXG4gIGZpbHRlcnM/OiBhbnlbXTsgLy8gTG9zIGZpbHRyb3MgZGlzcG9uaWJsZXMgKGNhdGVnb3LDrWFzLCBwcmVjaW8sIGF0cmlidXRvcylcclxuICBmaWx0ZXJzX3RvcD86IGFueVtdOyAvLyBMb3MgZmlsdHJvcyBzdXBlcmlvcmVzIChvcmRlbmFtaWVudG8pXHJcbiAgYnJlYWRjcnVtYj86IHN0cmluZ1tdOyAvLyBFbCBicmVhZGNydW1iXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhcHAtY29sbGVjdGlvbi1lYycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29sbGVjdGlvbi1lYy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb2xsZWN0aW9uLWVjLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzX3RvcDogRmlsdGVyW107XHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW107XHJcbiAgICBwcml2YXRlIGZpbHRlcnNDb25maWc6IEZpbHRlckNvbmZpZyA9IHtmaWx0ZXJzOltdfTtcclxuICAgIC8vIHB1YmxpYyBvcHRpb25zRmlsdGVyczogWydhbGwnXTtcclxuICAgIHB1YmxpYyBwcm9kdWN0czogUHJvZHVjdFtdO1xyXG4gICAgcHVibGljIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc3VzY3JpcGNpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBicmVhZGNydW1iOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBwdWJsaWMgaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVySW5WaWV3OkZpbHRlckVsZW1lbnQ7XHJcblxyXG4gICAgLy8gUHJvcGllZGFkZXMgcGFyYSBzY3JvbGwgeSBjYWNoZVxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBDb2xsZWN0aW9uU3RhdGU+KCk7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtYXhDYWNoZVNpemUgPSAxMDtcclxuICAgIHByaXZhdGUgcm91dGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgICBwcml2YXRlIHN0YXRlS2V5OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGlzUmVzdG9yaW5nU3RhdGU6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGNsaWNrSGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgdXNpbmdDYWNoZWRQcm9kdWN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBhbGxDYWNoZWRQcm9kdWN0czogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uc0NvbmZpZ3VyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGVuZGluZ1Njcm9sbFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgZXhwZWN0ZWRQcm9kdWN0Q291bnQ6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIGZpbHRlcnNGcm9tQ2FjaGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRmxhZyBwYXJhIGluZGljYXIgc2kgbG9zIGZpbHRyb3MgdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgcHJpdmF0ZSBpc0NhdGVnb3J5Q2hhbmdlOiBib29sZWFuID0gZmFsc2U7IC8vIEZsYWcgcGFyYSBpbmRpY2FyIHNpIGVzIHVuIGNhbWJpbyBkZSBjYXRlZ29yw61hXHJcbiAgICBcclxuICAgIC8vIFNlcnZpY2lvcyBhZGljaW9uYWxlcyBwYXJhIHNjcm9sbFxyXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3Q7XHJcblxyXG4gICAgQElucHV0KCkgdHlwZTtcclxuICAgIEBJbnB1dCgpIHZhbHVlO1xyXG4gICAgQElucHV0KCkgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgb3B0aW9uc0ZpbHRlcnM6IEZpbHRlclR5cGVbXSA9IFsnYWxsJ107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBwYXJhbXNTcnY6IFBhcmFtZXRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJvdGVjdGVkIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcclxuICAgICAgICBwdWJsaWMgZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBPYmplY3QpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMucGFyYW1zU3J2LnBhcmFtZXRlcnMuc3Vic2NyaWJlKHBhcmFtID0+IHRoaXMucGFyYW1zID0gcGFyYW0pXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IHRoaXMuY29uc3RzLmdldERlZmF1bHRGaWx0ZXJzKClcclxuICAgICAgICB0aGlzLmZpbHRlcnNDb25maWcuZmlsdGVycyA9IHRoaXMuY29uc3RzLmdldEZpbHRlckNvbmZpZygpXHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmlsdGVyc0luVmlldyQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5maWx0ZXJJblZpZXcgPSByZXMpXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gSW5pY2lhbGl6YXIgcHJvcGllZGFkZXMgZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgICAgICB0aGlzLnBsYXRmb3JtSWQgPSBwbGF0Zm9ybUlkO1xyXG4gICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4cGVjdGVkUHJvZHVjdENvdW50ID0gMDtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RhdGVLZXkgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBWZXJpZmljYXIgc2kgaGF5IGVzdGFkbyBndWFyZGFkbyBBTlRFUyBkZSBzY3JvbGwoMCwwKVxyXG4gICAgICAgIGNvbnN0IHNhdmVkU3RhdGUgPSBDb2xsZWN0aW9uRWNDb21wb25lbnQuc3RhdGVDYWNoZS5nZXQodGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHNhdmVkU3RhdGUgJiYgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE5PIGxsYW1hciB3aW5kb3cuc2Nyb2xsKDAsIDApIHBhcmEgcHJlc2VydmFyIHBvc2ljacOzblxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZWNPbkluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOyAvLyBMbGFtYXIgZGlyZWN0YW1lbnRlXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gQ29tcG9ydGFtaWVudG8gbm9ybWFsIGNvbiBzY3JvbGwgYWwgaW5pY2lvXHJcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5lY09uSW5pdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENvbmZpZ3VyYXIgbWFuZWpvIGRlIGVzdGFkb1xyXG4gICAgICAgIHRoaXMuc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgICBnZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBWZXJpZmljYXIgUFJJTUVSTyBzaSBoYXkgZXN0YWRvIGd1YXJkYWRvXHJcbiAgICAgICAgY29uc3Qgc2F2ZWRTdGF0ZSA9IENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLmdldCh0aGlzLnN0YXRlS2V5KTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoc2F2ZWRTdGF0ZSAmJiBzYXZlZFN0YXRlLnByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgUmVzdGF1cmFuZG8gZGVzZGUgY2FjaGU6Jywgc2F2ZWRTdGF0ZS5wcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgLy8gQ29uZmlndXJhciBtb2RvIGNhY2hlIEFOVEVTIGRlIHJlc3RhdXJhclxyXG4gICAgICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG4gICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nU3RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIHByb2R1Y3RvcyBpbm1lZGlhdGFtZW50ZVxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gWy4uLnNhdmVkU3RhdGUucHJvZHVjdHNdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHNhdmVkU3RhdGUuZmluaXNoZWQ7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gUmVzdGF1cmFyIGZpbHRyb3Mgc2kgZXN0w6FuIGRpc3BvbmlibGVzXHJcbiAgICAgICAgICAgIGlmIChzYXZlZFN0YXRlLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IFsuLi5zYXZlZFN0YXRlLmZpbHRlcnNdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gdHJ1ZTsgLy8gTWFyY2FyIHF1ZSBlc3RvcyBmaWx0cm9zIHZpZW5lbiBkZWwgY2FjaGVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5OmIEZpbHRyb3MgcmVzdGF1cmFkb3MgZGVzZGUgY2FjaGU6JywgdGhpcy5maWx0ZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuZmlsdGVyc190b3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc190b3AgPSBbLi4uc2F2ZWRTdGF0ZS5maWx0ZXJzX3RvcF07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBGaWx0cm9zIHRvcCByZXN0YXVyYWRvcyBkZXNkZSBjYWNoZTonLCB0aGlzLmZpbHRlcnNfdG9wLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNhdmVkU3RhdGUuYnJlYWRjcnVtYikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5icmVhZGNydW1iID0gWy4uLnNhdmVkU3RhdGUuYnJlYWRjcnVtYl07XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpiBCcmVhZGNydW1iIHJlc3RhdXJhZG8gZGVzZGUgY2FjaGU6JywgdGhpcy5icmVhZGNydW1iKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogQ29uZmlndXJhciBUT0RBUyBsYXMgc3VzY3JpcGNpb25lcyBkZWwgcGFkcmUgKGZpbHRyb3MsIGJyZWFkY3J1bWIsIGV0Yy4pXHJcbiAgICAgICAgICAgIC8vIHBlcm8gU0lOIHJlc2V0ZWFyIHByb2R1Y3RvcyBuaSBoYWNlciBwZXRpY2nDs24gaW5pY2lhbFxyXG4gICAgICAgICAgICB0aGlzLnNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIHBlcnNvbmFsaXphZGEgcGFyYSBkZXRlY3RhciBjYW1iaW9zIGRlIGNhdGVnb3LDrWFcclxuICAgICAgICAgICAgdGhpcy5zZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNDb25maWd1cmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFJlc3RhdXJhciBzY3JvbGwgZGVzcHXDqXMgZGUgcXVlIGxvcyBwcm9kdWN0b3Mgc2UgcmVuZGVyaWNlblxyXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JQcm9kdWN0UmVuZGVyaW5nKHNhdmVkU3RhdGUuc2Nyb2xsUG9zaXRpb24pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBObyBoYXkgY2FjaGUsIGNhcmdhIG5vcm1hbCcpO1xyXG4gICAgICAgIC8vIFNpIG5vIGhheSBlc3RhZG8gZ3VhcmRhZG8sIGNvbXBvcnRhbWllbnRvIG5vcm1hbFxyXG4gICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWxsQ2FjaGVkUHJvZHVjdHMgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZTsgLy8gTm8gaGF5IGZpbHRyb3MgZGVsIGNhY2hlXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGxhbWFyIGFsIGNvbXBvcnRhbWllbnRvIG9yaWdpbmFsXHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcmlnaW5hbEdldFByb2R1Y3RzQW5kU3Vic2NyaWJlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuYWN0aXZlUm91dGUucGFyYW1zLCB0aGlzLm9wdGlvbnNTZXJ2aWNlLnJlYWR5LCB0aGlzLmFjdGl2ZVJvdXRlLnF1ZXJ5UGFyYW1zXSkuc3Vic2NyaWJlKChbcGFyYW1zLCByZWFkeSwgcXVlcnlQYXJhbXNdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZWFkeS5yZWFkeUFsbCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgLy8gTWFyY2FyIGNvbW8gY2FtYmlvIGRlIGNhdGVnb3LDrWEgcGFyYSBsYSBjYXJnYSBpbmljaWFsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sndHlwZSddIHx8ICFwYXJhbXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IGxhdGVzdDogdHJ1ZSwgbGltaXQ6IDEwIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgIHRoaXMuZGVmYXVsdEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcGFyYW1zWyd0eXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmFtc1sndmFsdWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24udW5zdWJzY3JpYmUoKTsgfSBjYXRjaCAoZSkgeyB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5pc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUMgKHZhcmlhbnRzKTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAnZGUnLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zIMO6bmljb3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn4pqg77iPIENvbGxlY3Rpb25FQyAodmFyaWFudHMpOiBUb2RvcyBsb3MgcHJvZHVjdG9zIHlhIGV4aXN0ZW4gLSBpZ25vcmFuZG8nLCByZXMubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtYmlvKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gcmVzOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtYmlvID0gZmFsc2U7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdHJhciBwcm9kdWN0b3MgZHVwbGljYWRvcyBhbnRlcyBkZSBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldCh0aGlzLnByb2R1Y3RzLm1hcChwID0+IHAuaWQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDb2xsZWN0aW9uRUM6IEFncmVnYW5kbycsIHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCwgJ2RlJywgcmVzLmxlbmd0aCwgJ3Byb2R1Y3RvcyDDum5pY29zJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBDb2xsZWN0aW9uRUM6IFRvZG9zIGxvcyBwcm9kdWN0b3MgeWEgZXhpc3RlbiAtIGlnbm9yYW5kbycsIHJlcy5sZW5ndGgsICdwcm9kdWN0b3MnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbV9saXN0JywgeyBwcm9kdWN0czogdGhpcy5wcm9kdWN0cywgaXRlbV9saXN0X25hbWU6ICdDb2xsZWN0aW9uJywgaXRlbV9saXN0X2lkOiAwIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmdldFNwZWNpZmljRmlsdGVycyhyZXMsIHRoaXMuZmlsdGVyc0NvbmZpZy5maWx0ZXJzKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnNfdG9wID0gdGhpcy5nZXRTcGVjaWZpY0ZpbHRlcnMocmVzLCBbJ3NvcnQnXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbmlzaGVkKCkuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmZpbmlzaGVkID0gcmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwUGFyZW50U3Vic2NyaXB0aW9uc09ubHkoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRGVzdXNjcmliaXIgY3VhbHF1aWVyIHN1c2NyaXBjacOzbiBhbnRlcmlvclxyXG4gICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24/LnVuc3Vic2NyaWJlKCk7IH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIElNUE9SVEFOVEU6IENvbmZpZ3VyYXIgc3VzY3JpcGNpw7NuIGEgcHJvZHVjdG9zIHBhcmEgbmF2ZWdhY2nDs24gcG9zdGVyaW9yXHJcbiAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfk6YgU3VzY3JpcGNpw7NuIHByb2R1Y3RzJCAoZGVzZGUgY2FjaGUpOicsIHJlcz8ubGVuZ3RoLCAncHJvZHVjdG9zJyk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2kgZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGFncmVnYXIgc29sbyBwcm9kdWN0b3MgbnVldm9zIMO6bmljb3NcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvZHVjdHMgPSByZXMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBDYWNoZTogQWdyZWdhbmRvJywgdW5pcXVlUHJvZHVjdHMubGVuZ3RoLCAncHJvZHVjdG9zIGFkaWNpb25hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMucHVzaCguLi51bmlxdWVQcm9kdWN0cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cyA9IGZhbHNlOyAvLyBZYSBubyBzb2xvIGNhY2hlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmFyIHNpIGVzIGNhbWJpbyBkZSBjYXRlZ29yw61hIG8gc2Nyb2xsIGluZmluaXRvXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDYXRlZ29yeUNoYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1iaW8gZGUgY2F0ZWdvcsOtYTogcmVlbXBsYXphciBjb21wbGV0YW1lbnRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIENhbWJpbyBkZSBjYXRlZ29yw61hOiBSZWVtcGxhemFuZG8gcHJvZHVjdG9zIGNvbXBsZXRhbWVudGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQocmVzLCB0aGlzLmdldE9iamVjdFdpdGhWYXJpYW50KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSBmYWxzZTsgLy8gUmVzZXRlYXIgYmFuZGVyYVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNjcm9sbCBpbmZpbml0bzogYWdyZWdhciBwcm9kdWN0b3Mgw7puaWNvc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TnCBTY3JvbGwgaW5maW5pdG86IEFncmVnYW5kbyBwcm9kdWN0b3Mgw7puaWNvcycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQodGhpcy5wcm9kdWN0cy5tYXAocCA9PiBwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9kdWN0cyA9IHJlcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVByb2R1Y3RzID0gbmV3UHJvZHVjdHMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nSWRzLmhhcyhwLmlkKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pcXVlUHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KelSBBZ3JlZ2FuZG8nLCB1bmlxdWVQcm9kdWN0cy5sZW5ndGgsICdwcm9kdWN0b3Mgw7puaWNvcyBwb3Igc2Nyb2xsJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4udW5pcXVlUHJvZHVjdHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBUb2RvcyBsb3MgcHJvZHVjdG9zIGRlbCBzY3JvbGwgeWEgZXhpc3RlbicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzSW5WaWV3KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyAmJiByZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTaSByZWNpYmltb3MgYXJyYXkgdmFjw61vIHkgbm8gZXN0YW1vcyB1c2FuZG8gY2FjaGUsIGxpbXBpYXIgcHJvZHVjdG9zXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXNpbmdDYWNoZWRQcm9kdWN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtX2xpc3QnLCB7IHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLCBpdGVtX2xpc3RfbmFtZTogJ0NvbGxlY3Rpb24nLCBpdGVtX2xpc3RfaWQ6IDAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBzdXNjcmlwY2lvbmVzIGRlIGZpbHRyb3NcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maWx0ZXJzJC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgLy8gSU1QT1JUQU5URTogU29sbyBhY3R1YWxpemFyIGZpbHRyb3Mgc2kgTk8gdmllbmVuIGRlbCBjYWNoZVxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyc0Zyb21DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CflIQgQWN0dWFsaXphbmRvIGZpbHRyb3MgZGVzZGUgc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFkY3J1bWIgPSB0aGlzLm9wdGlvbnNTZXJ2aWNlLmdldEJyZWFkY3J1bWJCeUZpbHRlcnMocmVzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzX3RvcCA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgWydzb3J0J10pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfmqsgU2FsdGFuZG8gYWN0dWFsaXphY2nDs24gZGUgZmlsdHJvcyAodXNhbmRvIGNhY2hlKScpO1xyXG4gICAgICAgICAgICAgICAgLy8gVW5hIHZleiBxdWUgaGFuIHNpZG8gdXRpbGl6YWRvcywgcmVzZXRlYXIgZWwgZmxhZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5maW5pc2hlZCgpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5maW5pc2hlZCA9IHJlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cEN1c3RvbVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdXNjcmlwY2nDs24gcGVyc29uYWxpemFkYSBwYXJhIGRldGVjdGFyIGNhbWJpb3MgZGUgY2F0ZWdvcsOtYS9iw7pzcXVlZGFcclxuICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFjdGl2ZVJvdXRlLnBhcmFtcywgdGhpcy5vcHRpb25zU2VydmljZS5yZWFkeSwgdGhpcy5hY3RpdmVSb3V0ZS5xdWVyeVBhcmFtc10pLnN1YnNjcmliZSgoW3BhcmFtcywgcmVhZHksIHF1ZXJ5UGFyYW1zXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVhZHkucmVhZHlBbGwgJiYgdGhpcy5zdWJzY3JpcHRpb25zQ29uZmlndXJlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHRoaXMuZ2VuZXJhdGVTdGF0ZUtleSgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBTaSBsYSBjbGF2ZSBjYW1iacOzLCBzaWduaWZpY2EgcXVlIG5hdmVnYW1vcyBhIHVuYSBjYXRlZ29yw61hIGRpZmVyZW50ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRLZXkgIT09IHRoaXMuc3RhdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBDYW1iaW8gZGUgY2F0ZWdvcsOtYSBkZXRlY3RhZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVLZXkgPSBjdXJyZW50S2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIExpbXBpYXIgY2FjaGUgeSByZWNhcmdhciBub3JtYWxtZW50ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUNhY2hlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxDYWNoZWRQcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc0Zyb21DYWNoZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElNUE9SVEFOVEU6IE1hcmNhciBxdWUgZXMgY2FtYmlvIGRlIGNhdGVnb3LDrWEgeSByZXNldGVhciBlc3RhZG9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2F0ZWdvcnlDaGFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlY2FyZ2FyIG5vcm1hbG1lbnRlIC0gcGVybyBzb2xvIGxhIHBldGljacOzbiwgbm8gcmVjb25maWd1cmFyIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWROZXdDYXRlZ29yeShwYXJhbXMsIHF1ZXJ5UGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbG9hZE5ld0NhdGVnb3J5KHBhcmFtczogYW55LCBxdWVyeVBhcmFtczogYW55KTogdm9pZCB7XHJcbiAgICAgICAgLy8gSGFjZXIgc29sbyBsYSBwZXRpY2nDs24gZGUgcHJvZHVjdG9zIHNpbiByZWNvbmZpZ3VyYXIgdG9kYXMgbGFzIHN1c2NyaXBjaW9uZXNcclxuICAgICAgICBsZXQgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKCFwYXJhbXNbJ3R5cGUnXSB8fCAhcGFyYW1zWyd2YWx1ZSddKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFByb2R1Y3RzRm9yRmlsdGVyKHsgbGF0ZXN0OiB0cnVlLCBsaW1pdDogMTAgfSwgdGhpcy5vcHRpb25zRmlsdGVycywgcXVlcnlQYXJhbXMuc2VhcmNoLCB0aGlzLmRlZmF1bHRGaWx0ZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcmFtc1sndHlwZSddO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyYW1zWyd2YWx1ZSddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zb2xlLmxvZygn8J+UhCBOdWV2YSBwZXRpY2nDs24gZW52aWFkYSBwYXJhIGNhdGVnb3LDrWE6JywgcGFyYW1zLnR5cGUsIHBhcmFtcy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVN0YXRlS2V5KCk6IHN0cmluZyB7XHJcbiAgICAgICAgLy8gSW5jbHVpciBydXRhIHkgcGFyw6FtZXRyb3MgcGFyYSBnZW5lcmFyIGNsYXZlIMO6bmljYVxyXG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KCc/JylbMF07IC8vIFNpbiBxdWVyeSBwYXJhbXNcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmFjdGl2ZVJvdXRlLnNuYXBzaG90LnBhcmFtcztcclxuICAgICAgICByZXR1cm4gYCR7cm91dGV9XyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW52YWxpZGF0ZUNhY2hlKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIExpbXBpYXIgY2FjaGUgZXNwZWPDrWZpY28geSBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5eR77iPIEludmFsaWRhbmRvIGNhY2hlIHBhcmE6JywgdGhpcy5zdGF0ZUtleSk7XHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oYGNvbGxlY3Rpb25fc2Nyb2xsXyR7dGhpcy5zdGF0ZUtleX1gKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVhbGl6YSB1biBzb3J0IGRlIHByb2R1Y3RvcyBwb3IgZWwgY2FtcG8gZGF0ZUNyZWF0ZSBkZSBsYSB2YXJpYW50ZVxyXG4gICAgICogQHBhcmFtIGEgUHJvZHVjdG8gYVxyXG4gICAgICogQHBhcmFtIGIgUHJvZHVjdG8gYlxyXG4gICAgICogQHBhcmFtIHR5cGUgc2kgZXMgYGFzY2AgfCBgZGVzY2BcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9ICoqMSoqIHBhcmEgYHRydWVgIHwgKiowKiogcGFyYSBgZmFsc2VgXHJcbiAgICAgKi9cclxuICAgIHNvcnRQcm9kdWN0cyA9IChhOmFueSwgYjphbnksIHR5cGU6c3RyaW5nPSdhc2MnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQSA9IGEudmFyaWFudHMgJiYgYS52YXJpYW50cy5sZW5ndGggPiAwID8gYS52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuICAgICAgICBsZXQgdG9Db21wYXJlQiA9IGIudmFyaWFudHMgJiYgYi52YXJpYW50cy5sZW5ndGggPiAwID8gYi52YXJpYW50c1swXVsnZGF0ZUNyZWF0ZSddIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYodG9Db21wYXJlQSAmJiB0b0NvbXBhcmVCKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlQSA9IG5ldyBEYXRlKHRvQ29tcGFyZUEpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUIgPSBuZXcgRGF0ZSh0b0NvbXBhcmVCKTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCh0eXBlKXtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc2MnOiByZXR1cm4gKGRhdGVBID49IGRhdGVCKSA/IDEgOiAwOyBicmVha1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnYXNjJzogcmV0dXJuIChkYXRlQSA8PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIDBcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYXBsaWNhIGVsIGZpbHRybyBlbiBsYSB2aXN0YS4gXHJcbiAgICAgKi9cclxuICAgIGFwcGx5RmlsdGVyc0luVmlldyA9ICgpID0+IHtcclxuICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckluVmlldz8ubm9VcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IHRoaXMucHJvZHVjdHMuc29ydCgoYSwgYikgPT4gdGhpcy5zb3J0UHJvZHVjdHMoYSxiLHRoaXMuZmlsdGVySW5WaWV3LnZhbHVlKSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID1mYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTcGVjaWZpY0ZpbHRlcnMgPSAoZmlsdGVyczogRmlsdGVyW10sIHR5cGVzOiBGaWx0ZXJUeXBlW10pOiBGaWx0ZXJbXSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIHR5cGVzLmZvckVhY2godHlwZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRfZmlsdGVyID0gZmlsdGVycy5maW5kKGZpbHRlciA9PiBmaWx0ZXIudHlwZSgpID09IHR5cGUpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0X2ZpbHRlcikgcmVzdWx0LnB1c2gocmVzdWx0X2ZpbHRlcik7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBvblNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCkgJiYgIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldE5leHQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFyZVByb2R1Y3RzID0gKCkgPT4gdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwO1xyXG4gICAgaXNXYWl0aW5nID0gKCkgPT4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuaXNXYWl0aW5nKCk7XHJcbiAgICBzZXRGaW5pc2hlZCA9ICgpID0+IHRoaXMuZmluaXNoZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICBjaGFuZ2VGaWx0ZXIgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NvbGxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRBbGxQcm9kdWN0b3NUb0NhcnQgPSAocHJvZHVjdHMgPSBudWxsKSA9PiB7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcbiAgICAgICAgKHByb2R1Y3RzIHx8IHRoaXMucHJvZHVjdHMpLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50Lm1hcChwID0+IGl0ZW1zLnB1c2gocCkpKVxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSkubWFwKHByb2QgPT4gcHJvZC5wcm9kdWN0VG9DYXJ0SXRlbSApXHJcbiAgICAgICAgaXRlbXM/Lmxlbmd0aCAmJiB0aGlzLmNhcnRTZXJ2aWNlLmFkZEFsbFRvQ2FydChpdGVtcylcclxuICAgIH1cclxuXHJcbiAgICBnZXRPYmplY3RXaXRoVmFyaWFudCA9ICgpOiBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHMuZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCgpXHJcbiAgICB9IFxyXG5cclxuICAgIC8vIE3DqXRvZG9zIGRlIGNpY2xvIGRlIHZpZGEgcmVxdWVyaWRvc1xyXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGhheSB1biBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvZHVjdEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbC1sZy0zLCAuY29sLW1kLTQsIC5jb2wtNiwgW2NsYXNzKj1cInByb2R1Y3RcIl0sIC5wcm9kdWN0LWl0ZW0sIC5jYXJkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQcm9kdWN0Q291bnQgPSBwcm9kdWN0RWxlbWVudHMubGVuZ3RoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIHNpIHNlIGhhbiByZW5kZXJpemFkbyBzdWZpY2llbnRlcyBwcm9kdWN0b3NcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQcm9kdWN0Q291bnQgPj0gTWF0aC5taW4odGhpcy5leHBlY3RlZFByb2R1Y3RDb3VudCwgMTApKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRQb3NpdGlvbiA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsOyAvLyBMaW1waWFyIHBhcmEgZXZpdGFyIGxvb3BzXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFVzYXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIHBhcmEgYXNlZ3VyYXIgcXVlIGVsIHJlbmRlcmluZyBlc3TDqSBjb21wbGV0b1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVTY3JvbGxXaXRoUmV0cmllcyh0YXJnZXRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5zYXZlQ3VycmVudFN0YXRlKCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTGltcGlhciBzY3JvbGwgcGVuZGllbnRlXHJcbiAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIExpbXBpYXIgZXZlbnQgbGlzdGVuZXJzXHJcbiAgICAgICAgaWYgKHRoaXMuY2xpY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBNw6l0b2RvcyBkZSBtYW5lam8gZGUgc2Nyb2xsIHkgY2FjaGVcclxuICAgIHByaXZhdGUgc2V0dXBCZWZvcmVVbmxvYWRIYW5kbGVyKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgICAgICAgIC8vIEludGVyY2VwdGFyIGNsaWNzIGVuIHByb2R1Y3RvcyBwYXJhIGd1YXJkYXIgZXN0YWRvXHJcbiAgICAgICAgICAgIHRoaXMuY2xpY2tIYW5kbGVyID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAvLyBCdXNjYXIgc2kgZWwgY2xpYyBlcyBlbiB1biBlbmxhY2UgYSBwcm9kdWN0b1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluayA9IHRhcmdldC5jbG9zZXN0KCdhW2hyZWYqPVwiL3Byb2R1Y3QvXCJdJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobGluayAmJiB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfjq8gQ2xpYyBlbiBwcm9kdWN0byBkZXRlY3RhZG8sIGd1YXJkYW5kbyBlc3RhZG8nKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50U3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAvLyBHdWFyZGFyIGR1cmFudGUgc2Nyb2xsIGVuIGxhIHDDoWdpbmEgZGUgY29sZWNjacOzblxyXG4gICAgICAgICAgICBsZXQgc2Nyb2xsVGltZXI6IGFueTtcclxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSBlc3RhbW9zIGVuIHVuYSBww6FnaW5hIGRlIGNvbGVjY2nDs25cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy9jb2xsZWN0aW9uLycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVyKTtcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zYXZlQ3VycmVudFN0YXRlKCksIDMwMCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gR3VhcmRhciBhbnRlcyBkZSBxdWUgZWwgdXN1YXJpbyBzYWxnYSBkZSBsYSBww6FnaW5hXHJcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb3V0ZXIudXJsLmluY2x1ZGVzKCcvY29sbGVjdGlvbi8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUN1cnJlbnRTdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlQ3VycmVudFN0YXRlKCkge1xyXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHRoaXMucHJvZHVjdHMgJiYgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIE9idGVuZXIgcG9zaWNpw7NuIGRlIHNjcm9sbCBkZSBtw7psdGlwbGVzIGZ1ZW50ZXNcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zID0gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgMCxcclxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNvbG8gZ3VhcmRhciBzaSB0ZW5lbW9zIHVuYSBwb3NpY2nDs24gc2lnbmlmaWNhdGl2YSBvIHByb2R1Y3RvcyBzdWZpY2llbnRlc1xyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsUG9zID4gMTAgfHwgdGhpcy5wcm9kdWN0cy5sZW5ndGggPiAxMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGU6IENvbGxlY3Rpb25TdGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0czogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBzY3JvbGxQb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQ6IHRoaXMuZmluaXNoZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZzogdGhpcy5sb2FkaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IE1hdGguY2VpbCh0aGlzLnByb2R1Y3RzLmxlbmd0aCAvIDEwKSxcclxuICAgICAgICAgICAgICAgICAgICBhbGxDYWNoZWRQcm9kdWN0czogdGhpcy51c2luZ0NhY2hlZFByb2R1Y3RzID8gWy4uLnRoaXMuYWxsQ2FjaGVkUHJvZHVjdHNdIDogWy4uLnRoaXMucHJvZHVjdHNdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyA/IFsuLi50aGlzLmZpbHRlcnNdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnNfdG9wOiB0aGlzLmZpbHRlcnNfdG9wID8gWy4uLnRoaXMuZmlsdGVyc190b3BdIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFkY3J1bWI6IHRoaXMuYnJlYWRjcnVtYiA/IFsuLi50aGlzLmJyZWFkY3J1bWJdIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIENvbGxlY3Rpb25FY0NvbXBvbmVudC5zdGF0ZUNhY2hlLnNldCh0aGlzLnN0YXRlS2V5LCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIFRhbWJpw6luIGd1YXJkYXIgZW4gc2Vzc2lvblN0b3JhZ2UgY29tbyBiYWNrdXBcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShgY29sbGVjdGlvbl9zY3JvbGxfJHt0aGlzLnN0YXRlS2V5fWAsIHNjcm9sbFBvcy50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBjb2xsZWN0aW9uX3Byb2R1Y3RzXyR7dGhpcy5zdGF0ZUtleX1gLCB0aGlzLnByb2R1Y3RzLmxlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zaXRpb246IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIHRhcmdldCBlcyBtYXlvciBxdWUgbGEgYWx0dXJhIGRlbCBkb2N1bWVudG9cclxuICAgICAgICBjb25zdCBkb2N1bWVudEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHRhcmdldFBvc2l0aW9uID4gZG9jdW1lbnRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBNYXRoLm1heCgwLCBkb2N1bWVudEhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gdmVyaWZpY2FyIHNpIGVsIHVzdWFyaW8gaGEgaGVjaG8gc2Nyb2xsIG11eSBsZWpvc1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICBpZiAoY3VycmVudFBvcyA+IDUwMCAmJiBNYXRoLmFicyhjdXJyZW50UG9zIC0gdGFyZ2V0UG9zaXRpb24pID4gMTAwMCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEludGVudGFyIGVuY29udHJhciB1bmEgcG9zaWNpw7NuIG3DoXMgcHJlY2lzYSBiYXNhZGEgZW4gZWxlbWVudG9zIGRlbCBET01cclxuICAgICAgICBjb25zdCBpbXByb3ZlZFBvc2l0aW9uID0gdGhpcy50cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICBpZiAoaW1wcm92ZWRQb3NpdGlvbiAhPT0gdGFyZ2V0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBpbXByb3ZlZFBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xyXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTU7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgdHJ5U2Nyb2xsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBhdHRlbXB0cysrO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBzY3JvbGwgbcOhcyBhZ3Jlc2l2byBzaSBlcyBuZWNlc2FyaW9cclxuICAgICAgICAgICAgaWYgKGF0dGVtcHRzIDwgMykge1xyXG4gICAgICAgICAgICAgICAgLy8gUHJpbWVyb3MgaW50ZW50b3MgY29uIHNtb290aFxyXG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHRhcmdldFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlbnRvcyBwb3N0ZXJpb3JlcyBtw6FzIGRpcmVjdG9zXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgdGFyZ2V0UG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSB0YXJnZXRQb3NpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIGRlc3B1w6lzIGRlIHVuIG1vbWVudG9cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gTWF0aC5hYnMoY3VycmVudFBvcyAtIHRhcmdldFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiA1MCAmJiBhdHRlbXB0cyA8IG1heEF0dGVtcHRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBhdHRlbXB0cyA8IDUgPyAxMDAgOiBhdHRlbXB0cyA8IDEwID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodHJ5U2Nyb2xsLCBkZWxheSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxpbmcgPSBmYWxzZTsgLy8gTGliZXJhciBmbGFnIGN1YW5kbyB0ZXJtaW5lXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJbnRlbnRhciBzb2xvIHVuYSB2ZXogaW5pY2lhbG1lbnRlXHJcbiAgICAgICAgdHJ5U2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlTY3JvbGxUb1Byb2R1Y3RCeUluZGV4KHRhcmdldFBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgICAgICAvLyBJbnRlbnRhciBjYWxjdWxhciBhIHF1w6kgcHJvZHVjdG8gY29ycmVzcG9uZGUgbGEgcG9zaWNpw7NuXHJcbiAgICAgICAgY29uc3QgYXBwcm94aW1hdGVJbmRleCA9IE1hdGguZmxvb3IodGFyZ2V0UG9zaXRpb24gLyA0MDApOyAvLyBBc3VtaWVuZG8gfjQwMHB4IHBvciBwcm9kdWN0b1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIEJ1c2NhciBlbGVtZW50b3MgZGUgcHJvZHVjdG9cclxuICAgICAgICBjb25zdCBwcm9kdWN0RWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29sLWxnLTMsIC5jb2wtbWQtNCwgLmNvbC02LCBbY2xhc3MqPVwicHJvZHVjdFwiXSwgLnByb2R1Y3QtaXRlbSwgLmNhcmQnKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAocHJvZHVjdEVsZW1lbnRzLmxlbmd0aCA+IGFwcHJveGltYXRlSW5kZXggJiYgYXBwcm94aW1hdGVJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBwcm9kdWN0RWxlbWVudHNbYXBwcm94aW1hdGVJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQb3NpdGlvbiA9IHRhcmdldEVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXNhciBsYSBwb3NpY2nDs24gZGVsIGVsZW1lbnRvIHNpIGVzIHJhem9uYWJsZVxyXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZWxlbWVudFBvc2l0aW9uIC0gdGFyZ2V0UG9zaXRpb24pIDwgODAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFBvc2l0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0YXJnZXRQb3NpdGlvbjsgLy8gVXNhciBwb3NpY2nDs24gb3JpZ2luYWwgc2kgbm8gZW5jdWVudHJhIGVsZW1lbnRvIGFkZWN1YWRvXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3YWl0Rm9yUHJvZHVjdFJlbmRlcmluZyh0YXJnZXRQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gQ29uZmlndXJhciBlbCBzY3JvbGwgcGVuZGllbnRlIHBhcmEgcXVlIG5nQWZ0ZXJWaWV3Q2hlY2tlZCBsbyBtYW5lamVcclxuICAgICAgICB0aGlzLnBlbmRpbmdTY3JvbGxQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uO1xyXG4gICAgICAgIHRoaXMuZXhwZWN0ZWRQcm9kdWN0Q291bnQgPSB0aGlzLnByb2R1Y3RzPy5sZW5ndGggfHwgMDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBUaW1lb3V0IGRlIHNlZ3VyaWRhZCBlbiBjYXNvIGRlIHF1ZSBuZ0FmdGVyVmlld0NoZWNrZWQgbm8gc2UgZWplY3V0ZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFBvcyA9IHRoaXMucGVuZGluZ1Njcm9sbFBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlU2Nyb2xsV2l0aFJldHJpZXModGFyZ2V0UG9zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMjAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTcOpdG9kbyBwZXJzb25hbGl6YWRvIHBhcmEgbWFuZWphciBzZWxlY2Npw7NuIGRlIGZpbHRyb3MgcXVlIGludmFsaWRhcsOhIGNhY2hlXHJcbiAgICBjdXN0b21TZXRGaWx0ZXJTZWxlY3RlZCA9IChmaWx0ZXIsIGZpbHRlckVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyBJbnZhbGlkYXIgY2FjaGUgY29tcGxldGFtZW50ZSBjdWFuZG8gc2Ugc2VsZWNjaW9uYSB1biBmaWx0cm9cclxuICAgICAgICB0aGlzLnVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFsbENhY2hlZFByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5maWx0ZXJzRnJvbUNhY2hlID0gZmFsc2U7IC8vIFlhIG5vIHVzYW1vcyBmaWx0cm9zIGRlbCBjYWNoZVxyXG4gICAgICAgIHRoaXMuaXNDYXRlZ29yeUNoYW5nZSA9IHRydWU7IC8vIE1hcmNhciBjb21vIGNhbWJpbyBwYXJhIHJlZW1wbGF6YXIgcHJvZHVjdG9zXHJcbiAgICAgICAgQ29sbGVjdGlvbkVjQ29tcG9uZW50LnN0YXRlQ2FjaGUuZGVsZXRlKHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKCfwn5SEIEZpbHRybyBzZWxlY2Npb25hZG8sIGludmFsaWRhbmRvIGNhY2hlIHkgcmVjYXJnYW5kbyBkZXNkZSBlbmRwb2ludCBwYXJhOicsIHRoaXMuc3RhdGVLZXkpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFNvbG8gbGltcGlhciBwcm9kdWN0b3MsIE5PIGxpbXBpYXIgZmlsdHJvcyBwYXJhIHF1ZSBubyBkZXNhcGFyZXpjYW5cclxuICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMbGFtYXIgYWwgbcOpdG9kbyBvcmlnaW5hbCBkZWwgUHJvZHVjdHNTZXJ2aWNlIHF1ZSBpbmljaWFyw6EgdW5hIGNhcmdhIGNvbXBsZXRhXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9kdWN0c1NlcnZpY2Uuc2V0RmlsdGVyU2VsZWN0ZWQoZmlsdGVyLCBmaWx0ZXJFbGVtZW50KTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBMYSBzdXNjcmlwY2nDs24gcHJpbmNpcGFsIGF1dG9tw6F0aWNhbWVudGUgYWN0dWFsaXphcsOhIGxvcyBmaWx0cm9zXHJcbiAgICAgICAgLy8gcG9ycXVlIGZpbHRlcnNGcm9tQ2FjaGUgPSBmYWxzZSB5IHVzaW5nQ2FjaGVkUHJvZHVjdHMgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==