ng-easycommerce-v18 0.6.26 → 0.6.27

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 CHANGED
@@ -1,3 +1,12 @@
1
+ # Version 0.6.27
2
+ - Cantidades: se centraliza en el core la logica de multiples, minimo, maximo y stock para evitar que cada frontend replique validaciones de negocio.
3
+ - Cantidades: `QuantityRulesService` expone helpers comunes para calcular `step`, `min`, limites y alineacion al multiplo correcto segun producto, variante y carrito actual.
4
+ - Product list: el input de cantidad deja de validar el multiplo mientras el usuario escribe y pasa a normalizarse al perder el foco, permitiendo ingresar valores intermedios como `30` o `420`.
5
+ - Product list: los botones `+` y `-` usan el paso configurado por el core y mantienen sincronizado el valor visible con el valor real aplicado.
6
+ - Product detail: se restaura el flujo completo de edicion con input libre, normalizacion al `blur` y actualizacion correcta al usar `+`, `-` o agregar al carrito.
7
+ - Cart y sidebar: se ajusta el selector de cantidad para respetar la misma logica de core y evitar estados desincronizados al volver a interactuar desde carrito, sidebar o detalle.
8
+ - Bulk add: se conserva el comportamiento de inicializar en `0` cuando el frontend activa agregado masivo, sin romper la validacion final de cantidades ni la limpieza posterior al agregar.
9
+ - UI de cantidad: se unifica el patron visual recomendado para quitar los spinners nativos del input y dejar a los botones como unico control de incremento/decremento.
1
10
  # Version 0.6.26
2
11
  - Carrito: se agrega `cart_owner` para identificar el carrito activo por sesión y evitar reutilizar `cart_token` entre cuentas distintas.
3
12
  - Carrito: al arrancar la app se hidrata el estado persistido y se decide si corresponde recuperar el carrito anónimo o el carrito del usuario autenticado.
@@ -1,6 +1,6 @@
1
1
  import { Component, inject, Input } from '@angular/core';
2
2
  import { CoreConstantsService } from '../../../constants';
3
- import { CartService, ChannelService, ToastService, ParametersService, PriceVisibilityService } from '../../../ec-services';
3
+ import { CartService, ChannelService, ToastService, ParametersService, PriceVisibilityService, QuantityRulesService } from '../../../ec-services';
4
4
  import { TitleCasePipe } from '@angular/common';
5
5
  import { EcCurrencySymbolPipe } from '../../../ec-pipe';
6
6
  import { RouterLink } from '@angular/router';
@@ -15,13 +15,31 @@ export class CartItemEcComponent {
15
15
  _constants = inject(CoreConstantsService);
16
16
  _channelService = inject(ChannelService);
17
17
  parametersService = inject(ParametersService);
18
+ quantityRules = inject(QuantityRulesService);
18
19
  priceVisibility = inject(PriceVisibilityService);
19
20
  mediaUrl = this._constants.mediaUrl();
20
- quantity = 0;
21
+ _quantity = 0;
21
22
  variantsToShow = ['TALLA', 'COLOR'];
22
23
  updateStock = false;
23
24
  isQuantityUpdating = false;
24
25
  enableFieldNotesInArticleFile = false;
26
+ get quantity() {
27
+ const currentQuantity = Number(this.item?.quantity ?? this._quantity ?? 0);
28
+ return Number.isFinite(currentQuantity) ? currentQuantity : 0;
29
+ }
30
+ set quantity(value) {
31
+ const normalized = Number(value ?? 0);
32
+ this._quantity = Number.isFinite(normalized) ? normalized : 0;
33
+ if (this.item) {
34
+ this.item.quantity = this._quantity;
35
+ }
36
+ }
37
+ get quantityStep() {
38
+ return this.quantityRules.getQuantityStep(this.item?.product);
39
+ }
40
+ get quantityMin() {
41
+ return this.quantityRules.getQuantityMin(this.item?.product);
42
+ }
25
43
  ngOnInit() {
26
44
  this.quantity = this.item.quantity;
27
45
  this._channelService.channel$.subscribe(channel => {
@@ -259,23 +277,8 @@ export class CartItemEcComponent {
259
277
  return this.alignToMultiple(next, limits.minimumItemsQuantity, limits.maxAllowed, limits.multipleQuantity, showToast);
260
278
  }
261
279
  alignToMultiple(candidate, minAllowed, maxAllowed, multipleQuantity, showToast) {
262
- if (!multipleQuantity || multipleQuantity <= 1) {
263
- return candidate;
264
- }
265
- const remainder = candidate % multipleQuantity;
266
- if (remainder === 0) {
267
- return candidate;
268
- }
269
- const down = candidate - remainder;
270
- const up = candidate + (multipleQuantity - remainder);
271
- let next = candidate;
272
- if (down >= minAllowed) {
273
- next = down;
274
- }
275
- else if (up <= maxAllowed) {
276
- next = up;
277
- }
278
- if (showToast) {
280
+ const next = this.quantityRules.alignToMultiple(candidate, minAllowed, maxAllowed, multipleQuantity);
281
+ if (showToast && next !== candidate && multipleQuantity > 1) {
279
282
  this._toastService.show('multiple-quantity-required', {
280
283
  multiple: multipleQuantity,
281
284
  current: next
@@ -284,22 +287,11 @@ export class CartItemEcComponent {
284
287
  return next;
285
288
  }
286
289
  getQuantityLimits() {
287
- const variant = this.item?.product?.variants?.[0];
288
- if (!variant) {
290
+ const product = this.item?.product;
291
+ if (!product) {
289
292
  return null;
290
293
  }
291
- const stock = Number(variant?.stock ?? this.item?.product?.stock ?? 0);
292
- const maximumItemsQuantity = Number(this.item?.product?.maximumItemsQuantity ?? variant?.maximumItemsQuantity ?? 999999);
293
- const minimumItemsQuantity = Math.max(Number(this.item?.product?.minimumItemsQuantity ?? variant?.minimumItemsQuantity ?? 1), 1);
294
- const multipleQuantity = Number(this.item?.product?.multipleQuantity ?? variant?.multipleQuantity ?? 1);
295
- const maxAllowed = Math.min(stock, maximumItemsQuantity);
296
- return {
297
- stock,
298
- maximumItemsQuantity,
299
- minimumItemsQuantity,
300
- multipleQuantity,
301
- maxAllowed,
302
- };
294
+ return this.quantityRules.getQuantityLimits(product);
303
295
  }
304
296
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CartItemEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
305
297
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CartItemEcComponent, isStandalone: true, selector: "app-cart-item-ec", inputs: { item: "item", inSidebar: "inSidebar" }, ngImport: i0, template: "@if(!inSidebar){\n<p>cart-item-ec works!</p>\n}@else{\n\n<div class=\"row\">\n <div class=\"col-3\">\n @let product= item.product;\n @if(item.variant_id && product.variants.length>0){\n <img [src]=\"mediaUrl + product.variants[0].images[0]\" alt=\"\" class=\"img-fluid\">\n }@else{\n <img [src]=\"mediaUrl + product.picturesdefault[0]\" alt=\"\" class=\"img-fluid\">\n }\n </div>\n <div class=\"col-7\">\n <div class=\"info d-flex flex-column align-items-start\">\n @if (item.product.special_mark?.length > 0 || (item.product.saleprice && item.product.price > item.product.saleprice)) {\n <div class=\"marcas\">\n <img [src]=\"mediaUrl + (item.product.special_mark?.[0]?.images[0] || '')\" alt=\"\">\n\n @let discountText = createDiscountMessage(item.product.saleprice, item.product.price);\n @if (discountText) {\n <div class=\"tag-dsc\">\n {{ discountText }}\n </div>\n }\n </div>\n }\n <a class=\"title text-dark text-decoration-none m-0 p-0 h6 mb-0\"\n [routerLink]=\"['/product', item.variant_id]\">{{\n item.product.name | titlecase\n }}</a>\n <div class=\"qty1\">\n <span>{{ item.product.id}}</span>\n </div>\n <div class=\"price h6 fw-bold mb-0 pb-0\">{{ item.product.price | ecCurrencySymbol\n }}</div>\n @if(enableFieldNotesInArticleFile && item?.comments){\n <p class=\"comment-truncated fst-italic small text-muted mt-1 mb-0\">\"{{ item.comments }}\"</p>\n }\n @if(getVariants(item); as options){\n <div class=\"d-flex align-items-center p-0\">\n @for(option of options; track $index){\n <span class=\"me-1\"> {{option.name | titlecase}}:</span>\n @if(option.name == 'COLOR'){\n <div class=\"p-2 rounded\" [style.background]=\"'#' + option.value\"></div>\n }@else{\n <b>{{option.value}}</b>\n }\n }\n </div>\n }\n <div class=\"campoCantidad mt-2\">\n <div class=\"numero\">\n <button (click)=\"less(item.product.variants[0]?.stock)\" class=\"btn btn-outline-secondary\"\n type=\"button\" [attr.id]=\"'qty-minus-' + (item?.variant_id || item?.product?.id)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </button>\n <input type=\"text\" class=\"form-control text-center\" placeholder=\"\"\n aria-label=\"Cantidad del producto\"\n [attr.aria-describedby]=\"'qty-minus-' + (item?.variant_id || item?.product?.id)\"\n [value]=\"item.quantity\" min=\"1\" step=\"1\" [(ngModel)]=\"quantity\"\n (change)=\"updateQuantity(item.product.variants[0]?.stock)\">\n <button (click)=\"plus(item.product.variants[0]?.stock)\" class=\"btn btn-outline-secondary\"\n type=\"button\" [attr.id]=\"'qty-plus-' + (item?.variant_id || item?.product?.id)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"col-2\">\n <a (click)=\"deleteCartItem()\" class=\"btn botBorrar\"><i class=\"fa fa-trash\" aria-hidden=\"true\"></i></a>\n </div>\n</div>\n\n\n\n\n\n}\n", styles: [".comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}\n"], dependencies: [{ kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: EcCurrencySymbolPipe, name: "ecCurrencySymbol" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
@@ -315,4 +307,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
315
307
  }], inSidebar: [{
316
308
  type: Input
317
309
  }] } });
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1jb21wb25lbnRzL2NhcnQtZWMvY2FydC1pdGVtLWVjL2NhcnQtaXRlbS1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9jYXJ0LWVjL2NhcnQtaXRlbS1lYy9jYXJ0LWl0ZW0tZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFZN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUc1QixJQUFJLENBQU07SUFFSixTQUFTLEdBQVksS0FBSyxDQUFDO0lBRTVCLFlBQVksR0FBZ0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELGFBQWEsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELFVBQVUsR0FBeUIsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENB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LGNBQ2hCLElBQUksV0FDUCxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDOzhCQU9wRSxJQUFJO3NCQUZOLEtBQUs7dUJBQUM7d0JBQ04sUUFBUSxFQUFFLElBQUk7cUJBQ2Q7Z0JBRVEsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSwgQ2hhbm5lbFNlcnZpY2UsIFRvYXN0U2VydmljZSwgUGFyYW1ldGVyc1NlcnZpY2UsIFByaWNlVmlzaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lYy1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBUaXRsZUNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVjQ3VycmVuY3lTeW1ib2xQaXBlIH0gZnJvbSAnLi4vLi4vLi4vZWMtcGlwZSc7XG5pbXBvcnQgeyBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnYXBwLWNhcnQtaXRlbS1lYycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGltcG9ydHM6IFtUaXRsZUNhc2VQaXBlLCBFY0N1cnJlbmN5U3ltYm9sUGlwZSwgUm91dGVyTGluaywgRm9ybXNNb2R1bGVdLFxuXHR0ZW1wbGF0ZVVybDogJy4vY2FydC1pdGVtLWVjLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmw6ICcuL2NhcnQtaXRlbS1lYy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ2FydEl0ZW1FY0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cdEBJbnB1dCh7XG5cdFx0cmVxdWlyZWQ6IHRydWVcblx0fSkgaXRlbTogYW55O1xuXG5cdEBJbnB1dCgpIGluU2lkZWJhcjogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX2NhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSA9IGluamVjdChDYXJ0U2VydmljZSk7XG5cdHByaXZhdGUgX3RvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG5cdHByaXZhdGUgX2NvbnN0YW50czogQ29yZUNvbnN0YW50c1NlcnZpY2UgPSBpbmplY3QoQ29yZUNvbnN0YW50c1NlcnZpY2UpO1xuXHRwcml2YXRlIF9jaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UgPSBpbmplY3QoQ2hhbm5lbFNlcnZpY2UpO1xuXHRwcml2YXRlIHBhcmFtZXRlcnNTZXJ2aWNlID0gaW5qZWN0KFBhcmFtZXRlcnNTZXJ2aWNlKVxuXHRwdWJsaWMgcmVhZG9ubHkgcHJpY2VWaXNpYmlsaXR5ID0gaW5qZWN0KFByaWNlVmlzaWJpbGl0eVNlcnZpY2UpO1xuXG5cdHB1YmxpYyBtZWRpYVVybCA9IHRoaXMuX2NvbnN0YW50cy5tZWRpYVVybCgpO1xuXHRwdWJsaWMgcXVhbnRpdHkgPSAwO1xuXHRwdWJsaWMgdmFyaWFudHNUb1Nob3c6IHN0cmluZ1tdID0gWydUQUxMQScsICdDT0xPUiddO1xuXHRwdWJsaWMgdXBkYXRlU3RvY2s6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIGlzUXVhbnRpdHlVcGRhdGluZyA9IGZhbHNlO1xuXHRwdWJsaWMgZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGUgPSBmYWxzZTtcblxuXHRuZ09uSW5pdCgpIHtcblx0XHR0aGlzLnF1YW50aXR5ID0gdGhpcy5pdGVtLnF1YW50aXR5XG5cdFx0dGhpcy5fY2hhbm5lbFNlcnZpY2UuY2hhbm5lbCQuc3Vic2NyaWJlKGNoYW5uZWwgPT4ge1xuXHRcdFx0dGhpcy5lbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSA9ICEhY2hhbm5lbD8uZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGU7XG5cdFx0fSk7XG5cdFx0Ly8gY29uc29sZS5sb2codGhpcy5pdGVtLCB0aGlzLm1lZGlhVXJsKTtcblx0fVxuXG5cdHVwZGF0ZVF1YW50aXR5KHN0b2NrOiBudW1iZXIpIHtcblx0XHRjb25zdCBvcmlnaW5hbFF1YW50aXR5ID0gdGhpcy5pdGVtLnF1YW50aXR5OyAvLyBHdWFyZGFyIGNhbnRpZGFkIG9yaWdpbmFsXG5cdFx0Y29uc3QgY2FuZGlkYXRlID0gTnVtYmVyKHRoaXMucXVhbnRpdHkpO1xuXHRcdGNvbnN0IG5leHQgPSB0aGlzLmNsYW1wUXVhbnRpdHkoY2FuZGlkYXRlLCB0cnVlKTtcblxuXHRcdGlmIChuZXh0ID09PSBvcmlnaW5hbFF1YW50aXR5KSB7XG5cdFx0XHR0aGlzLnF1YW50aXR5ID0gb3JpZ2luYWxRdWFudGl0eTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobmV4dCA+IDAgJiYgbmV4dCA8PSBzdG9jaykge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IHRoaXMuX2NhcnRTZXJ2aWNlLnVwZGF0ZUl0ZW1RdWFudGl0eSh0aGlzLml0ZW0sIG5leHQsIHRoaXMuaXRlbT8uY29tbWVudHMgPz8gdW5kZWZpbmVkKTtcblxuXHRcdFx0Ly8gU2kgbGEgdmFsaWRhY2nDs24gZmFsbMOzLCByZXN0YXVyYXIgbGEgY2FudGlkYWQgb3JpZ2luYWxcblx0XHRcdGlmICghc3VjY2Vzcykge1xuXHRcdFx0XHR0aGlzLnF1YW50aXR5ID0gb3JpZ2luYWxRdWFudGl0eTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMucXVhbnRpdHkgPSBuZXh0O1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZXN0YXVyYXIgY2FudGlkYWQgb3JpZ2luYWwgc2kgZXN0w6EgZnVlcmEgZGUgcmFuZ29cblx0XHRcdHRoaXMucXVhbnRpdHkgPSBvcmlnaW5hbFF1YW50aXR5O1xuXHRcdFx0dGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jay1hY3R1YWxseScpO1xuXHRcdH1cblx0fVxuXG5cdHBsdXMoc3RvY2s6IG51bWJlciwgdmFsdWU6IG51bWJlciA9IDEpIHtcblx0XHRpZiAodGhpcy5pc1F1YW50aXR5VXBkYXRpbmcpIHJldHVybjtcblx0XHR0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IHRydWU7XG5cblx0XHRjb25zdCBsaW1pdHMgPSB0aGlzLmdldFF1YW50aXR5TGltaXRzKCk7XG5cdFx0Y29uc3QgZmFsbGJhY2tNdWx0aXBsZSA9IGxpbWl0cz8ubXVsdGlwbGVRdWFudGl0eSA/PyAxO1xuXHRcdGNvbnN0IGluY3JlbWVudCA9ICh2YWx1ZSA9PT0gMSAmJiBmYWxsYmFja011bHRpcGxlID4gMSkgPyBmYWxsYmFja011bHRpcGxlIDogKHZhbHVlICYmIHZhbHVlID4gMCA/IHZhbHVlIDogZmFsbGJhY2tNdWx0aXBsZSk7XG5cdFx0Y29uc3QgY2FuZGlkYXRlID0gTnVtYmVyKHRoaXMucXVhbnRpdHkpICsgaW5jcmVtZW50O1xuXHRcdGNvbnN0IG5ld1F1YW50aXR5ID0gdGhpcy5jbGFtcFF1YW50aXR5KGNhbmRpZGF0ZSwgdHJ1ZSk7XG5cblx0XHRpZiAobmV3UXVhbnRpdHkgPT09IE51bWJlcih0aGlzLnF1YW50aXR5KSkge1xuXHRcdFx0dGhpcy5pc1F1YW50aXR5VXBkYXRpbmcgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBWZXJpZmljYXIgc3RvY2sgQU5URVMgZGUgbGxhbWFyIGFsIHNlcnZpY2lvXG5cdFx0aWYgKG5ld1F1YW50aXR5ID4gc3RvY2spIHtcblx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IGZhbHNlOyB9LCAxMDAwKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzdWNjZXNzID0gdGhpcy5fY2FydFNlcnZpY2UudXBkYXRlSXRlbVF1YW50aXR5KHRoaXMuaXRlbSwgbmV3UXVhbnRpdHksIHRoaXMuaXRlbT8uY29tbWVudHMgPz8gdW5kZWZpbmVkKTtcblxuXHRcdC8vIFNvbG8gYWN0dWFsaXphciBlbCBpbnB1dCBzaSBsYSBvcGVyYWNpw7NuIGZ1ZSBleGl0b3NhXG5cdFx0aWYgKHN1Y2Nlc3MpIHtcblx0XHRcdHRoaXMucXVhbnRpdHkgPSBuZXdRdWFudGl0eTtcblx0XHR9XG5cdFx0Ly8gU2kgc3VjY2VzcyBlcyBmYWxzZSwgTk8gbW9zdHJhciBtZW5zYWplIGFxdcOtIHBvcnF1ZSB5YSBsbyBtb3N0csOzIHZhbGlkYXRlUXVhbnRpdHkoKVxuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7IHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nID0gZmFsc2U7IH0sIDEwMDApO1xuXHR9XG5cblx0bGVzcyhzdG9jazogbnVtYmVyLCB2YWx1ZTogbnVtYmVyID0gMSkge1xuXHRcdGlmICh0aGlzLmlzUXVhbnRpdHlVcGRhdGluZykgcmV0dXJuO1xuXHRcdHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nID0gdHJ1ZTtcblxuXHRcdGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0UXVhbnRpdHlMaW1pdHMoKTtcblx0XHRjb25zdCBmYWxsYmFja011bHRpcGxlID0gbGltaXRzPy5tdWx0aXBsZVF1YW50aXR5ID8/IDE7XG5cdFx0Y29uc3QgZGVjcmVtZW50ID0gKHZhbHVlID09PSAxICYmIGZhbGxiYWNrTXVsdGlwbGUgPiAxKSA/IGZhbGxiYWNrTXVsdGlwbGUgOiAodmFsdWUgJiYgdmFsdWUgPiAwID8gdmFsdWUgOiBmYWxsYmFja011bHRpcGxlKTtcblx0XHRjb25zdCBjYW5kaWRhdGUgPSBOdW1iZXIodGhpcy5xdWFudGl0eSkgLSBkZWNyZW1lbnQ7XG5cdFx0Y29uc3QgbmV3UXVhbnRpdHkgPSB0aGlzLmNsYW1wUXVhbnRpdHkoY2FuZGlkYXRlLCB0cnVlKTtcblxuXHRcdGlmIChuZXdRdWFudGl0eSA9PT0gTnVtYmVyKHRoaXMucXVhbnRpdHkpKSB7XG5cdFx0XHR0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFZlcmlmaWNhciBjYW50aWRhZCBtw61uaW1hIEFOVEVTIGRlIGxsYW1hciBhbCBzZXJ2aWNpb1xuXHRcdGlmIChuZXdRdWFudGl0eSA8PSAwKSB7XG5cdFx0XHQvLyBObyBwZXJtaXRpciBjYW50aWRhZGVzIG1lbm9yZXMgbyBpZ3VhbGVzIGEgMFxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB7IHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nID0gZmFsc2U7IH0sIDEwMDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLl9jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkodGhpcy5pdGVtLCBuZXdRdWFudGl0eSwgdGhpcy5pdGVtPy5jb21tZW50cyA/PyB1bmRlZmluZWQpO1xuXG5cdFx0Ly8gU29sbyBhY3R1YWxpemFyIGVsIGlucHV0IHNpIGxhIG9wZXJhY2nDs24gZnVlIGV4aXRvc2Fcblx0XHRpZiAoc3VjY2Vzcykge1xuXHRcdFx0dGhpcy5xdWFudGl0eSA9IG5ld1F1YW50aXR5O1xuXHRcdH1cblx0XHQvLyBTaSBzdWNjZXNzIGVzIGZhbHNlLCBOTyBtb3N0cmFyIG1lbnNhamUgYXF1w60gcG9ycXVlIHlhIGxvIG1vc3Ryw7MgdmFsaWRhdGVRdWFudGl0eSgpXG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5pc1F1YW50aXR5VXBkYXRpbmcgPSBmYWxzZTsgfSwgMTAwMCk7XG5cdH1cblxuXHRkZWxldGVDYXJ0SXRlbSgpIHtcblx0XHR0aGlzLl9jYXJ0U2VydmljZS5kZWxldGVDYXJ0SXRlbSh0aGlzLml0ZW0pXG5cdH1cblxuXHRnZXRWYXJpYW50cyhwcm9kdWN0OiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IGl0ZW0gPSBwcm9kdWN0Py5wcm9kdWN0O1xuXHRcdGNvbnN0IHNlbGVjdGVkVmFyaWFudCA9IHRoaXMuZmluZFNlbGVjdGVkVmFyaWFudChwcm9kdWN0KTtcblxuXHRcdGlmICghaXRlbSB8fCAhc2VsZWN0ZWRWYXJpYW50Py5vcHRpb25zPy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBvcHRpb25zTWFwOiBhbnlbXSA9IFtdO1xuXG5cdFx0c2VsZWN0ZWRWYXJpYW50Lm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uOiBhbnkpID0+IHtcblx0XHRcdGlmICghb3B0aW9uIHx8IHR5cGVvZiBvcHRpb24gIT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0T2JqZWN0LmtleXMob3B0aW9uKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuc2hvdWxkU2hvd1ZhcmlhbnRPcHRpb24oZW50cnkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IG9wdGlvbltlbnRyeV07XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVkVmFsdWUgPSBpdGVtPy5vcHRpb25zXG5cdFx0XHRcdFx0Py5mbGF0TWFwKChpdGVtT3B0aW9uOiBhbnkpID0+IGl0ZW1PcHRpb24udmFsdWVzIHx8IFtdKVxuXHRcdFx0XHRcdD8uZmluZCgodmFsdWU6IGFueSkgPT4gdmFsdWUuY29kZSA9PSBzZWxlY3RlZFZhbHVlKTtcblxuXHRcdFx0XHRvcHRpb25zTWFwLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IGVudHJ5LFxuXHRcdFx0XHRcdHZhbHVlOiBzZWxlY3RlZFZhbHVlLFxuXHRcdFx0XHRcdGRpc3BsYXlOYW1lOlxuXHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZT8ubmFtZSB8fFxuXHRcdFx0XHRcdFx0cmVzb2x2ZWRWYWx1ZT8uZGVzY3JpcHRpb24gfHxcblx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWU/LmxhYmVsIHx8XG5cdFx0XHRcdFx0XHRzZWxlY3RlZFZhbHVlLFxuXHRcdFx0XHRcdGltYWdlOiByZXNvbHZlZFZhbHVlPy5pbWFnZSxcblx0XHRcdFx0XHRtb2JpbGVJbWFnZTogcmVzb2x2ZWRWYWx1ZT8ubW9iaWxlSW1hZ2UsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb3B0aW9uc01hcDtcblx0fVxuXG5cdHByb2R1Y3REZXRhaWxMaW5rKGl0ZW06IGFueSk6IGFueVtdIHtcblx0XHRjb25zdCBwcm9kdWN0ID0gaXRlbT8ucHJvZHVjdDtcblx0XHRpZiAodGhpcy5fY29uc3RhbnRzLmdldFVzZVByb2R1Y3RTbHVnUm91dGUoKSAmJiBwcm9kdWN0Py5zbHVnKSB7XG5cdFx0XHRyZXR1cm4gWycvcHJvZHVjdCcsIFN0cmluZyhwcm9kdWN0LnNsdWcpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWycvcHJvZHVjdCcsIHByb2R1Y3Q/LmlkXTtcblx0fVxuXG5cdHByb2R1Y3REZXRhaWxRdWVyeVBhcmFtcyhpdGVtOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCB7XG5cdFx0cmV0dXJuIGl0ZW0/LnZhcmlhbnRfaWQgPyB7IHZhcmlhbnQ6IFN0cmluZyhpdGVtLnZhcmlhbnRfaWQpIH0gOiBudWxsO1xuXHR9XG5cblx0Z2V0T3B0aW9uRGlzcGxheShvcHRpb246IGFueSkge1xuXHRcdGlmICghb3B0aW9uKSB7XG5cdFx0XHRyZXR1cm4geyBpc0NvbG9yOiBmYWxzZSwgdmFsdWU6ICcnLCBsYWJlbDogJycgfTtcblx0XHR9XG5cblx0XHRjb25zdCBpc0NvbG9yID0gb3B0aW9uLm5hbWU/LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSA9PT0gJ0NPTE9SJztcblxuXHRcdHJldHVybiB7XG5cdFx0XHRpc0NvbG9yLFxuXHRcdFx0dmFsdWU6IG9wdGlvbi5kaXNwbGF5TmFtZSB8fCBvcHRpb24udmFsdWUgfHwgJycsXG5cdFx0XHRsYWJlbDogb3B0aW9uLnZhbHVlIHx8ICcnLFxuXHRcdH07XG5cdH1cblxuXHRnZXRWYXJpYW50TGFiZWwoaXRlbTogYW55KTogc3RyaW5nIHtcblx0XHRjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB0aGlzLmZpbmRTZWxlY3RlZFZhcmlhbnQoaXRlbSk7XG5cblx0XHRpZiAoIXNlbGVjdGVkVmFyaWFudCkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdGlmIChzZWxlY3RlZFZhcmlhbnQubmFtZSkge1xuXHRcdFx0cmV0dXJuIHNlbGVjdGVkVmFyaWFudC5uYW1lO1xuXHRcdH1cblxuXHRcdGlmIChzZWxlY3RlZFZhcmlhbnQudGl0bGUpIHtcblx0XHRcdHJldHVybiBzZWxlY3RlZFZhcmlhbnQudGl0bGU7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRWYXJpYW50Lm9wdGlvbnMpICYmIHNlbGVjdGVkVmFyaWFudC5vcHRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGZpcnN0T3B0aW9uID0gc2VsZWN0ZWRWYXJpYW50Lm9wdGlvbnNbMF07XG5cblx0XHRcdGlmIChmaXJzdE9wdGlvbiAmJiB0eXBlb2YgZmlyc3RPcHRpb24gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGNvbnN0IGZpcnN0RW50cnkgPSBPYmplY3QuZW50cmllcyhmaXJzdE9wdGlvbilbMF07XG5cblx0XHRcdFx0aWYgKGZpcnN0RW50cnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKGZpcnN0RW50cnlbMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBTdHJpbmcoZmlyc3RPcHRpb24pO1xuXHRcdH1cblxuXHRcdHJldHVybiBzZWxlY3RlZFZhcmlhbnQuY29kZSB8fCAnJztcblx0fVxuXG5cdHByb3RlY3RlZCBmaW5kU2VsZWN0ZWRWYXJpYW50KGl0ZW06IGFueSk6IGFueSB7XG5cdFx0Y29uc3QgcHJvZHVjdCA9IGl0ZW0/LnByb2R1Y3Q7XG5cdFx0Y29uc3QgdmFyaWFudElkID0gaXRlbT8udmFyaWFudF9pZDtcblxuXHRcdGlmICghcHJvZHVjdD8udmFyaWFudHM/Lmxlbmd0aCB8fCAhdmFyaWFudElkKSB7XG5cdFx0XHRyZXR1cm4gcHJvZHVjdD8udmFyaWFudHM/LlswXSB8fCBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9kdWN0LnZhcmlhbnRzLmZpbmQoXG5cdFx0XHQodmFyaWFudDogYW55KSA9PlxuXHRcdFx0XHR2YXJpYW50ICYmXG5cdFx0XHRcdCh2YXJpYW50SWQgPT09IHZhcmlhbnQuY29kZSB8fFxuXHRcdFx0XHRcdHZhcmlhbnRJZCA9PT0gdmFyaWFudC5pZCB8fFxuXHRcdFx0XHRcdHZhcmlhbnRJZCA9PT0gdmFyaWFudC52YXJpYW50X2lkKSxcblx0XHQpIHx8IHByb2R1Y3QudmFyaWFudHNbMF0gfHwgbnVsbDtcblx0fVxuXG5cdHByb3RlY3RlZCBzaG91bGRTaG93VmFyaWFudE9wdGlvbihvcHRpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkodGhpcy52YXJpYW50c1RvU2hvdykgfHwgdGhpcy52YXJpYW50c1RvU2hvdy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBvcHRpb25OYW1lLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcblx0XHRjb25zdCBjb25maWd1cmVkID0gdGhpcy52YXJpYW50c1RvU2hvdy5tYXAoKG5hbWUpID0+IG5hbWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKTtcblxuXHRcdHJldHVybiBjb25maWd1cmVkLmluY2x1ZGVzKG5vcm1hbGl6ZWQpIHx8IG5vcm1hbGl6ZWQgPT09ICdUQUxMRScgfHwgbm9ybWFsaXplZCA9PT0gJ1NJWkUnO1xuXHR9XG5cblx0Y3JlYXRlRGlzY291bnRNZXNzYWdlKHNhbGVwcmljZTogbnVtYmVyLCBwcmljZTogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRpZiAoaXNOYU4oc2FsZXByaWNlKSB8fCBpc05hTihwcmljZSkgfHwgc2FsZXByaWNlIDw9IDAgfHwgcHJpY2UgPD0gMCkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdC8vIFNvbG8gaGF5IGRlc2N1ZW50byByZWFsIGN1YW5kbyBlbCBwcmVjaW8gb3JpZ2luYWwgZXMgbWF5b3IgYWwgcHJlY2lvIGRlIG9mZXJ0YS5cblx0XHRpZiAocHJpY2UgPD0gc2FsZXByaWNlKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlzY291bnRQZXJjZW50YWdlID0gTWF0aC5yb3VuZCgoKHByaWNlIC0gc2FsZXByaWNlKSAvIHByaWNlKSAqIDEwMCk7XG5cdFx0aWYgKCFpc0Zpbml0ZShkaXNjb3VudFBlcmNlbnRhZ2UpIHx8IGRpc2NvdW50UGVyY2VudGFnZSA8PSAwKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGAke2Rpc2NvdW50UGVyY2VudGFnZX0lIE9GRmA7XG5cdH1cblxuXHRjaGVja1N0b2NrKHByb2R1Y3Q6IGFueSk6IGFueSB7XG5cdFx0Zm9yIChjb25zdCB2YXJpYW50IG9mIHByb2R1Y3QucHJvZHVjdC52YXJpYW50cykge1xuXHRcdFx0aWYgKHByb2R1Y3QudmFyaWFudF9pZCA9PT0gdmFyaWFudC5jb2RlKSB7XG5cdFx0XHRcdGlmICh2YXJpYW50LnN0b2NrID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTdG9jayA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuICcwJztcblx0XHRcdFx0fSBlbHNlIGlmIChwcm9kdWN0LnF1YW50aXR5ID4gdmFyaWFudC5zdG9jaykge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlU3RvY2sgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiB2YXJpYW50LnN0b2NrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTsgLy8gU29sbyBzZSBlamVjdXRhIHNpIG5vIHNlIGN1bXBsZSBsYSBjb25kaWNpw7NuXG5cdH1cblxuXHQvLyBQQVJBTUVUUk9TXG5cdHB1YmxpYyBwYXJhbWV0ZXJzJDogT2JzZXJ2YWJsZTxQYXJhbWV0ZXJbXSB8IG51bGw+ID0gdGhpcy5wYXJhbWV0ZXJzU2VydmljZS5nZXRQYXJhbWV0ZXJzKClcblx0cHVibGljIGhhc1BhcmFtcyA9IHRoaXMucGFyYW1ldGVyc1NlcnZpY2UuaGFzUGFyYW1zXG5cblx0cHJpdmF0ZSBjbGFtcFF1YW50aXR5KGNhbmRpZGF0ZTogbnVtYmVyLCBzaG93VG9hc3Q6IGJvb2xlYW4pOiBudW1iZXIge1xuXHRcdGNvbnN0IGxpbWl0cyA9IHRoaXMuZ2V0UXVhbnRpdHlMaW1pdHMoKTtcblx0XHRpZiAoIWxpbWl0cykge1xuXHRcdFx0cmV0dXJuIGNhbmRpZGF0ZTtcblx0XHR9XG5cblx0XHRsZXQgbmV4dCA9IGNhbmRpZGF0ZTtcblx0XHRpZiAobmV4dCA8IGxpbWl0cy5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuXHRcdFx0aWYgKHNob3dUb2FzdCAmJiBsaW1pdHMubWluaW11bUl0ZW1zUXVhbnRpdHkgPiAxKSB7XG5cdFx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdtaW5pbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogbGltaXRzLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pO1xuXHRcdFx0fVxuXHRcdFx0bmV4dCA9IGxpbWl0cy5taW5pbXVtSXRlbXNRdWFudGl0eTtcblx0XHR9XG5cblx0XHRpZiAobmV4dCA+IGxpbWl0cy5tYXhBbGxvd2VkKSB7XG5cdFx0XHRpZiAoc2hvd1RvYXN0KSB7XG5cdFx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcblx0XHRcdH1cblx0XHRcdG5leHQgPSBsaW1pdHMubWF4QWxsb3dlZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hbGlnblRvTXVsdGlwbGUobmV4dCwgbGltaXRzLm1pbmltdW1JdGVtc1F1YW50aXR5LCBsaW1pdHMubWF4QWxsb3dlZCwgbGltaXRzLm11bHRpcGxlUXVhbnRpdHksIHNob3dUb2FzdCk7XG5cdH1cblxuXHRwcml2YXRlIGFsaWduVG9NdWx0aXBsZShcblx0XHRjYW5kaWRhdGU6IG51bWJlcixcblx0XHRtaW5BbGxvd2VkOiBudW1iZXIsXG5cdFx0bWF4QWxsb3dlZDogbnVtYmVyLFxuXHRcdG11bHRpcGxlUXVhbnRpdHk6IG51bWJlcixcblx0XHRzaG93VG9hc3Q6IGJvb2xlYW5cblx0KTogbnVtYmVyIHtcblx0XHRpZiAoIW11bHRpcGxlUXVhbnRpdHkgfHwgbXVsdGlwbGVRdWFudGl0eSA8PSAxKSB7XG5cdFx0XHRyZXR1cm4gY2FuZGlkYXRlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbWFpbmRlciA9IGNhbmRpZGF0ZSAlIG11bHRpcGxlUXVhbnRpdHk7XG5cdFx0aWYgKHJlbWFpbmRlciA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGNhbmRpZGF0ZTtcblx0XHR9XG5cblx0XHRjb25zdCBkb3duID0gY2FuZGlkYXRlIC0gcmVtYWluZGVyO1xuXHRcdGNvbnN0IHVwID0gY2FuZGlkYXRlICsgKG11bHRpcGxlUXVhbnRpdHkgLSByZW1haW5kZXIpO1xuXHRcdGxldCBuZXh0ID0gY2FuZGlkYXRlO1xuXG5cdFx0aWYgKGRvd24gPj0gbWluQWxsb3dlZCkge1xuXHRcdFx0bmV4dCA9IGRvd247XG5cdFx0fSBlbHNlIGlmICh1cCA8PSBtYXhBbGxvd2VkKSB7XG5cdFx0XHRuZXh0ID0gdXA7XG5cdFx0fVxuXG5cdFx0aWYgKHNob3dUb2FzdCkge1xuXHRcdFx0dGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ211bHRpcGxlLXF1YW50aXR5LXJlcXVpcmVkJywge1xuXHRcdFx0XHRtdWx0aXBsZTogbXVsdGlwbGVRdWFudGl0eSxcblx0XHRcdFx0Y3VycmVudDogbmV4dFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5leHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldFF1YW50aXR5TGltaXRzKCkge1xuXHRcdGNvbnN0IHZhcmlhbnQgPSB0aGlzLml0ZW0/LnByb2R1Y3Q/LnZhcmlhbnRzPy5bMF07XG5cdFx0aWYgKCF2YXJpYW50KSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBzdG9jayA9IE51bWJlcih2YXJpYW50Py5zdG9jayA/PyB0aGlzLml0ZW0/LnByb2R1Y3Q/LnN0b2NrID8/IDApO1xuXHRcdGNvbnN0IG1heGltdW1JdGVtc1F1YW50aXR5ID0gTnVtYmVyKFxuXHRcdFx0dGhpcy5pdGVtPy5wcm9kdWN0Py5tYXhpbXVtSXRlbXNRdWFudGl0eSA/PyB2YXJpYW50Py5tYXhpbXVtSXRlbXNRdWFudGl0eSA/PyA5OTk5OTlcblx0XHQpO1xuXHRcdGNvbnN0IG1pbmltdW1JdGVtc1F1YW50aXR5ID0gTWF0aC5tYXgoXG5cdFx0XHROdW1iZXIodGhpcy5pdGVtPy5wcm9kdWN0Py5taW5pbXVtSXRlbXNRdWFudGl0eSA/PyB2YXJpYW50Py5taW5pbXVtSXRlbXNRdWFudGl0eSA/PyAxKSxcblx0XHRcdDFcblx0XHQpO1xuXHRcdGNvbnN0IG11bHRpcGxlUXVhbnRpdHkgPSBOdW1iZXIoXG5cdFx0XHR0aGlzLml0ZW0/LnByb2R1Y3Q/Lm11bHRpcGxlUXVhbnRpdHkgPz8gdmFyaWFudD8ubXVsdGlwbGVRdWFudGl0eSA/PyAxXG5cdFx0KTtcblx0XHRjb25zdCBtYXhBbGxvd2VkID0gTWF0aC5taW4oc3RvY2ssIG1heGltdW1JdGVtc1F1YW50aXR5KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRzdG9jayxcblx0XHRcdG1heGltdW1JdGVtc1F1YW50aXR5LFxuXHRcdFx0bWluaW11bUl0ZW1zUXVhbnRpdHksXG5cdFx0XHRtdWx0aXBsZVF1YW50aXR5LFxuXHRcdFx0bWF4QWxsb3dlZCxcblx0XHR9O1xuXHR9XG59XG4iLCJAaWYoIWluU2lkZWJhcil7XG48cD5jYXJ0LWl0ZW0tZWMgd29ya3MhPC9wPlxufUBlbHNle1xuXG48ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICAgIEBsZXQgcHJvZHVjdD0gaXRlbS5wcm9kdWN0O1xuICAgICAgICBAaWYoaXRlbS52YXJpYW50X2lkICYmIHByb2R1Y3QudmFyaWFudHMubGVuZ3RoPjApe1xuICAgICAgICA8aW1nIFtzcmNdPVwibWVkaWFVcmwgKyAgcHJvZHVjdC52YXJpYW50c1swXS5pbWFnZXNbMF1cIiBhbHQ9XCJcIiBjbGFzcz1cImltZy1mbHVpZFwiPlxuICAgICAgICB9QGVsc2V7XG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArICBwcm9kdWN0LnBpY3R1cmVzZGVmYXVsdFswXVwiIGFsdD1cIlwiIGNsYXNzPVwiaW1nLWZsdWlkXCI+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImluZm8gZC1mbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgICBAaWYgKGl0ZW0ucHJvZHVjdC5zcGVjaWFsX21hcms/Lmxlbmd0aCA+IDAgfHwgKGl0ZW0ucHJvZHVjdC5zYWxlcHJpY2UgJiYgaXRlbS5wcm9kdWN0LnByaWNlID4gaXRlbS5wcm9kdWN0LnNhbGVwcmljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcmNhc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIm1lZGlhVXJsICsgKGl0ZW0ucHJvZHVjdC5zcGVjaWFsX21hcms/LlswXT8uaW1hZ2VzWzBdIHx8ICcnKVwiIGFsdD1cIlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAbGV0IGRpc2NvdW50VGV4dCA9IGNyZWF0ZURpc2NvdW50TWVzc2FnZShpdGVtLnByb2R1Y3Quc2FsZXByaWNlLCBpdGVtLnByb2R1Y3QucHJpY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChkaXNjb3VudFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWctZHNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGlzY291bnRUZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxhIGNsYXNzPVwidGl0bGUgdGV4dC1kYXJrIHRleHQtZGVjb3JhdGlvbi1ub25lIG0tMCBwLTAgaDYgbWItMFwiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvcHJvZHVjdCcsIGl0ZW0udmFyaWFudF9pZF1cIj57e1xuICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC5uYW1lIHwgdGl0bGVjYXNlXG4gICAgICAgICAgICAgICAgfX08L2E+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicXR5MVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0ucHJvZHVjdC5pZH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJpY2UgaDYgZnctYm9sZCBtYi0wIHBiLTBcIj57eyBpdGVtLnByb2R1Y3QucHJpY2UgfCBlY0N1cnJlbmN5U3ltYm9sXG4gICAgICAgICAgICAgICAgfX08L2Rpdj5cbiAgICAgICAgICAgIEBpZihlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSAmJiBpdGVtPy5jb21tZW50cyl7XG4gICAgICAgICAgICA8cCBjbGFzcz1cImNvbW1lbnQtdHJ1bmNhdGVkIGZzdC1pdGFsaWMgc21hbGwgdGV4dC1tdXRlZCBtdC0xIG1iLTBcIj5cInt7IGl0ZW0uY29tbWVudHMgfX1cIjwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZihnZXRWYXJpYW50cyhpdGVtKTsgYXMgb3B0aW9ucyl7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLTBcIj5cbiAgICAgICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWUtMVwiPiB7e29wdGlvbi5uYW1lIHwgdGl0bGVjYXNlfX06PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZihvcHRpb24ubmFtZSA9PSAnQ09MT1InKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0yIHJvdW5kZWRcIiBbc3R5bGUuYmFja2dyb3VuZF09XCInIycgKyBvcHRpb24udmFsdWVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICB9QGVsc2V7XG4gICAgICAgICAgICAgICAgPGI+e3tvcHRpb24udmFsdWV9fTwvYj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FtcG9DYW50aWRhZCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyb1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsZXNzKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8uc3RvY2spXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbYXR0ci5pZF09XCIncXR5LW1pbnVzLScgKyAoaXRlbT8udmFyaWFudF9pZCB8fCBpdGVtPy5wcm9kdWN0Py5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWludXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlclwiIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDYW50aWRhZCBkZWwgcHJvZHVjdG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCIncXR5LW1pbnVzLScgKyAoaXRlbT8udmFyaWFudF9pZCB8fCBpdGVtPy5wcm9kdWN0Py5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0ucXVhbnRpdHlcIiBtaW49XCIxXCIgc3RlcD1cIjFcIiBbKG5nTW9kZWwpXT1cInF1YW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlUXVhbnRpdHkoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdPy5zdG9jaylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicGx1cyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LnN0b2NrKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuaWRdPVwiJ3F0eS1wbHVzLScgKyAoaXRlbT8udmFyaWFudF9pZCB8fCBpdGVtPy5wcm9kdWN0Py5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGEgKGNsaWNrKT1cImRlbGV0ZUNhcnRJdGVtKClcIiBjbGFzcz1cImJ0biBib3RCb3JyYXJcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvYT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cblxuXG5cbn1cbiJdfQ==
310
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC1pdGVtLWVjLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9lYy1jb21wb25lbnRzL2NhcnQtZWMvY2FydC1pdGVtLWVjL2NhcnQtaXRlbS1lYy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1lYXN5Y29tbWVyY2UtdjE4L3NyYy9saWIvZWMtY29tcG9uZW50cy9jYXJ0LWVjL2NhcnQtaXRlbS1lYy9jYXJ0LWl0ZW0tZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xKLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFZN0MsTUFBTSxPQUFPLG1CQUFtQjtJQUc1QixJQUFJLENBQU07SUFFSixTQUFTLEdBQVksS0FBSyxDQUFDO0lBRTVCLFlBQVksR0FBZ0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELGFBQWEsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELFVBQVUsR0FBeUIsTUFBTSxDQUFDLG9C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b21wb25lbnQsIGluamVjdCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UsIENoYW5uZWxTZXJ2aWNlLCBUb2FzdFNlcnZpY2UsIFBhcmFtZXRlcnNTZXJ2aWNlLCBQcmljZVZpc2liaWxpdHlTZXJ2aWNlLCBRdWFudGl0eVJ1bGVzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzJztcbmltcG9ydCB7IFRpdGxlQ2FzZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRWNDdXJyZW5jeVN5bWJvbFBpcGUgfSBmcm9tICcuLi8uLi8uLi9lYy1waXBlJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcblxuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdhcHAtY2FydC1pdGVtLWVjJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aW1wb3J0czogW1RpdGxlQ2FzZVBpcGUsIEVjQ3VycmVuY3lTeW1ib2xQaXBlLCBSb3V0ZXJMaW5rLCBGb3Jtc01vZHVsZV0sXG5cdHRlbXBsYXRlVXJsOiAnLi9jYXJ0LWl0ZW0tZWMuY29tcG9uZW50Lmh0bWwnLFxuXHRzdHlsZVVybDogJy4vY2FydC1pdGVtLWVjLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDYXJ0SXRlbUVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblx0QElucHV0KHtcblx0XHRyZXF1aXJlZDogdHJ1ZVxuXHR9KSBpdGVtOiBhbnk7XG5cblx0QElucHV0KCkgaW5TaWRlYmFyOiBib29sZWFuID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBfY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlID0gaW5qZWN0KENhcnRTZXJ2aWNlKTtcblx0cHJpdmF0ZSBfdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcblx0cHJpdmF0ZSBfY29uc3RhbnRzOiBDb3JlQ29uc3RhbnRzU2VydmljZSA9IGluamVjdChDb3JlQ29uc3RhbnRzU2VydmljZSk7XG5cdHByaXZhdGUgX2NoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSA9IGluamVjdChDaGFubmVsU2VydmljZSk7XG5cdHByaXZhdGUgcGFyYW1ldGVyc1NlcnZpY2UgPSBpbmplY3QoUGFyYW1ldGVyc1NlcnZpY2UpXG5cdHByaXZhdGUgcXVhbnRpdHlSdWxlcyA9IGluamVjdChRdWFudGl0eVJ1bGVzU2VydmljZSk7XG5cdHB1YmxpYyByZWFkb25seSBwcmljZVZpc2liaWxpdHkgPSBpbmplY3QoUHJpY2VWaXNpYmlsaXR5U2VydmljZSk7XG5cblx0cHVibGljIG1lZGlhVXJsID0gdGhpcy5fY29uc3RhbnRzLm1lZGlhVXJsKCk7XG5cdHByaXZhdGUgX3F1YW50aXR5ID0gMDtcblx0cHVibGljIHZhcmlhbnRzVG9TaG93OiBzdHJpbmdbXSA9IFsnVEFMTEEnLCAnQ09MT1InXTtcblx0cHVibGljIHVwZGF0ZVN0b2NrOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBpc1F1YW50aXR5VXBkYXRpbmcgPSBmYWxzZTtcblx0cHVibGljIGVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID0gZmFsc2U7XG5cblx0Z2V0IHF1YW50aXR5KCk6IG51bWJlciB7XG5cdFx0Y29uc3QgY3VycmVudFF1YW50aXR5ID0gTnVtYmVyKHRoaXMuaXRlbT8ucXVhbnRpdHkgPz8gdGhpcy5fcXVhbnRpdHkgPz8gMCk7XG5cdFx0cmV0dXJuIE51bWJlci5pc0Zpbml0ZShjdXJyZW50UXVhbnRpdHkpID8gY3VycmVudFF1YW50aXR5IDogMDtcblx0fVxuXG5cdHNldCBxdWFudGl0eSh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgbm9ybWFsaXplZCA9IE51bWJlcih2YWx1ZSA/PyAwKTtcblx0XHR0aGlzLl9xdWFudGl0eSA9IE51bWJlci5pc0Zpbml0ZShub3JtYWxpemVkKSA/IG5vcm1hbGl6ZWQgOiAwO1xuXHRcdGlmICh0aGlzLml0ZW0pIHtcblx0XHRcdHRoaXMuaXRlbS5xdWFudGl0eSA9IHRoaXMuX3F1YW50aXR5O1xuXHRcdH1cblx0fVxuXG5cdGdldCBxdWFudGl0eVN0ZXAoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5xdWFudGl0eVJ1bGVzLmdldFF1YW50aXR5U3RlcCh0aGlzLml0ZW0/LnByb2R1Y3QpO1xuXHR9XG5cblx0Z2V0IHF1YW50aXR5TWluKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMucXVhbnRpdHlSdWxlcy5nZXRRdWFudGl0eU1pbih0aGlzLml0ZW0/LnByb2R1Y3QpO1xuXHR9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy5xdWFudGl0eSA9IHRoaXMuaXRlbS5xdWFudGl0eVxuXHRcdHRoaXMuX2NoYW5uZWxTZXJ2aWNlLmNoYW5uZWwkLnN1YnNjcmliZShjaGFubmVsID0+IHtcblx0XHRcdHRoaXMuZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGUgPSAhIWNoYW5uZWw/LmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlO1xuXHRcdH0pO1xuXHRcdC8vIGNvbnNvbGUubG9nKHRoaXMuaXRlbSwgdGhpcy5tZWRpYVVybCk7XG5cdH1cblxuXHR1cGRhdGVRdWFudGl0eShzdG9jazogbnVtYmVyKSB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxRdWFudGl0eSA9IHRoaXMuaXRlbS5xdWFudGl0eTsgLy8gR3VhcmRhciBjYW50aWRhZCBvcmlnaW5hbFxuXHRcdGNvbnN0IGNhbmRpZGF0ZSA9IE51bWJlcih0aGlzLnF1YW50aXR5KTtcblx0XHRjb25zdCBuZXh0ID0gdGhpcy5jbGFtcFF1YW50aXR5KGNhbmRpZGF0ZSwgdHJ1ZSk7XG5cblx0XHRpZiAobmV4dCA9PT0gb3JpZ2luYWxRdWFudGl0eSkge1xuXHRcdFx0dGhpcy5xdWFudGl0eSA9IG9yaWdpbmFsUXVhbnRpdHk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5leHQgPiAwICYmIG5leHQgPD0gc3RvY2spIHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLl9jYXJ0U2VydmljZS51cGRhdGVJdGVtUXVhbnRpdHkodGhpcy5pdGVtLCBuZXh0LCB0aGlzLml0ZW0/LmNvbW1lbnRzID8/IHVuZGVmaW5lZCk7XG5cblx0XHRcdC8vIFNpIGxhIHZhbGlkYWNpw7NuIGZhbGzDsywgcmVzdGF1cmFyIGxhIGNhbnRpZGFkIG9yaWdpbmFsXG5cdFx0XHRpZiAoIXN1Y2Nlc3MpIHtcblx0XHRcdFx0dGhpcy5xdWFudGl0eSA9IG9yaWdpbmFsUXVhbnRpdHk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnF1YW50aXR5ID0gbmV4dDtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUmVzdGF1cmFyIGNhbnRpZGFkIG9yaWdpbmFsIHNpIGVzdMOhIGZ1ZXJhIGRlIHJhbmdvXG5cdFx0XHR0aGlzLnF1YW50aXR5ID0gb3JpZ2luYWxRdWFudGl0eTtcblx0XHRcdHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2stYWN0dWFsbHknKTtcblx0XHR9XG5cdH1cblxuXHRwbHVzKHN0b2NrOiBudW1iZXIsIHZhbHVlOiBudW1iZXIgPSAxKSB7XG5cdFx0aWYgKHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nKSByZXR1cm47XG5cdFx0dGhpcy5pc1F1YW50aXR5VXBkYXRpbmcgPSB0cnVlO1xuXG5cdFx0Y29uc3QgbGltaXRzID0gdGhpcy5nZXRRdWFudGl0eUxpbWl0cygpO1xuXHRcdGNvbnN0IGZhbGxiYWNrTXVsdGlwbGUgPSBsaW1pdHM/Lm11bHRpcGxlUXVhbnRpdHkgPz8gMTtcblx0XHRjb25zdCBpbmNyZW1lbnQgPSAodmFsdWUgPT09IDEgJiYgZmFsbGJhY2tNdWx0aXBsZSA+IDEpID8gZmFsbGJhY2tNdWx0aXBsZSA6ICh2YWx1ZSAmJiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IGZhbGxiYWNrTXVsdGlwbGUpO1xuXHRcdGNvbnN0IGNhbmRpZGF0ZSA9IE51bWJlcih0aGlzLnF1YW50aXR5KSArIGluY3JlbWVudDtcblx0XHRjb25zdCBuZXdRdWFudGl0eSA9IHRoaXMuY2xhbXBRdWFudGl0eShjYW5kaWRhdGUsIHRydWUpO1xuXG5cdFx0aWYgKG5ld1F1YW50aXR5ID09PSBOdW1iZXIodGhpcy5xdWFudGl0eSkpIHtcblx0XHRcdHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVmVyaWZpY2FyIHN0b2NrIEFOVEVTIGRlIGxsYW1hciBhbCBzZXJ2aWNpb1xuXHRcdGlmIChuZXdRdWFudGl0eSA+IHN0b2NrKSB7XG5cdFx0XHR0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrLWFjdHVhbGx5Jyk7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5pc1F1YW50aXR5VXBkYXRpbmcgPSBmYWxzZTsgfSwgMTAwMCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc3VjY2VzcyA9IHRoaXMuX2NhcnRTZXJ2aWNlLnVwZGF0ZUl0ZW1RdWFudGl0eSh0aGlzLml0ZW0sIG5ld1F1YW50aXR5LCB0aGlzLml0ZW0/LmNvbW1lbnRzID8/IHVuZGVmaW5lZCk7XG5cblx0XHQvLyBTb2xvIGFjdHVhbGl6YXIgZWwgaW5wdXQgc2kgbGEgb3BlcmFjacOzbiBmdWUgZXhpdG9zYVxuXHRcdGlmIChzdWNjZXNzKSB7XG5cdFx0XHR0aGlzLnF1YW50aXR5ID0gbmV3UXVhbnRpdHk7XG5cdFx0fVxuXHRcdC8vIFNpIHN1Y2Nlc3MgZXMgZmFsc2UsIE5PIG1vc3RyYXIgbWVuc2FqZSBhcXXDrSBwb3JxdWUgeWEgbG8gbW9zdHLDsyB2YWxpZGF0ZVF1YW50aXR5KClcblxuXHRcdHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IGZhbHNlOyB9LCAxMDAwKTtcblx0fVxuXG5cdGxlc3Moc3RvY2s6IG51bWJlciwgdmFsdWU6IG51bWJlciA9IDEpIHtcblx0XHRpZiAodGhpcy5pc1F1YW50aXR5VXBkYXRpbmcpIHJldHVybjtcblx0XHR0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IHRydWU7XG5cblx0XHRjb25zdCBsaW1pdHMgPSB0aGlzLmdldFF1YW50aXR5TGltaXRzKCk7XG5cdFx0Y29uc3QgZmFsbGJhY2tNdWx0aXBsZSA9IGxpbWl0cz8ubXVsdGlwbGVRdWFudGl0eSA/PyAxO1xuXHRcdGNvbnN0IGRlY3JlbWVudCA9ICh2YWx1ZSA9PT0gMSAmJiBmYWxsYmFja011bHRpcGxlID4gMSkgPyBmYWxsYmFja011bHRpcGxlIDogKHZhbHVlICYmIHZhbHVlID4gMCA/IHZhbHVlIDogZmFsbGJhY2tNdWx0aXBsZSk7XG5cdFx0Y29uc3QgY2FuZGlkYXRlID0gTnVtYmVyKHRoaXMucXVhbnRpdHkpIC0gZGVjcmVtZW50O1xuXHRcdGNvbnN0IG5ld1F1YW50aXR5ID0gdGhpcy5jbGFtcFF1YW50aXR5KGNhbmRpZGF0ZSwgdHJ1ZSk7XG5cblx0XHRpZiAobmV3UXVhbnRpdHkgPT09IE51bWJlcih0aGlzLnF1YW50aXR5KSkge1xuXHRcdFx0dGhpcy5pc1F1YW50aXR5VXBkYXRpbmcgPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBWZXJpZmljYXIgY2FudGlkYWQgbcOtbmltYSBBTlRFUyBkZSBsbGFtYXIgYWwgc2VydmljaW9cblx0XHRpZiAobmV3UXVhbnRpdHkgPD0gMCkge1xuXHRcdFx0Ly8gTm8gcGVybWl0aXIgY2FudGlkYWRlcyBtZW5vcmVzIG8gaWd1YWxlcyBhIDBcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmlzUXVhbnRpdHlVcGRhdGluZyA9IGZhbHNlOyB9LCAxMDAwKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBzdWNjZXNzID0gdGhpcy5fY2FydFNlcnZpY2UudXBkYXRlSXRlbVF1YW50aXR5KHRoaXMuaXRlbSwgbmV3UXVhbnRpdHksIHRoaXMuaXRlbT8uY29tbWVudHMgPz8gdW5kZWZpbmVkKTtcblxuXHRcdC8vIFNvbG8gYWN0dWFsaXphciBlbCBpbnB1dCBzaSBsYSBvcGVyYWNpw7NuIGZ1ZSBleGl0b3NhXG5cdFx0aWYgKHN1Y2Nlc3MpIHtcblx0XHRcdHRoaXMucXVhbnRpdHkgPSBuZXdRdWFudGl0eTtcblx0XHR9XG5cdFx0Ly8gU2kgc3VjY2VzcyBlcyBmYWxzZSwgTk8gbW9zdHJhciBtZW5zYWplIGFxdcOtIHBvcnF1ZSB5YSBsbyBtb3N0csOzIHZhbGlkYXRlUXVhbnRpdHkoKVxuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7IHRoaXMuaXNRdWFudGl0eVVwZGF0aW5nID0gZmFsc2U7IH0sIDEwMDApO1xuXHR9XG5cblx0ZGVsZXRlQ2FydEl0ZW0oKSB7XG5cdFx0dGhpcy5fY2FydFNlcnZpY2UuZGVsZXRlQ2FydEl0ZW0odGhpcy5pdGVtKVxuXHR9XG5cblx0Z2V0VmFyaWFudHMocHJvZHVjdDogYW55KTogYW55IHtcblx0XHRjb25zdCBpdGVtID0gcHJvZHVjdD8ucHJvZHVjdDtcblx0XHRjb25zdCBzZWxlY3RlZFZhcmlhbnQgPSB0aGlzLmZpbmRTZWxlY3RlZFZhcmlhbnQocHJvZHVjdCk7XG5cblx0XHRpZiAoIWl0ZW0gfHwgIXNlbGVjdGVkVmFyaWFudD8ub3B0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb3B0aW9uc01hcDogYW55W10gPSBbXTtcblxuXHRcdHNlbGVjdGVkVmFyaWFudC5vcHRpb25zLmZvckVhY2goKG9wdGlvbjogYW55KSA9PiB7XG5cdFx0XHRpZiAoIW9wdGlvbiB8fCB0eXBlb2Ygb3B0aW9uICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdE9iamVjdC5rZXlzKG9wdGlvbikuZm9yRWFjaCgoZW50cnkpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLnNob3VsZFNob3dWYXJpYW50T3B0aW9uKGVudHJ5KSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBvcHRpb25bZW50cnldO1xuXHRcdFx0XHRjb25zdCByZXNvbHZlZFZhbHVlID0gaXRlbT8ub3B0aW9uc1xuXHRcdFx0XHRcdD8uZmxhdE1hcCgoaXRlbU9wdGlvbjogYW55KSA9PiBpdGVtT3B0aW9uLnZhbHVlcyB8fCBbXSlcblx0XHRcdFx0XHQ/LmZpbmQoKHZhbHVlOiBhbnkpID0+IHZhbHVlLmNvZGUgPT0gc2VsZWN0ZWRWYWx1ZSk7XG5cblx0XHRcdFx0b3B0aW9uc01hcC5wdXNoKHtcblx0XHRcdFx0XHRuYW1lOiBlbnRyeSxcblx0XHRcdFx0XHR2YWx1ZTogc2VsZWN0ZWRWYWx1ZSxcblx0XHRcdFx0XHRkaXNwbGF5TmFtZTpcblx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWU/Lm5hbWUgfHxcblx0XHRcdFx0XHRcdHJlc29sdmVkVmFsdWU/LmRlc2NyaXB0aW9uIHx8XG5cdFx0XHRcdFx0XHRyZXNvbHZlZFZhbHVlPy5sYWJlbCB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRWYWx1ZSxcblx0XHRcdFx0XHRpbWFnZTogcmVzb2x2ZWRWYWx1ZT8uaW1hZ2UsXG5cdFx0XHRcdFx0bW9iaWxlSW1hZ2U6IHJlc29sdmVkVmFsdWU/Lm1vYmlsZUltYWdlLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9wdGlvbnNNYXA7XG5cdH1cblxuXHRwcm9kdWN0RGV0YWlsTGluayhpdGVtOiBhbnkpOiBhbnlbXSB7XG5cdFx0Y29uc3QgcHJvZHVjdCA9IGl0ZW0/LnByb2R1Y3Q7XG5cdFx0aWYgKHRoaXMuX2NvbnN0YW50cy5nZXRVc2VQcm9kdWN0U2x1Z1JvdXRlKCkgJiYgcHJvZHVjdD8uc2x1Zykge1xuXHRcdFx0cmV0dXJuIFsnL3Byb2R1Y3QnLCBTdHJpbmcocHJvZHVjdC5zbHVnKV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFsnL3Byb2R1Y3QnLCBwcm9kdWN0Py5pZF07XG5cdH1cblxuXHRwcm9kdWN0RGV0YWlsUXVlcnlQYXJhbXMoaXRlbTogYW55KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwge1xuXHRcdHJldHVybiBpdGVtPy52YXJpYW50X2lkID8geyB2YXJpYW50OiBTdHJpbmcoaXRlbS52YXJpYW50X2lkKSB9IDogbnVsbDtcblx0fVxuXG5cdGdldE9wdGlvbkRpc3BsYXkob3B0aW9uOiBhbnkpIHtcblx0XHRpZiAoIW9wdGlvbikge1xuXHRcdFx0cmV0dXJuIHsgaXNDb2xvcjogZmFsc2UsIHZhbHVlOiAnJywgbGFiZWw6ICcnIH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNDb2xvciA9IG9wdGlvbi5uYW1lPy50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgPT09ICdDT0xPUic7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNDb2xvcixcblx0XHRcdHZhbHVlOiBvcHRpb24uZGlzcGxheU5hbWUgfHwgb3B0aW9uLnZhbHVlIHx8ICcnLFxuXHRcdFx0bGFiZWw6IG9wdGlvbi52YWx1ZSB8fCAnJyxcblx0XHR9O1xuXHR9XG5cblx0Z2V0VmFyaWFudExhYmVsKGl0ZW06IGFueSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRWYXJpYW50ID0gdGhpcy5maW5kU2VsZWN0ZWRWYXJpYW50KGl0ZW0pO1xuXG5cdFx0aWYgKCFzZWxlY3RlZFZhcmlhbnQpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRpZiAoc2VsZWN0ZWRWYXJpYW50Lm5hbWUpIHtcblx0XHRcdHJldHVybiBzZWxlY3RlZFZhcmlhbnQubmFtZTtcblx0XHR9XG5cblx0XHRpZiAoc2VsZWN0ZWRWYXJpYW50LnRpdGxlKSB7XG5cdFx0XHRyZXR1cm4gc2VsZWN0ZWRWYXJpYW50LnRpdGxlO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFyaWFudC5vcHRpb25zKSAmJiBzZWxlY3RlZFZhcmlhbnQub3B0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBmaXJzdE9wdGlvbiA9IHNlbGVjdGVkVmFyaWFudC5vcHRpb25zWzBdO1xuXG5cdFx0XHRpZiAoZmlyc3RPcHRpb24gJiYgdHlwZW9mIGZpcnN0T3B0aW9uID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRjb25zdCBmaXJzdEVudHJ5ID0gT2JqZWN0LmVudHJpZXMoZmlyc3RPcHRpb24pWzBdO1xuXG5cdFx0XHRcdGlmIChmaXJzdEVudHJ5KSB7XG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhmaXJzdEVudHJ5WzFdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gU3RyaW5nKGZpcnN0T3B0aW9uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc2VsZWN0ZWRWYXJpYW50LmNvZGUgfHwgJyc7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZmluZFNlbGVjdGVkVmFyaWFudChpdGVtOiBhbnkpOiBhbnkge1xuXHRcdGNvbnN0IHByb2R1Y3QgPSBpdGVtPy5wcm9kdWN0O1xuXHRcdGNvbnN0IHZhcmlhbnRJZCA9IGl0ZW0/LnZhcmlhbnRfaWQ7XG5cblx0XHRpZiAoIXByb2R1Y3Q/LnZhcmlhbnRzPy5sZW5ndGggfHwgIXZhcmlhbnRJZCkge1xuXHRcdFx0cmV0dXJuIHByb2R1Y3Q/LnZhcmlhbnRzPy5bMF0gfHwgbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvZHVjdC52YXJpYW50cy5maW5kKFxuXHRcdFx0KHZhcmlhbnQ6IGFueSkgPT5cblx0XHRcdFx0dmFyaWFudCAmJlxuXHRcdFx0XHQodmFyaWFudElkID09PSB2YXJpYW50LmNvZGUgfHxcblx0XHRcdFx0XHR2YXJpYW50SWQgPT09IHZhcmlhbnQuaWQgfHxcblx0XHRcdFx0XHR2YXJpYW50SWQgPT09IHZhcmlhbnQudmFyaWFudF9pZCksXG5cdFx0KSB8fCBwcm9kdWN0LnZhcmlhbnRzWzBdIHx8IG51bGw7XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2hvdWxkU2hvd1ZhcmlhbnRPcHRpb24ob3B0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmFyaWFudHNUb1Nob3cpIHx8IHRoaXMudmFyaWFudHNUb1Nob3cubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBub3JtYWxpemVkID0gb3B0aW9uTmFtZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG5cdFx0Y29uc3QgY29uZmlndXJlZCA9IHRoaXMudmFyaWFudHNUb1Nob3cubWFwKChuYW1lKSA9PiBuYW1lLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSk7XG5cblx0XHRyZXR1cm4gY29uZmlndXJlZC5pbmNsdWRlcyhub3JtYWxpemVkKSB8fCBub3JtYWxpemVkID09PSAnVEFMTEUnIHx8IG5vcm1hbGl6ZWQgPT09ICdTSVpFJztcblx0fVxuXG5cdGNyZWF0ZURpc2NvdW50TWVzc2FnZShzYWxlcHJpY2U6IG51bWJlciwgcHJpY2U6IG51bWJlcik6IHN0cmluZyB7XG5cdFx0aWYgKGlzTmFOKHNhbGVwcmljZSkgfHwgaXNOYU4ocHJpY2UpIHx8IHNhbGVwcmljZSA8PSAwIHx8IHByaWNlIDw9IDApIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHQvLyBTb2xvIGhheSBkZXNjdWVudG8gcmVhbCBjdWFuZG8gZWwgcHJlY2lvIG9yaWdpbmFsIGVzIG1heW9yIGFsIHByZWNpbyBkZSBvZmVydGEuXG5cdFx0aWYgKHByaWNlIDw9IHNhbGVwcmljZSkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRpc2NvdW50UGVyY2VudGFnZSA9IE1hdGgucm91bmQoKChwcmljZSAtIHNhbGVwcmljZSkgLyBwcmljZSkgKiAxMDApO1xuXHRcdGlmICghaXNGaW5pdGUoZGlzY291bnRQZXJjZW50YWdlKSB8fCBkaXNjb3VudFBlcmNlbnRhZ2UgPD0gMCkge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtkaXNjb3VudFBlcmNlbnRhZ2V9JSBPRkZgO1xuXHR9XG5cblx0Y2hlY2tTdG9jayhwcm9kdWN0OiBhbnkpOiBhbnkge1xuXHRcdGZvciAoY29uc3QgdmFyaWFudCBvZiBwcm9kdWN0LnByb2R1Y3QudmFyaWFudHMpIHtcblx0XHRcdGlmIChwcm9kdWN0LnZhcmlhbnRfaWQgPT09IHZhcmlhbnQuY29kZSkge1xuXHRcdFx0XHRpZiAodmFyaWFudC5zdG9jayA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlU3RvY2sgPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHRcdH0gZWxzZSBpZiAocHJvZHVjdC5xdWFudGl0eSA+IHZhcmlhbnQuc3RvY2spIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZVN0b2NrID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gdmFyaWFudC5zdG9jaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7IC8vIFNvbG8gc2UgZWplY3V0YSBzaSBubyBzZSBjdW1wbGUgbGEgY29uZGljacOzblxuXHR9XG5cblx0Ly8gUEFSQU1FVFJPU1xuXHRwdWJsaWMgcGFyYW1ldGVycyQ6IE9ic2VydmFibGU8UGFyYW1ldGVyW10gfCBudWxsPiA9IHRoaXMucGFyYW1ldGVyc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpXG5cdHB1YmxpYyBoYXNQYXJhbXMgPSB0aGlzLnBhcmFtZXRlcnNTZXJ2aWNlLmhhc1BhcmFtc1xuXG5cdHByaXZhdGUgY2xhbXBRdWFudGl0eShjYW5kaWRhdGU6IG51bWJlciwgc2hvd1RvYXN0OiBib29sZWFuKTogbnVtYmVyIHtcblx0XHRjb25zdCBsaW1pdHMgPSB0aGlzLmdldFF1YW50aXR5TGltaXRzKCk7XG5cdFx0aWYgKCFsaW1pdHMpIHtcblx0XHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdFx0fVxuXG5cdFx0bGV0IG5leHQgPSBjYW5kaWRhdGU7XG5cdFx0aWYgKG5leHQgPCBsaW1pdHMubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcblx0XHRcdGlmIChzaG93VG9hc3QgJiYgbGltaXRzLm1pbmltdW1JdGVtc1F1YW50aXR5ID4gMSkge1xuXHRcdFx0XHR0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGxpbWl0cy5taW5pbXVtSXRlbXNRdWFudGl0eSB9KTtcblx0XHRcdH1cblx0XHRcdG5leHQgPSBsaW1pdHMubWluaW11bUl0ZW1zUXVhbnRpdHk7XG5cdFx0fVxuXG5cdFx0aWYgKG5leHQgPiBsaW1pdHMubWF4QWxsb3dlZCkge1xuXHRcdFx0aWYgKHNob3dUb2FzdCkge1xuXHRcdFx0XHR0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrLWFjdHVhbGx5Jyk7XG5cdFx0XHR9XG5cdFx0XHRuZXh0ID0gbGltaXRzLm1heEFsbG93ZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYWxpZ25Ub011bHRpcGxlKG5leHQsIGxpbWl0cy5taW5pbXVtSXRlbXNRdWFudGl0eSwgbGltaXRzLm1heEFsbG93ZWQsIGxpbWl0cy5tdWx0aXBsZVF1YW50aXR5LCBzaG93VG9hc3QpO1xuXHR9XG5cblx0cHJpdmF0ZSBhbGlnblRvTXVsdGlwbGUoXG5cdFx0Y2FuZGlkYXRlOiBudW1iZXIsXG5cdFx0bWluQWxsb3dlZDogbnVtYmVyLFxuXHRcdG1heEFsbG93ZWQ6IG51bWJlcixcblx0XHRtdWx0aXBsZVF1YW50aXR5OiBudW1iZXIsXG5cdFx0c2hvd1RvYXN0OiBib29sZWFuXG5cdCk6IG51bWJlciB7XG5cdFx0Y29uc3QgbmV4dCA9IHRoaXMucXVhbnRpdHlSdWxlcy5hbGlnblRvTXVsdGlwbGUoY2FuZGlkYXRlLCBtaW5BbGxvd2VkLCBtYXhBbGxvd2VkLCBtdWx0aXBsZVF1YW50aXR5KTtcblxuXHRcdGlmIChzaG93VG9hc3QgJiYgbmV4dCAhPT0gY2FuZGlkYXRlICYmIG11bHRpcGxlUXVhbnRpdHkgPiAxKSB7XG5cdFx0XHR0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnbXVsdGlwbGUtcXVhbnRpdHktcmVxdWlyZWQnLCB7XG5cdFx0XHRcdG11bHRpcGxlOiBtdWx0aXBsZVF1YW50aXR5LFxuXHRcdFx0XHRjdXJyZW50OiBuZXh0XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV4dDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UXVhbnRpdHlMaW1pdHMoKSB7XG5cdFx0Y29uc3QgcHJvZHVjdCA9IHRoaXMuaXRlbT8ucHJvZHVjdDtcblx0XHRpZiAoIXByb2R1Y3QpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnF1YW50aXR5UnVsZXMuZ2V0UXVhbnRpdHlMaW1pdHMocHJvZHVjdCk7XG5cdH1cbn1cbiIsIkBpZighaW5TaWRlYmFyKXtcbjxwPmNhcnQtaXRlbS1lYyB3b3JrcyE8L3A+XG59QGVsc2V7XG5cbjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTNcIj5cbiAgICAgICAgQGxldCBwcm9kdWN0PSBpdGVtLnByb2R1Y3Q7XG4gICAgICAgIEBpZihpdGVtLnZhcmlhbnRfaWQgJiYgcHJvZHVjdC52YXJpYW50cy5sZW5ndGg+MCl7XG4gICAgICAgIDxpbWcgW3NyY109XCJtZWRpYVVybCArICBwcm9kdWN0LnZhcmlhbnRzWzBdLmltYWdlc1swXVwiIGFsdD1cIlwiIGNsYXNzPVwiaW1nLWZsdWlkXCI+XG4gICAgICAgIH1AZWxzZXtcbiAgICAgICAgPGltZyBbc3JjXT1cIm1lZGlhVXJsICsgIHByb2R1Y3QucGljdHVyZXNkZWZhdWx0WzBdXCIgYWx0PVwiXCIgY2xhc3M9XCJpbWctZmx1aWRcIj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtN1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mbyBkLWZsZXggZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgIEBpZiAoaXRlbS5wcm9kdWN0LnNwZWNpYWxfbWFyaz8ubGVuZ3RoID4gMCB8fCAoaXRlbS5wcm9kdWN0LnNhbGVwcmljZSAmJiBpdGVtLnByb2R1Y3QucHJpY2UgPiBpdGVtLnByb2R1Y3Quc2FsZXByaWNlKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFyY2FzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwibWVkaWFVcmwgKyAoaXRlbS5wcm9kdWN0LnNwZWNpYWxfbWFyaz8uWzBdPy5pbWFnZXNbMF0gfHwgJycpXCIgYWx0PVwiXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBsZXQgZGlzY291bnRUZXh0ID0gY3JlYXRlRGlzY291bnRNZXNzYWdlKGl0ZW0ucHJvZHVjdC5zYWxlcHJpY2UsIGl0ZW0ucHJvZHVjdC5wcmljZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRpc2NvdW50VGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhZy1kc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkaXNjb3VudFRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0aXRsZSB0ZXh0LWRhcmsgdGV4dC1kZWNvcmF0aW9uLW5vbmUgbS0wIHAtMCBoNiBtYi0wXCJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9wcm9kdWN0JywgaXRlbS52YXJpYW50X2lkXVwiPnt7XG4gICAgICAgICAgICAgICAgaXRlbS5wcm9kdWN0Lm5hbWUgfCB0aXRsZWNhc2VcbiAgICAgICAgICAgICAgICB9fTwvYT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJxdHkxXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5wcm9kdWN0LmlkfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmljZSBoNiBmdy1ib2xkIG1iLTAgcGItMFwiPnt7IGl0ZW0ucHJvZHVjdC5wcmljZSB8IGVjQ3VycmVuY3lTeW1ib2xcbiAgICAgICAgICAgICAgICB9fTwvZGl2PlxuICAgICAgICAgICAgQGlmKGVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlICYmIGl0ZW0/LmNvbW1lbnRzKXtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY29tbWVudC10cnVuY2F0ZWQgZnN0LWl0YWxpYyBzbWFsbCB0ZXh0LW11dGVkIG10LTEgbWItMFwiPlwie3sgaXRlbS5jb21tZW50cyB9fVwiPC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmKGdldFZhcmlhbnRzKGl0ZW0pOyBhcyBvcHRpb25zKXtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtMFwiPlxuICAgICAgICAgICAgICAgIEBmb3Iob3B0aW9uIG9mIG9wdGlvbnM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0xXCI+IHt7b3B0aW9uLm5hbWUgfCB0aXRsZWNhc2V9fTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmKG9wdGlvbi5uYW1lID09ICdDT0xPUicpe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTIgcm91bmRlZFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIicjJyArIG9wdGlvbi52YWx1ZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIH1AZWxzZXtcbiAgICAgICAgICAgICAgICA8Yj57e29wdGlvbi52YWx1ZX19PC9iPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYW1wb0NhbnRpZGFkIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtZXJvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxlc3MoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdPy5zdG9jaylcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFthdHRyLmlkXT1cIidxdHktbWludXMtJyArIChpdGVtPy52YXJpYW50X2lkIHx8IGl0ZW0/LnByb2R1Y3Q/LmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1taW51c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHRleHQtY2VudGVyXCIgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhbnRpZGFkIGRlbCBwcm9kdWN0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIidxdHktbWludXMtJyArIChpdGVtPy52YXJpYW50X2lkIHx8IGl0ZW0/LnByb2R1Y3Q/LmlkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS5xdWFudGl0eVwiIG1pbj1cIjFcIiBzdGVwPVwiMVwiIFsobmdNb2RlbCldPVwicXVhbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVRdWFudGl0eShpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0/LnN0b2NrKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJwbHVzKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXT8uc3RvY2spXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBbYXR0ci5pZF09XCIncXR5LXBsdXMtJyArIChpdGVtPy52YXJpYW50X2lkIHx8IGl0ZW0/LnByb2R1Y3Q/LmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8YSAoY2xpY2spPVwiZGVsZXRlQ2FydEl0ZW0oKVwiIGNsYXNzPVwiYnRuIGJvdEJvcnJhclwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2hcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9hPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cblxuXG5cblxufVxuIl19