ngx-sumax-erp-components 1.1.2 → 1.1.4

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.
@@ -1,8 +1,9 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild, forwardRef } from '@angular/core';
2
2
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { isObservable } from 'rxjs';
4
- import { shareReplay } from 'rxjs/operators';
3
+ import { isObservable, of } from 'rxjs';
4
+ import { shareReplay, take } from 'rxjs/operators';
5
5
  import { SharedComponentsUtil } from '../utils/SharedComponentsUtil';
6
+ import { NgSelectUtils } from '../utils/NgSelectUtils';
6
7
  import * as i0 from "@angular/core";
7
8
  import * as i1 from "../utils/message-util.service";
8
9
  import * as i2 from "./ng-select-multiple.service";
@@ -14,10 +15,11 @@ import * as i7 from "@ng-select/ng-select";
14
15
  import * as i8 from "@angular/material/checkbox";
15
16
  import * as i9 from "@angular/material/tooltip";
16
17
  export class NgSelectMultipleComponent {
17
- constructor(cdrf, messageUtilService, ngSelectMultipleService) {
18
+ constructor(cdrf, messageUtilService, ngSelectMultipleService, zone) {
18
19
  this.cdrf = cdrf;
19
20
  this.messageUtilService = messageUtilService;
20
21
  this.ngSelectMultipleService = ngSelectMultipleService;
22
+ this.zone = zone;
21
23
  this.onChange = (_) => { };
22
24
  this.onTouched = () => { };
23
25
  this.onValidationChange = () => { };
@@ -170,6 +172,12 @@ export class NgSelectMultipleComponent {
170
172
  * @type string
171
173
  */
172
174
  this.loadingText = "Cargando...";
175
+ /**
176
+ * @description Muestra los elementos seleccionados al inicio de la lista.
177
+ * @default false
178
+ * @type boolean
179
+ */
180
+ this.orderedSelectionTop = false;
173
181
  /**
174
182
  * @description Evento emitido al navegar al siguiente control
175
183
  * @type EventEmitter<any>
@@ -314,6 +322,35 @@ export class NgSelectMultipleComponent {
314
322
  this.ngSelectMultiple.open();
315
323
  }
316
324
  }
325
+ handleDropdownOpen() {
326
+ if (!this.orderedSelectionTop)
327
+ return;
328
+ this.items.pipe(take(1)).subscribe((allOptions) => {
329
+ const selectedValues = (this._value ?? [])
330
+ .map((selectedItem) => selectedItem.value)
331
+ .filter((itemValue) => itemValue !== null);
332
+ NgSelectUtils.reorderItems(allOptions, selectedValues, (reorderedOptions) => {
333
+ this.items = of(reorderedOptions);
334
+ if (selectedValues.length > 0) {
335
+ this.zone.onStable.pipe(take(1)).subscribe(() => {
336
+ const panel = this.ngSelectMultiple?.dropdownPanel?.scrollElementRef?.nativeElement;
337
+ if (panel) {
338
+ panel.scrollTop = 0;
339
+ }
340
+ });
341
+ }
342
+ });
343
+ });
344
+ }
345
+ handleDropdownClose() {
346
+ if (!this.orderedSelectionTop)
347
+ return;
348
+ this.items.pipe(take(1)).subscribe((allOptions) => {
349
+ NgSelectUtils.reorderItems(allOptions, [], (reorderedOptions) => {
350
+ this.items = of(reorderedOptions);
351
+ }, true);
352
+ });
353
+ }
317
354
  /**
318
355
  * @description Maneja el evento de pérdida de foco
319
356
  * @param e Evento de pérdida de foco
@@ -451,8 +488,8 @@ export class NgSelectMultipleComponent {
451
488
  }
452
489
  }
453
490
  }
454
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgSelectMultipleComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MessageUtilService }, { token: i2.NgSelectMultipleService }], target: i0.ɵɵFactoryTarget.Component }); }
455
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: NgSelectMultipleComponent, selector: "ng-select-multiple", inputs: { items: "items", showlimit: "showlimit", showLabel: "showLabel", label: "label", autocomplete: "autocomplete", Header: "Header", Footer: "Footer", required: "required", next: "next", nextIsDisable: "nextIsDisable", back: "back", backIsDisable: "backIsDisable", disabled: "disabled", readonly: "readonly", openWhenFocus: "openWhenFocus", markFirst: "markFirst", labelInfo: "labelInfo", textLabelInfo: "textLabelInfo", validatorMessage: "validatorMessage", tooltipMessage: "tooltipMessage", validatorAlert: "validatorAlert", submitted: "submitted", refresh: "refresh", isForFilter: "isForFilter", appendTo: "appendTo", Language: "Language", virtualScroll: "virtualScroll", loading: "loading", loadingText: "loadingText" }, outputs: { onNext: "onNext", onBack: "onBack", change: "change", blur: "blur", onfocus: "onfocus", onrefresh: "onrefresh" }, providers: [
491
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgSelectMultipleComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.MessageUtilService }, { token: i2.NgSelectMultipleService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
492
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: NgSelectMultipleComponent, selector: "ng-select-multiple", inputs: { items: "items", showlimit: "showlimit", showLabel: "showLabel", label: "label", autocomplete: "autocomplete", Header: "Header", Footer: "Footer", required: "required", next: "next", nextIsDisable: "nextIsDisable", back: "back", backIsDisable: "backIsDisable", disabled: "disabled", readonly: "readonly", openWhenFocus: "openWhenFocus", markFirst: "markFirst", labelInfo: "labelInfo", textLabelInfo: "textLabelInfo", validatorMessage: "validatorMessage", tooltipMessage: "tooltipMessage", validatorAlert: "validatorAlert", submitted: "submitted", refresh: "refresh", isForFilter: "isForFilter", appendTo: "appendTo", Language: "Language", virtualScroll: "virtualScroll", loading: "loading", loadingText: "loadingText", orderedSelectionTop: "orderedSelectionTop" }, outputs: { onNext: "onNext", onBack: "onBack", change: "change", blur: "blur", onfocus: "onfocus", onrefresh: "onrefresh" }, providers: [
456
493
  {
457
494
  provide: NG_VALUE_ACCESSOR,
458
495
  useExisting: forwardRef(() => NgSelectMultipleComponent),
@@ -463,7 +500,7 @@ export class NgSelectMultipleComponent {
463
500
  useExisting: forwardRef(() => NgSelectMultipleComponent),
464
501
  multi: true,
465
502
  }
466
- ], viewQueries: [{ propertyName: "ngSelectMultiple", first: true, predicate: ["ngSelectMultiple"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ml-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n</label>\r\n\r\n<div\r\n [class.input-icon]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.refresh]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted && refresh\"\r\n [class.right]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <div class=\"d-flex\">\r\n <div class=\"position-relative\" [class.app-ng-selec-container]=\"refresh\" [class.w-100]=\"!refresh\">\r\n <!-- tooltip-message es el icono de error -->\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [submitted]=\"submitted\"\r\n [tooltipMessage]=\"tooltipMessage\"></tooltip-message>\r\n <ng-select\r\n #ngSelectMultiple\r\n [class]=\"refresh ? 'app-ng-select' : 'w-100'\"\r\n [items]=\"$any(checkIfObservable(items) ? (items | async) : items)\"\r\n [(ngModel)]=\"_value\"\r\n [readonly]=\"disabled || readonly\"\r\n (change)=\"eventChange($event)\"\r\n (focus)=\"eventFocus($event)\"\r\n (blur)=\"eventBlur($event)\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [multiple]=\"true\"\r\n placeholder=\"Seleccionar\"\r\n [closeOnSelect]=\"false\"\r\n [appendTo]=\"appendTo\"\r\n [inputAttrs]=\"{ autocomplete: autocomplete }\"\r\n [markFirst]=\"markFirst\"\r\n (keyup.ArrowLeft)=\"leftKeyUp()\"\r\n (keyup.ArrowRight)=\"rightKeyUp()\"\r\n [loading]=\"loading\"\r\n [loadingText]=\"loadingText\"\r\n [clearSearchOnAdd]=\"true\"\r\n [class.ng-select-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.ng-select-touched]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <ng-template ng-header-tmp *ngIf=\"Header\">\r\n <mat-checkbox\r\n class=\"ng-multiselect-checkbox\"\r\n [color]=\"'primary'\"\r\n [(ngModel)]=\"checkedAll\"\r\n [indeterminate]=\"checkedIndeterminate\"\r\n (change)=\"selectAll($event)\">\r\n <span *ngIf=\"!checkedAll\">{{ Language.SelectAll }}</span>\r\n <span *ngIf=\"checkedAll\">{{ Language.UnselectAll }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length != _value.length\">\r\n <div class=\"ng-value\" *ngFor=\"let item of items | slice: 0 : showlimit\">\r\n <span class=\"ng-value-label\"> {{ $any(item).label }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </div>\r\n <div class=\"ng-value\" *ngIf=\"items.length > showlimit\">\r\n <span class=\"ng-value-label\">+{{ items.length - showlimit }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <mat-checkbox class=\"ng-multiselect-checkbox\" id=\"item-{{ index }}\" color=\"primary\" [checked]=\"item$.selected\">\r\n <span data-toggle=\"tooltip\" title=\"{{ item.label }}\">{{ item.label }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length == _value.length\">\r\n <div class=\"ng-value\">\r\n <span class=\"ng-value-label\">{{ Language.All }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-footer-tmp *ngIf=\"Footer\"> {{ Language.Selected }}: {{ _value.length }} </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"app-ng-select-button bd-highlight\" *ngIf=\"refresh\">\r\n <button\r\n *ngIf=\"refresh\"\r\n type=\"button\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"btn btn-info p-0 rounded-0 h-100\"\r\n (click)=\"onRefresh()\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\">refresh</mat-icon> -->\r\n <i class=\"fa fa-refresh text-white px-1\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\"></i>\r\n </button>\r\n </div>\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<!-- error-message es el mansaje que aparece abajo del componente -->\r\n<error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n", styles: ["ng-select-simple{display:block}.sumax-label{color:#646c9a!important}.input-icon tooltip-message{color:#ccc;position:absolute;z-index:3;font-size:16px;text-align:center;right:9px;top:50%;transform:translateY(-50%)}.input-icon.right>.form-control{padding-right:33px;padding-left:12px}.upperCase .ng-select-container .ng-value-container .ng-input>input{text-transform:uppercase}.app-ng-select-button{width:34px}.app-ng-select-button button{width:100%}.app-ng-selec-container{width:calc(100% - 34px)}.app-ng-select-action{width:20%}.app-ng-select-action button{width:50%}.overflow-box{padding:5px;height:100px;border:1px solid #999;overflow:hidden}.ng-dropdown-panel{width:auto!important;max-width:550px;min-width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.errorMessageComponent, selector: "error-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }, { kind: "component", type: i6.tooltipMessageComponent, selector: "tooltip-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }, { kind: "component", type: i7.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i7.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i7.NgMultiLabelTemplateDirective, selector: "[ng-multi-label-tmp]" }, { kind: "directive", type: i7.NgHeaderTemplateDirective, selector: "[ng-header-tmp]" }, { kind: "directive", type: i7.NgFooterTemplateDirective, selector: "[ng-footer-tmp]" }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.SlicePipe, name: "slice" }] }); }
503
+ ], viewQueries: [{ propertyName: "ngSelectMultiple", first: true, predicate: ["ngSelectMultiple"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ml-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n</label>\r\n\r\n<div\r\n [class.input-icon]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.refresh]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted && refresh\"\r\n [class.right]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <div class=\"d-flex\">\r\n <div class=\"position-relative\" [class.app-ng-selec-container]=\"refresh\" [class.w-100]=\"!refresh\">\r\n <!-- tooltip-message es el icono de error -->\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [submitted]=\"submitted\"\r\n [tooltipMessage]=\"tooltipMessage\"></tooltip-message>\r\n <ng-select\r\n #ngSelectMultiple\r\n [class]=\"refresh ? 'app-ng-select' : 'w-100'\"\r\n [items]=\"$any(checkIfObservable(items) ? (items | async) : items)\"\r\n [(ngModel)]=\"_value\"\r\n [readonly]=\"disabled || readonly\"\r\n (change)=\"eventChange($event)\"\r\n (focus)=\"eventFocus($event)\"\r\n (blur)=\"eventBlur($event)\"\r\n (open)=\"handleDropdownOpen()\"\r\n (close)=\"handleDropdownClose()\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [multiple]=\"true\"\r\n placeholder=\"Seleccionar\"\r\n [closeOnSelect]=\"false\"\r\n [appendTo]=\"appendTo\"\r\n [inputAttrs]=\"{ autocomplete: autocomplete }\"\r\n [markFirst]=\"markFirst\"\r\n (keyup.ArrowLeft)=\"leftKeyUp()\"\r\n (keyup.ArrowRight)=\"rightKeyUp()\"\r\n [loading]=\"loading\"\r\n [loadingText]=\"loadingText\"\r\n [clearSearchOnAdd]=\"true\"\r\n [class.ng-select-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.ng-select-touched]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <ng-template ng-header-tmp *ngIf=\"Header\">\r\n <mat-checkbox\r\n class=\"ng-multiselect-checkbox\"\r\n [color]=\"'primary'\"\r\n [(ngModel)]=\"checkedAll\"\r\n [indeterminate]=\"checkedIndeterminate\"\r\n (change)=\"selectAll($event)\">\r\n <span *ngIf=\"!checkedAll\">{{ Language.SelectAll }}</span>\r\n <span *ngIf=\"checkedAll\">{{ Language.UnselectAll }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length != _value.length\">\r\n <div class=\"ng-value\" *ngFor=\"let item of items | slice: 0 : showlimit\">\r\n <span class=\"ng-value-label\"> {{ $any(item).label }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </div>\r\n <div class=\"ng-value\" *ngIf=\"items.length > showlimit\">\r\n <span class=\"ng-value-label\">+{{ items.length - showlimit }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <mat-checkbox class=\"ng-multiselect-checkbox\" id=\"item-{{ index }}\" color=\"primary\" [checked]=\"item$.selected\">\r\n <span data-toggle=\"tooltip\" title=\"{{ item.label }}\">{{ item.label }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length == _value.length\">\r\n <div class=\"ng-value\">\r\n <span class=\"ng-value-label\">{{ Language.All }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-footer-tmp *ngIf=\"Footer\"> {{ Language.Selected }}: {{ _value.length }} </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"app-ng-select-button bd-highlight\" *ngIf=\"refresh\">\r\n <button\r\n *ngIf=\"refresh\"\r\n type=\"button\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"btn btn-info p-0 rounded-0 h-100\"\r\n (click)=\"onRefresh()\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\">refresh</mat-icon> -->\r\n <i class=\"fa fa-refresh text-white px-1\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\"></i>\r\n </button>\r\n </div>\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<!-- error-message es el mansaje que aparece abajo del componente -->\r\n<error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n", styles: ["ng-select-simple{display:block}.sumax-label{color:#646c9a!important}.input-icon tooltip-message{color:#ccc;position:absolute;z-index:3;font-size:16px;text-align:center;right:9px;top:50%;transform:translateY(-50%)}.input-icon.right>.form-control{padding-right:33px;padding-left:12px}.upperCase .ng-select-container .ng-value-container .ng-input>input{text-transform:uppercase}.app-ng-select-button{width:34px}.app-ng-select-button button{width:100%}.app-ng-selec-container{width:calc(100% - 34px)}.app-ng-select-action{width:20%}.app-ng-select-action button{width:50%}.overflow-box{padding:5px;height:100px;border:1px solid #999;overflow:hidden}.ng-dropdown-panel{width:auto!important;max-width:550px;min-width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.errorMessageComponent, selector: "error-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }, { kind: "component", type: i6.tooltipMessageComponent, selector: "tooltip-message", inputs: ["tooltipMessage", "validatorMessage", "controls", "label", "submitted"] }, { kind: "component", type: i7.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i7.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i7.NgMultiLabelTemplateDirective, selector: "[ng-multi-label-tmp]" }, { kind: "directive", type: i7.NgHeaderTemplateDirective, selector: "[ng-header-tmp]" }, { kind: "directive", type: i7.NgFooterTemplateDirective, selector: "[ng-footer-tmp]" }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.SlicePipe, name: "slice" }] }); }
467
504
  }
468
505
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgSelectMultipleComponent, decorators: [{
469
506
  type: Component,
@@ -478,8 +515,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
478
515
  useExisting: forwardRef(() => NgSelectMultipleComponent),
479
516
  multi: true,
480
517
  }
481
- ], template: "<label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ml-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n</label>\r\n\r\n<div\r\n [class.input-icon]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.refresh]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted && refresh\"\r\n [class.right]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <div class=\"d-flex\">\r\n <div class=\"position-relative\" [class.app-ng-selec-container]=\"refresh\" [class.w-100]=\"!refresh\">\r\n <!-- tooltip-message es el icono de error -->\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [submitted]=\"submitted\"\r\n [tooltipMessage]=\"tooltipMessage\"></tooltip-message>\r\n <ng-select\r\n #ngSelectMultiple\r\n [class]=\"refresh ? 'app-ng-select' : 'w-100'\"\r\n [items]=\"$any(checkIfObservable(items) ? (items | async) : items)\"\r\n [(ngModel)]=\"_value\"\r\n [readonly]=\"disabled || readonly\"\r\n (change)=\"eventChange($event)\"\r\n (focus)=\"eventFocus($event)\"\r\n (blur)=\"eventBlur($event)\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [multiple]=\"true\"\r\n placeholder=\"Seleccionar\"\r\n [closeOnSelect]=\"false\"\r\n [appendTo]=\"appendTo\"\r\n [inputAttrs]=\"{ autocomplete: autocomplete }\"\r\n [markFirst]=\"markFirst\"\r\n (keyup.ArrowLeft)=\"leftKeyUp()\"\r\n (keyup.ArrowRight)=\"rightKeyUp()\"\r\n [loading]=\"loading\"\r\n [loadingText]=\"loadingText\"\r\n [clearSearchOnAdd]=\"true\"\r\n [class.ng-select-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.ng-select-touched]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <ng-template ng-header-tmp *ngIf=\"Header\">\r\n <mat-checkbox\r\n class=\"ng-multiselect-checkbox\"\r\n [color]=\"'primary'\"\r\n [(ngModel)]=\"checkedAll\"\r\n [indeterminate]=\"checkedIndeterminate\"\r\n (change)=\"selectAll($event)\">\r\n <span *ngIf=\"!checkedAll\">{{ Language.SelectAll }}</span>\r\n <span *ngIf=\"checkedAll\">{{ Language.UnselectAll }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length != _value.length\">\r\n <div class=\"ng-value\" *ngFor=\"let item of items | slice: 0 : showlimit\">\r\n <span class=\"ng-value-label\"> {{ $any(item).label }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </div>\r\n <div class=\"ng-value\" *ngIf=\"items.length > showlimit\">\r\n <span class=\"ng-value-label\">+{{ items.length - showlimit }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <mat-checkbox class=\"ng-multiselect-checkbox\" id=\"item-{{ index }}\" color=\"primary\" [checked]=\"item$.selected\">\r\n <span data-toggle=\"tooltip\" title=\"{{ item.label }}\">{{ item.label }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length == _value.length\">\r\n <div class=\"ng-value\">\r\n <span class=\"ng-value-label\">{{ Language.All }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-footer-tmp *ngIf=\"Footer\"> {{ Language.Selected }}: {{ _value.length }} </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"app-ng-select-button bd-highlight\" *ngIf=\"refresh\">\r\n <button\r\n *ngIf=\"refresh\"\r\n type=\"button\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"btn btn-info p-0 rounded-0 h-100\"\r\n (click)=\"onRefresh()\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\">refresh</mat-icon> -->\r\n <i class=\"fa fa-refresh text-white px-1\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\"></i>\r\n </button>\r\n </div>\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<!-- error-message es el mansaje que aparece abajo del componente -->\r\n<error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n", styles: ["ng-select-simple{display:block}.sumax-label{color:#646c9a!important}.input-icon tooltip-message{color:#ccc;position:absolute;z-index:3;font-size:16px;text-align:center;right:9px;top:50%;transform:translateY(-50%)}.input-icon.right>.form-control{padding-right:33px;padding-left:12px}.upperCase .ng-select-container .ng-value-container .ng-input>input{text-transform:uppercase}.app-ng-select-button{width:34px}.app-ng-select-button button{width:100%}.app-ng-selec-container{width:calc(100% - 34px)}.app-ng-select-action{width:20%}.app-ng-select-action button{width:50%}.overflow-box{padding:5px;height:100px;border:1px solid #999;overflow:hidden}.ng-dropdown-panel{width:auto!important;max-width:550px;min-width:100%}\n"] }]
482
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.MessageUtilService }, { type: i2.NgSelectMultipleService }], propDecorators: { ngSelectMultiple: [{
518
+ ], template: "<label *ngIf=\"label != null && label != '' && showLabel\" class=\"d-flex sumax-label mb-0 p-0\"\r\n ><span [title]=\"label\" style=\"white-space: nowrap; overflow: hidden; text-overflow: ellipsis\">{{ label }}</span>\r\n <span *ngIf=\"required\" class=\"ml-1\" [class.text-danger]=\"controls?.errors != null\"> *</span>\r\n <span *ngIf=\"labelInfo\">\r\n <i class=\"fa fa-exclamation-circle text-info ms-2\" [matTooltip]=\"textLabelInfo\" matTooltipClass=\"bg-info\"></i>\r\n </span>\r\n</label>\r\n\r\n<div\r\n [class.input-icon]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.refresh]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted && refresh\"\r\n [class.right]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <div class=\"d-flex\">\r\n <div class=\"position-relative\" [class.app-ng-selec-container]=\"refresh\" [class.w-100]=\"!refresh\">\r\n <!-- tooltip-message es el icono de error -->\r\n <tooltip-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [submitted]=\"submitted\"\r\n [tooltipMessage]=\"tooltipMessage\"></tooltip-message>\r\n <ng-select\r\n #ngSelectMultiple\r\n [class]=\"refresh ? 'app-ng-select' : 'w-100'\"\r\n [items]=\"$any(checkIfObservable(items) ? (items | async) : items)\"\r\n [(ngModel)]=\"_value\"\r\n [readonly]=\"disabled || readonly\"\r\n (change)=\"eventChange($event)\"\r\n (focus)=\"eventFocus($event)\"\r\n (blur)=\"eventBlur($event)\"\r\n (open)=\"handleDropdownOpen()\"\r\n (close)=\"handleDropdownClose()\"\r\n [virtualScroll]=\"virtualScroll\"\r\n [multiple]=\"true\"\r\n placeholder=\"Seleccionar\"\r\n [closeOnSelect]=\"false\"\r\n [appendTo]=\"appendTo\"\r\n [inputAttrs]=\"{ autocomplete: autocomplete }\"\r\n [markFirst]=\"markFirst\"\r\n (keyup.ArrowLeft)=\"leftKeyUp()\"\r\n (keyup.ArrowRight)=\"rightKeyUp()\"\r\n [loading]=\"loading\"\r\n [loadingText]=\"loadingText\"\r\n [clearSearchOnAdd]=\"true\"\r\n [class.ng-select-invalid]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\"\r\n [class.ng-select-touched]=\"controls?.errors != null && (controls?.dirty || controls?.touched) && submitted\">\r\n <ng-template ng-header-tmp *ngIf=\"Header\">\r\n <mat-checkbox\r\n class=\"ng-multiselect-checkbox\"\r\n [color]=\"'primary'\"\r\n [(ngModel)]=\"checkedAll\"\r\n [indeterminate]=\"checkedIndeterminate\"\r\n (change)=\"selectAll($event)\">\r\n <span *ngIf=\"!checkedAll\">{{ Language.SelectAll }}</span>\r\n <span *ngIf=\"checkedAll\">{{ Language.UnselectAll }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length != _value.length\">\r\n <div class=\"ng-value\" *ngFor=\"let item of items | slice: 0 : showlimit\">\r\n <span class=\"ng-value-label\"> {{ $any(item).label }}</span>\r\n <span class=\"ng-value-icon right\" (click)=\"clear(item)\" aria-hidden=\"true\">\u00D7</span>\r\n </div>\r\n <div class=\"ng-value\" *ngIf=\"items.length > showlimit\">\r\n <span class=\"ng-value-label\">+{{ items.length - showlimit }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\" let-item$=\"item$\" let-index=\"index\">\r\n <mat-checkbox class=\"ng-multiselect-checkbox\" id=\"item-{{ index }}\" color=\"primary\" [checked]=\"item$.selected\">\r\n <span data-toggle=\"tooltip\" title=\"{{ item.label }}\">{{ item.label }}</span>\r\n </mat-checkbox>\r\n </ng-template>\r\n\r\n <ng-template\r\n ng-multi-label-tmp\r\n let-items=\"items\"\r\n let-clear=\"clear\"\r\n *ngIf=\"$any(checkIfObservable(items) ? (items | async) : items)?.length == _value.length\">\r\n <div class=\"ng-value\">\r\n <span class=\"ng-value-label\">{{ Language.All }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template ng-footer-tmp *ngIf=\"Footer\"> {{ Language.Selected }}: {{ _value.length }} </ng-template>\r\n </ng-select>\r\n </div>\r\n <div class=\"app-ng-select-button bd-highlight\" *ngIf=\"refresh\">\r\n <button\r\n *ngIf=\"refresh\"\r\n type=\"button\"\r\n [disabled]=\"disabled || readonly\"\r\n class=\"btn btn-info p-0 rounded-0 h-100\"\r\n (click)=\"onRefresh()\">\r\n <!-- <mat-icon class=\"text-white pt-1\" style=\"font-size: 18px;\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\">refresh</mat-icon> -->\r\n <i class=\"fa fa-refresh text-white px-1\" [matTooltip]=\"'Refrescar'\" matTooltipClass=\"bg-info\"></i>\r\n </button>\r\n </div>\r\n <ng-content select=\"[more-buttons]\"></ng-content>\r\n </div>\r\n</div>\r\n\r\n<!-- error-message es el mansaje que aparece abajo del componente -->\r\n<error-message\r\n [label]=\"label\"\r\n [controls]=\"controls\"\r\n [validatorMessage]=\"validatorMessage\"\r\n [tooltipMessage]=\"tooltipMessage\"\r\n [submitted]=\"submitted\"></error-message>\r\n", styles: ["ng-select-simple{display:block}.sumax-label{color:#646c9a!important}.input-icon tooltip-message{color:#ccc;position:absolute;z-index:3;font-size:16px;text-align:center;right:9px;top:50%;transform:translateY(-50%)}.input-icon.right>.form-control{padding-right:33px;padding-left:12px}.upperCase .ng-select-container .ng-value-container .ng-input>input{text-transform:uppercase}.app-ng-select-button{width:34px}.app-ng-select-button button{width:100%}.app-ng-selec-container{width:calc(100% - 34px)}.app-ng-select-action{width:20%}.app-ng-select-action button{width:50%}.overflow-box{padding:5px;height:100px;border:1px solid #999;overflow:hidden}.ng-dropdown-panel{width:auto!important;max-width:550px;min-width:100%}\n"] }]
519
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.MessageUtilService }, { type: i2.NgSelectMultipleService }, { type: i0.NgZone }], propDecorators: { ngSelectMultiple: [{
483
520
  type: ViewChild,
484
521
  args: ['ngSelectMultiple']
485
522
  }], items: [{
@@ -540,6 +577,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
540
577
  type: Input
541
578
  }], loadingText: [{
542
579
  type: Input
580
+ }], orderedSelectionTop: [{
581
+ type: Input
543
582
  }], onNext: [{
544
583
  type: Output
545
584
  }], onBack: [{
@@ -553,4 +592,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
553
592
  }], onrefresh: [{
554
593
  type: Output
555
594
  }] } });
556
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2VsZWN0LW11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdW1heC1lcnAtY29tcG9uZW50L3NyYy9saWIvbmctc2VsZWN0LW11bHRpcGxlL25nLXNlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VtYXgtZXJwLWNvbXBvbmVudC9zcmMvbGliL25nLXNlbGVjdC1tdWx0aXBsZS9uZy1zZWxlY3QtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlKLE9BQU8sRUFBbUIsYUFBYSxFQUFFLGlCQUFpQixFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBRXJHLE9BQU8sRUFBNEIsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFvQnJFLE1BQU0sT0FBTyx5QkFBeUI7SUFzU3BDLFlBQ1UsSUFBdUIsRUFDdkIsa0JBQXNDLEVBQ3RDLHVCQUFnRDtRQUZoRCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFwUzFELGFBQVEsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLGNBQVMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEIsdUJBQWtCLEdBQUcsR0FBRyxFQUFFLEdBQUcs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QUFPO3NCQUFmLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBWUcsYUFBYTtzQkFBckIsS0FBSztnQkFPRyxPQUFPO3NCQUFmLEtBQUs7Z0JBT0csV0FBVztzQkFBbkIsS0FBSztnQkFNSSxNQUFNO3NCQUFmLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTTtnQkFNRyxJQUFJO3NCQUFiLE1BQU07Z0JBTUcsT0FBTztzQkFBaEIsTUFBTTtnQkFNRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdTZWxlY3RDb21wb25lbnQgfSBmcm9tICdAbmctc2VsZWN0L25nLXNlbGVjdCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBOZ1NlbGVjdE11bHRpcGxlU2VydmljZSB9IGZyb20gJy4vbmctc2VsZWN0LW11bHRpcGxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaGFyZWRDb21wb25lbnRzVXRpbCB9IGZyb20gJy4uL3V0aWxzL1NoYXJlZENvbXBvbmVudHNVdGlsJztcclxuaW1wb3J0IHsgTWVzc2FnZVV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS11dGlsLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy1zZWxlY3QtbXVsdGlwbGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1zZWxlY3QtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nLXNlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdTZWxlY3RNdWx0aXBsZUNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ1NlbGVjdE11bHRpcGxlQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTZWxlY3RNdWx0aXBsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuXHJcbiAgQFZpZXdDaGlsZCgnbmdTZWxlY3RNdWx0aXBsZScpIG5nU2VsZWN0TXVsdGlwbGUhOiBOZ1NlbGVjdENvbXBvbmVudDtcclxuXHJcbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZSA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIExpc3RhIGRlIGVsZW1lbnRvcyBwYXJhIGVsIHNlbGVjdG9yXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgT2JzZXJ2YWJsZTxhbnlbXT5cclxuICAgKi9cclxuICBASW5wdXQoKSBpdGVtcyE6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBMw61taXRlIGRlIGVsZW1lbnRvcyBhIG1vc3RyYXJcclxuICAgKiBAZGVmYXVsdCAyXHJcbiAgICogQHR5cGUgbnVtYmVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd2xpbWl0OiBudW1iZXIgPSAyO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBsYSB2aXN1YWxpemFjacOzbiBkZWwgdGV4dG8gc3VwZXJpb3IgKGxhYmVsKVxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd0xhYmVsOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVGV4dG8gYSBtb3N0cmFyIGNvbW8gZXRpcXVldGEgZGVsIGNhbXBvXHJcbiAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAqIEB0eXBlIGFueVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBhbnkgPSBudWxsO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxvciBwYXJhIGVsIGF0cmlidXRvIGF1dG9jb21wbGV0ZSBkZWwgaW5wdXRcclxuICAgKiBAZGVmYXVsdCBcIm5vLWF1dG9jb21wbGV0ZS1uZy1zZWxlY3RcIlxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZTogc3RyaW5nID0gXCJuby1hdXRvY29tcGxldGUtbmctc2VsZWN0XCI7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgZWwgZW5jYWJlemFkbyBkZWwgc2VsZWN0b3JcclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIEhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgZWwgcGllIGRlbCBzZWxlY3RvclxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgRm9vdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIGVsIGNhbXBvIGVzIG9ibGlnYXRvcmlvXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNpYSBhbCBzaWd1aWVudGUgY29udHJvbCBwYXJhIG5hdmVnYWNpw7NuXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgbmV4dDogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2lhIGFsIGNvbnRyb2wgYWx0ZXJuYXRpdm8gY3VhbmRvIGVsIHNpZ3VpZW50ZSBlc3TDoSBkZXNoYWJpbGl0YWRvXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgbmV4dElzRGlzYWJsZTogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2lhIGFsIGNvbnRyb2wgYW50ZXJpb3IgcGFyYSBuYXZlZ2FjacOzblxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqIEB0eXBlIGFueVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2s6IGFueTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNpYSBhbCBjb250cm9sIGFsdGVybmF0aXZvIGN1YW5kbyBlbCBhbnRlcmlvciBlc3TDoSBkZXNoYWJpbGl0YWRvXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgYmFja0lzRGlzYWJsZTogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBEZXNoYWJpbGl0YSBlbCBjb250cm9sXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsZWNlIGVsIGNvbnRyb2wgY29tbyBzb2xvIGxlY3R1cmFcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIHNlbGVjdG9yIGFsIHJlY2liaXIgZWwgZm9jb1xyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG9wZW5XaGVuRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTWFyY2EgZWwgcHJpbWVyIGVsZW1lbnRvIGRlIGxhIGxpc3RhXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWFya0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGluZm9ybWFjacOzbiBhZGljaW9uYWwgcGFyYSBsYSBldGlxdWV0YVxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0byBpbmZvcm1hdGl2byBhZGljaW9uYWwgcGFyYSBsYSBldGlxdWV0YVxyXG4gICAqIEBkZWZhdWx0ICcnXHJcbiAgICogQHR5cGUgc3RyaW5nXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGV4dExhYmVsSW5mbzogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgbWVuc2FqZXMgZGUgdmFsaWRhY2nDs25cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2YWxpZGF0b3JNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgbWVuc2FqZXMgZGUgYXl1ZGEgY29tbyB0b29sdGlwc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgdG9vbHRpcE1lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIGFsZXJ0YXMgZGUgdmFsaWRhY2nDs25cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2YWxpZGF0b3JBbGVydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2Egc2kgZWwgZm9ybXVsYXJpbyBoYSBzaWRvIGVudmlhZG8gcGFyYSBtb3N0cmFyIHZhbGlkYWNpb25lc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSBlbCBib3TDs24gZGUgYWN0dWFsaXphclxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIHNlIGVzdMOhIHV0aWxpemFuZG8gcGFyYSBmaWx0cm9zXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSBpc0ZvckZpbHRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRvIGFsIHF1ZSBzZSBhZGp1bnRhcsOhIGVsIGRyb3Bkb3duXHJcbiAgICogQGRlZmF1bHQgXCJib2R5XCJcclxuICAgKiBAdHlwZSBhbnlcclxuICAgKi9cclxuICBASW5wdXQoKSBhcHBlbmRUbzogYW55ID0gXCJib2R5XCI7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRleHRvcyBwZXJzb25hbGl6YWRvcyBwYXJhIGVsIGNvbXBvbmVudGVcclxuICAgKiBAZGVmYXVsdCBcInsgU2VsZWN0ZWQ6ICdTZWxlY2Npb25hZG9zJywgU2VsZWN0QWxsOiAnVE9ET1MnLCBVbnNlbGVjdEFsbDogJ05JTkdVTk8nLCBBbGw6ICdUT0RPUycgfVwiXHJcbiAgICogQHR5cGUgb2JqZWN0XHJcbiAgICovXHJcbiAgQElucHV0KCkgTGFuZ3VhZ2U6IGFueSA9IHtcclxuICAgIFNlbGVjdGVkOiAnU2VsZWNjaW9uYWRvcycsXHJcbiAgICBTZWxlY3RBbGw6ICdUT0RPUycsXHJcbiAgICBVbnNlbGVjdEFsbDogJ05JTkdVTk8nLFxyXG4gICAgQWxsOiAnVE9ET1MnXHJcbiAgfTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgZWwgZGVzcGxhemFtaWVudG8gdmlydHVhbCBwYXJhIGxpc3RhcyBncmFuZGVzXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYSBzaSBlc3TDoSBjYXJnYW5kbyBkYXRvc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRleHRvIGEgbW9zdHJhciBkdXJhbnRlIGxhIGNhcmdhXHJcbiAgICogQGRlZmF1bHQgXCJDYXJnYW5kby4uLlwiXHJcbiAgICogQHR5cGUgc3RyaW5nXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9hZGluZ1RleHQ6IHN0cmluZyA9IFwiQ2FyZ2FuZG8uLi5cIjtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50byBlbWl0aWRvIGFsIG5hdmVnYXIgYWwgc2lndWllbnRlIGNvbnRyb2xcclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbk5leHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudG8gZW1pdGlkbyBhbCBuYXZlZ2FyIGFsIGNvbnRyb2wgYW50ZXJpb3JcclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbkJhY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudG8gZW1pdGlkbyBhbCBjYW1iaWFyIGxhIHNlbGVjY2nDs25cclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudG8gZW1pdGlkbyBhbCBwZXJkZXIgZWwgZm9jb1xyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGJsdXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudG8gZW1pdGlkbyBhbCByZWNpYmlyIGVsIGZvY29cclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbmZvY3VzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnRvIGVtaXRpZG8gYWwgYWN0dWFsaXphclxyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9ucmVmcmVzaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFV0aWxpZGFkIHBhcmEgY29tcG9uZW50ZXMgY29tcGFydGlkb3NcclxuICAgKiBAdHlwZSBTaGFyZWRDb21wb25lbnRzVXRpbFxyXG4gICAqL1xyXG4gIHNoYXJlZENvbXBvbmVudHNVdGlsID0gbmV3IFNoYXJlZENvbXBvbmVudHNVdGlsKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxvciBhY3R1YWwgZGVsIGNvbXBvbmVudGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIF92YWx1ZTogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2lhIGFsIGNvbnRyb2wgZGVsIGZvcm11bGFyaW9cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGNvbnRyb2xzOiBhbnk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIExpc3RhIGNvbXBsZXRhIGRlIGVsZW1lbnRvc1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgYWxsOiBhbnk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYSBzaSB0b2RvcyBsb3MgZWxlbWVudG9zIGVzdMOhbiBzZWxlY2Npb25hZG9zXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBjaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYSBzaSBoYXkgdW5hIHNlbGVjY2nDs24gcGFyY2lhbFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgY2hlY2tlZEluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIExpc3RhIGRlIHN1c2NyaXBjaW9uZXMgcGFyYSBsaW1waWFyIGFsIGRlc3RydWlyIGVsIGNvbXBvbmVudGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcmY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBtZXNzYWdlVXRpbFNlcnZpY2U6IE1lc3NhZ2VVdGlsU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdTZWxlY3RNdWx0aXBsZVNlcnZpY2U6IE5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNob3dsaW1pdCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0U2hvd2xpbWl0KCk7XHJcbiAgICB0aGlzLkhlYWRlciA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0SGVhZGVyKCk7XHJcbiAgICB0aGlzLkZvb3RlciA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0Rm9vdGVyKCk7XHJcbiAgICB0aGlzLnZhbGlkYXRvck1lc3NhZ2UgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldFZhbGlkYXRvck1lc3NhZ2UoKTtcclxuICAgIHRoaXMudG9vbHRpcE1lc3NhZ2UgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldFRvb2x0aXBNZXNzYWdlKCk7XHJcbiAgICB0aGlzLm9wZW5XaGVuRm9jdXMgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldE9wZW5XaGVuRm9jdXMoKTtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRTdWJtaXR0ZWQoKTtcclxuICAgIHRoaXMudmFsaWRhdG9yQWxlcnQgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldFZhbGlkYXRvckFsZXJ0KCk7XHJcbiAgICB0aGlzLmFwcGVuZFRvID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRBcHBlbmRUbygpO1xyXG4gICAgdGhpcy5sb2FkaW5nVGV4dCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0TG9hZGluZ1RleHQoKTtcclxuICAgIHRoaXMubWFya0ZpcnN0ID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRNYXJrRmlyc3QoKTtcclxuICAgIHRoaXMudmlydHVhbFNjcm9sbCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0VmlydHVhbFNjcm9sbCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgYW55IHtcclxuICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9sO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlPyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRpb25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddKSB7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmIChpc09ic2VydmFibGUodGhpcy5pdGVtcykpIHtcclxuICAgICAgICB0aGlzLmNhcmdhKCk7XHJcbiAgICAgICAgLy8gdGhpcy5zZXRBbGwoKTtcclxuICAgICAgICAvLyB0aGlzLml0ZW1zJCA9IHRoaXMuaXRlbXMucGlwZShmaW5hbGl6ZSgoKSA9PiB7XHJcbiAgICAgICAgLy8gICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyAgIHRoaXMuY2RyZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAvLyB9KSkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgLy8gICB0aGlzLmNkcmYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgLy8gfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmFsbCA9IHRoaXMuaXRlbXM7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydzdWJtaXR0ZWQnXSkge1xyXG4gICAgICBpZiAodGhpcy5jb250cm9scyAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbJ3N1Ym1pdHRlZCddLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuY29udHJvbHMubWFya0FzRGlydHkoKTtcclxuICAgICAgICB0aGlzLmNvbnRyb2xzLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FyZ2EoKSB7XHJcbiAgICB0aGlzLmFsbCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMucGlwZShzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlIH0pKTtcclxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5pdGVtcy5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICByZXNvbHZlKHJlcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBWZXJpZmljYSBzaSB1biBvYmpldG8gZXMgdW4gT2JzZXJ2YWJsZVxyXG4gICAqIEBwYXJhbSBpdGVtcyBFbGVtZW50b3MgYSB2ZXJpZmljYXJcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBzaSBlcyBPYnNlcnZhYmxlLCBmYWxzZSBlbiBjYXNvIGNvbnRyYXJpb1xyXG4gICAqL1xyXG4gIGNoZWNrSWZPYnNlcnZhYmxlKGl0ZW1zOiBhbnkpIHtcclxuICAgIGlmIChpc09ic2VydmFibGUoaXRlbXMpKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE1hbmVqYSBlbCBldmVudG8gZGUgZm9jb1xyXG4gICAqIEBwYXJhbSBlIEV2ZW50byBkZSBmb2NvXHJcbiAgICovXHJcbiAgZXZlbnRGb2N1cyhlOiBhbnkpIHtcclxuICAgIHRoaXMub25mb2N1cy5lbWl0KGUpO1xyXG4gICAgaWYgKHRoaXMub3BlbldoZW5Gb2N1cykge1xyXG4gICAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE1hbmVqYSBlbCBldmVudG8gZGUgcMOpcmRpZGEgZGUgZm9jb1xyXG4gICAqIEBwYXJhbSBlIEV2ZW50byBkZSBww6lyZGlkYSBkZSBmb2NvXHJcbiAgICovXHJcbiAgZXZlbnRCbHVyKGU6IGFueSkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICAgIHRoaXMub25WYWxpZGF0aW9uQ2hhbmdlKCk7XHJcbiAgICB0aGlzLmJsdXIuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFc3RhYmxlY2UgZWwgZm9jbyBlbiBlbCBjb21wb25lbnRlXHJcbiAgICovXHJcbiAgZm9jdXMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUuZm9jdXMoKTtcclxuICAgIGlmICh0aGlzLm9wZW5XaGVuRm9jdXMpIHtcclxuICAgICAgdGhpcy5uZ1NlbGVjdE11bHRpcGxlLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE1hbmVqYSBlbCBldmVudG8gZGUgYWN0dWFsaXphY2nDs25cclxuICAgKi9cclxuICBvblJlZnJlc2goKSB7XHJcbiAgICB0aGlzLm9ucmVmcmVzaC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gQ2llcnJhIGVsIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgY2xvc2UgPSAoKSA9PiB7XHJcbiAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUuY2xvc2UoKTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmIChpc09ic2VydmFibGUodGhpcy5pdGVtcykpIHtcclxuICAgICAgLy90aGlzLnNldEFsbCgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuYWxsID0gdGhpcy5pdGVtcztcclxuICAgIH1cclxuICB9XHJcbiAgc2V0QWxsKCkge1xyXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5pdGVtcy5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgdGhpcy5hbGwgPSByZXM7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBbGwoZTogYW55KSB7XHJcbiAgICBpZiAoZS5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLmFsbCk7XHJcbiAgICAgIGlmKHRoaXMuaXNGb3JGaWx0ZXIpe1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5hbGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUoW10pO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKFtdKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hlY2tlZEluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIHRoaXMubmdTZWxlY3RNdWx0aXBsZS5mb2N1cygpO1xyXG4gICAgdGhpcy5jZHJmLm1hcmtGb3JDaGVjaztcclxuICB9XHJcblxyXG4gIGV2ZW50Q2hhbmdlKGU6IGFueSkge1xyXG4gICAgaWYgKGUubGVuZ3RoID09IHRoaXMuYWxsLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmNoZWNrZWRBbGwgPSB0cnVlO1xyXG4gICAgICB0aGlzLmNoZWNrZWRJbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKGUubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2hlY2tlZEluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNoZWNrZWRJbmRldGVybWluYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMud3JpdGVWYWx1ZShlKTtcclxuICAgIHRoaXMub25DaGFuZ2UoZSk7XHJcbiAgICB0aGlzLmNoYW5nZS5lbWl0KGUpO1xyXG5cclxuICB9XHJcblxyXG4gIHJpZ2h0S2V5VXAoKSB7XHJcbiAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUuY2xvc2UoKTtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBsZXQgdmFsaWRhdG9yID0gdGhpcy5zaGFyZWRDb21wb25lbnRzVXRpbC5zdG9wQnlWYWxpZGF0b3IodGhpcy5jb250cm9scywgdGhpcy52YWxpZGF0b3JBbGVydCwgdGhpcy5sYWJlbCk7XHJcbiAgICAgIGlmICh2YWxpZGF0b3IuZXJyb3IpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VVdGlsU2VydmljZS5nZXRNZXNzYWdlRXJyb3IoXCIwMDAwNDZcIiwgXCJFcnJvclwiLCB2YWxpZGF0b3IubWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5uZXh0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5uZXh0LmRpc2FibGVkIHx8IHRoaXMubmV4dC5yZWFkb25seSkge1xyXG4gICAgICAgIGlmICh0aGlzLm5leHRJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLm5leHRJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5uZXh0LmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLm5leHRJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5uZXh0SXNEaXNhYmxlLmZvY3VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbk5leHQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZWZ0S2V5VXAoKSB7XHJcbiAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUuY2xvc2UoKTtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBsZXQgdmFsaWRhdG9yID0gdGhpcy5zaGFyZWRDb21wb25lbnRzVXRpbC5zdG9wQnlWYWxpZGF0b3IodGhpcy5jb250cm9scywgdGhpcy52YWxpZGF0b3JBbGVydCwgdGhpcy5sYWJlbCk7XHJcbiAgICAgIGlmICh2YWxpZGF0b3IuZXJyb3IpIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VVdGlsU2VydmljZS5nZXRNZXNzYWdlRXJyb3IoXCIwMDAwNDZcIiwgXCJFcnJvclwiLCB2YWxpZGF0b3IubWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5iYWNrICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5iYWNrLmRpc2FibGVkIHx8IHRoaXMuYmFjay5yZWFkb25seSkge1xyXG4gICAgICAgIGlmICh0aGlzLmJhY2tJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmJhY2tJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5iYWNrLmZvY3VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmJhY2tJc0Rpc2FibGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5iYWNrSXNEaXNhYmxlLmZvY3VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbkJhY2suZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bGFiZWwgKm5nSWY9XCJsYWJlbCAhPSBudWxsICYmIGxhYmVsICE9ICcnICYmIHNob3dMYWJlbFwiIGNsYXNzPVwiZC1mbGV4IHN1bWF4LWxhYmVsIG1iLTAgcC0wXCJcclxuICA+PHNwYW4gW3RpdGxlXT1cImxhYmVsXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpc1wiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gIDxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cIm1sLTFcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwiY29udHJvbHM/LmVycm9ycyAhPSBudWxsXCI+ICo8L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJsYWJlbEluZm9cIj5cclxuICAgIDxpIGNsYXNzPVwiZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIHRleHQtaW5mbyBtcy0yXCIgW21hdFRvb2x0aXBdPVwidGV4dExhYmVsSW5mb1wiIG1hdFRvb2x0aXBDbGFzcz1cImJnLWluZm9cIj48L2k+XHJcbiAgPC9zcGFuPlxyXG48L2xhYmVsPlxyXG5cclxuPGRpdlxyXG4gIFtjbGFzcy5pbnB1dC1pY29uXT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWRcIlxyXG4gIFtjbGFzcy5yZWZyZXNoXT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWQgJiYgcmVmcmVzaFwiXHJcbiAgW2NsYXNzLnJpZ2h0XT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIiBbY2xhc3MuYXBwLW5nLXNlbGVjLWNvbnRhaW5lcl09XCJyZWZyZXNoXCIgW2NsYXNzLnctMTAwXT1cIiFyZWZyZXNoXCI+XHJcbiAgICAgIDwhLS0gdG9vbHRpcC1tZXNzYWdlIGVzIGVsIGljb25vIGRlIGVycm9yIC0tPlxyXG4gICAgICA8dG9vbHRpcC1tZXNzYWdlXHJcbiAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcclxuICAgICAgICBbY29udHJvbHNdPVwiY29udHJvbHNcIlxyXG4gICAgICAgIFt2YWxpZGF0b3JNZXNzYWdlXT1cInZhbGlkYXRvck1lc3NhZ2VcIlxyXG4gICAgICAgIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcclxuICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwidG9vbHRpcE1lc3NhZ2VcIj48L3Rvb2x0aXAtbWVzc2FnZT5cclxuICAgICAgPG5nLXNlbGVjdFxyXG4gICAgICAgICNuZ1NlbGVjdE11bHRpcGxlXHJcbiAgICAgICAgW2NsYXNzXT1cInJlZnJlc2ggPyAnYXBwLW5nLXNlbGVjdCcgOiAndy0xMDAnXCJcclxuICAgICAgICBbaXRlbXNdPVwiJGFueShjaGVja0lmT2JzZXJ2YWJsZShpdGVtcykgPyAoaXRlbXMgfCBhc3luYykgOiBpdGVtcylcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwiX3ZhbHVlXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxyXG4gICAgICAgIChjaGFuZ2UpPVwiZXZlbnRDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKGZvY3VzKT1cImV2ZW50Rm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgKGJsdXIpPVwiZXZlbnRCbHVyKCRldmVudClcIlxyXG4gICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cInZpcnR1YWxTY3JvbGxcIlxyXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmFyXCJcclxuICAgICAgICBbY2xvc2VPblNlbGVjdF09XCJmYWxzZVwiXHJcbiAgICAgICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcclxuICAgICAgICBbaW5wdXRBdHRyc109XCJ7IGF1dG9jb21wbGV0ZTogYXV0b2NvbXBsZXRlIH1cIlxyXG4gICAgICAgIFttYXJrRmlyc3RdPVwibWFya0ZpcnN0XCJcclxuICAgICAgICAoa2V5dXAuQXJyb3dMZWZ0KT1cImxlZnRLZXlVcCgpXCJcclxuICAgICAgICAoa2V5dXAuQXJyb3dSaWdodCk9XCJyaWdodEtleVVwKClcIlxyXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiXHJcbiAgICAgICAgW2NsZWFyU2VhcmNoT25BZGRdPVwidHJ1ZVwiXHJcbiAgICAgICAgW2NsYXNzLm5nLXNlbGVjdC1pbnZhbGlkXT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgIFtjbGFzcy5uZy1zZWxlY3QtdG91Y2hlZF09XCJjb250cm9scz8uZXJyb3JzICE9IG51bGwgJiYgKGNvbnRyb2xzPy5kaXJ0eSB8fCBjb250cm9scz8udG91Y2hlZCkgJiYgc3VibWl0dGVkXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWhlYWRlci10bXAgKm5nSWY9XCJIZWFkZXJcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgY2xhc3M9XCJuZy1tdWx0aXNlbGVjdC1jaGVja2JveFwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoZWNrZWRBbGxcIlxyXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJjaGVja2VkSW5kZXRlcm1pbmF0ZVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0QWxsKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY2hlY2tlZEFsbFwiPnt7IExhbmd1YWdlLlNlbGVjdEFsbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaGVja2VkQWxsXCI+e3sgTGFuZ3VhZ2UuVW5zZWxlY3RBbGwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgIG5nLW11bHRpLWxhYmVsLXRtcFxyXG4gICAgICAgICAgbGV0LWl0ZW1zPVwiaXRlbXNcIlxyXG4gICAgICAgICAgbGV0LWNsZWFyPVwiY2xlYXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KGNoZWNrSWZPYnNlcnZhYmxlKGl0ZW1zKSA/IChpdGVtcyB8IGFzeW5jKSA6IGl0ZW1zKT8ubGVuZ3RoICE9IF92YWx1ZS5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZy12YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zIHwgc2xpY2U6IDAgOiBzaG93bGltaXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPiB7eyAkYW55KGl0ZW0pLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5nLXZhbHVlLWljb24gcmlnaHRcIiAoY2xpY2spPVwiY2xlYXIoaXRlbSlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXZhbHVlXCIgKm5nSWY9XCJpdGVtcy5sZW5ndGggPiBzaG93bGltaXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPit7eyBpdGVtcy5sZW5ndGggLSBzaG93bGltaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXRlbSQ9XCJpdGVtJFwiIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibmctbXVsdGlzZWxlY3QtY2hlY2tib3hcIiBpZD1cIml0ZW0te3sgaW5kZXggfX1cIiBjb2xvcj1cInByaW1hcnlcIiBbY2hlY2tlZF09XCJpdGVtJC5zZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cInt7IGl0ZW0ubGFiZWwgfX1cIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBuZy1tdWx0aS1sYWJlbC10bXBcclxuICAgICAgICAgIGxldC1pdGVtcz1cIml0ZW1zXCJcclxuICAgICAgICAgIGxldC1jbGVhcj1cImNsZWFyXCJcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShjaGVja0lmT2JzZXJ2YWJsZShpdGVtcykgPyAoaXRlbXMgfCBhc3luYykgOiBpdGVtcyk/Lmxlbmd0aCA9PSBfdmFsdWUubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmctdmFsdWVcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPnt7IExhbmd1YWdlLkFsbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1mb290ZXItdG1wICpuZ0lmPVwiRm9vdGVyXCI+IHt7IExhbmd1YWdlLlNlbGVjdGVkIH19OiB7eyBfdmFsdWUubGVuZ3RoIH19IDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXBwLW5nLXNlbGVjdC1idXR0b24gYmQtaGlnaGxpZ2h0XCIgKm5nSWY9XCJyZWZyZXNoXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAqbmdJZj1cInJlZnJlc2hcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWluZm8gcC0wIHJvdW5kZWQtMCBoLTEwMFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaCgpXCI+XHJcbiAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJ0ZXh0LXdoaXRlIHB0LTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBbbWF0VG9vbHRpcF09XCInUmVmcmVzY2FyJ1wiIG1hdFRvb2x0aXBDbGFzcz1cImJnLWluZm9cIj5yZWZyZXNoPC9tYXQtaWNvbj4gLS0+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoIHRleHQtd2hpdGUgcHgtMVwiIFttYXRUb29sdGlwXT1cIidSZWZyZXNjYXInXCIgbWF0VG9vbHRpcENsYXNzPVwiYmctaW5mb1wiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttb3JlLWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gZXJyb3ItbWVzc2FnZSBlcyBlbCBtYW5zYWplIHF1ZSBhcGFyZWNlIGFiYWpvIGRlbCBjb21wb25lbnRlIC0tPlxyXG48ZXJyb3ItbWVzc2FnZVxyXG4gIFtsYWJlbF09XCJsYWJlbFwiXHJcbiAgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCJcclxuICBbdmFsaWRhdG9yTWVzc2FnZV09XCJ2YWxpZGF0b3JNZXNzYWdlXCJcclxuICBbdG9vbHRpcE1lc3NhZ2VdPVwidG9vbHRpcE1lc3NhZ2VcIlxyXG4gIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCI+PC9lcnJvci1tZXNzYWdlPlxyXG4iXX0=
595
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2VsZWN0LW11bHRpcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdW1heC1lcnAtY29tcG9uZW50L3NyYy9saWIvbmctc2VsZWN0LW11bHRpcGxlL25nLXNlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3VtYXgtZXJwLWNvbXBvbmVudC9zcmMvbGliL25nLXNlbGVjdC1tdWx0aXBsZS9uZy1zZWxlY3QtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBbUIsYUFBYSxFQUFFLGlCQUFpQixFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBRXJHLE9BQU8sRUFBNEIsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFrQnZELE1BQU0sT0FBTyx5QkFBeUI7SUE2U3BDLFlBQ1UsSUFBdUIsRUFDdkIsa0JBQXNDLEVBQ3RDLHVCQUFnRCxFQUNoRCxJQUFZO1FBSFosU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFDdkIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELFNBQUksR0FBSixJQUFJLENBQVE7UUE1U3RCLGFBQVEsR0FBRyxDQUFDLENBQU0s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QUFZO3NCQUFwQixLQUFLO2dCQU9HLE1BQU07c0JBQWQsS0FBSztnQkFPRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxTQUFTO3NCQUFqQixLQUFLO2dCQU9HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csYUFBYTtzQkFBckIsS0FBSztnQkFPRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBT0csY0FBYztzQkFBdEIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQU9HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBT0csUUFBUTtzQkFBaEIsS0FBSztnQkFPRyxRQUFRO3NCQUFoQixLQUFLO2dCQVlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU9HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBT0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQU1JLE1BQU07c0JBQWYsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQU1HLElBQUk7c0JBQWIsTUFBTTtnQkFNRyxPQUFPO3NCQUFoQixNQUFNO2dCQU1HLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE5nU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc2hhcmVSZXBsYXksIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlIH0gZnJvbSAnLi9uZy1zZWxlY3QtbXVsdGlwbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFNoYXJlZENvbXBvbmVudHNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvU2hhcmVkQ29tcG9uZW50c1V0aWwnO1xyXG5pbXBvcnQgeyBNZXNzYWdlVXRpbFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9tZXNzYWdlLXV0aWwuc2VydmljZSc7XHJcbmltcG9ydCB7IE5nU2VsZWN0VXRpbHMgfSBmcm9tICcuLi91dGlscy9OZ1NlbGVjdFV0aWxzJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy1zZWxlY3QtbXVsdGlwbGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1zZWxlY3QtbXVsdGlwbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nLXNlbGVjdC1tdWx0aXBsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdTZWxlY3RNdWx0aXBsZUNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ1NlbGVjdE11bHRpcGxlQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTZWxlY3RNdWx0aXBsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuXHJcbiAgQFZpZXdDaGlsZCgnbmdTZWxlY3RNdWx0aXBsZScpIG5nU2VsZWN0TXVsdGlwbGUhOiBOZ1NlbGVjdENvbXBvbmVudDtcclxuXHJcbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcbiAgb25Ub3VjaGVkID0gKCkgPT4geyB9O1xyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZSA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIExpc3RhIGRlIGVsZW1lbnRvcyBwYXJhIGVsIHNlbGVjdG9yXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgT2JzZXJ2YWJsZTxhbnlbXT5cclxuICAgKi9cclxuICBASW5wdXQoKSBpdGVtcyE6IE9ic2VydmFibGU8YW55W10+O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBMw61taXRlIGRlIGVsZW1lbnRvcyBhIG1vc3RyYXJcclxuICAgKiBAZGVmYXVsdCAyXHJcbiAgICogQHR5cGUgbnVtYmVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd2xpbWl0OiBudW1iZXIgPSAyO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBsYSB2aXN1YWxpemFjacOzbiBkZWwgdGV4dG8gc3VwZXJpb3IgKGxhYmVsKVxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd0xhYmVsOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVGV4dG8gYSBtb3N0cmFyIGNvbW8gZXRpcXVldGEgZGVsIGNhbXBvXHJcbiAgICogQGRlZmF1bHQgbnVsbFxyXG4gICAqIEB0eXBlIGFueVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBhbnkgPSBudWxsO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxvciBwYXJhIGVsIGF0cmlidXRvIGF1dG9jb21wbGV0ZSBkZWwgaW5wdXRcclxuICAgKiBAZGVmYXVsdCBcIm5vLWF1dG9jb21wbGV0ZS1uZy1zZWxlY3RcIlxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZTogc3RyaW5nID0gXCJuby1hdXRvY29tcGxldGUtbmctc2VsZWN0XCI7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgZWwgZW5jYWJlemFkbyBkZWwgc2VsZWN0b3JcclxuICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIEhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgZWwgcGllIGRlbCBzZWxlY3RvclxyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgRm9vdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIGVsIGNhbXBvIGVzIG9ibGlnYXRvcmlvXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNpYSBhbCBzaWd1aWVudGUgY29udHJvbCBwYXJhIG5hdmVnYWNpw7NuXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgbmV4dDogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2lhIGFsIGNvbnRyb2wgYWx0ZXJuYXRpdm8gY3VhbmRvIGVsIHNpZ3VpZW50ZSBlc3TDoSBkZXNoYWJpbGl0YWRvXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgbmV4dElzRGlzYWJsZTogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2lhIGFsIGNvbnRyb2wgYW50ZXJpb3IgcGFyYSBuYXZlZ2FjacOzblxyXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxyXG4gICAqIEB0eXBlIGFueVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhY2s6IGFueTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNpYSBhbCBjb250cm9sIGFsdGVybmF0aXZvIGN1YW5kbyBlbCBhbnRlcmlvciBlc3TDoSBkZXNoYWJpbGl0YWRvXHJcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXHJcbiAgICogQHR5cGUgYW55XHJcbiAgICovXHJcbiAgQElucHV0KCkgYmFja0lzRGlzYWJsZTogYW55O1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBEZXNoYWJpbGl0YSBlbCBjb250cm9sXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsZWNlIGVsIGNvbnRyb2wgY29tbyBzb2xvIGxlY3R1cmFcclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIHNlbGVjdG9yIGFsIHJlY2liaXIgZWwgZm9jb1xyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG9wZW5XaGVuRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTWFyY2EgZWwgcHJpbWVyIGVsZW1lbnRvIGRlIGxhIGxpc3RhXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWFya0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGluZm9ybWFjacOzbiBhZGljaW9uYWwgcGFyYSBsYSBldGlxdWV0YVxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsSW5mbzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBUZXh0byBpbmZvcm1hdGl2byBhZGljaW9uYWwgcGFyYSBsYSBldGlxdWV0YVxyXG4gICAqIEBkZWZhdWx0ICcnXHJcbiAgICogQHR5cGUgc3RyaW5nXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGV4dExhYmVsSW5mbzogc3RyaW5nID0gJyc7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgbWVuc2FqZXMgZGUgdmFsaWRhY2nDs25cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2YWxpZGF0b3JNZXNzYWdlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgbWVuc2FqZXMgZGUgYXl1ZGEgY29tbyB0b29sdGlwc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgdG9vbHRpcE1lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIGFsZXJ0YXMgZGUgdmFsaWRhY2nDs25cclxuICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2YWxpZGF0b3JBbGVydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2Egc2kgZWwgZm9ybXVsYXJpbyBoYSBzaWRvIGVudmlhZG8gcGFyYSBtb3N0cmFyIHZhbGlkYWNpb25lc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc3VibWl0dGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSBlbCBib3TDs24gZGUgYWN0dWFsaXphclxyXG4gICAqIEBkZWZhdWx0IGZhbHNlXHJcbiAgICogQHR5cGUgYm9vbGVhblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIHNlIGVzdMOhIHV0aWxpemFuZG8gcGFyYSBmaWx0cm9zXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSBpc0ZvckZpbHRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEVsZW1lbnRvIGFsIHF1ZSBzZSBhZGp1bnRhcsOhIGVsIGRyb3Bkb3duXHJcbiAgICogQGRlZmF1bHQgXCJib2R5XCJcclxuICAgKiBAdHlwZSBhbnlcclxuICAgKi9cclxuICBASW5wdXQoKSBhcHBlbmRUbzogYW55ID0gXCJib2R5XCI7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRleHRvcyBwZXJzb25hbGl6YWRvcyBwYXJhIGVsIGNvbXBvbmVudGVcclxuICAgKiBAZGVmYXVsdCBcInsgU2VsZWN0ZWQ6ICdTZWxlY2Npb25hZG9zJywgU2VsZWN0QWxsOiAnVE9ET1MnLCBVbnNlbGVjdEFsbDogJ05JTkdVTk8nLCBBbGw6ICdUT0RPUycgfVwiXHJcbiAgICogQHR5cGUgb2JqZWN0XHJcbiAgICovXHJcbiAgQElucHV0KCkgTGFuZ3VhZ2U6IGFueSA9IHtcclxuICAgIFNlbGVjdGVkOiAnU2VsZWNjaW9uYWRvcycsXHJcbiAgICBTZWxlY3RBbGw6ICdUT0RPUycsXHJcbiAgICBVbnNlbGVjdEFsbDogJ05JTkdVTk8nLFxyXG4gICAgQWxsOiAnVE9ET1MnXHJcbiAgfTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgZWwgZGVzcGxhemFtaWVudG8gdmlydHVhbCBwYXJhIGxpc3RhcyBncmFuZGVzXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqIEB0eXBlIGJvb2xlYW5cclxuICAgKi9cclxuICBASW5wdXQoKSB2aXJ0dWFsU2Nyb2xsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEluZGljYSBzaSBlc3TDoSBjYXJnYW5kbyBkYXRvc1xyXG4gICAqIEBkZWZhdWx0IHRydWVcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRleHRvIGEgbW9zdHJhciBkdXJhbnRlIGxhIGNhcmdhXHJcbiAgICogQGRlZmF1bHQgXCJDYXJnYW5kby4uLlwiXHJcbiAgICogQHR5cGUgc3RyaW5nXHJcbiAgICovXHJcbiAgQElucHV0KCkgbG9hZGluZ1RleHQ6IHN0cmluZyA9IFwiQ2FyZ2FuZG8uLi5cIjtcclxuXHJcbiAgIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIGxvcyBlbGVtZW50b3Mgc2VsZWNjaW9uYWRvcyBhbCBpbmljaW8gZGUgbGEgbGlzdGEuXHJcbiAgICogQGRlZmF1bHQgZmFsc2VcclxuICAgKiBAdHlwZSBib29sZWFuXHJcbiAgICovXHJcbiAgQElucHV0KCkgb3JkZXJlZFNlbGVjdGlvblRvcCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnRvIGVtaXRpZG8gYWwgbmF2ZWdhciBhbCBzaWd1aWVudGUgY29udHJvbFxyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uTmV4dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50byBlbWl0aWRvIGFsIG5hdmVnYXIgYWwgY29udHJvbCBhbnRlcmlvclxyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uQmFjazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50byBlbWl0aWRvIGFsIGNhbWJpYXIgbGEgc2VsZWNjacOzblxyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50byBlbWl0aWRvIGFsIHBlcmRlciBlbCBmb2NvXHJcbiAgICogQHR5cGUgRXZlbnRFbWl0dGVyPGFueT5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEV2ZW50byBlbWl0aWRvIGFsIHJlY2liaXIgZWwgZm9jb1xyXG4gICAqIEB0eXBlIEV2ZW50RW1pdHRlcjxhbnk+XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uZm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudG8gZW1pdGlkbyBhbCBhY3R1YWxpemFyXHJcbiAgICogQHR5cGUgRXZlbnRFbWl0dGVyPGFueT5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgb25yZWZyZXNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVXRpbGlkYWQgcGFyYSBjb21wb25lbnRlcyBjb21wYXJ0aWRvc1xyXG4gICAqIEB0eXBlIFNoYXJlZENvbXBvbmVudHNVdGlsXHJcbiAgICovXHJcbiAgc2hhcmVkQ29tcG9uZW50c1V0aWwgPSBuZXcgU2hhcmVkQ29tcG9uZW50c1V0aWwoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFZhbG9yIGFjdHVhbCBkZWwgY29tcG9uZW50ZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgX3ZhbHVlOiBhbnk7XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFJlZmVyZW5jaWEgYWwgY29udHJvbCBkZWwgZm9ybXVsYXJpb1xyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgY29udHJvbHM6IGFueTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTGlzdGEgY29tcGxldGEgZGUgZWxlbWVudG9zXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBhbGw6IGFueTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIHRvZG9zIGxvcyBlbGVtZW50b3MgZXN0w6FuIHNlbGVjY2lvbmFkb3NcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIGNoZWNrZWRBbGwgPSBmYWxzZTtcclxuICBcclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gSW5kaWNhIHNpIGhheSB1bmEgc2VsZWNjacOzbiBwYXJjaWFsXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBjaGVja2VkSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgc3VzY3JpcGNpb25lcyBwYXJhIGxpbXBpYXIgYWwgZGVzdHJ1aXIgZWwgY29tcG9uZW50ZVxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIG1lc3NhZ2VVdGlsU2VydmljZTogTWVzc2FnZVV0aWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuZ1NlbGVjdE11bHRpcGxlU2VydmljZTogTmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxyXG4gICkge1xyXG4gICAgdGhpcy5zaG93bGltaXQgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldFNob3dsaW1pdCgpO1xyXG4gICAgdGhpcy5IZWFkZXIgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldEhlYWRlcigpO1xyXG4gICAgdGhpcy5Gb290ZXIgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldEZvb3RlcigpO1xyXG4gICAgdGhpcy52YWxpZGF0b3JNZXNzYWdlID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRWYWxpZGF0b3JNZXNzYWdlKCk7XHJcbiAgICB0aGlzLnRvb2x0aXBNZXNzYWdlID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRUb29sdGlwTWVzc2FnZSgpO1xyXG4gICAgdGhpcy5vcGVuV2hlbkZvY3VzID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRPcGVuV2hlbkZvY3VzKCk7XHJcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0U3VibWl0dGVkKCk7XHJcbiAgICB0aGlzLnZhbGlkYXRvckFsZXJ0ID0gdGhpcy5uZ1NlbGVjdE11bHRpcGxlU2VydmljZS5nZXRWYWxpZGF0b3JBbGVydCgpO1xyXG4gICAgdGhpcy5hcHBlbmRUbyA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0QXBwZW5kVG8oKTtcclxuICAgIHRoaXMubG9hZGluZ1RleHQgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldExvYWRpbmdUZXh0KCk7XHJcbiAgICB0aGlzLm1hcmtGaXJzdCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZVNlcnZpY2UuZ2V0TWFya0ZpcnN0KCk7XHJcbiAgICB0aGlzLnZpcnR1YWxTY3JvbGwgPSB0aGlzLm5nU2VsZWN0TXVsdGlwbGVTZXJ2aWNlLmdldFZpcnR1YWxTY3JvbGwoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IGFueSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbDtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZT8oZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25WYWxpZGF0aW9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICBpZiAoaXNPYnNlcnZhYmxlKHRoaXMuaXRlbXMpKSB7XHJcbiAgICAgICAgdGhpcy5jYXJnYSgpO1xyXG4gICAgICAgIC8vIHRoaXMuc2V0QWxsKCk7XHJcbiAgICAgICAgLy8gdGhpcy5pdGVtcyQgPSB0aGlzLml0ZW1zLnBpcGUoZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgIC8vICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLy8gICB0aGlzLmNkcmYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgLy8gfSkpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIC8vICAgdGhpcy5jZHJmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hbGwgPSB0aGlzLml0ZW1zO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snc3VibWl0dGVkJ10pIHtcclxuICAgICAgaWYgKHRoaXMuY29udHJvbHMgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydzdWJtaXR0ZWQnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xzLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgdGhpcy5jb250cm9scy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGNhcmdhKCkge1xyXG4gICAgdGhpcy5hbGwgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnBpcGUoc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSB9KSk7XHJcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuaXRlbXMuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXMpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gVmVyaWZpY2Egc2kgdW4gb2JqZXRvIGVzIHVuIE9ic2VydmFibGVcclxuICAgKiBAcGFyYW0gaXRlbXMgRWxlbWVudG9zIGEgdmVyaWZpY2FyXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgc2kgZXMgT2JzZXJ2YWJsZSwgZmFsc2UgZW4gY2FzbyBjb250cmFyaW9cclxuICAgKi9cclxuICBjaGVja0lmT2JzZXJ2YWJsZShpdGVtczogYW55KSB7XHJcbiAgICBpZiAoaXNPYnNlcnZhYmxlKGl0ZW1zKSlcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBNYW5lamEgZWwgZXZlbnRvIGRlIGZvY29cclxuICAgKiBAcGFyYW0gZSBFdmVudG8gZGUgZm9jb1xyXG4gICAqL1xyXG4gIGV2ZW50Rm9jdXMoZTogYW55KSB7XHJcbiAgICB0aGlzLm9uZm9jdXMuZW1pdChlKTtcclxuICAgIGlmICh0aGlzLm9wZW5XaGVuRm9jdXMpIHtcclxuICAgICAgdGhpcy5uZ1NlbGVjdE11bHRpcGxlLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZURyb3Bkb3duT3BlbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcmRlcmVkU2VsZWN0aW9uVG9wKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pdGVtcy5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoYWxsT3B0aW9ucykgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9ICh0aGlzLl92YWx1ZSA/PyBbXSlcclxuICAgICAgICAubWFwKChzZWxlY3RlZEl0ZW06IHsgdmFsdWU6IGFueSB9KSA9PiBzZWxlY3RlZEl0ZW0udmFsdWUpXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbVZhbHVlOiBudWxsKSA9PiBpdGVtVmFsdWUgIT09IG51bGwpIGFzIChzdHJpbmcgfCBudW1iZXIpW107XHJcblxyXG4gICAgICBOZ1NlbGVjdFV0aWxzLnJlb3JkZXJJdGVtcyhhbGxPcHRpb25zLCBzZWxlY3RlZFZhbHVlcywgKHJlb3JkZXJlZE9wdGlvbnMpID0+IHtcclxuICAgICAgICB0aGlzLml0ZW1zID0gb2YocmVvcmRlcmVkT3B0aW9ucyk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMubmdTZWxlY3RNdWx0aXBsZT8uZHJvcGRvd25QYW5lbD8uc2Nyb2xsRWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHBhbmVsKSB7XHJcbiAgICAgICAgICAgICAgcGFuZWwuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRHJvcGRvd25DbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5vcmRlcmVkU2VsZWN0aW9uVG9wKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pdGVtcy5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoYWxsT3B0aW9ucykgPT4ge1xyXG4gICAgICBOZ1NlbGVjdFV0aWxzLnJlb3JkZXJJdGVtcyhcclxuICAgICAgICBhbGxPcHRpb25zLFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIChyZW9yZGVyZWRPcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1zID0gb2YocmVvcmRlcmVkT3B0aW9ucyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTWFuZWphIGVsIGV2ZW50byBkZSBww6lyZGlkYSBkZSBmb2NvXHJcbiAgICogQHBhcmFtIGUgRXZlbnRvIGRlIHDDqXJkaWRhIGRlIGZvY29cclxuICAgKi9cclxuICBldmVudEJsdXIoZTogYW55KSB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5vblZhbGlkYXRpb25DaGFuZ2UoKTtcclxuICAgIHRoaXMuYmx1ci5lbWl0KGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIEVzdGFibGVjZSBlbCBmb2NvIGVuIGVsIGNvbXBvbmVudGVcclxuICAgKi9cclxuICBmb2N1cyA9ICgpID0+IHtcclxuICAgIHRoaXMubmdTZWxlY3RNdWx0aXBsZS5mb2N1cygpO1xyXG4gICAgaWYgKHRoaXMub3BlbldoZW5Gb2N1cykge1xyXG4gICAgICB0aGlzLm5nU2VsZWN0TXVsdGlwbGUub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gTWFuZWphIGVsIGV2ZW50byBkZSBhY3R1YWxpemFjacOzblxyXG4gICAqL1xyXG4gIG9uUmVmcmVzaCgpIHtcclxuICAgIHRoaXMub25yZWZyZXNoLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBDaWVycmEgZWwgZHJvcGRvd25cclxuICAgKi9cclxuICBjbG9zZSA9ICgpID0+IHtcclxuICAgIHRoaXMubmdTZWxlY3RNdWx0aXBsZS5jbG9zZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh0aGlzLml0ZW1zKSkge1xyXG4gICAgICAvL3RoaXMuc2V0QWxsKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hbGwgPSB0aGlzLml0ZW1zO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXRBbGwoKSB7XHJcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLml0ZW1zLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICB0aGlzLmFsbCA9IHJlcztcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl92YWx1ZSA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbChlOiBhbnkpIHtcclxuICAgIGlmIChlLmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuYWxsKTtcclxuICAgICAgaWYodGhpcy5pc0ZvckZpbHRlcil7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmFsbCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShbXSk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UoW10pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja2VkSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5uZ1NlbGVjdE11bHRpcGxlLmZvY3VzKCk7XHJcbiAgICB0aGlzLmNkcmYubWFya0ZvckNoZWNrO1xyXG4gIH1cclxuXHJcbiAgZXZlbnRDaGFuZ2UoZTogYW55KSB7XHJcbiAgICBpZiAoZS5sZW5ndGggPT0gdGhpcy5hbGwubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2hlY2tlZEluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoZS5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLmNoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jaGVja2VkSW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2hlY2tlZEluZGV0ZXJtaW5hdGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy53cml0ZVZhbHVlKGUpO1xyXG4gICAgdGhpcy5vbkNoYW5nZShlKTtcclxuICAgIHRoaXMuY2hhbmdlLmVtaXQoZSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcmlnaHRLZXlVcCgpIHtcclxuICAgIHRoaXMubmdTZWxlY3RNdWx0aXBsZS5jbG9zZSgpO1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGxldCB2YWxpZGF0b3IgPSB0aGlzLnNoYXJlZENvbXBvbmVudHNVdGlsLnN0b3BCeVZhbGlkYXRvcih0aGlzLmNvbnRyb2xzLCB0aGlzLnZhbGlkYXRvckFsZXJ0LCB0aGlzLmxhYmVsKTtcclxuICAgICAgaWYgKHZhbGlkYXRvci5lcnJvcikge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVV0aWxTZXJ2aWNlLmdldE1lc3NhZ2VFcnJvcihcIjAwMDA0NlwiLCBcIkVycm9yXCIsIHZhbGlkYXRvci5tZXNzYWdlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLm5leHQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh0aGlzLm5leHQuZGlzYWJsZWQgfHwgdGhpcy5uZXh0LnJlYWRvbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMubmV4dElzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMubmV4dElzRGlzYWJsZS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5leHQuZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMubmV4dElzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLm5leHRJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9uTmV4dC5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxlZnRLZXlVcCgpIHtcclxuICAgIHRoaXMubmdTZWxlY3RNdWx0aXBsZS5jbG9zZSgpO1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGxldCB2YWxpZGF0b3IgPSB0aGlzLnNoYXJlZENvbXBvbmVudHNVdGlsLnN0b3BCeVZhbGlkYXRvcih0aGlzLmNvbnRyb2xzLCB0aGlzLnZhbGlkYXRvckFsZXJ0LCB0aGlzLmxhYmVsKTtcclxuICAgICAgaWYgKHZhbGlkYXRvci5lcnJvcikge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVV0aWxTZXJ2aWNlLmdldE1lc3NhZ2VFcnJvcihcIjAwMDA0NlwiLCBcIkVycm9yXCIsIHZhbGlkYXRvci5tZXNzYWdlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmJhY2sgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh0aGlzLmJhY2suZGlzYWJsZWQgfHwgdGhpcy5iYWNrLnJlYWRvbmx5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmFja0lzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuYmFja0lzRGlzYWJsZS5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmJhY2suZm9jdXMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuYmFja0lzRGlzYWJsZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLmJhY2tJc0Rpc2FibGUuZm9jdXMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm9uQmFjay5lbWl0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcbiIsIjxsYWJlbCAqbmdJZj1cImxhYmVsICE9IG51bGwgJiYgbGFiZWwgIT0gJycgJiYgc2hvd0xhYmVsXCIgY2xhc3M9XCJkLWZsZXggc3VtYXgtbGFiZWwgbWItMCBwLTBcIlxyXG4gID48c3BhbiBbdGl0bGVdPVwibGFiZWxcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBub3dyYXA7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgPHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwibWwtMVwiIFtjbGFzcy50ZXh0LWRhbmdlcl09XCJjb250cm9scz8uZXJyb3JzICE9IG51bGxcIj4gKjwvc3Bhbj5cclxuICA8c3BhbiAqbmdJZj1cImxhYmVsSW5mb1wiPlxyXG4gICAgPGkgY2xhc3M9XCJmYSBmYS1leGNsYW1hdGlvbi1jaXJjbGUgdGV4dC1pbmZvIG1zLTJcIiBbbWF0VG9vbHRpcF09XCJ0ZXh0TGFiZWxJbmZvXCIgbWF0VG9vbHRpcENsYXNzPVwiYmctaW5mb1wiPjwvaT5cclxuICA8L3NwYW4+XHJcbjwvbGFiZWw+XHJcblxyXG48ZGl2XHJcbiAgW2NsYXNzLmlucHV0LWljb25dPVwiY29udHJvbHM/LmVycm9ycyAhPSBudWxsICYmIChjb250cm9scz8uZGlydHkgfHwgY29udHJvbHM/LnRvdWNoZWQpICYmIHN1Ym1pdHRlZFwiXHJcbiAgW2NsYXNzLnJlZnJlc2hdPVwiY29udHJvbHM/LmVycm9ycyAhPSBudWxsICYmIChjb250cm9scz8uZGlydHkgfHwgY29udHJvbHM/LnRvdWNoZWQpICYmIHN1Ym1pdHRlZCAmJiByZWZyZXNoXCJcclxuICBbY2xhc3MucmlnaHRdPVwiY29udHJvbHM/LmVycm9ycyAhPSBudWxsICYmIChjb250cm9scz8uZGlydHkgfHwgY29udHJvbHM/LnRvdWNoZWQpICYmIHN1Ym1pdHRlZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiIFtjbGFzcy5hcHAtbmctc2VsZWMtY29udGFpbmVyXT1cInJlZnJlc2hcIiBbY2xhc3Mudy0xMDBdPVwiIXJlZnJlc2hcIj5cclxuICAgICAgPCEtLSB0b29sdGlwLW1lc3NhZ2UgZXMgZWwgaWNvbm8gZGUgZXJyb3IgLS0+XHJcbiAgICAgIDx0b29sdGlwLW1lc3NhZ2VcclxuICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxyXG4gICAgICAgIFtjb250cm9sc109XCJjb250cm9sc1wiXHJcbiAgICAgICAgW3ZhbGlkYXRvck1lc3NhZ2VdPVwidmFsaWRhdG9yTWVzc2FnZVwiXHJcbiAgICAgICAgW3N1Ym1pdHRlZF09XCJzdWJtaXR0ZWRcIlxyXG4gICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCJ0b29sdGlwTWVzc2FnZVwiPjwvdG9vbHRpcC1tZXNzYWdlPlxyXG4gICAgICA8bmctc2VsZWN0XHJcbiAgICAgICAgI25nU2VsZWN0TXVsdGlwbGVcclxuICAgICAgICBbY2xhc3NdPVwicmVmcmVzaCA/ICdhcHAtbmctc2VsZWN0JyA6ICd3LTEwMCdcIlxyXG4gICAgICAgIFtpdGVtc109XCIkYW55KGNoZWNrSWZPYnNlcnZhYmxlKGl0ZW1zKSA/IChpdGVtcyB8IGFzeW5jKSA6IGl0ZW1zKVwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJfdmFsdWVcIlxyXG4gICAgICAgIFtyZWFkb25seV09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXHJcbiAgICAgICAgKGNoYW5nZSk9XCJldmVudENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAoZm9jdXMpPVwiZXZlbnRGb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAoYmx1cik9XCJldmVudEJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9wZW4pPVwiaGFuZGxlRHJvcGRvd25PcGVuKClcIlxyXG4gICAgICAgIChjbG9zZSk9XCJoYW5kbGVEcm9wZG93bkNsb3NlKClcIlxyXG4gICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cInZpcnR1YWxTY3JvbGxcIlxyXG4gICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmFyXCJcclxuICAgICAgICBbY2xvc2VPblNlbGVjdF09XCJmYWxzZVwiXHJcbiAgICAgICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcclxuICAgICAgICBbaW5wdXRBdHRyc109XCJ7IGF1dG9jb21wbGV0ZTogYXV0b2NvbXBsZXRlIH1cIlxyXG4gICAgICAgIFttYXJrRmlyc3RdPVwibWFya0ZpcnN0XCJcclxuICAgICAgICAoa2V5dXAuQXJyb3dMZWZ0KT1cImxlZnRLZXlVcCgpXCJcclxuICAgICAgICAoa2V5dXAuQXJyb3dSaWdodCk9XCJyaWdodEtleVVwKClcIlxyXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAgIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiXHJcbiAgICAgICAgW2NsZWFyU2VhcmNoT25BZGRdPVwidHJ1ZVwiXHJcbiAgICAgICAgW2NsYXNzLm5nLXNlbGVjdC1pbnZhbGlkXT1cImNvbnRyb2xzPy5lcnJvcnMgIT0gbnVsbCAmJiAoY29udHJvbHM/LmRpcnR5IHx8IGNvbnRyb2xzPy50b3VjaGVkKSAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgIFtjbGFzcy5uZy1zZWxlY3QtdG91Y2hlZF09XCJjb250cm9scz8uZXJyb3JzICE9IG51bGwgJiYgKGNvbnRyb2xzPy5kaXJ0eSB8fCBjb250cm9scz8udG91Y2hlZCkgJiYgc3VibWl0dGVkXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWhlYWRlci10bXAgKm5nSWY9XCJIZWFkZXJcIj5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgY2xhc3M9XCJuZy1tdWx0aXNlbGVjdC1jaGVja2JveFwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCIncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoZWNrZWRBbGxcIlxyXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJjaGVja2VkSW5kZXRlcm1pbmF0ZVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0QWxsKCRldmVudClcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhY2hlY2tlZEFsbFwiPnt7IExhbmd1YWdlLlNlbGVjdEFsbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjaGVja2VkQWxsXCI+e3sgTGFuZ3VhZ2UuVW5zZWxlY3RBbGwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgIG5nLW11bHRpLWxhYmVsLXRtcFxyXG4gICAgICAgICAgbGV0LWl0ZW1zPVwiaXRlbXNcIlxyXG4gICAgICAgICAgbGV0LWNsZWFyPVwiY2xlYXJcIlxyXG4gICAgICAgICAgKm5nSWY9XCIkYW55KGNoZWNrSWZPYnNlcnZhYmxlKGl0ZW1zKSA/IChpdGVtcyB8IGFzeW5jKSA6IGl0ZW1zKT8ubGVuZ3RoICE9IF92YWx1ZS5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZy12YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zIHwgc2xpY2U6IDAgOiBzaG93bGltaXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPiB7eyAkYW55KGl0ZW0pLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5nLXZhbHVlLWljb24gcmlnaHRcIiAoY2xpY2spPVwiY2xlYXIoaXRlbSlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLXZhbHVlXCIgKm5nSWY9XCJpdGVtcy5sZW5ndGggPiBzaG93bGltaXRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPit7eyBpdGVtcy5sZW5ndGggLSBzaG93bGltaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbmctb3B0aW9uLXRtcCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaXRlbSQ9XCJpdGVtJFwiIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwibmctbXVsdGlzZWxlY3QtY2hlY2tib3hcIiBpZD1cIml0ZW0te3sgaW5kZXggfX1cIiBjb2xvcj1cInByaW1hcnlcIiBbY2hlY2tlZF09XCJpdGVtJC5zZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cInt7IGl0ZW0ubGFiZWwgfX1cIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICBuZy1tdWx0aS1sYWJlbC10bXBcclxuICAgICAgICAgIGxldC1pdGVtcz1cIml0ZW1zXCJcclxuICAgICAgICAgIGxldC1jbGVhcj1cImNsZWFyXCJcclxuICAgICAgICAgICpuZ0lmPVwiJGFueShjaGVja0lmT2JzZXJ2YWJsZShpdGVtcykgPyAoaXRlbXMgfCBhc3luYykgOiBpdGVtcyk/Lmxlbmd0aCA9PSBfdmFsdWUubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmctdmFsdWVcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuZy12YWx1ZS1sYWJlbFwiPnt7IExhbmd1YWdlLkFsbCB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBuZy1mb290ZXItdG1wICpuZ0lmPVwiRm9vdGVyXCI+IHt7IExhbmd1YWdlLlNlbGVjdGVkIH19OiB7eyBfdmFsdWUubGVuZ3RoIH19IDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXBwLW5nLXNlbGVjdC1idXR0b24gYmQtaGlnaGxpZ2h0XCIgKm5nSWY9XCJyZWZyZXNoXCI+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAqbmdJZj1cInJlZnJlc2hcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWluZm8gcC0wIHJvdW5kZWQtMCBoLTEwMFwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaCgpXCI+XHJcbiAgICAgICAgPCEtLSA8bWF0LWljb24gY2xhc3M9XCJ0ZXh0LXdoaXRlIHB0LTFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIiBbbWF0VG9vbHRpcF09XCInUmVmcmVzY2FyJ1wiIG1hdFRvb2x0aXBDbGFzcz1cImJnLWluZm9cIj5yZWZyZXNoPC9tYXQtaWNvbj4gLS0+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoIHRleHQtd2hpdGUgcHgtMVwiIFttYXRUb29sdGlwXT1cIidSZWZyZXNjYXInXCIgbWF0VG9vbHRpcENsYXNzPVwiYmctaW5mb1wiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttb3JlLWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gZXJyb3ItbWVzc2FnZSBlcyBlbCBtYW5zYWplIHF1ZSBhcGFyZWNlIGFiYWpvIGRlbCBjb21wb25lbnRlIC0tPlxyXG48ZXJyb3ItbWVzc2FnZVxyXG4gIFtsYWJlbF09XCJsYWJlbFwiXHJcbiAgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCJcclxuICBbdmFsaWRhdG9yTWVzc2FnZV09XCJ2YWxpZGF0b3JNZXNzYWdlXCJcclxuICBbdG9vbHRpcE1lc3NhZ2VdPVwidG9vbHRpcE1lc3NhZ2VcIlxyXG4gIFtzdWJtaXR0ZWRdPVwic3VibWl0dGVkXCI+PC9lcnJvci1tZXNzYWdlPlxyXG4iXX0=