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.
- package/README.md +58 -22
- package/assets/ec-i18n/en.json +1 -3
- package/assets/ec-i18n/es.json +1 -3
- package/bundles/ng-easycommerce.umd.js +515 -181
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/core.consts.js +1 -6
- package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +3 -5
- package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +5 -8
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +8 -13
- package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +450 -14
- package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +3 -30
- package/esm2015/lib/ec-component/product-ec/product-ec.component.js +2 -1
- package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +5 -8
- package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +3 -1
- package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +1 -2
- package/esm2015/lib/services/cart.service.js +12 -27
- package/esm2015/lib/services/currency.service.js +7 -43
- package/esm5/lib/core.consts.js +1 -6
- package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +3 -5
- package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +5 -8
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +8 -13
- package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +458 -13
- package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +3 -48
- package/esm5/lib/ec-component/product-ec/product-ec.component.js +2 -1
- package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +5 -8
- package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +3 -1
- package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +3 -3
- package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +1 -2
- package/esm5/lib/services/cart.service.js +12 -27
- package/esm5/lib/services/currency.service.js +7 -43
- package/fesm2015/ng-easycommerce.js +502 -159
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +516 -182
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/core.consts.d.ts +0 -5
- package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +0 -1
- package/lib/ec-component/cart-ec/cart-ec.component.d.ts +0 -1
- package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +1 -1
- package/lib/ec-component/collection-ec/collection-ec.component.d.ts +34 -4
- package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +0 -3
- package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +0 -1
- package/lib/services/cart.service.d.ts +2 -2
- package/lib/services/currency.service.d.ts +2 -14
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -17,6 +17,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
17
17
|
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;
|
|
18
18
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
19
|
};
|
|
20
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
21
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
22
|
+
};
|
|
20
23
|
var __read = (this && this.__read) || function (o, n) {
|
|
21
24
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
22
25
|
if (!m) return o;
|
|
@@ -37,8 +40,9 @@ var __spread = (this && this.__spread) || function () {
|
|
|
37
40
|
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
38
41
|
return ar;
|
|
39
42
|
};
|
|
40
|
-
import { Component, Input } from '@angular/core';
|
|
41
|
-
import { ActivatedRoute } from '@angular/router';
|
|
43
|
+
import { Component, Input, Inject, PLATFORM_ID } from '@angular/core';
|
|
44
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
45
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
42
46
|
// import { Constants, Filter, OptionsService, Product, ProductsService } from 'ng-easycommerce';
|
|
43
47
|
import { combineLatest } from 'rxjs';
|
|
44
48
|
import { ComponentHelper } from '../../classes/component-helper';
|
|
@@ -52,7 +56,7 @@ import { ParametersService } from '../../services/parameters.service';
|
|
|
52
56
|
import { ProductsService } from '../../services/products/products.service';
|
|
53
57
|
var CollectionEcComponent = /** @class */ (function (_super) {
|
|
54
58
|
__extends(CollectionEcComponent, _super);
|
|
55
|
-
function CollectionEcComponent(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService) {
|
|
59
|
+
function CollectionEcComponent(productsService, paramsSrv, activeRoute, optionsService, authService, analyticsService, cartService, consts, filtersService, router, platformId) {
|
|
56
60
|
var _this = _super.call(this) || this;
|
|
57
61
|
_this.productsService = productsService;
|
|
58
62
|
_this.paramsSrv = paramsSrv;
|
|
@@ -63,12 +67,21 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
63
67
|
_this.cartService = cartService;
|
|
64
68
|
_this.consts = consts;
|
|
65
69
|
_this.filtersService = filtersService;
|
|
70
|
+
_this.router = router;
|
|
66
71
|
_this.filters = [];
|
|
67
72
|
_this.filtersConfig = { filters: [] };
|
|
68
73
|
_this.finished = false;
|
|
69
74
|
_this.loading = true;
|
|
70
75
|
_this.breadcrumb = [];
|
|
71
76
|
_this.isCollection = true;
|
|
77
|
+
_this.usingCachedProducts = false;
|
|
78
|
+
_this.allCachedProducts = [];
|
|
79
|
+
_this.subscriptionsConfigured = false;
|
|
80
|
+
_this.isScrolling = false;
|
|
81
|
+
_this.pendingScrollPosition = null;
|
|
82
|
+
_this.expectedProductCount = 0;
|
|
83
|
+
_this.filtersFromCache = false; // Flag para indicar si los filtros vienen del cache
|
|
84
|
+
_this.isCategoryChange = false; // Flag para indicar si es un cambio de categoría
|
|
72
85
|
_this.productsWithUniqueVariant = false;
|
|
73
86
|
_this.optionsFilters = ['all'];
|
|
74
87
|
/**
|
|
@@ -139,26 +152,117 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
139
152
|
_this.getObjectWithVariant = function () {
|
|
140
153
|
return _this.consts.getParamsProductsWithUniqueVariant();
|
|
141
154
|
};
|
|
155
|
+
// Método personalizado para manejar selección de filtros que invalidará cache
|
|
156
|
+
_this.customSetFilterSelected = function (filter, filterElement) {
|
|
157
|
+
// Invalidar cache completamente cuando se selecciona un filtro
|
|
158
|
+
_this.usingCachedProducts = false;
|
|
159
|
+
_this.allCachedProducts = [];
|
|
160
|
+
_this.filtersFromCache = false; // Ya no usamos filtros del cache
|
|
161
|
+
_this.isCategoryChange = true; // Marcar como cambio para reemplazar productos
|
|
162
|
+
CollectionEcComponent_1.stateCache.delete(_this.stateKey);
|
|
163
|
+
console.log('🔄 Filtro seleccionado, invalidando cache y recargando desde endpoint para:', _this.stateKey);
|
|
164
|
+
// Solo limpiar productos, NO limpiar filtros para que no desaparezcan
|
|
165
|
+
_this.products = [];
|
|
166
|
+
_this.loading = true;
|
|
167
|
+
// Llamar al método original del ProductsService que iniciará una carga completa
|
|
168
|
+
var result = _this.productsService.setFilterSelected(filter, filterElement);
|
|
169
|
+
// La suscripción principal automáticamente actualizará los filtros
|
|
170
|
+
// porque filtersFromCache = false y usingCachedProducts = false
|
|
171
|
+
return result;
|
|
172
|
+
};
|
|
142
173
|
_this.paramsSrv.parameters.subscribe(function (param) { return _this.params = param; });
|
|
143
174
|
_this.defaultFilters = _this.consts.getDefaultFilters();
|
|
144
175
|
_this.filtersConfig.filters = _this.consts.getFilterConfig();
|
|
145
176
|
_this.productsService.filtersInView$.subscribe(function (res) { return _this.filterInView = res; });
|
|
177
|
+
// Inicializar propiedades de scroll y cache
|
|
178
|
+
_this.platformId = platformId;
|
|
179
|
+
_this.isRestoringState = false;
|
|
180
|
+
_this.usingCachedProducts = false;
|
|
181
|
+
_this.allCachedProducts = [];
|
|
182
|
+
_this.subscriptionsConfigured = false;
|
|
183
|
+
_this.isScrolling = false;
|
|
184
|
+
_this.pendingScrollPosition = null;
|
|
185
|
+
_this.expectedProductCount = 0;
|
|
186
|
+
_this.filtersFromCache = false;
|
|
146
187
|
_this.ecOnConstruct();
|
|
147
188
|
return _this;
|
|
148
189
|
}
|
|
190
|
+
CollectionEcComponent_1 = CollectionEcComponent;
|
|
149
191
|
CollectionEcComponent.prototype.ngOnInit = function () {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
this.
|
|
153
|
-
|
|
192
|
+
this.stateKey = this.router.url.split('?')[0];
|
|
193
|
+
// Verificar si hay estado guardado ANTES de scroll(0,0)
|
|
194
|
+
var savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
|
|
195
|
+
if (savedState && savedState.products.length > 0) {
|
|
196
|
+
// NO llamar window.scroll(0, 0) para preservar posición
|
|
197
|
+
this.products = [];
|
|
198
|
+
this.ecOnInit();
|
|
199
|
+
this.getProductsAndSubscribe(); // Llamar directamente
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Comportamiento normal con scroll al inicio
|
|
203
|
+
window.scroll(0, 0);
|
|
204
|
+
this.products = [];
|
|
205
|
+
this.ecOnInit();
|
|
206
|
+
this.getProductsAndSubscribe();
|
|
207
|
+
}
|
|
208
|
+
// Configurar manejo de estado
|
|
209
|
+
this.setupBeforeUnloadHandler();
|
|
154
210
|
};
|
|
155
211
|
CollectionEcComponent.prototype.getProductsAndSubscribe = function () {
|
|
212
|
+
// Verificar PRIMERO si hay estado guardado
|
|
213
|
+
var savedState = CollectionEcComponent_1.stateCache.get(this.stateKey);
|
|
214
|
+
if (savedState && savedState.products.length > 0) {
|
|
215
|
+
console.log('📦 Restaurando desde cache:', savedState.products.length, 'productos');
|
|
216
|
+
// Configurar modo cache ANTES de restaurar
|
|
217
|
+
this.usingCachedProducts = true;
|
|
218
|
+
this.allCachedProducts = __spread(savedState.products);
|
|
219
|
+
this.isRestoringState = true;
|
|
220
|
+
// Restaurar productos inmediatamente
|
|
221
|
+
this.products = __spread(savedState.products);
|
|
222
|
+
this.finished = savedState.finished;
|
|
223
|
+
this.loading = false;
|
|
224
|
+
// Restaurar filtros si están disponibles
|
|
225
|
+
if (savedState.filters) {
|
|
226
|
+
this.filters = __spread(savedState.filters);
|
|
227
|
+
this.filtersFromCache = true; // Marcar que estos filtros vienen del cache
|
|
228
|
+
console.log('📦 Filtros restaurados desde cache:', this.filters.length);
|
|
229
|
+
}
|
|
230
|
+
if (savedState.filters_top) {
|
|
231
|
+
this.filters_top = __spread(savedState.filters_top);
|
|
232
|
+
console.log('📦 Filtros top restaurados desde cache:', this.filters_top.length);
|
|
233
|
+
}
|
|
234
|
+
if (savedState.breadcrumb) {
|
|
235
|
+
this.breadcrumb = __spread(savedState.breadcrumb);
|
|
236
|
+
console.log('📦 Breadcrumb restaurado desde cache:', this.breadcrumb);
|
|
237
|
+
}
|
|
238
|
+
// IMPORTANTE: Configurar TODAS las suscripciones del padre (filtros, breadcrumb, etc.)
|
|
239
|
+
// pero SIN resetear productos ni hacer petición inicial
|
|
240
|
+
this.setupParentSubscriptionsOnly();
|
|
241
|
+
// Configurar suscripción personalizada para detectar cambios de categoría
|
|
242
|
+
this.setupCustomSubscription();
|
|
243
|
+
this.subscriptionsConfigured = true;
|
|
244
|
+
// Restaurar scroll después de que los productos se rendericen
|
|
245
|
+
this.waitForProductRendering(savedState.scrollPosition);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
console.log('🔄 No hay cache, carga normal');
|
|
249
|
+
// Si no hay estado guardado, comportamiento normal
|
|
250
|
+
this.usingCachedProducts = false;
|
|
251
|
+
this.allCachedProducts = [];
|
|
252
|
+
this.filtersFromCache = false; // No hay filtros del cache
|
|
253
|
+
// Llamar al comportamiento original
|
|
254
|
+
this.originalGetProductsAndSubscribe();
|
|
255
|
+
this.subscriptionsConfigured = true;
|
|
256
|
+
};
|
|
257
|
+
CollectionEcComponent.prototype.originalGetProductsAndSubscribe = function () {
|
|
156
258
|
var _this = this;
|
|
157
259
|
combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(function (_a) {
|
|
158
260
|
var _b = __read(_a, 3), params = _b[0], ready = _b[1], queryParams = _b[2];
|
|
159
261
|
if (ready.readyAll) {
|
|
160
262
|
var cambio_1 = false;
|
|
161
263
|
_this.products = [];
|
|
264
|
+
// Marcar como cambio de categoría para la carga inicial
|
|
265
|
+
_this.isCategoryChange = true;
|
|
162
266
|
if (!params['type'] || !params['value']) {
|
|
163
267
|
_this.productsService.getProductsForFilter({ latest: true, limit: 10 }, _this.optionsFilters, queryParams.search, _this.defaultFilters);
|
|
164
268
|
}
|
|
@@ -189,7 +293,16 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
189
293
|
}
|
|
190
294
|
else {
|
|
191
295
|
res = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
|
|
192
|
-
|
|
296
|
+
// Filtrar productos duplicados antes de agregar
|
|
297
|
+
var existingIds_1 = new Set(_this.products.map(function (p) { return p.id; }));
|
|
298
|
+
var uniqueProducts = res.filter(function (p) { return !existingIds_1.has(p.id); });
|
|
299
|
+
if (uniqueProducts.length > 0) {
|
|
300
|
+
console.log('➕ CollectionEC (variants): Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
|
|
301
|
+
(_a = _this.products).push.apply(_a, __spread(uniqueProducts));
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
console.log('⚠️ CollectionEC (variants): Todos los productos ya existen - ignorando', res.length, 'productos');
|
|
305
|
+
}
|
|
193
306
|
_this.applyFiltersInView();
|
|
194
307
|
}
|
|
195
308
|
;
|
|
@@ -201,7 +314,16 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
201
314
|
cambio_1 = false;
|
|
202
315
|
}
|
|
203
316
|
else {
|
|
204
|
-
|
|
317
|
+
// Filtrar productos duplicados antes de agregar
|
|
318
|
+
var existingIds_2 = new Set(_this.products.map(function (p) { return p.id; }));
|
|
319
|
+
var uniqueProducts = res.filter(function (p) { return !existingIds_2.has(p.id); });
|
|
320
|
+
if (uniqueProducts.length > 0) {
|
|
321
|
+
console.log('➕ CollectionEC: Agregando', uniqueProducts.length, 'de', res.length, 'productos únicos');
|
|
322
|
+
(_b = _this.products).push.apply(_b, __spread(uniqueProducts));
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
console.log('⚠️ CollectionEC: Todos los productos ya existen - ignorando', res.length, 'productos');
|
|
326
|
+
}
|
|
205
327
|
_this.applyFiltersInView();
|
|
206
328
|
}
|
|
207
329
|
}
|
|
@@ -218,6 +340,145 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
218
340
|
}
|
|
219
341
|
});
|
|
220
342
|
};
|
|
343
|
+
CollectionEcComponent.prototype.setupParentSubscriptionsOnly = function () {
|
|
344
|
+
var _this = this;
|
|
345
|
+
var _a;
|
|
346
|
+
// Desuscribir cualquier suscripción anterior
|
|
347
|
+
try {
|
|
348
|
+
(_a = this.suscripcion) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
349
|
+
}
|
|
350
|
+
catch (e) { }
|
|
351
|
+
// IMPORTANTE: Configurar suscripción a productos para navegación posterior
|
|
352
|
+
this.suscripcion = this.productsService.products$.subscribe(function (res) {
|
|
353
|
+
var _a, _b;
|
|
354
|
+
var _c;
|
|
355
|
+
console.log('📦 Suscripción products$ (desde cache):', (_c = res) === null || _c === void 0 ? void 0 : _c.length, 'productos');
|
|
356
|
+
_this.loading = false;
|
|
357
|
+
if (res && res.length > 0) {
|
|
358
|
+
// Si estamos usando cache, agregar solo productos nuevos únicos
|
|
359
|
+
if (_this.usingCachedProducts) {
|
|
360
|
+
var existingIds_3 = new Set(_this.products.map(function (p) { return p.id; }));
|
|
361
|
+
var uniqueProducts = res.filter(function (p) { return !existingIds_3.has(p.id); });
|
|
362
|
+
if (uniqueProducts.length > 0) {
|
|
363
|
+
console.log('➕ Cache: Agregando', uniqueProducts.length, 'productos adicionales');
|
|
364
|
+
(_a = _this.products).push.apply(_a, __spread(uniqueProducts));
|
|
365
|
+
_this.usingCachedProducts = false; // Ya no solo cache
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
// Determinar si es cambio de categoría o scroll infinito
|
|
370
|
+
if (_this.isCategoryChange) {
|
|
371
|
+
// Cambio de categoría: reemplazar completamente
|
|
372
|
+
console.log('🔄 Cambio de categoría: Reemplazando productos completamente');
|
|
373
|
+
if (_this.productsWithUniqueVariant) {
|
|
374
|
+
_this.products = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
_this.products = res;
|
|
378
|
+
}
|
|
379
|
+
_this.applyFiltersInView();
|
|
380
|
+
_this.isCategoryChange = false; // Resetear bandera
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
// Scroll infinito: agregar productos únicos
|
|
384
|
+
console.log('📜 Scroll infinito: Agregando productos únicos');
|
|
385
|
+
var existingIds_4 = new Set(_this.products.map(function (p) { return p.id; }));
|
|
386
|
+
var newProducts = res;
|
|
387
|
+
if (_this.productsWithUniqueVariant) {
|
|
388
|
+
newProducts = _this.productsService.getProductsWithUniqueVariant(res, _this.getObjectWithVariant());
|
|
389
|
+
}
|
|
390
|
+
var uniqueProducts = newProducts.filter(function (p) { return !existingIds_4.has(p.id); });
|
|
391
|
+
if (uniqueProducts.length > 0) {
|
|
392
|
+
console.log('➕ Agregando', uniqueProducts.length, 'productos únicos por scroll');
|
|
393
|
+
(_b = _this.products).push.apply(_b, __spread(uniqueProducts));
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
console.log('⚠️ Todos los productos del scroll ya existen');
|
|
397
|
+
}
|
|
398
|
+
_this.applyFiltersInView();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else if (res && res.length === 0) {
|
|
403
|
+
// Si recibimos array vacío y no estamos usando cache, limpiar productos
|
|
404
|
+
if (!_this.usingCachedProducts) {
|
|
405
|
+
_this.products = [];
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
_this.finished = _this.productsService.isFinished();
|
|
409
|
+
_this.analyticsService.callEvent('view_item_list', { products: _this.products, item_list_name: 'Collection', item_list_id: 0 });
|
|
410
|
+
});
|
|
411
|
+
// Configurar suscripciones de filtros
|
|
412
|
+
this.productsService.filters$.subscribe(function (res) {
|
|
413
|
+
// IMPORTANTE: Solo actualizar filtros si NO vienen del cache
|
|
414
|
+
if (!_this.filtersFromCache) {
|
|
415
|
+
console.log('🔄 Actualizando filtros desde server');
|
|
416
|
+
_this.breadcrumb = _this.optionsService.getBreadcrumbByFilters(res);
|
|
417
|
+
_this.filters = _this.getSpecificFilters(res, _this.filtersConfig.filters);
|
|
418
|
+
_this.filters_top = _this.getSpecificFilters(res, ['sort']);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
console.log('🚫 Saltando actualización de filtros (usando cache)');
|
|
422
|
+
// Una vez que han sido utilizados, resetear el flag
|
|
423
|
+
_this.filtersFromCache = false;
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
this.productsService.finished().subscribe(function (res) { return _this.finished = res; });
|
|
427
|
+
};
|
|
428
|
+
CollectionEcComponent.prototype.setupCustomSubscription = function () {
|
|
429
|
+
var _this = this;
|
|
430
|
+
// Suscripción personalizada para detectar cambios de categoría/búsqueda
|
|
431
|
+
combineLatest([this.activeRoute.params, this.optionsService.ready, this.activeRoute.queryParams]).subscribe(function (_a) {
|
|
432
|
+
var _b = __read(_a, 3), params = _b[0], ready = _b[1], queryParams = _b[2];
|
|
433
|
+
if (ready.readyAll && _this.subscriptionsConfigured) {
|
|
434
|
+
var currentKey = _this.generateStateKey();
|
|
435
|
+
// Si la clave cambió, significa que navegamos a una categoría diferente
|
|
436
|
+
if (currentKey !== _this.stateKey) {
|
|
437
|
+
console.log('🔄 Cambio de categoría detectado, invalidando cache y recargando');
|
|
438
|
+
_this.stateKey = currentKey;
|
|
439
|
+
// Limpiar cache y recargar normalmente
|
|
440
|
+
_this.invalidateCache();
|
|
441
|
+
_this.usingCachedProducts = false;
|
|
442
|
+
_this.allCachedProducts = [];
|
|
443
|
+
_this.filtersFromCache = false;
|
|
444
|
+
// IMPORTANTE: Marcar que es cambio de categoría y resetear estado
|
|
445
|
+
_this.isCategoryChange = true;
|
|
446
|
+
_this.loading = true;
|
|
447
|
+
_this.products = [];
|
|
448
|
+
// Recargar normalmente - pero solo la petición, no reconfigurar suscripciones
|
|
449
|
+
_this.loadNewCategory(params, queryParams);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
};
|
|
454
|
+
CollectionEcComponent.prototype.loadNewCategory = function (params, queryParams) {
|
|
455
|
+
// Hacer solo la petición de productos sin reconfigurar todas las suscripciones
|
|
456
|
+
var cambio = false;
|
|
457
|
+
if (!params['type'] || !params['value']) {
|
|
458
|
+
this.productsService.getProductsForFilter({ latest: true, limit: 10 }, this.optionsFilters, queryParams.search, this.defaultFilters);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
this.productsService.getProductsForFilter({ type: params.type, value: params.value }, this.optionsFilters, queryParams.search, this.defaultFilters);
|
|
462
|
+
cambio = true;
|
|
463
|
+
this.type = params['type'];
|
|
464
|
+
this.value = params['value'];
|
|
465
|
+
}
|
|
466
|
+
console.log('🔄 Nueva petición enviada para categoría:', params.type, params.value);
|
|
467
|
+
};
|
|
468
|
+
CollectionEcComponent.prototype.generateStateKey = function () {
|
|
469
|
+
// Incluir ruta y parámetros para generar clave única
|
|
470
|
+
var route = this.router.url.split('?')[0]; // Sin query params
|
|
471
|
+
var params = this.activeRoute.snapshot.params;
|
|
472
|
+
return route + "_" + JSON.stringify(params);
|
|
473
|
+
};
|
|
474
|
+
CollectionEcComponent.prototype.invalidateCache = function () {
|
|
475
|
+
// Limpiar cache específico y sessionStorage
|
|
476
|
+
console.log('🗑️ Invalidando cache para:', this.stateKey);
|
|
477
|
+
CollectionEcComponent_1.stateCache.delete(this.stateKey);
|
|
478
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
479
|
+
sessionStorage.removeItem("collection_scroll_" + this.stateKey);
|
|
480
|
+
}
|
|
481
|
+
};
|
|
221
482
|
CollectionEcComponent.prototype.onScroll = function () {
|
|
222
483
|
this.loading = true;
|
|
223
484
|
if (!this.productsService.isWaiting() && !this.productsService.getNext()) {
|
|
@@ -225,6 +486,187 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
225
486
|
this.loading = false;
|
|
226
487
|
}
|
|
227
488
|
};
|
|
489
|
+
// Métodos de ciclo de vida requeridos
|
|
490
|
+
CollectionEcComponent.prototype.ngAfterViewChecked = function () {
|
|
491
|
+
var _this = this;
|
|
492
|
+
// Solo verificar si hay un scroll pendiente
|
|
493
|
+
if (this.pendingScrollPosition !== null && isPlatformBrowser(this.platformId)) {
|
|
494
|
+
var productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
|
|
495
|
+
var currentProductCount = productElements.length;
|
|
496
|
+
// Verificar si se han renderizado suficientes productos
|
|
497
|
+
if (currentProductCount >= Math.min(this.expectedProductCount, 10)) {
|
|
498
|
+
var targetPosition_1 = this.pendingScrollPosition;
|
|
499
|
+
this.pendingScrollPosition = null; // Limpiar para evitar loops
|
|
500
|
+
// Usar requestAnimationFrame para asegurar que el rendering esté completo
|
|
501
|
+
requestAnimationFrame(function () {
|
|
502
|
+
requestAnimationFrame(function () {
|
|
503
|
+
_this.restoreScrollWithRetries(targetPosition_1);
|
|
504
|
+
_this.isRestoringState = false;
|
|
505
|
+
});
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
CollectionEcComponent.prototype.ngOnDestroy = function () {
|
|
511
|
+
var _a;
|
|
512
|
+
(_a = this.routerSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
513
|
+
this.saveCurrentState();
|
|
514
|
+
// Limpiar scroll pendiente
|
|
515
|
+
this.pendingScrollPosition = null;
|
|
516
|
+
// Limpiar event listeners
|
|
517
|
+
if (this.clickHandler) {
|
|
518
|
+
document.removeEventListener('click', this.clickHandler);
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
// Métodos de manejo de scroll y cache
|
|
522
|
+
CollectionEcComponent.prototype.setupBeforeUnloadHandler = function () {
|
|
523
|
+
var _this = this;
|
|
524
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
525
|
+
// Interceptar clics en productos para guardar estado
|
|
526
|
+
this.clickHandler = function (event) {
|
|
527
|
+
var target = event.target;
|
|
528
|
+
// Buscar si el clic es en un enlace a producto
|
|
529
|
+
var link = target.closest('a[href*="/product/"]');
|
|
530
|
+
if (link && _this.router.url.includes('/collection/')) {
|
|
531
|
+
console.log('🎯 Clic en producto detectado, guardando estado');
|
|
532
|
+
_this.saveCurrentState();
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
document.addEventListener('click', this.clickHandler);
|
|
536
|
+
// Guardar durante scroll en la página de colección
|
|
537
|
+
var scrollTimer_1;
|
|
538
|
+
window.addEventListener('scroll', function () {
|
|
539
|
+
// Solo guardar si estamos en una página de colección
|
|
540
|
+
if (_this.router.url.includes('/collection/')) {
|
|
541
|
+
clearTimeout(scrollTimer_1);
|
|
542
|
+
scrollTimer_1 = setTimeout(function () { return _this.saveCurrentState(); }, 300);
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
// Guardar antes de que el usuario salga de la página
|
|
546
|
+
window.addEventListener('beforeunload', function () {
|
|
547
|
+
if (_this.router.url.includes('/collection/')) {
|
|
548
|
+
_this.saveCurrentState();
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
};
|
|
553
|
+
CollectionEcComponent.prototype.saveCurrentState = function () {
|
|
554
|
+
if (isPlatformBrowser(this.platformId) && this.products && this.products.length > 0) {
|
|
555
|
+
// Obtener posición de scroll de múltiples fuentes
|
|
556
|
+
var scrollPos = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop || 0, document.body.scrollTop || 0);
|
|
557
|
+
// Solo guardar si tenemos una posición significativa o productos suficientes
|
|
558
|
+
if (scrollPos > 10 || this.products.length > 10) {
|
|
559
|
+
var state = {
|
|
560
|
+
products: __spread(this.products),
|
|
561
|
+
scrollPosition: scrollPos,
|
|
562
|
+
finished: this.finished,
|
|
563
|
+
loading: this.loading,
|
|
564
|
+
page: Math.ceil(this.products.length / 10),
|
|
565
|
+
allCachedProducts: this.usingCachedProducts ? __spread(this.allCachedProducts) : __spread(this.products),
|
|
566
|
+
filters: this.filters ? __spread(this.filters) : undefined,
|
|
567
|
+
filters_top: this.filters_top ? __spread(this.filters_top) : undefined,
|
|
568
|
+
breadcrumb: this.breadcrumb ? __spread(this.breadcrumb) : undefined
|
|
569
|
+
};
|
|
570
|
+
CollectionEcComponent_1.stateCache.set(this.stateKey, state);
|
|
571
|
+
// También guardar en sessionStorage como backup
|
|
572
|
+
try {
|
|
573
|
+
sessionStorage.setItem("collection_scroll_" + this.stateKey, scrollPos.toString());
|
|
574
|
+
sessionStorage.setItem("collection_products_" + this.stateKey, this.products.length.toString());
|
|
575
|
+
}
|
|
576
|
+
catch (e) { }
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
CollectionEcComponent.prototype.restoreScrollWithRetries = function (targetPosition) {
|
|
581
|
+
var _this = this;
|
|
582
|
+
if (this.isScrolling) {
|
|
583
|
+
return;
|
|
584
|
+
}
|
|
585
|
+
// Verificar si el target es mayor que la altura del documento
|
|
586
|
+
var documentHeight = document.documentElement.scrollHeight;
|
|
587
|
+
if (targetPosition > documentHeight) {
|
|
588
|
+
targetPosition = Math.max(0, documentHeight - window.innerHeight);
|
|
589
|
+
}
|
|
590
|
+
// Solo verificar si el usuario ha hecho scroll muy lejos
|
|
591
|
+
var currentPos = window.pageYOffset || document.documentElement.scrollTop;
|
|
592
|
+
if (currentPos > 500 && Math.abs(currentPos - targetPosition) > 1000) {
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
this.isScrolling = true;
|
|
596
|
+
// Intentar encontrar una posición más precisa basada en elementos del DOM
|
|
597
|
+
var improvedPosition = this.tryScrollToProductByIndex(targetPosition);
|
|
598
|
+
if (improvedPosition !== targetPosition) {
|
|
599
|
+
targetPosition = improvedPosition;
|
|
600
|
+
}
|
|
601
|
+
var attempts = 0;
|
|
602
|
+
var maxAttempts = 15;
|
|
603
|
+
var tryScroll = function () {
|
|
604
|
+
attempts++;
|
|
605
|
+
// Usar scroll más agresivo si es necesario
|
|
606
|
+
if (attempts < 3) {
|
|
607
|
+
// Primeros intentos con smooth
|
|
608
|
+
window.scrollTo({
|
|
609
|
+
top: targetPosition,
|
|
610
|
+
behavior: 'smooth'
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
// Intentos posteriores más directos
|
|
615
|
+
window.scrollTo(0, targetPosition);
|
|
616
|
+
document.documentElement.scrollTop = targetPosition;
|
|
617
|
+
document.body.scrollTop = targetPosition;
|
|
618
|
+
}
|
|
619
|
+
// Verificar después de un momento
|
|
620
|
+
setTimeout(function () {
|
|
621
|
+
var currentPos = window.pageYOffset || document.documentElement.scrollTop;
|
|
622
|
+
var difference = Math.abs(currentPos - targetPosition);
|
|
623
|
+
if (difference > 50 && attempts < maxAttempts) {
|
|
624
|
+
var delay = attempts < 5 ? 100 : attempts < 10 ? 200 : 300;
|
|
625
|
+
setTimeout(tryScroll, delay);
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
_this.isScrolling = false; // Liberar flag cuando termine
|
|
629
|
+
}
|
|
630
|
+
}, 100);
|
|
631
|
+
};
|
|
632
|
+
// Intentar solo una vez inicialmente
|
|
633
|
+
tryScroll();
|
|
634
|
+
};
|
|
635
|
+
CollectionEcComponent.prototype.tryScrollToProductByIndex = function (targetPosition) {
|
|
636
|
+
// Intentar calcular a qué producto corresponde la posición
|
|
637
|
+
var approximateIndex = Math.floor(targetPosition / 400); // Asumiendo ~400px por producto
|
|
638
|
+
// Buscar elementos de producto
|
|
639
|
+
var productElements = document.querySelectorAll('.col-lg-3, .col-md-4, .col-6, [class*="product"], .product-item, .card');
|
|
640
|
+
if (productElements.length > approximateIndex && approximateIndex >= 0) {
|
|
641
|
+
var targetElement = productElements[approximateIndex];
|
|
642
|
+
var elementPosition = targetElement.offsetTop;
|
|
643
|
+
// Usar la posición del elemento si es razonable
|
|
644
|
+
if (Math.abs(elementPosition - targetPosition) < 800) {
|
|
645
|
+
return elementPosition;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
return targetPosition; // Usar posición original si no encuentra elemento adecuado
|
|
649
|
+
};
|
|
650
|
+
CollectionEcComponent.prototype.waitForProductRendering = function (targetPosition) {
|
|
651
|
+
var _this = this;
|
|
652
|
+
var _a;
|
|
653
|
+
// Configurar el scroll pendiente para que ngAfterViewChecked lo maneje
|
|
654
|
+
this.pendingScrollPosition = targetPosition;
|
|
655
|
+
this.expectedProductCount = ((_a = this.products) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
656
|
+
// Timeout de seguridad en caso de que ngAfterViewChecked no se ejecute
|
|
657
|
+
setTimeout(function () {
|
|
658
|
+
if (_this.pendingScrollPosition !== null) {
|
|
659
|
+
var targetPos = _this.pendingScrollPosition;
|
|
660
|
+
_this.pendingScrollPosition = null;
|
|
661
|
+
_this.restoreScrollWithRetries(targetPos);
|
|
662
|
+
_this.isRestoringState = false;
|
|
663
|
+
}
|
|
664
|
+
}, 2000);
|
|
665
|
+
};
|
|
666
|
+
var CollectionEcComponent_1;
|
|
667
|
+
// Propiedades para scroll y cache
|
|
668
|
+
CollectionEcComponent.stateCache = new Map();
|
|
669
|
+
CollectionEcComponent.maxCacheSize = 10;
|
|
228
670
|
CollectionEcComponent.ctorParameters = function () { return [
|
|
229
671
|
{ type: ProductsService },
|
|
230
672
|
{ type: ParametersService },
|
|
@@ -234,7 +676,9 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
234
676
|
{ type: AnalyticsService },
|
|
235
677
|
{ type: CartService },
|
|
236
678
|
{ type: Constants },
|
|
237
|
-
{ type: FiltersService }
|
|
679
|
+
{ type: FiltersService },
|
|
680
|
+
{ type: Router },
|
|
681
|
+
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
|
|
238
682
|
]; };
|
|
239
683
|
__decorate([
|
|
240
684
|
Input()
|
|
@@ -248,14 +692,15 @@ var CollectionEcComponent = /** @class */ (function (_super) {
|
|
|
248
692
|
__decorate([
|
|
249
693
|
Input()
|
|
250
694
|
], CollectionEcComponent.prototype, "optionsFilters", void 0);
|
|
251
|
-
CollectionEcComponent = __decorate([
|
|
695
|
+
CollectionEcComponent = CollectionEcComponent_1 = __decorate([
|
|
252
696
|
Component({
|
|
253
697
|
selector: 'app-collection-ec',
|
|
254
698
|
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>",
|
|
255
699
|
styles: [".h1-custom{color:#00f}"]
|
|
256
|
-
})
|
|
700
|
+
}),
|
|
701
|
+
__param(10, Inject(PLATFORM_ID))
|
|
257
702
|
], CollectionEcComponent);
|
|
258
703
|
return CollectionEcComponent;
|
|
259
704
|
}(ComponentHelper));
|
|
260
705
|
export { CollectionEcComponent };
|
|
261
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxpR0FBaUc7QUFDakcsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBUTNFO0lBQTJDLHlDQUFlO0lBc0J0RCwrQkFBbUIsZUFBZ0MsRUFDckMsU0FBNEIsRUFDNUIsV0FBMkIsRUFDM0IsY0FBOEIsRUFDakMsV0FBd0IsRUFDdkIsZ0JBQWtDLEVBQ25DLFdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2pCLGNBQThCO1FBUnpDLFlBU0ksaUJBQU8sU0FNVjtRQWZrQixxQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDckMsZUFBUyxHQUFULFNBQVMsQ0FBbUI7UUFDNUIsaUJBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzNCLG9CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNqQyxpQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN2QixzQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ25DLGlCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsb0JBQWMsR0FBZCxjQUFjLENBQWdCO1FBNUJsQyxhQUFPLEdBQWEsRUFBRSxDQUFDO1FBR3RCLG1CQUFhLEdBQWlCLEVBQUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxDQUFDO1FBRzVDLGNBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGdCQUFVLEdBQWEsRUFBRSxDQUFBO1FBQ3pCLGtCQUFZLEdBQUcsSUFBSSxDQUFDO1FBT2xCLCtCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMzQyxvQkFBYyxHQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBcUZoRDs7Ozs7O1dBTUc7UUFDSCxrQkFBWSxHQUFHLFVBQUMsQ0FBSyxFQUFFLENBQUssRUFBRSxJQUFpQjtZQUFqQixxQkFBQSxFQUFBLFlBQWlCO1lBQzNDLEtBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUUxRixJQUFHLFVBQVUsSUFBSSxVQUFVLEVBQUU7Z0JBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFakMsUUFBTyxJQUFJLEVBQUM7b0JBQ1IsS0FBSyxNQUFNO3dCQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUFDLE1BQUs7b0JBQ25ELEtBQUssS0FBSzt3QkFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFBQyxNQUFLO29CQUNsRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtpQkFDcEI7YUFDSjtpQkFBSTtnQkFDRCxPQUFPLENBQUMsQ0FBQTthQUNYO1FBQ0wsQ0FBQyxDQUFBO1FBRUQ7O1dBRUc7UUFDSCx3QkFBa0IsR0FBRzs7WUFFakIsVUFBSSxLQUFJLENBQUMsWUFBWSwwQ0FBRSxLQUFLLEVBQUU7Z0JBQzFCLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQTlDLENBQThDLENBQUMsQ0FBQTtnQkFDNUYsS0FBSSxDQUFDLE9BQU8sR0FBRSxLQUFLLENBQUE7YUFDdEI7UUFDTCxDQUFDLENBQUE7UUFFRCx3QkFBa0IsR0FBRyxVQUFDLE9BQWlCLEVBQUUsS0FBbUI7WUFDeEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQSxJQUFJO2dCQUNkLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNLElBQUksT0FBQSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFyQixDQUFxQixDQUFDLENBQUM7Z0JBQ2xFLElBQUksYUFBYTtvQkFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUM5QyxPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQTtRQVVELGlCQUFXLEdBQUcsY0FBTSxPQUFBLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBeEIsQ0FBd0IsQ0FBQztRQUM3QyxlQUFTLEdBQUcsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQWhDLENBQWdDLENBQUM7UUFDbkQsaUJBQVcsR0FBRyxjQUFNLE9BQUEsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQXBCLENBQW9CLENBQUM7UUFHekMsa0JBQVksR0FBRyxVQUFDLENBQUM7WUFDYixJQUFJLENBQUMsS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUE7UUFFRCwyQkFBcUIsR0FBRyxVQUFDLFFBQWU7WUFBZix5QkFBQSxFQUFBLGVBQWU7O1lBQ3BDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLENBQUMsUUFBUSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBYixDQUFhLENBQUMsRUFBckQsQ0FBcUQsQ0FBQyxDQUFBO1lBQzlGLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLGlCQUFpQixFQUF0QixDQUFzQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsSUFBSSxDQUFDLGlCQUFpQixFQUF0QixDQUFzQixDQUFFLENBQUE7WUFDekYsT0FBQSxLQUFLLDBDQUFFLE1BQU0sS0FBSSxLQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6RCxDQUFDLENBQUE7UUFFRCwwQkFBb0IsR0FBRztZQUNuQixPQUFPLEtBQUksQ0FBQyxNQUFNLENBQUMsa0NBQWtDLEVBQUUsQ0FBQTtRQUMzRCxDQUFDLENBQUE7UUFwSkcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQW5CLENBQW1CLENBQUMsQ0FBQTtRQUNqRSxLQUFJLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNyRCxLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQzFELEtBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBRSxVQUFBLEdBQUcsSUFBSSxPQUFBLEtBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUF2QixDQUF1QixDQUFDLENBQUE7UUFDOUUsS0FBSSxDQUFDLGFBQWEsRUFBRSxDQUFBOztJQUN4QixDQUFDO0lBRUQsd0NBQVEsR0FBUjtRQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUNmLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCx1REFBdUIsR0FBdkI7UUFBQSxpQkEwREM7UUF6REcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFDLEVBQTRCO2dCQUE1QixrQkFBNEIsRUFBM0IsY0FBTSxFQUFFLGFBQUssRUFBRSxtQkFBVztZQUNwSSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLElBQUksUUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbkIsS0FBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3JDLEtBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN4STtxQkFDSTtvQkFDRCxLQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFJLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO29CQUNySixRQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNkLEtBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixLQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsSUFBSTtvQkFBRSxLQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUFFO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUc7Z0JBQUEsQ0FBQztnQkFDdEQsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ3ZELFVBQUEsR0FBRzs7b0JBQ0MsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7d0JBQ2pCLEtBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO3dCQUNuQixLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7cUJBQ3JEO3lCQUFNO3dCQUNILElBQUksS0FBSSxDQUFDLHlCQUF5QixFQUFFOzRCQUNoQyxJQUFJLFFBQU0sRUFBRTtnQ0FDUixLQUFJLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUMsNEJBQTRCLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFFLENBQUM7Z0NBQ3JHLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO2dDQUN6QixRQUFNLEdBQUcsS0FBSyxDQUFDOzZCQUNsQjtpQ0FDSTtnQ0FDRCxHQUFHLEdBQUcsS0FBSSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLEVBQUUsS0FBSSxDQUFDLG9CQUFvQixFQUFFLENBQUUsQ0FBQztnQ0FDM0YsQ0FBQSxLQUFBLEtBQUksQ0FBQyxRQUFRLENBQUEsQ0FBQyxJQUFJLG9CQUFJLEdBQUcsR0FBQztnQ0FDMUIsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7NkJBQzdCOzRCQUFBLENBQUM7eUJBQ0w7NkJBQU07NEJBQ0gsSUFBSSxRQUFNLEVBQUU7Z0NBQ1IsS0FBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7Z0NBQ3BCLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dDQUMxQixRQUFNLEdBQUcsS0FBSyxDQUFDOzZCQUNsQjtpQ0FDSTtnQ0FDRCxDQUFBLEtBQUEsS0FBSSxDQUFDLFFBQVEsQ0FBQSxDQUFDLElBQUksb0JBQUksR0FBRyxHQUFFO2dDQUMzQixLQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs2QkFFN0I7eUJBRUo7cUJBQ0o7b0JBQ0QsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ2pJLENBQUMsQ0FBQyxDQUFDO2dCQUNQLEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFBLEdBQUc7b0JBQ3ZDLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbEUsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3hFLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsS0FBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQW5CLENBQW1CLENBQUMsQ0FBQztnQkFDdEUsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDeEI7UUFDTCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFpREQsd0NBQVEsR0FBUjtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN0RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNMLENBQUM7O2dCQXhJbUMsZUFBZTtnQkFDMUIsaUJBQWlCO2dCQUNmLGNBQWM7Z0JBQ1gsY0FBYztnQkFDcEIsV0FBVztnQkFDTCxnQkFBZ0I7Z0JBQ3RCLFdBQVc7Z0JBQ2hCLFNBQVM7Z0JBQ0QsY0FBYzs7SUFiaEM7UUFBUixLQUFLLEVBQUU7dURBQU07SUFDTDtRQUFSLEtBQUssRUFBRTt3REFBTztJQUNOO1FBQVIsS0FBSyxFQUFFOzRFQUE0QztJQUMzQztRQUFSLEtBQUssRUFBRTtpRUFBd0M7SUFwQnZDLHFCQUFxQjtRQUxqQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsbUJBQW1CO1lBQzdCLG1UQUE2Qzs7U0FFaEQsQ0FBQztPQUNXLHFCQUFxQixDQXNMakM7SUFBRCw0QkFBQztDQUFBLEFBdExELENBQTJDLGVBQWUsR0FzTHpEO1NBdExZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXJFbGVtZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG4vLyBpbXBvcnQgeyBDb25zdGFudHMsIEZpbHRlciwgT3B0aW9uc1NlcnZpY2UsIFByb2R1Y3QsIFByb2R1Y3RzU2VydmljZSB9IGZyb20gJ25nLWVhc3ljb21tZXJjZSc7XHJcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xyXG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi8uLi9jbGFzc2VzL2ZpbHRlcnMvRmlsdGVyJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29yZS5jb25zdHMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0RmlsdGVyLCBGaWx0ZXJDb25maWcsIEZpbHRlclR5cGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ZpbHRlcic7XHJcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XHJcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xyXG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYW5hbHl0aWNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRmlsdGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maWx0ZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvZHVjdHMvcHJvZHVjdHMuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1jb2xsZWN0aW9uLWVjJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xsZWN0aW9uLWVjLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbGxlY3Rpb24tZWMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVyczogRmlsdGVyW10gPSBbXTtcclxuICAgIHB1YmxpYyBmaWx0ZXJzX3RvcDogRmlsdGVyW107XHJcbiAgICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJzOiBEZWZhdWx0RmlsdGVyW107XHJcbiAgICBwcml2YXRlIGZpbHRlcnNDb25maWc6IEZpbHRlckNvbmZpZyA9IHtmaWx0ZXJzOltdfTtcclxuICAgIC8vIHB1YmxpYyBvcHRpb25zRmlsdGVyczogWydhbGwnXTtcclxuICAgIHB1YmxpYyBwcm9kdWN0czogUHJvZHVjdFtdO1xyXG4gICAgcHVibGljIGZpbmlzaGVkID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc3VzY3JpcGNpb246IFN1YnNjcmlwdGlvbjtcclxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBicmVhZGNydW1iOiBzdHJpbmdbXSA9IFtdXHJcbiAgICBwdWJsaWMgaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBwYXJhbXM6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgZmlsdGVySW5WaWV3OkZpbHRlckVsZW1lbnQ7XHJcblxyXG4gICAgQElucHV0KCkgdHlwZTtcclxuICAgIEBJbnB1dCgpIHZhbHVlO1xyXG4gICAgQElucHV0KCkgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgb3B0aW9uc0ZpbHRlcnM6IEZpbHRlclR5cGVbXSA9IFsnYWxsJ107XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBwYXJhbXNTcnY6IFBhcmFtZXRlcnNTZXJ2aWNlLFxyXG4gICAgICAgIHByb3RlY3RlZCBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJvdGVjdGVkIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcclxuICAgICAgICBwdWJsaWMgZmlsdGVyc1NlcnZpY2U6IEZpbHRlcnNTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnBhcmFtc1Nydi5wYXJhbWV0ZXJzLnN1YnNjcmliZShwYXJhbSA9PiB0aGlzLnBhcmFtcyA9IHBhcmFtKVxyXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlcnMgPSB0aGlzLmNvbnN0cy5nZXREZWZhdWx0RmlsdGVycygpXHJcbiAgICAgICAgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMgPSB0aGlzLmNvbnN0cy5nZXRGaWx0ZXJDb25maWcoKVxyXG4gICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbHRlcnNJblZpZXckLnN1YnNjcmliZSggcmVzID0+IHRoaXMuZmlsdGVySW5WaWV3ID0gcmVzKVxyXG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbCgwLCAwKTtcclxuICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXHJcbiAgICAgICAgdGhpcy5nZXRQcm9kdWN0c0FuZFN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0UHJvZHVjdHNBbmRTdWJzY3JpYmUoKTogdm9pZCB7XHJcbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5hY3RpdmVSb3V0ZS5wYXJhbXMsIHRoaXMub3B0aW9uc1NlcnZpY2UucmVhZHksIHRoaXMuYWN0aXZlUm91dGUucXVlcnlQYXJhbXNdKS5zdWJzY3JpYmUoKFtwYXJhbXMsIHJlYWR5LCBxdWVyeVBhcmFtc10pID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlYWR5LnJlYWR5QWxsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2FtYmlvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1sndHlwZSddIHx8ICFwYXJhbXNbJ3ZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IGxhdGVzdDogdHJ1ZSwgbGltaXQ6IDEwIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgdGhpcy5kZWZhdWx0RmlsdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c0ZvckZpbHRlcih7IHR5cGU6IHBhcmFtcy50eXBlLCB2YWx1ZTogcGFyYW1zLnZhbHVlIH0sIHRoaXMub3B0aW9uc0ZpbHRlcnMsIHF1ZXJ5UGFyYW1zLnNlYXJjaCwgIHRoaXMuZGVmYXVsdEZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gcGFyYW1zWyd0eXBlJ107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmFtc1sndmFsdWUnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRyeSB7IHRoaXMuc3VzY3JpcGNpb24udW5zdWJzY3JpYmUoKTsgfSBjYXRjaCAoZSkgeyB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdXNjcmlwY2lvbiA9IHRoaXMucHJvZHVjdHNTZXJ2aWNlLnByb2R1Y3RzJC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoZWQgPSB0aGlzLnByb2R1Y3RzU2VydmljZS5pc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWJpbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChyZXMsIHRoaXMuZ2V0T2JqZWN0V2l0aFZhcmlhbnQoKSApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4ucmVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW1iaW8pIHsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSByZXM7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0luVmlldygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1iaW8gPSBmYWxzZTsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzLnB1c2goLi4ucmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnNJblZpZXcoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtX2xpc3QnLCB7IHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLCBpdGVtX2xpc3RfbmFtZTogJ0NvbGxlY3Rpb24nLCBpdGVtX2xpc3RfaWQ6IDAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmZpbHRlcnMkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYiA9IHRoaXMub3B0aW9uc1NlcnZpY2UuZ2V0QnJlYWRjcnVtYkJ5RmlsdGVycyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZ2V0U3BlY2lmaWNGaWx0ZXJzKHJlcywgdGhpcy5maWx0ZXJzQ29uZmlnLmZpbHRlcnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyc190b3AgPSB0aGlzLmdldFNwZWNpZmljRmlsdGVycyhyZXMsIFsnc29ydCddKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZmluaXNoZWQoKS5zdWJzY3JpYmUocmVzID0+IHRoaXMuZmluaXNoZWQgPSByZXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlYWxpemEgdW4gc29ydCBkZSBwcm9kdWN0b3MgcG9yIGVsIGNhbXBvIGRhdGVDcmVhdGUgZGUgbGEgdmFyaWFudGVcclxuICAgICAqIEBwYXJhbSBhIFByb2R1Y3RvIGFcclxuICAgICAqIEBwYXJhbSBiIFByb2R1Y3RvIGJcclxuICAgICAqIEBwYXJhbSB0eXBlIHNpIGVzIGBhc2NgIHwgYGRlc2NgXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAqKjEqKiBwYXJhIGB0cnVlYCB8ICoqMCoqIHBhcmEgYGZhbHNlYFxyXG4gICAgICovXHJcbiAgICBzb3J0UHJvZHVjdHMgPSAoYTphbnksIGI6YW55LCB0eXBlOnN0cmluZz0nYXNjJykgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgbGV0IHRvQ29tcGFyZUEgPSBhLnZhcmlhbnRzICYmIGEudmFyaWFudHMubGVuZ3RoID4gMCA/IGEudmFyaWFudHNbMF1bJ2RhdGVDcmVhdGUnXSA6IG51bGw7XHJcbiAgICAgICAgbGV0IHRvQ29tcGFyZUIgPSBiLnZhcmlhbnRzICYmIGIudmFyaWFudHMubGVuZ3RoID4gMCA/IGIudmFyaWFudHNbMF1bJ2RhdGVDcmVhdGUnXSA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmKHRvQ29tcGFyZUEgJiYgdG9Db21wYXJlQikge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUEgPSBuZXcgRGF0ZSh0b0NvbXBhcmVBKTtcclxuICAgICAgICAgICAgbGV0IGRhdGVCID0gbmV3IERhdGUodG9Db21wYXJlQik7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2godHlwZSl7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkZXNjJzogcmV0dXJuIChkYXRlQSA+PSBkYXRlQikgPyAxIDogMDsgYnJlYWtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2FzYyc6IHJldHVybiAoZGF0ZUEgPD0gZGF0ZUIpID8gMSA6IDA7IGJyZWFrXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAwXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGFwbGljYSBlbCBmaWx0cm8gZW4gbGEgdmlzdGEuIFxyXG4gICAgICovXHJcbiAgICBhcHBseUZpbHRlcnNJblZpZXcgPSAoKSA9PiB7XHJcbiAgICAgICBcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJJblZpZXc/Lm5vVXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHMgPSB0aGlzLnByb2R1Y3RzLnNvcnQoKGEsIGIpID0+IHRoaXMuc29ydFByb2R1Y3RzKGEsYix0aGlzLmZpbHRlckluVmlldy52YWx1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9ZmFsc2VcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3BlY2lmaWNGaWx0ZXJzID0gKGZpbHRlcnM6IEZpbHRlcltdLCB0eXBlczogRmlsdGVyVHlwZVtdKTogRmlsdGVyW10gPT4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgICB0eXBlcy5mb3JFYWNoKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0X2ZpbHRlciA9IGZpbHRlcnMuZmluZChmaWx0ZXIgPT4gZmlsdGVyLnR5cGUoKSA9PSB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdF9maWx0ZXIpIHJlc3VsdC5wdXNoKHJlc3VsdF9maWx0ZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb25TY3JvbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzV2FpdGluZygpICYmICF0aGlzLnByb2R1Y3RzU2VydmljZS5nZXROZXh0KCkpIHtcclxuICAgICAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcmVQcm9kdWN0cyA9ICgpID0+IHRoaXMucHJvZHVjdHMubGVuZ3RoID4gMDtcclxuICAgIGlzV2FpdGluZyA9ICgpID0+IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmlzV2FpdGluZygpO1xyXG4gICAgc2V0RmluaXNoZWQgPSAoKSA9PiB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgY2hhbmdlRmlsdGVyID0gKGUpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb2xsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQWxsUHJvZHVjdG9zVG9DYXJ0ID0gKHByb2R1Y3RzID0gbnVsbCkgPT4ge1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdO1xyXG4gICAgICAgIChwcm9kdWN0cyB8fCB0aGlzLnByb2R1Y3RzKS5tYXAocHJvZCA9PiBwcm9kLnByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudC5tYXAocCA9PiBpdGVtcy5wdXNoKHApKSlcclxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihwcm9kID0+IHByb2QucHJvZHVjdFRvQ2FydEl0ZW0pLm1hcChwcm9kID0+IHByb2QucHJvZHVjdFRvQ2FydEl0ZW0gKVxyXG4gICAgICAgIGl0ZW1zPy5sZW5ndGggJiYgdGhpcy5jYXJ0U2VydmljZS5hZGRBbGxUb0NhcnQoaXRlbXMpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T2JqZWN0V2l0aFZhcmlhbnQgPSAoKTogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RzLmdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQoKVxyXG4gICAgfSBcclxuXHJcbn1cclxuIl19
|
|
706
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1lYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvZWMtY29tcG9uZW50L2NvbGxlY3Rpb24tZWMvY29sbGVjdGlvbi1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxXQUFXLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQW9CM0U7SUFBMkMseUNBQWU7SUF5Q3RELCtCQUFtQixlQUFnQyxFQUNyQyxTQUE0QixFQUM1QixXQUEy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IE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIEluamVjdCwgUExBVEZPUk1fSUQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRmlsdGVyRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZmlsdGVyJztcclxuLy8gaW1wb3J0IHsgQ29uc3RhbnRzLCBGaWx0ZXIsIE9wdGlvbnNTZXJ2aWNlLCBQcm9kdWN0LCBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICduZy1lYXN5Y29tbWVyY2UnO1xyXG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9maWx0ZXJzL0ZpbHRlcic7XHJcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2NvcmUuY29uc3RzJztcclxuaW1wb3J0IHsgRGVmYXVsdEZpbHRlciwgRmlsdGVyQ29uZmlnLCBGaWx0ZXJUeXBlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wYXJhbXNJbnRlcmZhY2VzL3BhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpbHRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmlsdGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vcHRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb2R1Y3RzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2R1Y3RzL3Byb2R1Y3RzLnNlcnZpY2UnO1xyXG5cclxuLy8gSW50ZXJmYWNlIHBhcmEgZWwgZXN0YWRvIGRlbCBjYWNoZVxyXG5pbnRlcmZhY2UgQ29sbGVjdGlvblN0YXRlIHtcclxuICBwcm9kdWN0czogYW55W107XHJcbiAgc2Nyb2xsUG9zaXRpb246IG51bWJlcjtcclxuICBmaW5pc2hlZDogYm9vbGVhbjtcclxuICBsb2FkaW5nOiBib29sZWFuO1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBhbGxDYWNoZWRQcm9kdWN0cz86IGFueVtdO1xyXG4gIGZpbHRlcnM/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==
|