@fundamental-ngx/core 0.43.30 → 0.43.32

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.
@@ -210,7 +210,7 @@ export declare class ComboboxComponent implements ComboboxInterface, SingleDropd
210
210
  /** @hidden */
211
211
  ngAfterViewInit(): void;
212
212
  /** @hidden */
213
- onInputKeydownHandler(event: KeyboardEvent): void;
213
+ onInputKeydownHandler(event: KeyboardEvent | string): void;
214
214
  /** @hidden */
215
215
  onItemKeyDownHandler(event: KeyboardEvent, value: any): void;
216
216
  /** @hidden */
@@ -209,43 +209,50 @@ export class ComboboxComponent {
209
209
  if (this.readOnly) {
210
210
  return;
211
211
  }
212
- if (KeyUtil.isKeyCode(event, TAB) && this.open) {
213
- this._close();
214
- return;
215
- }
216
- if (KeyUtil.isKeyCode(event, ENTER)) {
217
- if (this.searchFn) {
218
- this.searchFn();
212
+ if (typeof event === 'string') {
213
+ if (event === 'pasteEvent') {
214
+ this.isOpenChangeHandle(true);
219
215
  }
220
216
  }
221
- else if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {
222
- if (event.altKey) {
223
- this._resetDisplayedValues();
224
- this.isOpenChangeHandle(true);
217
+ else {
218
+ if (KeyUtil.isKeyCode(event, TAB) && this.open) {
219
+ this._close();
220
+ return;
225
221
  }
226
- if (this.open && this.listComponent) {
227
- this.listComponent.setItemActive(0);
222
+ if (KeyUtil.isKeyCode(event, ENTER)) {
223
+ if (this.searchFn) {
224
+ this.searchFn();
225
+ }
228
226
  }
229
- else if (!this.open) {
230
- this._chooseOtherItem(1);
227
+ else if (KeyUtil.isKeyCode(event, DOWN_ARROW)) {
228
+ if (event.altKey) {
229
+ this._resetDisplayedValues();
230
+ this.isOpenChangeHandle(true);
231
+ }
232
+ if (this.open && this.listComponent) {
233
+ this.listComponent.setItemActive(0);
234
+ }
235
+ else if (!this.open) {
236
+ this._chooseOtherItem(1);
237
+ }
238
+ event.preventDefault();
231
239
  }
232
- event.preventDefault();
233
- }
234
- else if (KeyUtil.isKeyCode(event, UP_ARROW)) {
235
- this._chooseOtherItem(-1);
236
- event.preventDefault();
237
- }
238
- else if (KeyUtil.isKeyCode(event, this.closingKeys)) {
239
- this.isOpenChangeHandle(false);
240
- event.stopPropagation();
241
- }
242
- else if (this.openOnKeyboardEvent &&
243
- !event.ctrlKey &&
244
- !event.altKey &&
245
- !KeyUtil.isKeyCode(event, this.nonOpeningKeys)) {
246
- this.isOpenChangeHandle(true);
247
- if (this.isEmptyValue && KeyUtil.isKeyType(event, 'control') && !KeyUtil.isKeyCode(event, BACKSPACE)) {
248
- this.listComponent.setItemActive(0);
240
+ else if (KeyUtil.isKeyCode(event, UP_ARROW)) {
241
+ this._chooseOtherItem(-1);
242
+ event.preventDefault();
243
+ }
244
+ else if (KeyUtil.isKeyCode(event, this.closingKeys)) {
245
+ this.isOpenChangeHandle(false);
246
+ event.stopPropagation();
247
+ }
248
+ else if (this.openOnKeyboardEvent &&
249
+ !event.ctrlKey &&
250
+ !event.altKey &&
251
+ !KeyUtil.isKeyCode(event, this.nonOpeningKeys)) {
252
+ this.isOpenChangeHandle(true);
253
+ if (this.isEmptyValue && KeyUtil.isKeyType(event, 'control') && !KeyUtil.isKeyCode(event, BACKSPACE)) {
254
+ this.listComponent.setItemActive(0);
255
+ }
249
256
  }
250
257
  }
251
258
  }
@@ -537,7 +544,7 @@ ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
537
544
  provide: FD_COMBOBOX_COMPONENT,
538
545
  useExisting: ComboboxComponent
539
546
  }
540
- ], queries: [{ propertyName: "listMessages", predicate: FD_LIST_MESSAGE_DIRECTIVE }], viewQueries: [{ propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true }, { propertyName: "popoverComponent", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "inputGroup", first: true, predicate: InputGroupComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["controlTemplate"], descendants: true }, { propertyName: "listTemplate", first: true, predicate: ["listTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"mobile ? mobileTemplate : desktopTemplate\"></ng-container>\n\n<ng-template #desktopTemplate>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [class.fd-combobox-full-width]=\"isSearch\"\n [isOpen]=\"open && displayedValues && displayedValues.length > 0\"\n (isOpenChange)=\"isOpenChangeHandle($event)\"\n [fillControlMode]=\"fillControlMode\"\n [scrollStrategy]=\"_repositionScrollStrategy\"\n [focusTrapped]=\"true\"\n [triggers]=\"triggers\"\n [disabled]=\"disabled || readOnly\"\n [maxWidth]=\"640\"\n [closeOnOutsideClick]=\"closeOnOutsideClick\"\n >\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </fd-popover-control>\n <fd-popover-body [hidden]=\"!displayedValues.length\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template let-term=\"term\" #itemSource>\n <span\n fd-list-title\n *ngIf=\"!itemTemplate; else customRendererTemplate\"\n [innerHTML]=\"term | displayFnPipe : displayFn | highlight : inputText : highlighting && filterHighlight\"\n fdTruncatedTitle\n >\n </span>\n <ng-template #customRendererTemplate>\n <ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: term }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #mobileTemplate>\n <ng-container [ngTemplateOutlet]=\"controlTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #controlTemplate>\n <fd-input-group\n [button]=\"showDropdownButton\"\n [glyph]=\"showDropdownButton ? glyphValue : null\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [isControl]=\"true\"\n [isExpanded]=\"!mobile && open && displayedValues.length > 0\"\n [showFocus]=\"!clearInputBtnFocused\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"title || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"onPrimaryButtonClick()\"\n (click)=\"mobile && isOpenChangeHandle(true)\"\n >\n <input\n #searchInputElement\n fdkAutoComplete\n fd-input-group-input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-describedby]=\"comboboxId + '-list-results'\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? comboboxId + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n [attr.aria-expanded]=\"!mobile && open && displayedValues.length\"\n [attr.aria-required]=\"required\"\n [attr.tabindex]=\"readOnly || disabled ? -1 : null\"\n [enable]=\"autoComplete && !mobile\"\n [displayFn]=\"displayFn\"\n [options]=\"dropdownValues\"\n [inputText]=\"inputText\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [attr.aria-readonly]=\"readOnly\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [(ngModel)]=\"inputText\"\n (onComplete)=\"handleAutoComplete($event)\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (ngModelChange)=\"handleSearchTermChange()\"\n (blur)=\"handleBlur()\"\n />\n <span\n class=\"fd-input-group__addon fd-input-group__addon--button\"\n [class.fd-shellbar__input-group-addon]=\"inShellbar\"\n *ngIf=\"isSearch && showClearButton && inputText && inputText.length > 0\"\n >\n <button\n fd-button\n class=\"fd-input-group__button\"\n type=\"button\"\n [fdType]=\"inShellbar ? 'standard' : 'transparent'\"\n title=\"Clear input\"\n [class.fd-shellbar__button]=\"inShellbar\"\n [attr.tabindex]=\"clearButtonFocusable ? 0 : -1\"\n (focus)=\"clearInputBtnFocus()\"\n (blur)=\"clearInputBtnBlur()\"\n (click)=\"_handleClearSearchTerm()\"\n >\n <fd-icon glyph=\"decline\"></fd-icon>\n </button>\n </span>\n </fd-input-group>\n <div [id]=\"comboboxId + '-list-results'\" class=\"fd-combobox-count-list-results\">\n {{ displayedValues.length || 0 }} result list items\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n class=\"fd-combobox-custom-list\"\n [dropdownMode]=\"true\"\n [id]=\"comboboxId + '-result'\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"comboboxId + '-search'\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [hasMessage]=\"listMessages && listMessages.length > 0\"\n [byline]=\"byline\"\n (keydown.tab)=\"_close()\"\n (keydown.shift.tab)=\"_close()\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n >\n <ng-content></ng-content>\n <ng-container *ngIf=\"groupFn; else flatList\">\n <ng-container *ngFor=\"let group of displayedValues | listGroupPipe : groupFn\">\n <li role=\"group\" fd-list-group-header [tabindex]=\"0\">\n <span fd-list-title>{{ group.key }}</span>\n </li>\n <li\n role=\"option\"\n fd-list-item\n [attr.aria-placeholder]=\"group.key\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of group.value\"\n [selected]=\"isSelected(term)\"\n [value]=\"term\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ term: term }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n <ng-template #flatList>\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of displayedValues\"\n [selected]=\"isSelected(term)\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n [value]=\"term\"\n >\n <ng-container [ngTemplateOutlet]=\"itemSource\" [ngTemplateOutletContext]=\"{ term: term }\"></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n", styles: [".fd-combobox-custom-class,.fd-combobox-custom-class .fd-combobox-shellbar-custom{display:inline-block}.fd-list__item.fd-combobox-list-item{cursor:pointer}.fd-combobox-full-width{width:100%}.fd-combobox-count-list-results{position:absolute;opacity:0;z-index:-1}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i5.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i5.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i8.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: i9.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i9.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText", "ariaRole"], outputs: ["keyDown"] }, { kind: "directive", type: i9.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i9.ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "component", type: i10.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "directive", type: i2.AutoCompleteDirective, selector: "[fdkAutoComplete], [fdAutoComplete], [fd-auto-complete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "directive", type: i2.TruncatedTitleDirective, selector: "[fdkTruncatedTitle], [fdTruncatedTitle], [fd-truncate-title]" }, { kind: "pipe", type: i2.DisplayFnPipe, name: "displayFnPipe" }, { kind: "pipe", type: i2.SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: i11.FdTranslatePipe, name: "fdTranslate" }, { kind: "pipe", type: i12.ListGroupPipe, name: "listGroupPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
547
+ ], queries: [{ propertyName: "listMessages", predicate: FD_LIST_MESSAGE_DIRECTIVE }], viewQueries: [{ propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true }, { propertyName: "popoverComponent", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "inputGroup", first: true, predicate: InputGroupComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["controlTemplate"], descendants: true }, { propertyName: "listTemplate", first: true, predicate: ["listTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"mobile ? mobileTemplate : desktopTemplate\"></ng-container>\n\n<ng-template #desktopTemplate>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [class.fd-combobox-full-width]=\"isSearch\"\n [isOpen]=\"open && displayedValues && displayedValues.length > 0\"\n (isOpenChange)=\"isOpenChangeHandle($event)\"\n [fillControlMode]=\"fillControlMode\"\n [scrollStrategy]=\"_repositionScrollStrategy\"\n [focusTrapped]=\"true\"\n [triggers]=\"triggers\"\n [disabled]=\"disabled || readOnly\"\n [maxWidth]=\"640\"\n [closeOnOutsideClick]=\"closeOnOutsideClick\"\n >\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </fd-popover-control>\n <fd-popover-body [hidden]=\"!displayedValues.length\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template let-term=\"term\" #itemSource>\n <span\n fd-list-title\n *ngIf=\"!itemTemplate; else customRendererTemplate\"\n [innerHTML]=\"term | displayFnPipe : displayFn | highlight : inputText : highlighting && filterHighlight\"\n fdTruncatedTitle\n >\n </span>\n <ng-template #customRendererTemplate>\n <ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: term }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #mobileTemplate>\n <ng-container [ngTemplateOutlet]=\"controlTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #controlTemplate>\n <fd-input-group\n [button]=\"showDropdownButton\"\n [glyph]=\"showDropdownButton ? glyphValue : null\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [isControl]=\"true\"\n [isExpanded]=\"!mobile && open && displayedValues.length > 0\"\n [showFocus]=\"!clearInputBtnFocused\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"title || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"onPrimaryButtonClick()\"\n (click)=\"mobile && isOpenChangeHandle(true)\"\n >\n <input\n #searchInputElement\n fdkAutoComplete\n fd-input-group-input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-describedby]=\"comboboxId + '-list-results'\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? comboboxId + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n [attr.aria-expanded]=\"!mobile && open && displayedValues.length\"\n [attr.aria-required]=\"required\"\n [attr.tabindex]=\"readOnly || disabled ? -1 : null\"\n [enable]=\"autoComplete && !mobile\"\n [displayFn]=\"displayFn\"\n [options]=\"dropdownValues\"\n [inputText]=\"inputText\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [attr.aria-readonly]=\"readOnly\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [(ngModel)]=\"inputText\"\n (onComplete)=\"handleAutoComplete($event)\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (paste)=\"onInputKeydownHandler('pasteEvent')\"\n (ngModelChange)=\"handleSearchTermChange()\"\n (blur)=\"handleBlur()\"\n />\n <span\n class=\"fd-input-group__addon fd-input-group__addon--button\"\n [class.fd-shellbar__input-group-addon]=\"inShellbar\"\n *ngIf=\"isSearch && showClearButton && inputText && inputText.length > 0\"\n >\n <button\n fd-button\n class=\"fd-input-group__button\"\n type=\"button\"\n [fdType]=\"inShellbar ? 'standard' : 'transparent'\"\n title=\"Clear input\"\n [class.fd-shellbar__button]=\"inShellbar\"\n [attr.tabindex]=\"clearButtonFocusable ? 0 : -1\"\n (focus)=\"clearInputBtnFocus()\"\n (blur)=\"clearInputBtnBlur()\"\n (click)=\"_handleClearSearchTerm()\"\n >\n <fd-icon glyph=\"decline\"></fd-icon>\n </button>\n </span>\n </fd-input-group>\n <div [id]=\"comboboxId + '-list-results'\" class=\"fd-combobox-count-list-results\">\n {{ displayedValues.length || 0 }} result list items\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n class=\"fd-combobox-custom-list\"\n [dropdownMode]=\"true\"\n [id]=\"comboboxId + '-result'\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"comboboxId + '-search'\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [hasMessage]=\"listMessages && listMessages.length > 0\"\n [byline]=\"byline\"\n (keydown.tab)=\"_close()\"\n (keydown.shift.tab)=\"_close()\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n >\n <ng-content></ng-content>\n <ng-container *ngIf=\"groupFn; else flatList\">\n <ng-container *ngFor=\"let group of displayedValues | listGroupPipe : groupFn\">\n <li role=\"group\" fd-list-group-header [tabindex]=\"0\">\n <span fd-list-title>{{ group.key }}</span>\n </li>\n <li\n role=\"option\"\n fd-list-item\n [attr.aria-placeholder]=\"group.key\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of group.value\"\n [selected]=\"isSelected(term)\"\n [value]=\"term\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ term: term }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n <ng-template #flatList>\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of displayedValues\"\n [selected]=\"isSelected(term)\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n [value]=\"term\"\n >\n <ng-container [ngTemplateOutlet]=\"itemSource\" [ngTemplateOutletContext]=\"{ term: term }\"></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n", styles: [".fd-combobox-custom-class,.fd-combobox-custom-class .fd-combobox-shellbar-custom{display:inline-block}.fd-list__item.fd-combobox-list-item{cursor:pointer}.fd-combobox-full-width{width:100%}.fd-combobox-count-list-results{position:absolute;opacity:0;z-index:-1}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i5.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i5.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i8.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "addonButtonAriaHidden", "iconTitle", "ariaLabelledby", "ariaLabelledBy"], outputs: ["addOnButtonClicked", "search"] }, { kind: "directive", type: i8.InputGroupInputDirective, selector: "[fdInputGroupInput], [fd-input-group-input]", inputs: ["class"] }, { kind: "component", type: i9.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i9.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText", "ariaRole"], outputs: ["keyDown"] }, { kind: "directive", type: i9.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "directive", type: i9.ListGroupHeaderDirective, selector: "[fdListGroupHeader], [fd-list-group-header]", inputs: ["nativeElementId"], outputs: ["keyDown"] }, { kind: "component", type: i10.IconComponent, selector: "fd-icon", inputs: ["glyph", "font", "class", "ariaLabel"] }, { kind: "directive", type: i2.AutoCompleteDirective, selector: "[fdkAutoComplete], [fdAutoComplete], [fd-auto-complete]", inputs: ["options", "inputText", "enable", "matcher", "displayFn"], outputs: ["onComplete"] }, { kind: "directive", type: i2.TruncatedTitleDirective, selector: "[fdkTruncatedTitle], [fdTruncatedTitle], [fd-truncate-title]" }, { kind: "pipe", type: i2.DisplayFnPipe, name: "displayFnPipe" }, { kind: "pipe", type: i2.SearchHighlightPipe, name: "highlight" }, { kind: "pipe", type: i11.FdTranslatePipe, name: "fdTranslate" }, { kind: "pipe", type: i12.ListGroupPipe, name: "listGroupPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
541
548
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, decorators: [{
542
549
  type: Component,
543
550
  args: [{ selector: 'fd-combobox', providers: [
@@ -557,7 +564,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
557
564
  '[class.fd-combobox-custom-class]': 'true',
558
565
  '[class.fd-combobox-input]': 'true',
559
566
  '[class.fd-combobox-custom-class--mobile]': 'mobile'
560
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngTemplateOutlet=\"mobile ? mobileTemplate : desktopTemplate\"></ng-container>\n\n<ng-template #desktopTemplate>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [class.fd-combobox-full-width]=\"isSearch\"\n [isOpen]=\"open && displayedValues && displayedValues.length > 0\"\n (isOpenChange)=\"isOpenChangeHandle($event)\"\n [fillControlMode]=\"fillControlMode\"\n [scrollStrategy]=\"_repositionScrollStrategy\"\n [focusTrapped]=\"true\"\n [triggers]=\"triggers\"\n [disabled]=\"disabled || readOnly\"\n [maxWidth]=\"640\"\n [closeOnOutsideClick]=\"closeOnOutsideClick\"\n >\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </fd-popover-control>\n <fd-popover-body [hidden]=\"!displayedValues.length\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template let-term=\"term\" #itemSource>\n <span\n fd-list-title\n *ngIf=\"!itemTemplate; else customRendererTemplate\"\n [innerHTML]=\"term | displayFnPipe : displayFn | highlight : inputText : highlighting && filterHighlight\"\n fdTruncatedTitle\n >\n </span>\n <ng-template #customRendererTemplate>\n <ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: term }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #mobileTemplate>\n <ng-container [ngTemplateOutlet]=\"controlTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #controlTemplate>\n <fd-input-group\n [button]=\"showDropdownButton\"\n [glyph]=\"showDropdownButton ? glyphValue : null\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [isControl]=\"true\"\n [isExpanded]=\"!mobile && open && displayedValues.length > 0\"\n [showFocus]=\"!clearInputBtnFocused\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"title || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"onPrimaryButtonClick()\"\n (click)=\"mobile && isOpenChangeHandle(true)\"\n >\n <input\n #searchInputElement\n fdkAutoComplete\n fd-input-group-input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-describedby]=\"comboboxId + '-list-results'\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? comboboxId + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n [attr.aria-expanded]=\"!mobile && open && displayedValues.length\"\n [attr.aria-required]=\"required\"\n [attr.tabindex]=\"readOnly || disabled ? -1 : null\"\n [enable]=\"autoComplete && !mobile\"\n [displayFn]=\"displayFn\"\n [options]=\"dropdownValues\"\n [inputText]=\"inputText\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [attr.aria-readonly]=\"readOnly\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [(ngModel)]=\"inputText\"\n (onComplete)=\"handleAutoComplete($event)\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (ngModelChange)=\"handleSearchTermChange()\"\n (blur)=\"handleBlur()\"\n />\n <span\n class=\"fd-input-group__addon fd-input-group__addon--button\"\n [class.fd-shellbar__input-group-addon]=\"inShellbar\"\n *ngIf=\"isSearch && showClearButton && inputText && inputText.length > 0\"\n >\n <button\n fd-button\n class=\"fd-input-group__button\"\n type=\"button\"\n [fdType]=\"inShellbar ? 'standard' : 'transparent'\"\n title=\"Clear input\"\n [class.fd-shellbar__button]=\"inShellbar\"\n [attr.tabindex]=\"clearButtonFocusable ? 0 : -1\"\n (focus)=\"clearInputBtnFocus()\"\n (blur)=\"clearInputBtnBlur()\"\n (click)=\"_handleClearSearchTerm()\"\n >\n <fd-icon glyph=\"decline\"></fd-icon>\n </button>\n </span>\n </fd-input-group>\n <div [id]=\"comboboxId + '-list-results'\" class=\"fd-combobox-count-list-results\">\n {{ displayedValues.length || 0 }} result list items\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n class=\"fd-combobox-custom-list\"\n [dropdownMode]=\"true\"\n [id]=\"comboboxId + '-result'\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"comboboxId + '-search'\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [hasMessage]=\"listMessages && listMessages.length > 0\"\n [byline]=\"byline\"\n (keydown.tab)=\"_close()\"\n (keydown.shift.tab)=\"_close()\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n >\n <ng-content></ng-content>\n <ng-container *ngIf=\"groupFn; else flatList\">\n <ng-container *ngFor=\"let group of displayedValues | listGroupPipe : groupFn\">\n <li role=\"group\" fd-list-group-header [tabindex]=\"0\">\n <span fd-list-title>{{ group.key }}</span>\n </li>\n <li\n role=\"option\"\n fd-list-item\n [attr.aria-placeholder]=\"group.key\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of group.value\"\n [selected]=\"isSelected(term)\"\n [value]=\"term\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ term: term }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n <ng-template #flatList>\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of displayedValues\"\n [selected]=\"isSelected(term)\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n [value]=\"term\"\n >\n <ng-container [ngTemplateOutlet]=\"itemSource\" [ngTemplateOutletContext]=\"{ term: term }\"></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n", styles: [".fd-combobox-custom-class,.fd-combobox-custom-class .fd-combobox-shellbar-custom{display:inline-block}.fd-list__item.fd-combobox-list-item{cursor:pointer}.fd-combobox-full-width{width:100%}.fd-combobox-count-list-results{position:absolute;opacity:0;z-index:-1}\n"] }]
567
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngTemplateOutlet=\"mobile ? mobileTemplate : desktopTemplate\"></ng-container>\n\n<ng-template #desktopTemplate>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n [class.fd-combobox-full-width]=\"isSearch\"\n [isOpen]=\"open && displayedValues && displayedValues.length > 0\"\n (isOpenChange)=\"isOpenChangeHandle($event)\"\n [fillControlMode]=\"fillControlMode\"\n [scrollStrategy]=\"_repositionScrollStrategy\"\n [focusTrapped]=\"true\"\n [triggers]=\"triggers\"\n [disabled]=\"disabled || readOnly\"\n [maxWidth]=\"640\"\n [closeOnOutsideClick]=\"closeOnOutsideClick\"\n >\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\n </fd-popover-control>\n <fd-popover-body [hidden]=\"!displayedValues.length\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template let-term=\"term\" #itemSource>\n <span\n fd-list-title\n *ngIf=\"!itemTemplate; else customRendererTemplate\"\n [innerHTML]=\"term | displayFnPipe : displayFn | highlight : inputText : highlighting && filterHighlight\"\n fdTruncatedTitle\n >\n </span>\n <ng-template #customRendererTemplate>\n <ng-container [ngTemplateOutlet]=\"itemTemplate\" [ngTemplateOutletContext]=\"{ $implicit: term }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #mobileTemplate>\n <ng-container [ngTemplateOutlet]=\"controlTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #controlTemplate>\n <fd-input-group\n [button]=\"showDropdownButton\"\n [glyph]=\"showDropdownButton ? glyphValue : null\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [isControl]=\"true\"\n [isExpanded]=\"!mobile && open && displayedValues.length > 0\"\n [showFocus]=\"!clearInputBtnFocused\"\n [glyphAriaLabel]=\"ariaLabel || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n [iconTitle]=\"title || ('platformMultiCombobox.inputGlyphAriaLabel' | fdTranslate)\"\n (addOnButtonClicked)=\"onPrimaryButtonClick()\"\n (click)=\"mobile && isOpenChangeHandle(true)\"\n >\n <input\n #searchInputElement\n fdkAutoComplete\n fd-input-group-input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-describedby]=\"comboboxId + '-list-results'\"\n [attr.aria-autocomplete]=\"autoComplete && !mobile ? 'list' : null\"\n [attr.aria-owns]=\"autoComplete && !mobile ? comboboxId + '-result' : null\"\n [attr.aria-haspopup]=\"autoComplete && !mobile\"\n [attr.aria-expanded]=\"!mobile && open && displayedValues.length\"\n [attr.aria-required]=\"required\"\n [attr.tabindex]=\"readOnly || disabled ? -1 : null\"\n [enable]=\"autoComplete && !mobile\"\n [displayFn]=\"displayFn\"\n [options]=\"dropdownValues\"\n [inputText]=\"inputText\"\n [disabled]=\"disabled\"\n [readonly]=\"readOnly\"\n [attr.aria-readonly]=\"readOnly\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [(ngModel)]=\"inputText\"\n (onComplete)=\"handleAutoComplete($event)\"\n (keydown)=\"onInputKeydownHandler($event)\"\n (paste)=\"onInputKeydownHandler('pasteEvent')\"\n (ngModelChange)=\"handleSearchTermChange()\"\n (blur)=\"handleBlur()\"\n />\n <span\n class=\"fd-input-group__addon fd-input-group__addon--button\"\n [class.fd-shellbar__input-group-addon]=\"inShellbar\"\n *ngIf=\"isSearch && showClearButton && inputText && inputText.length > 0\"\n >\n <button\n fd-button\n class=\"fd-input-group__button\"\n type=\"button\"\n [fdType]=\"inShellbar ? 'standard' : 'transparent'\"\n title=\"Clear input\"\n [class.fd-shellbar__button]=\"inShellbar\"\n [attr.tabindex]=\"clearButtonFocusable ? 0 : -1\"\n (focus)=\"clearInputBtnFocus()\"\n (blur)=\"clearInputBtnBlur()\"\n (click)=\"_handleClearSearchTerm()\"\n >\n <fd-icon glyph=\"decline\"></fd-icon>\n </button>\n </span>\n </fd-input-group>\n <div [id]=\"comboboxId + '-list-results'\" class=\"fd-combobox-count-list-results\">\n {{ displayedValues.length || 0 }} result list items\n </div>\n</ng-template>\n\n<ng-template #listTemplate>\n <ul\n fd-list\n class=\"fd-combobox-custom-list\"\n [dropdownMode]=\"true\"\n [id]=\"comboboxId + '-result'\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"comboboxId + '-search'\"\n [style.maxHeight]=\"!mobile && maxHeight\"\n [hasMessage]=\"listMessages && listMessages.length > 0\"\n [byline]=\"byline\"\n (keydown.tab)=\"_close()\"\n (keydown.shift.tab)=\"_close()\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n >\n <ng-content></ng-content>\n <ng-container *ngIf=\"groupFn; else flatList\">\n <ng-container *ngFor=\"let group of displayedValues | listGroupPipe : groupFn\">\n <li role=\"group\" fd-list-group-header [tabindex]=\"0\">\n <span fd-list-title>{{ group.key }}</span>\n </li>\n <li\n role=\"option\"\n fd-list-item\n [attr.aria-placeholder]=\"group.key\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of group.value\"\n [selected]=\"isSelected(term)\"\n [value]=\"term\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ term: term }\"\n ></ng-container>\n </li>\n </ng-container>\n </ng-container>\n <ng-template #flatList>\n <li\n fd-list-item\n role=\"option\"\n [tabindex]=\"0\"\n class=\"fd-combobox-list-item\"\n *ngFor=\"let term of displayedValues\"\n [selected]=\"isSelected(term)\"\n (keydown)=\"onItemKeyDownHandler($event, term)\"\n (click)=\"onMenuClickHandler(term)\"\n [value]=\"term\"\n >\n <ng-container [ngTemplateOutlet]=\"itemSource\" [ngTemplateOutletContext]=\"{ term: term }\"></ng-container>\n </li>\n </ng-template>\n </ul>\n</ng-template>\n", styles: [".fd-combobox-custom-class,.fd-combobox-custom-class .fd-combobox-shellbar-custom{display:inline-block}.fd-list__item.fd-combobox-list-item{cursor:pointer}.fd-combobox-full-width{width:100%}.fd-combobox-count-list-results{position:absolute;opacity:0;z-index:-1}\n"] }]
561
568
  }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i2.DynamicComponentService }, { type: i3.ContentDensityObserver }]; }, propDecorators: { comboboxId: [{
562
569
  type: Input
563
570
  }], inputId: [{
@@ -660,4 +667,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
660
667
  type: ViewChild,
661
668
  args: ['listTemplate']
662
669
  }] } });
663
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY29tYm9ib3gvY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY29tYm9ib3gvY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFDSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUNMLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNYLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFSCx1QkFBdUIsRUFFdkIsT0FBTyxFQUVWLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQix1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQXdCLE1BQU0sNEJBQTRCLENBQUM7QUFDNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0s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Y2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWVtYmVyLW9yZGVyaW5nICovXG5pbXBvcnQge1xuICAgIEJBQ0tTUEFDRSxcbiAgICBDT05UUk9MLFxuICAgIERPV05fQVJST1csXG4gICAgRU5URVIsXG4gICAgRVNDQVBFLFxuICAgIExFRlRfQVJST1csXG4gICAgUklHSFRfQVJST1csXG4gICAgU0hJRlQsXG4gICAgU1BBQ0UsXG4gICAgVEFCLFxuICAgIFVQX0FSUk9XXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIEF1dG9Db21wbGV0ZUV2ZW50LFxuICAgIER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgIEZvY3VzRXNjYXBlRGlyZWN0aW9uLFxuICAgIEtleVV0aWwsXG4gICAgTnVsbGFibGVcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgRm9ybUl0ZW1Db250cm9sLCByZWdpc3RlckZvcm1JdGVtQ29udHJvbCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9mb3JtJztcbmltcG9ydCB7IElucHV0R3JvdXBDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvaW5wdXQtZ3JvdXAnO1xuaW1wb3J0IHsgRkRfTElTVF9NRVNTQUdFX0RJUkVDVElWRSwgTGlzdENvbXBvbmVudCwgTGlzdE1lc3NhZ2VEaXJlY3RpdmUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbGlzdCc7XG5pbXBvcnQgeyBNZW51S2V5Ym9hcmRTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21lbnUnO1xuaW1wb3J0IHsgTW9iaWxlTW9kZUNvbmZpZyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9tb2JpbGUtbW9kZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3BvcG92ZXInO1xuaW1wb3J0IHsgUG9wb3ZlckZpbGxNb2RlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5cbmltcG9ydCB7IE92ZXJsYXksIFJlcG9zaXRpb25TY3JvbGxTdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IEZvcm1TdGF0ZXMsIFNpbmdsZURyb3Bkb3duVmFsdWVDb250cm9sIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvZm9ybXMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlPYnNlcnZlciwgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgQ29tYm9ib3hJdGVtIH0gZnJvbSAnLi9jb21ib2JveC1pdGVtJztcbmltcG9ydCB7IENvbWJvYm94TW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21ib2JveC1tb2JpbGUvY29tYm9ib3gtbW9iaWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21ib2JveE1vYmlsZU1vZHVsZSB9IGZyb20gJy4vY29tYm9ib3gtbW9iaWxlL2NvbWJvYm94LW1vYmlsZS5tb2R1bGUnO1xuaW1wb3J0IHsgQ09NQk9CT1hfQ09NUE9ORU5ULCBDb21ib2JveEludGVyZmFjZSB9IGZyb20gJy4vY29tYm9ib3guaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyb3VwRnVuY3Rpb24gfSBmcm9tICcuL2xpc3QtZ3JvdXAucGlwZSc7XG5pbXBvcnQgeyBGRF9DT01CT0JPWF9DT01QT05FTlQgfSBmcm9tICcuL3Rva2Vucyc7XG5cbmxldCBjb21ib2JveFVuaXF1ZUlkID0gMDtcblxuLyoqXG4gKiBBbGxvd3MgdXNlcnMgdG8gZmlsdGVyIHRocm91Z2ggcmVzdWx0cyBhbmQgc2VsZWN0IGEgdmFsdWUuXG4gKlxuICogU3VwcG9ydHMgQW5ndWxhciBGb3Jtcy5cbiAqIGBgYGh0bWxcbiAqIDxmZC1jb21ib2JveFxuICogICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRlcm1cIlxuICogICAgICBbZHJvcGRvd25WYWx1ZXNdPVwiZHJvcGRvd25WYWx1ZXNcIlxuICogICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgc29tZSB0ZXh0Li4uXCI+XG4gKiA8L2ZkLWNvbWJvYm94PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtY29tYm9ib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICByZWdpc3RlckZvcm1JdGVtQ29udHJvbChDb21ib2JveENvbXBvbmVudCksXG4gICAgICAgIE1lbnVLZXlib2FyZFNlcnZpY2UsXG4gICAgICAgIGNvbnRlbnREZW5zaXR5T2JzZXJ2ZXJQcm92aWRlcnMoKSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRkRfQ09NQk9CT1hfQ09NUE9ORU5ULFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IENvbWJvYm94Q29tcG9uZW50XG4gICAgICAgIH1cbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5mZC1jb21ib2JveC1jdXN0b20tY2xhc3NdJzogJ3RydWUnLFxuICAgICAgICAnW2NsYXNzLmZkLWNvbWJvYm94LWlucHV0XSc6ICd0cnVlJyxcbiAgICAgICAgJ1tjbGFzcy5mZC1jb21ib2JveC1jdXN0b20tY2xhc3MtLW1vYmlsZV0nOiAnbW9iaWxlJ1xuICAgIH0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudFxuICAgIGltcGxlbWVudHNcbiAgICAgICAgQ29tYm9ib3hJbnRlcmZhY2UsXG4gICAgICAgIFNpbmdsZURyb3Bkb3duVmFsdWVDb250cm9sLFxuICAgICAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICAgICAgT25Jbml0LFxuICAgICAgICBPbkNoYW5nZXMsXG4gICAgICAgIEFmdGVyVmlld0luaXQsXG4gICAgICAgIE9uRGVzdHJveSxcbiAgICAgICAgRm9ybUl0ZW1Db250cm9sXG57XG4gICAgLyoqIElkIGZvciB0aGUgQ29tYm9ib3guICovXG4gICAgQElucHV0KClcbiAgICBjb21ib2JveElkID0gYGZkLWNvbWJvYm94LSR7Y29tYm9ib3hVbmlxdWVJZCsrfWA7XG5cbiAgICAvKiogSWQgYXR0cmlidXRlIGZvciBpbnB1dCBlbGVtZW50IGluc2lkZSBDb21ib2JveCBjb21wb25lbnQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlucHV0SWQgPSAnJztcblxuICAgIC8qKiBBcmlhLWxhYmVsIGZvciBDb21ib2JveC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFyaWFMYWJlbDogTnVsbGFibGU8c3RyaW5nPjtcblxuICAgIC8qKiBBcmlhLUxhYmVsbGVkYnkgZm9yIGVsZW1lbnQgZGVzY3JpYmluZyBDb21ib2JveC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFyaWFMYWJlbGxlZEJ5OiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgLyoqIElmIGl0IGlzIG1hbmRhdG9yeSBmaWVsZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKiBWYWx1ZXMgdG8gYmUgZmlsdGVyZWQgaW4gdGhlIHNlYXJjaCBpbnB1dC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRyb3Bkb3duVmFsdWVzOiBhbnlbXSA9IFtdO1xuXG4gICAgLyoqIEZpbHRlciBmdW5jdGlvbi4gQWNjZXB0cyBhbiBhcnJheSBvZiBvYmplY3RzIGFuZCBhIHNlYXJjaCB0ZXJtIGFzIGFyZ3VtZW50c1xuICAgICAqIGFuZCByZXR1cm5zIGEgc3RyaW5nLiBTZWUgc2VhcmNoIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyRm4gPSB0aGlzLl9kZWZhdWx0RmlsdGVyO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHNlYXJjaCBpbnB1dCBpcyBkaXNhYmxlZC4gKiovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKiBQbGFjZWhvbGRlciBvZiB0aGUgc2VhcmNoIGlucHV0LiAqKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBDb21ib2JveCBpcyBhIFNlYXJjaCBGaWVsZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNTZWFyY2ggPSBmYWxzZTtcblxuICAgIC8qKiBJY29uIHRvIGRpc3BsYXkgaW4gdGhlIHJpZ2h0LXNpZGUgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2x5cGggPSAnbmF2aWdhdGlvbi1kb3duLWFycm93JztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgY2xlYXIgc2VhcmNoIHRlcm0gYnV0dG9uIHdoZW4gdGhlIENvbWJvYm94IGlzIGEgU2VhcmNoIEZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93Q2xlYXJCdXR0b24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogIFRoZSB0cmlnZ2VyIGV2ZW50cyB0aGF0IHdpbGwgb3Blbi9jbG9zZSB0aGUgb3B0aW9ucyBwb3BvdmVyLlxuICAgICAqICBBY2NlcHRzIGFueSBbSFRNTCBET00gRXZlbnRzXShodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2pzcmVmL2RvbV9vYmpfZXZlbnQuYXNwKS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRyaWdnZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbWJvYm94IHNob3VsZCBjbG9zZSwgd2hlbiBhIGNsaWNrIGlzIHBlcmZvcm1lZCBvdXRzaWRlIGl0cyBib3VuZGFyaWVzLiBUcnVlIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2sgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgY29tYm9ib3ggc2hvdWxkIG9wZW4sIHdoZW4gYW55IGtleSBpcyBwcmVzc2VkIGluIGlucHV0IChleGNlcHQgRXNjYXBlLCBTcGFjZSwgRW50ZXIpLiBUcnVlIGJ5IGRlZmF1bHRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW5PbktleWJvYXJkRXZlbnQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogIFRoZSBzdGF0ZSBvZiB0aGUgZm9ybSBjb250cm9sIC0gYXBwbGllcyBjc3MgY2xhc3Nlcy5cbiAgICAgKiAgQ2FuIGJlIGBzdWNjZXNzYCwgYGVycm9yYCwgYHdhcm5pbmdgLCBgaW5mb3JtYXRpb25gIG9yIGJsYW5rIGZvciBkZWZhdWx0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc3RhdGU/OiBGb3JtU3RhdGVzO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRlbXBsYXRlIHdpdGggd2hpY2ggdG8gZGlzcGxheSB0aGUgaW5kaXZpZHVhbCBsaXN0ZWQgaXRlbXMuXG4gICAgICogVXNlIGl0IGJ5IHBhc3NpbmcgYW4gbmctdGVtcGxhdGUgd2l0aCBpbXBsaWNpdCBjb250ZW50LiBTZWUgZXhhbXBsZXMgZm9yIG1vcmUgaW5mby5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gaGFuZGxlIGdyb3VwaW5nIG9mIGl0ZW1zLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ3JvdXBGbjogR3JvdXBGdW5jdGlvbjtcblxuICAgIC8qKiBNYXggaGVpZ2h0IG9mIHRoZSBwb3BvdmVyLiBBbnkgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggc2Nyb2xsaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0ID0gJzUwdmgnO1xuXG4gICAgLyoqIFNlYXJjaCBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIEVudGVyIGtleSBpcyBwcmVzc2VkIG9uIHRoZSBtYWluIGlucHV0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2VhcmNoRm46ICgpID0+IHZvaWQ7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbWF0Y2hpbmcgc3RyaW5nIHNob3VsZCBiZSBoaWdobGlnaHRlZCBkdXJpbmcgZmlsdHJhdGlvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZ2hsaWdodGluZyA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbWF0Y2hpbmcgc3RyaW5nIHNob3VsZCBiZSBoaWdobGlnaHRlZCBhZnRlciBjb21ib2JveCB2YWx1ZSBpcyBzZWxlY3RlZC4gKi9cbiAgICBmaWx0ZXJIaWdobGlnaHQgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHBvcG92ZXIgc2hvdWxkIGNsb3NlIHdoZW4gYSB1c2VyIHNlbGVjdHMgYSByZXN1bHQuICovXG4gICAgQElucHV0KClcbiAgICBjbG9zZU9uU2VsZWN0ID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBmaWVsZCBzaG91bGQgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHJlc3VsdCBwaWNrZWQgYnkgdGhlIHVzZXIuICovXG4gICAgQElucHV0KClcbiAgICBmaWxsT25TZWxlY3QgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGF1dG9jb21wbGV0ZSBzaG91bGQgYmUgZW5hYmxlZDsgRW5hYmxlZCBieSBkZWZhdWx0ICovXG4gICAgQElucHV0KClcbiAgICBhdXRvQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogUHJlc2V0IG9wdGlvbnMgZm9yIHRoZSBTZWxlY3QgYm9keSB3aWR0aCwgd2hhdGV2ZXIgaXMgY2hvc2VuLCB0aGUgYm9keSBoYXMgYSA2MDBweCBsaW1pdC5cbiAgICAgKiAqIGBhdC1sZWFzdGAgd2lsbCBhcHBseSBhIG1pbmltdW0gd2lkdGggdG8gdGhlIGJvZHkgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2wuIC0gRGVmYXVsdFxuICAgICAqICogYGVxdWFsYCB3aWxsIGFwcGx5IGEgd2lkdGggdG8gdGhlIGJvZHkgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2wuXG4gICAgICogKiAnZml0LWNvbnRlbnQnIHdpbGwgYXBwbHkgd2lkdGggbmVlZGVkIHRvIHByb3Blcmx5IGRpc3BsYXkgaXRlbXMgaW5zaWRlLCBpbmRlcGVuZGVudCBvZiBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsbENvbnRyb2xNb2RlOiBQb3BvdmVyRmlsbE1vZGUgPSAnYXQtbGVhc3QnO1xuXG4gICAgLyoqIERlZmluZXMgaWYgY29tYm9ib3ggc2hvdWxkIGJlaGF2ZSBzYW1lIGFzIGRyb3Bkb3duLiBXaGVuIGl0J3MgZW5hYmxlZCB3cml0aW5nIGluc2lkZSB0ZXh0IGlucHV0IHdvbid0XG4gICAgICogdHJpZ2dlciBvbkNoYW5nZSBmdW5jdGlvbiwgdW50aWwgaXQgbWF0Y2hlcyBvbmUgb2YgZGlzcGxheWVkIGRyb3Bkb3duIHZhbHVlcy4gQWxzbyBjb21tdW5pY2F0aW5nIHdpdGggY29tYm9ib3hcbiAgICAgKiBjYW4gYmUgYWNoaWV2ZWQgb25seSBieSBvYmplY3RzIHdpdGggc2FtZSB0eXBlIGFzIGRyb3Bkb3duVmFsdWUgKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbW11bmljYXRlQnlPYmplY3QgPSBmYWxzZTtcblxuICAgIC8qKiBEaXNwbGF5IGZ1bmN0aW9uLiBBY2NlcHRzIGFuIG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZVxuICAgICAqIGl0ZW1zIHBhc3NlZCB0byBkcm9wZG93blZhbHVlcyBhcyBhcmd1bWVudCwgYW5kIG91dHB1dHMgYSBzdHJpbmcuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIHNlYXJjaCBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlGbiA9IHRoaXMuX2RlZmF1bHREaXNwbGF5O1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBBZGRPbiBCdXR0b24gc2hvdWxkIGJlIGZvY3VzYWJsZVxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBidXR0b25Gb2N1c2FibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgY2xlYXIgYnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGUuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xlYXJCdXR0b25Gb2N1c2FibGUgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbWJvYm94IGlzIHJlYWRvbmx5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVhZE9ubHkgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21ib2JveCBzaG91bGQgYmUgYnVpbHQgb24gbW9iaWxlIG1vZGUgKi9cbiAgICBASW5wdXQoKVxuICAgIG1vYmlsZSA9IGZhbHNlO1xuXG4gICAgLyoqIE11bHRpIElucHV0IE1vYmlsZSBDb25maWd1cmF0aW9uLCBpdCdzIGFwcGxpZWQgb25seSwgd2hlbiBtb2JpbGUgaXMgZW5hYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgbW9iaWxlQ29uZmlnOiBNb2JpbGVNb2RlQ29uZmlnO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgYWRkb24gYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Ryb3Bkb3duQnV0dG9uID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gcmV0dXJuIHJlc3VsdHMgd2hlcmUgdGhlIGlucHV0IG1hdGNoZXMgdGhlIGVudGlyZSBzdHJpbmcuIEJ5IGRlZmF1bHQsIG9ubHkgcmVzdWx0cyB0aGF0IHN0YXJ0XG4gICAgICogd2l0aCB0aGUgaW5wdXQgc2VhcmNoIHRlcm0gd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGluY2x1ZGVzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHRpcCBmb3IgdGhlIG11bHRpLWlucHV0IGljb24uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgbGlzdCBpdGVtIG9wdGlvbnMgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGJ5bGluZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGJ5bGluZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQWN0aW9uIHRvIHBlcmZvcm0gd2hlbiB1c2VyIHNoaWZ0cyBmb2N1cyBmcm9tIHRoZSBkcm9wZG93bi5cbiAgICAgKiAtIGBjbG9zZWAgd2lsbCBjbG9zZSB0aGUgZHJvcGRvd24gcHJlc2VydmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIC0gYGNsb3NlQW5kU2VsZWN0YCB3aWxsIGNsb3NlIHRoZSBkcm9wZG93biBhbmQgc2VsZWN0IGxhc3QgZm9jdXNlZCBkcm9wZG93biBpdGVtLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdGFiT3V0U3RyYXRlZ3k6ICdjbG9zZScgfCAnY2xvc2VBbmRTZWxlY3QnID0gJ2Nsb3NlQW5kU2VsZWN0JztcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gaXRlbSBpcyBjbGlja2VkLiBVc2UgKiRldmVudCogdG8gcmV0cmlldmUgaXQuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaXRlbUNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxDb21ib2JveEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveEl0ZW0+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCwgd2hlbiB0aGUgY29tYm9ib3gncyBwb3BvdmVyIGJvZHkgaXMgb3BlbmVkIG9yIGNsb3NlZCAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG9wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGlucHV0IHRleHQgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBpbnB1dFRleHRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoTGlzdENvbXBvbmVudClcbiAgICBsaXN0Q29tcG9uZW50OiBMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dEVsZW1lbnQnKVxuICAgIHNlYXJjaElucHV0RWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChQb3BvdmVyQ29tcG9uZW50KVxuICAgIHBvcG92ZXJDb21wb25lbnQ6IFBvcG92ZXJDb21wb25lbnQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoSW5wdXRHcm91cENvbXBvbmVudClcbiAgICBpbnB1dEdyb3VwOiBJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAQ29udGVudENoaWxkcmVuKEZEX0xJU1RfTUVTU0FHRV9ESVJFQ1RJVkUpXG4gICAgbGlzdE1lc3NhZ2VzOiBRdWVyeUxpc3Q8TGlzdE1lc3NhZ2VEaXJlY3RpdmU+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdjb250cm9sVGVtcGxhdGUnKVxuICAgIGNvbnRyb2xUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdsaXN0VGVtcGxhdGUnKVxuICAgIGxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqIEtleXMsIHRoYXQgd29uJ3QgdHJpZ2dlciB0aGUgcG9wb3ZlcidzIG9wZW4gc3RhdGUsIHdoZW4gZGlzcGF0Y2hlZCBvbiBzZWFyY2ggaW5wdXQgKi9cbiAgICByZWFkb25seSBub25PcGVuaW5nS2V5czogbnVtYmVyW10gPSBbXG4gICAgICAgIEVTQ0FQRSxcbiAgICAgICAgRU5URVIsXG4gICAgICAgIExFRlRfQVJST1csXG4gICAgICAgIFJJR0hUX0FSUk9XLFxuICAgICAgICBET1dOX0FSUk9XLFxuICAgICAgICBVUF9BUlJPVyxcbiAgICAgICAgQ09OVFJPTCxcbiAgICAgICAgVEFCLFxuICAgICAgICBTSElGVFxuICAgIF07XG5cbiAgICAvKiogS2V5cywgdGhhdCB3aWxsIGNsb3NlIHBvcG92ZXIncyBib2R5LCB3aGVuIGRpc3BhdGNoZWQgb24gc2VhcmNoIGlucHV0ICovXG4gICAgcmVhZG9ubHkgY2xvc2luZ0tleXM6IG51bWJlcltdID0gW0VTQ0FQRV07XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IF9yZXBvc2l0aW9uU2Nyb2xsU3RyYXRlZ3k6IFJlcG9zaXRpb25TY3JvbGxTdHJhdGVneTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBjb21ib2JveCBpcyBvcGVuZWQuICovXG4gICAgb3BlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGlucHV0IGNvdXAgaXMgaW4gdGhlIHNoZWxsYmFyLiBPbmx5IGZvciBpbnRlcm5hbCB1c2UgYnkgY29tYm9ib3ggY29tcG9uZW50XG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGluU2hlbGxiYXIgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZGlzcGxheWVkVmFsdWVzOiBhbnlbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpbnB1dFRleHRWYWx1ZSA9ICcnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjbGVhcklucHV0QnRuRm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF92YWx1ZTogYW55O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vdmVybGF5OiBPdmVybGF5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZHluYW1pY0NvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICByZWFkb25seSBfY29udGVudERlbnNpdHlPYnNlcnZlcjogQ29udGVudERlbnNpdHlPYnNlcnZlclxuICAgICkge1xuICAgICAgICB0aGlzLl9yZXBvc2l0aW9uU2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbih7IGF1dG9DbG9zZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgdGhpcy5zaG93RHJvcGRvd25CdXR0b24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWZyZXNoRGlzcGxheWVkVmFsdWVzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duVmFsdWVzICYmIChjaGFuZ2VzLmRyb3Bkb3duVmFsdWVzIHx8IGNoYW5nZXMuc2VhcmNoVGVybSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hEaXNwbGF5ZWRWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWRkU2hlbGxiYXJDbGFzcygpO1xuXG4gICAgICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VXBNb2JpbGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uSW5wdXRLZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWFkT25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBUQUIpICYmIHRoaXMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRU5URVIpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVykpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERpc3BsYXllZFZhbHVlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMub3BlbiAmJiB0aGlzLmxpc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMub3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nob29zZU90aGVySXRlbSgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFVQX0FSUk9XKSkge1xuICAgICAgICAgICAgdGhpcy5fY2hvb3NlT3RoZXJJdGVtKC0xKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIHRoaXMuY2xvc2luZ0tleXMpKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMub3Blbk9uS2V5Ym9hcmRFdmVudCAmJlxuICAgICAgICAgICAgIWV2ZW50LmN0cmxLZXkgJiZcbiAgICAgICAgICAgICFldmVudC5hbHRLZXkgJiZcbiAgICAgICAgICAgICFLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgdGhpcy5ub25PcGVuaW5nS2V5cylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHlWYWx1ZSAmJiBLZXlVdGlsLmlzS2V5VHlwZShldmVudCwgJ2NvbnRyb2wnKSAmJiAhS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEJBQ0tTUEFDRSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25JdGVtS2V5RG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBFTlRFUikgfHwgS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFNQQUNFKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMub25NZW51Q2xpY2tIYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25NZW51Q2xpY2tIYW5kbGVyKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5kcm9wZG93blZhbHVlcy5maW5kSW5kZXgoKF92YWx1ZSkgPT4gX3ZhbHVlID09PSB2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVDbGlja0FjdGlvbnModmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJIaWdobGlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXRlbUNsaWNrZWQuZW1pdCh7IGl0ZW06IHZhbHVlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBIYW5kbGUgZGlhbG9nIGRpc21pc3NpbmcsIGNsb3NlcyBwb3BvdmVyIGFuZCBzZXRzIGJhY2t1cCBkYXRhLiAqL1xuICAgIGRpYWxvZ0Rpc21pc3ModGVybTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gdGhpcy5kaXNwbGF5Rm4odGVybSk7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodGVybSk7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlIGRpYWxvZyBhcHByb3ZhbCwgY2xvc2VzIHBvcG92ZXIgYW5kIHByb3BhZ2F0ZXMgZGF0YSBjaGFuZ2VzLiAqL1xuICAgIGRpYWxvZ0FwcHJvdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqIElmIHRydWUgdmFsdWUgZW1wdHkgKi9cbiAgICBnZXQgaXNFbXB0eVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaW5wdXRUZXh0IHx8IHRoaXMuaW5wdXRUZXh0Py50cmltKCkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKiBJbnB1dCB0ZXh0IG9mIHRoZSBpbnB1dC4gKi9cbiAgICBzZXQgaW5wdXRUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0VGV4dENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgICAgaWYgKCF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlucHV0VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dFRleHRWYWx1ZTtcbiAgICB9XG5cbiAgICAvKiogR2V0IHRoZSBnbHlwaCB2YWx1ZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb21ib2JveCBpcyB1c2VkIGFzIGEgc2VhcmNoIGZpZWxkIG9yIG5vdC4gKi9cbiAgICBnZXQgZ2x5cGhWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NlYXJjaCA/ICdzZWFyY2gnIDogdGhpcy5nbHlwaDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9oYW5kbGVDbGVhclNlYXJjaFRlcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0VmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5pbnB1dFRleHRDaGFuZ2UuZW1pdCgnJyk7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5kcm9wZG93blZhbHVlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHRWYWx1ZSA9IHRoaXMuZGlzcGxheUZuKHZhbHVlKTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCBwYXNzZWQgdG8gbGlzdCBjb21wb25lbnQgKi9cbiAgICBoYW5kbGVMaXN0Rm9jdXNFc2NhcGUoZGlyZWN0aW9uOiBGb2N1c0VzY2FwZURpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGhhbmRsZVNlYXJjaFRlcm1DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5maWx0ZXJGbih0aGlzLmRyb3Bkb3duVmFsdWVzLCB0aGlzLmlucHV0VGV4dCk7XG4gICAgICAgIGlmICh0aGlzLnBvcG92ZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudC5yZWZyZXNoUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25QcmltYXJ5QnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIC8vIFByZXZlbnQgcHJpbWFyeSBidXR0b24gY2xpY2sgYmVoYXZpb3VyIG9uIG1vYmlsZXNcbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWFyY2hGbikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hGbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jlc2V0RGlzcGxheWVkVmFsdWVzKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKCF0aGlzLm9wZW4pO1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuZmlsdGVySGlnaGxpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGlzT3BlbkNoYW5nZUhhbmRsZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgLyoqIFJlc2V0IGRpc3BsYXllZCB2YWx1ZXMgb24gZXZlcnkgbW9iaWxlIG9wZW4gKi9cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlICYmICF0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RGlzcGxheWVkVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3BlbiAhPT0gaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4gPSBpc09wZW47XG4gICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChpc09wZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wZW4gJiYgIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJsdXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICB0aGlzLl9jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IGhhbmRsZXMgY29tcGxldGUgZXZlbnQgZnJvbSBhdXRvIGNvbXBsZXRlIGRpcmVjdGl2ZSwgc2V0dGluZyB0aGUgbmV3IHZhbHVlLCBhbmQgY2xvc2luZyBwb3BvdmVyICovXG4gICAgaGFuZGxlQXV0b0NvbXBsZXRlKGV2ZW50OiBBdXRvQ29tcGxldGVFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbnB1dFRleHQgIT09IGV2ZW50LnRlcm0pIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gZXZlbnQudGVybTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VhcmNoVGVybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5mb3JjZUNsb3NlICYmIHRoaXMuaW5wdXRUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBdXRvQ29tcGxldGUoe1xuICAgICAgICAgICAgICAgIHRlcm06IHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgZm9yY2VDbG9zZTogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjbGVhcklucHV0QnRuRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJJbnB1dEJ0bkZvY3VzZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY2xlYXJJbnB1dEJ0bkJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJJbnB1dEJ0bkZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQ3VycmVudCBzZWxlY3QgdmFsdWUgKi9cbiAgICBnZXRWYWx1ZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0ID0gdGhpcy5fdmFsdWUgPyB0aGlzLmlucHV0VGV4dCA6ICcnO1xuICAgICAgICBpZiAodGhpcy50YWJPdXRTdHJhdGVneSA9PT0gJ2Nsb3NlQW5kU2VsZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZEl0ZW0gPSB0aGlzLmxpc3RDb21wb25lbnQuZ2V0QWN0aXZlSXRlbSgpO1xuICAgICAgICAgICAgaWYgKGZvY3VzZWRJdGVtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2xpY2tBY3Rpb25zKGZvY3VzZWRJdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2VIYW5kbGUoZmFsc2UpO1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCB0aGF0IHBpY2tzIG90aGVyIHZhbHVlIG1vdmVkIGZyb20gY3VycmVudCBvbmUgYnkgb2Zmc2V0LCBjYWxsZWQgb25seSB3aGVuIGNvbWJvYm94IGlzIGNsb3NlZCAqL1xuICAgIHByaXZhdGUgX2Nob29zZU90aGVySXRlbShvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBhY3RpdmVWYWx1ZTogYW55ID0gdGhpcy5fZ2V0T3B0aW9uT2JqZWN0QnlEaXNwbGF5ZWRWYWx1ZSh0aGlzLmlucHV0VGV4dFZhbHVlKTtcbiAgICAgICAgY29uc3QgaW5kZXg6IG51bWJlciA9IHRoaXMuZHJvcGRvd25WYWx1ZXMuZmluZEluZGV4KCh2YWx1ZSkgPT4gdmFsdWUgPT09IGFjdGl2ZVZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25WYWx1ZXNbaW5kZXggKyBvZmZzZXRdKSB7XG4gICAgICAgICAgICB0aGlzLm9uTWVudUNsaWNrSGFuZGxlcih0aGlzLmRyb3Bkb3duVmFsdWVzW2luZGV4ICsgb2Zmc2V0XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcmVzZXQgZmlsdGVyaW5nIGZvciBkaXNwbGF5ZWQgdmFsdWVzLiBJdCBvdmVycmlkZXMgZGlzcGxheWVkIHZhbHVlcyBieSBhbGwgcG9zc2libGUgZHJvcGRvd24gdmFsdWVzICovXG4gICAgcHJpdmF0ZSBfcmVzZXREaXNwbGF5ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5kcm9wZG93blZhbHVlcyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2FkZFNoZWxsYmFyQ2xhc3MoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmluU2hlbGxiYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmQtc2hlbGxiYXJfX2lucHV0LWdyb3VwLWlucHV0Jyk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwLnNldEluU2hlbGxiYXIodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2RlZmF1bHREaXNwbGF5KHN0cjogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3N0cn1gO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcihjb250ZW50QXJyYXk6IGFueVtdLCBzZWFyY2hUZXJtOiBhbnkpOiBhbnlbXSB7XG4gICAgICAgIHRoaXMuZmlsdGVySGlnaGxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hUZXJtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudEFycmF5LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm0gPSB0aGlzLmRpc3BsYXlGbihpdGVtKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmNsdWRlcyA/IHRlcm0uaW5jbHVkZXMoc2VhcmNoTG93ZXIpIDogdGVybS5zdGFydHNXaXRoKHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VhcmNoVGVybSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiBpdGVtID09PSBzZWFyY2hUZXJtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGVudEFycmF5IHx8IFtdO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ2xpY2tBY3Rpb25zKHRlcm06IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsbE9uU2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRlcm0pO1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSB0aGlzLmRpc3BsYXlGbih0ZXJtKTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmlucHV0VGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hUZXJtQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRPcHRpb25PYmplY3RCeURpc3BsYXllZFZhbHVlKGRpc3BsYXlWYWx1ZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJvcGRvd25WYWx1ZXMuZmluZCgodmFsdWUpID0+IHRoaXMuZGlzcGxheUZuKHZhbHVlKSA9PT0gZGlzcGxheVZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hEaXNwbGF5ZWRWYWx1ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VGV4dCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHRoaXMuaW5wdXRUZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkVmFsdWVzID0gdGhpcy5kcm9wZG93blZhbHVlcyB8fCBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcHJvcGFnYXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb21tdW5pY2F0ZUJ5T2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2dldE9wdGlvbk9iamVjdEJ5RGlzcGxheWVkVmFsdWUodGhpcy5pbnB1dFRleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheUZuKHZhbHVlKSAhPT0gdGhpcy5kaXNwbGF5Rm4odGhpcy5nZXRWYWx1ZSgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmdldFZhbHVlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmlucHV0VGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgc2V0VmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb21tdW5pY2F0ZUJ5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmRpc3BsYXlGbih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgYXN5bmMgX3NldFVwTW9iaWxlTW9kZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDT01CT0JPWF9DT01QT05FTlQsIHVzZVZhbHVlOiB0aGlzIH1dLFxuICAgICAgICAgICAgcGFyZW50OiB0aGlzLl9pbmplY3RvclxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9keW5hbWljQ29tcG9uZW50U2VydmljZS5jcmVhdGVEeW5hbWljTW9kdWxlKFxuICAgICAgICAgICAgeyBsaXN0VGVtcGxhdGU6IHRoaXMubGlzdFRlbXBsYXRlLCBjb250cm9sVGVtcGxhdGU6IHRoaXMuY29udHJvbFRlbXBsYXRlIH0sXG4gICAgICAgICAgICBDb21ib2JveE1vYmlsZU1vZHVsZSxcbiAgICAgICAgICAgIENvbWJvYm94TW9iaWxlQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgIGluamVjdG9yXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBpc1NlbGVjdGVkKHRlcm06IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXJtVmFsdWUgPSB0aGlzLmNvbW11bmljYXRlQnlPYmplY3QgPyB0ZXJtIDogdGhpcy5kaXNwbGF5Rm4odGVybSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCkgPT09IHRlcm1WYWx1ZTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9iaWxlID8gbW9iaWxlVGVtcGxhdGUgOiBkZXNrdG9wVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZXNrdG9wVGVtcGxhdGU+XG4gICAgPGZkLXBvcG92ZXJcbiAgICAgICAgYWRkaXRpb25hbEJvZHlDbGFzcz1cImZkLXBvcG92ZXItY3VzdG9tLWxpc3RcIlxuICAgICAgICBbY2xhc3MuZmQtY29tYm9ib3gtZnVsbC13aWR0aF09XCJpc1NlYXJjaFwiXG4gICAgICAgIFtpc09wZW5dPVwib3BlbiAmJiBkaXNwbGF5ZWRWYWx1ZXMgJiYgZGlzcGxheWVkVmFsdWVzLmxlbmd0aCA+IDBcIlxuICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cImlzT3BlbkNoYW5nZUhhbmRsZSgkZXZlbnQpXCJcbiAgICAgICAgW2ZpbGxDb250cm9sTW9kZV09XCJmaWxsQ29udHJvbE1vZGVcIlxuICAgICAgICBbc2Nyb2xsU3RyYXRlZ3ldPVwiX3JlcG9zaXRpb25TY3JvbGxTdHJhdGVneVwiXG4gICAgICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXG4gICAgICAgIFt0cmlnZ2Vyc109XCJ0cmlnZ2Vyc1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkT25seVwiXG4gICAgICAgIFttYXhXaWR0aF09XCI2NDBcIlxuICAgICAgICBbY2xvc2VPbk91dHNpZGVDbGlja109XCJjbG9zZU9uT3V0c2lkZUNsaWNrXCJcbiAgICA+XG4gICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICA8ZmQtcG9wb3Zlci1ib2R5IFtoaWRkZW5dPVwiIWRpc3BsYXllZFZhbHVlcy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XG4gICAgPC9mZC1wb3BvdmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlIGxldC10ZXJtPVwidGVybVwiICNpdGVtU291cmNlPlxuICAgIDxzcGFuXG4gICAgICAgIGZkLWxpc3QtdGl0bGVcbiAgICAgICAgKm5nSWY9XCIhaXRlbVRlbXBsYXRlOyBlbHNlIGN1c3RvbVJlbmRlcmVyVGVtcGxhdGVcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cInRlcm0gfCBkaXNwbGF5Rm5QaXBlIDogZGlzcGxheUZuIHwgaGlnaGxpZ2h0IDogaW5wdXRUZXh0IDogaGlnaGxpZ2h0aW5nICYmIGZpbHRlckhpZ2hsaWdodFwiXG4gICAgICAgIGZkVHJ1bmNhdGVkVGl0bGVcbiAgICA+XG4gICAgPC9zcGFuPlxuICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tUmVuZGVyZXJUZW1wbGF0ZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRlcm0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vYmlsZVRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRyb2xUZW1wbGF0ZT5cbiAgICA8ZmQtaW5wdXQtZ3JvdXBcbiAgICAgICAgW2J1dHRvbl09XCJzaG93RHJvcGRvd25CdXR0b25cIlxuICAgICAgICBbZ2x5cGhdPVwic2hvd0Ryb3Bkb3duQnV0dG9uID8gZ2x5cGhWYWx1ZSA6IG51bGxcIlxuICAgICAgICBbc3RhdGVdPVwic3RhdGVcIlxuICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImJ1dHRvbkZvY3VzYWJsZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkT25seVwiXG4gICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgIFtpc0V4cGFuZGVkXT1cIiFtb2JpbGUgJiYgb3BlbiAmJiBkaXNwbGF5ZWRWYWx1ZXMubGVuZ3RoID4gMFwiXG4gICAgICAgIFtzaG93Rm9jdXNdPVwiIWNsZWFySW5wdXRCdG5Gb2N1c2VkXCJcbiAgICAgICAgW2dseXBoQXJpYUxhYmVsXT1cImFyaWFMYWJlbCB8fCAoJ3BsYXRmb3JtTXVsdGlDb21ib2JveC5pbnB1dEdseXBoQXJpYUxhYmVsJyB8IGZkVHJhbnNsYXRlKVwiXG4gICAgICAgIFtpY29uVGl0bGVdPVwidGl0bGUgfHwgKCdwbGF0Zm9ybU11bHRpQ29tYm9ib3guaW5wdXRHbHlwaEFyaWFMYWJlbCcgfCBmZFRyYW5zbGF0ZSlcIlxuICAgICAgICAoYWRkT25CdXR0b25DbGlja2VkKT1cIm9uUHJpbWFyeUJ1dHRvbkNsaWNrKClcIlxuICAgICAgICAoY2xpY2spPVwibW9iaWxlICYmIGlzT3BlbkNoYW5nZUhhbmRsZSh0cnVlKVwiXG4gICAgPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgIGZka0F1dG9Db21wbGV0ZVxuICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiY29tYm9ib3hJZCArICctbGlzdC1yZXN1bHRzJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWF1dG9jb21wbGV0ZV09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZSA/ICdsaXN0JyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gY29tYm9ib3hJZCArICctcmVzdWx0JyA6IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiFtb2JpbGUgJiYgb3BlbiAmJiBkaXNwbGF5ZWRWYWx1ZXMubGVuZ3RoXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwicmVhZE9ubHkgfHwgZGlzYWJsZWQgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgW2VuYWJsZV09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICBbZGlzcGxheUZuXT1cImRpc3BsYXlGblwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJkcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgICBbaW5wdXRUZXh0XT1cImlucHV0VGV4dFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgIChvbkNvbXBsZXRlKT1cImhhbmRsZUF1dG9Db21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlkb3duSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlYXJjaFRlcm1DaGFuZ2UoKVwiXG4gICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxuICAgICAgICAvPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJmZC1pbnB1dC1ncm91cF9fYWRkb24gZmQtaW5wdXQtZ3JvdXBfX2FkZG9uLS1idXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzLmZkLXNoZWxsYmFyX19pbnB1dC1ncm91cC1hZGRvbl09XCJpblNoZWxsYmFyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNTZWFyY2ggJiYgc2hvd0NsZWFyQnV0dG9uICYmIGlucHV0VGV4dCAmJiBpbnB1dFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWlucHV0LWdyb3VwX19idXR0b25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwiaW5TaGVsbGJhciA/ICdzdGFuZGFyZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtc2hlbGxiYXJfX2J1dHRvbl09XCJpblNoZWxsYmFyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjbGVhckJ1dHRvbkZvY3VzYWJsZSA/IDAgOiAtMVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNsZWFySW5wdXRCdG5Gb2N1cygpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJjbGVhcklucHV0QnRuQmx1cigpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2hhbmRsZUNsZWFyU2VhcmNoVGVybSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtaWNvbiBnbHlwaD1cImRlY2xpbmVcIj48L2ZkLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG4gICAgPGRpdiBbaWRdPVwiY29tYm9ib3hJZCArICctbGlzdC1yZXN1bHRzJ1wiIGNsYXNzPVwiZmQtY29tYm9ib3gtY291bnQtbGlzdC1yZXN1bHRzXCI+XG4gICAgICAgIHt7IGRpc3BsYXllZFZhbHVlcy5sZW5ndGggfHwgMCB9fSByZXN1bHQgbGlzdCBpdGVtc1xuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0VGVtcGxhdGU+XG4gICAgPHVsXG4gICAgICAgIGZkLWxpc3RcbiAgICAgICAgY2xhc3M9XCJmZC1jb21ib2JveC1jdXN0b20tbGlzdFwiXG4gICAgICAgIFtkcm9wZG93bk1vZGVdPVwidHJ1ZVwiXG4gICAgICAgIFtpZF09XCJjb21ib2JveElkICsgJy1yZXN1bHQnXCJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY29tYm9ib3hJZCArICctc2VhcmNoJ1wiXG4gICAgICAgIFtzdHlsZS5tYXhIZWlnaHRdPVwiIW1vYmlsZSAmJiBtYXhIZWlnaHRcIlxuICAgICAgICBbaGFzTWVzc2FnZV09XCJsaXN0TWVzc2FnZXMgJiYgbGlzdE1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYnlsaW5lXT1cImJ5bGluZVwiXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJfY2xvc2UoKVwiXG4gICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJfY2xvc2UoKVwiXG4gICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBGbjsgZWxzZSBmbGF0TGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZGlzcGxheWVkVmFsdWVzIHwgbGlzdEdyb3VwUGlwZSA6IGdyb3VwRm5cIj5cbiAgICAgICAgICAgICAgICA8bGkgcm9sZT1cImdyb3VwXCIgZmQtbGlzdC1ncm91cC1oZWFkZXIgW3RhYmluZGV4XT1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyBncm91cC5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cImdyb3VwLmtleVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jb21ib2JveC1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGVybSBvZiBncm91cC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm1cIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWVudUNsaWNrSGFuZGxlcih0ZXJtKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRlcm06IHRlcm0gfVwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZsYXRMaXN0PlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY29tYm9ib3gtbGlzdC1pdGVtXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGVybSBvZiBkaXNwbGF5ZWRWYWx1ZXNcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKHRlcm0pXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZW51Q2xpY2tIYW5kbGVyKHRlcm0pXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVybVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdGVybTogdGVybSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuIl19
670
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY29tYm9ib3gvY29tYm9ib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY29tYm9ib3gvY29tYm9ib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFDSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUNMLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNYLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFFSCx1QkFBdUIsRUFFdkIsT0FBTyxFQUVWLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQix1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQXdCLE1BQU0sNEJBQTRCLENBQUM7QUFDNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0s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Z0JBQWdCO2dCQUszQixVQUFVO3NCQURULFNBQVM7dUJBQUMsbUJBQW1CO2dCQUs5QixZQUFZO3NCQURYLGVBQWU7dUJBQUMseUJBQXlCO2dCQUsxQyxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUs1QixZQUFZO3NCQURYLFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcgKi9cbmltcG9ydCB7XG4gICAgQkFDS1NQQUNFLFxuICAgIENPTlRST0wsXG4gICAgRE9XTl9BUlJPVyxcbiAgICBFTlRFUixcbiAgICBFU0NBUEUsXG4gICAgTEVGVF9BUlJPVyxcbiAgICBSSUdIVF9BUlJPVyxcbiAgICBTSElGVCxcbiAgICBTUEFDRSxcbiAgICBUQUIsXG4gICAgVVBfQVJST1dcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgQXV0b0NvbXBsZXRlRXZlbnQsXG4gICAgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgRm9jdXNFc2NhcGVEaXJlY3Rpb24sXG4gICAgS2V5VXRpbCxcbiAgICBOdWxsYWJsZVxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay91dGlscyc7XG5pbXBvcnQgeyBGb3JtSXRlbUNvbnRyb2wsIHJlZ2lzdGVyRm9ybUl0ZW1Db250cm9sIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgSW5wdXRHcm91cENvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9pbnB1dC1ncm91cCc7XG5pbXBvcnQgeyBGRF9MSVNUX01FU1NBR0VfRElSRUNUSVZFLCBMaXN0Q29tcG9uZW50LCBMaXN0TWVzc2FnZURpcmVjdGl2ZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9saXN0JztcbmltcG9ydCB7IE1lbnVLZXlib2FyZFNlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbWVudSc7XG5pbXBvcnQgeyBNb2JpbGVNb2RlQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21vYmlsZS1tb2RlJztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvcG9wb3Zlcic7XG5pbXBvcnQgeyBQb3BvdmVyRmlsbE1vZGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvc2hhcmVkJztcblxuaW1wb3J0IHsgT3ZlcmxheSwgUmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgRm9ybVN0YXRlcywgU2luZ2xlRHJvcGRvd25WYWx1ZUNvbnRyb2wgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2Nkay9mb3Jtcyc7XG5pbXBvcnQgeyBDb250ZW50RGVuc2l0eU9ic2VydmVyLCBjb250ZW50RGVuc2l0eU9ic2VydmVyUHJvdmlkZXJzIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2NvbnRlbnQtZGVuc2l0eSc7XG5pbXBvcnQgeyBDb21ib2JveEl0ZW0gfSBmcm9tICcuL2NvbWJvYm94LWl0ZW0nO1xuaW1wb3J0IHsgQ29tYm9ib3hNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL2NvbWJvYm94LW1vYmlsZS9jb21ib2JveC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IENvbWJvYm94TW9iaWxlTW9kdWxlIH0gZnJvbSAnLi9jb21ib2JveC1tb2JpbGUvY29tYm9ib3gtbW9iaWxlLm1vZHVsZSc7XG5pbXBvcnQgeyBDT01CT0JPWF9DT01QT05FTlQsIENvbWJvYm94SW50ZXJmYWNlIH0gZnJvbSAnLi9jb21ib2JveC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JvdXBGdW5jdGlvbiB9IGZyb20gJy4vbGlzdC1ncm91cC5waXBlJztcbmltcG9ydCB7IEZEX0NPTUJPQk9YX0NPTVBPTkVOVCB9IGZyb20gJy4vdG9rZW5zJztcblxubGV0IGNvbWJvYm94VW5pcXVlSWQgPSAwO1xuXG4vKipcbiAqIEFsbG93cyB1c2VycyB0byBmaWx0ZXIgdGhyb3VnaCByZXN1bHRzIGFuZCBzZWxlY3QgYSB2YWx1ZS5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICogYGBgaHRtbFxuICogPGZkLWNvbWJvYm94XG4gKiAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiXG4gKiAgICAgIFtkcm9wZG93blZhbHVlc109XCJkcm9wZG93blZhbHVlc1wiXG4gKiAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSBzb21lIHRleHQuLi5cIj5cbiAqIDwvZmQtY29tYm9ib3g+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jb21ib2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbWJvYm94LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbWJvYm94Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHJlZ2lzdGVyRm9ybUl0ZW1Db250cm9sKENvbWJvYm94Q29tcG9uZW50KSxcbiAgICAgICAgTWVudUtleWJvYXJkU2VydmljZSxcbiAgICAgICAgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycygpLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGRF9DT01CT0JPWF9DT01QT05FTlQsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogQ29tYm9ib3hDb21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLmZkLWNvbWJvYm94LWN1c3RvbS1jbGFzc10nOiAndHJ1ZScsXG4gICAgICAgICdbY2xhc3MuZmQtY29tYm9ib3gtaW5wdXRdJzogJ3RydWUnLFxuICAgICAgICAnW2NsYXNzLmZkLWNvbWJvYm94LWN1c3RvbS1jbGFzcy0tbW9iaWxlXSc6ICdtb2JpbGUnXG4gICAgfSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENvbWJvYm94Q29tcG9uZW50XG4gICAgaW1wbGVtZW50c1xuICAgICAgICBDb21ib2JveEludGVyZmFjZSxcbiAgICAgICAgU2luZ2xlRHJvcGRvd25WYWx1ZUNvbnRyb2wsXG4gICAgICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgICAgICBPbkluaXQsXG4gICAgICAgIE9uQ2hhbmdlcyxcbiAgICAgICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICAgICAgT25EZXN0cm95LFxuICAgICAgICBGb3JtSXRlbUNvbnRyb2xcbntcbiAgICAvKiogSWQgZm9yIHRoZSBDb21ib2JveC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbWJvYm94SWQgPSBgZmQtY29tYm9ib3gtJHtjb21ib2JveFVuaXF1ZUlkKyt9YDtcblxuICAgIC8qKiBJZCBhdHRyaWJ1dGUgZm9yIGlucHV0IGVsZW1lbnQgaW5zaWRlIENvbWJvYm94IGNvbXBvbmVudCAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5wdXRJZCA9ICcnO1xuXG4gICAgLyoqIEFyaWEtbGFiZWwgZm9yIENvbWJvYm94LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXJpYUxhYmVsOiBOdWxsYWJsZTxzdHJpbmc+O1xuXG4gICAgLyoqIEFyaWEtTGFiZWxsZWRieSBmb3IgZWxlbWVudCBkZXNjcmliaW5nIENvbWJvYm94LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXJpYUxhYmVsbGVkQnk6IE51bGxhYmxlPHN0cmluZz47XG5cbiAgICAvKiogSWYgaXQgaXMgbWFuZGF0b3J5IGZpZWxkICovXG4gICAgQElucHV0KClcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFZhbHVlcyB0byBiZSBmaWx0ZXJlZCBpbiB0aGUgc2VhcmNoIGlucHV0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJvcGRvd25WYWx1ZXM6IGFueVtdID0gW107XG5cbiAgICAvKiogRmlsdGVyIGZ1bmN0aW9uLiBBY2NlcHRzIGFuIGFycmF5IG9mIG9iamVjdHMgYW5kIGEgc2VhcmNoIHRlcm0gYXMgYXJndW1lbnRzXG4gICAgICogYW5kIHJldHVybnMgYSBzdHJpbmcuIFNlZSBzZWFyY2ggaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJGbiA9IHRoaXMuX2RlZmF1bHRGaWx0ZXI7XG5cbiAgICAvKiogV2hldGhlciB0aGUgc2VhcmNoIGlucHV0IGlzIGRpc2FibGVkLiAqKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVkOiBib29sZWFuO1xuXG4gICAgLyoqIFBsYWNlaG9sZGVyIG9mIHRoZSBzZWFyY2ggaW5wdXQuICoqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIENvbWJvYm94IGlzIGEgU2VhcmNoIEZpZWxkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpc1NlYXJjaCA9IGZhbHNlO1xuXG4gICAgLyoqIEljb24gdG8gZGlzcGxheSBpbiB0aGUgcmlnaHQtc2lkZSBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBnbHlwaCA9ICduYXZpZ2F0aW9uLWRvd24tYXJyb3cnO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBzaG93IHRoZSBjbGVhciBzZWFyY2ggdGVybSBidXR0b24gd2hlbiB0aGUgQ29tYm9ib3ggaXMgYSBTZWFyY2ggRmllbGRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dDbGVhckJ1dHRvbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHRyaWdnZXIgZXZlbnRzIHRoYXQgd2lsbCBvcGVuL2Nsb3NlIHRoZSBvcHRpb25zIHBvcG92ZXIuXG4gICAgICogIEFjY2VwdHMgYW55IFtIVE1MIERPTSBFdmVudHNdKGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vanNyZWYvZG9tX29ial9ldmVudC5hc3ApLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdHJpZ2dlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKiogV2hldGhlciB0aGUgY29tYm9ib3ggc2hvdWxkIGNsb3NlLCB3aGVuIGEgY2xpY2sgaXMgcGVyZm9ybWVkIG91dHNpZGUgaXRzIGJvdW5kYXJpZXMuIFRydWUgYnkgZGVmYXVsdCAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2xvc2VPbk91dHNpZGVDbGljayA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb21ib2JveCBzaG91bGQgb3Blbiwgd2hlbiBhbnkga2V5IGlzIHByZXNzZWQgaW4gaW5wdXQgKGV4Y2VwdCBFc2NhcGUsIFNwYWNlLCBFbnRlcikuIFRydWUgYnkgZGVmYXVsdFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgb3Blbk9uS2V5Ym9hcmRFdmVudCA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG9mIHRoZSBmb3JtIGNvbnRyb2wgLSBhcHBsaWVzIGNzcyBjbGFzc2VzLlxuICAgICAqICBDYW4gYmUgYHN1Y2Nlc3NgLCBgZXJyb3JgLCBgd2FybmluZ2AsIGBpbmZvcm1hdGlvbmAgb3IgYmxhbmsgZm9yIGRlZmF1bHQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzdGF0ZT86IEZvcm1TdGF0ZXM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGVtcGxhdGUgd2l0aCB3aGljaCB0byBkaXNwbGF5IHRoZSBpbmRpdmlkdWFsIGxpc3RlZCBpdGVtcy5cbiAgICAgKiBVc2UgaXQgYnkgcGFzc2luZyBhbiBuZy10ZW1wbGF0ZSB3aXRoIGltcGxpY2l0IGNvbnRlbnQuIFNlZSBleGFtcGxlcyBmb3IgbW9yZSBpbmZvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBoYW5kbGUgZ3JvdXBpbmcgb2YgaXRlbXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBncm91cEZuOiBHcm91cEZ1bmN0aW9uO1xuXG4gICAgLyoqIE1heCBoZWlnaHQgb2YgdGhlIHBvcG92ZXIuIEFueSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aWxsIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBzY3JvbGxpbmcuICovXG4gICAgQElucHV0KClcbiAgICBtYXhIZWlnaHQgPSAnNTB2aCc7XG5cbiAgICAvKiogU2VhcmNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgRW50ZXIga2V5IGlzIHByZXNzZWQgb24gdGhlIG1haW4gaW5wdXQuICovXG4gICAgQElucHV0KClcbiAgICBzZWFyY2hGbjogKCkgPT4gdm9pZDtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtYXRjaGluZyBzdHJpbmcgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGR1cmluZyBmaWx0cmF0aW9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlnaGxpZ2h0aW5nID0gdHJ1ZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtYXRjaGluZyBzdHJpbmcgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGFmdGVyIGNvbWJvYm94IHZhbHVlIGlzIHNlbGVjdGVkLiAqL1xuICAgIGZpbHRlckhpZ2hsaWdodCA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgY2xvc2Ugd2hlbiBhIHVzZXIgc2VsZWN0cyBhIHJlc3VsdC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25TZWxlY3QgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGlucHV0IGZpZWxkIHNob3VsZCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcmVzdWx0IHBpY2tlZCBieSB0aGUgdXNlci4gKi9cbiAgICBASW5wdXQoKVxuICAgIGZpbGxPblNlbGVjdCA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBlbmFibGVkOyBFbmFibGVkIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKVxuICAgIGF1dG9Db21wbGV0ZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIFNlbGVjdCBib2R5IHdpZHRoLCB3aGF0ZXZlciBpcyBjaG9zZW4sIHRoZSBib2R5IGhhcyBhIDYwMHB4IGxpbWl0LlxuICAgICAqICogYGF0LWxlYXN0YCB3aWxsIGFwcGx5IGEgbWluaW11bSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC4gLSBEZWZhdWx0XG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqICdmaXQtY29udGVudCcgd2lsbCBhcHBseSB3aWR0aCBuZWVkZWQgdG8gcHJvcGVybHkgZGlzcGxheSBpdGVtcyBpbnNpZGUsIGluZGVwZW5kZW50IG9mIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZSA9ICdhdC1sZWFzdCc7XG5cbiAgICAvKiogRGVmaW5lcyBpZiBjb21ib2JveCBzaG91bGQgYmVoYXZlIHNhbWUgYXMgZHJvcGRvd24uIFdoZW4gaXQncyBlbmFibGVkIHdyaXRpbmcgaW5zaWRlIHRleHQgaW5wdXQgd29uJ3RcbiAgICAgKiB0cmlnZ2VyIG9uQ2hhbmdlIGZ1bmN0aW9uLCB1bnRpbCBpdCBtYXRjaGVzIG9uZSBvZiBkaXNwbGF5ZWQgZHJvcGRvd24gdmFsdWVzLiBBbHNvIGNvbW11bmljYXRpbmcgd2l0aCBjb21ib2JveFxuICAgICAqIGNhbiBiZSBhY2hpZXZlZCBvbmx5IGJ5IG9iamVjdHMgd2l0aCBzYW1lIHR5cGUgYXMgZHJvcGRvd25WYWx1ZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tbXVuaWNhdGVCeU9iamVjdCA9IGZhbHNlO1xuXG4gICAgLyoqIERpc3BsYXkgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhIHN0cmluZy5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgc2VhcmNoIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheUZuID0gdGhpcy5fZGVmYXVsdERpc3BsYXk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIEFkZE9uIEJ1dHRvbiBzaG91bGQgYmUgZm9jdXNhYmxlXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGJ1dHRvbkZvY3VzYWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBjbGVhciBidXR0b24gc2hvdWxkIGJlIGZvY3VzYWJsZS5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBjbGVhckJ1dHRvbkZvY3VzYWJsZSA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgY29tYm9ib3ggaXMgcmVhZG9ubHkuICovXG4gICAgQElucHV0KClcbiAgICByZWFkT25seSA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbWJvYm94IHNob3VsZCBiZSBidWlsdCBvbiBtb2JpbGUgbW9kZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgbW9iaWxlID0gZmFsc2U7XG5cbiAgICAvKiogTXVsdGkgSW5wdXQgTW9iaWxlIENvbmZpZ3VyYXRpb24sIGl0J3MgYXBwbGllZCBvbmx5LCB3aGVuIG1vYmlsZSBpcyBlbmFibGVkICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGVDb25maWc6IE1vYmlsZU1vZGVDb25maWc7XG5cbiAgICAvKiogV2hldGhlciB0byBkaXNwbGF5IHRoZSBhZGRvbiBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBzaG93RHJvcGRvd25CdXR0b24gPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZXR1cm4gcmVzdWx0cyB3aGVyZSB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZW50aXJlIHN0cmluZy4gQnkgZGVmYXVsdCwgb25seSByZXN1bHRzIHRoYXQgc3RhcnRcbiAgICAgKiB3aXRoIHRoZSBpbnB1dCBzZWFyY2ggdGVybSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5jbHVkZXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29sdGlwIGZvciB0aGUgbXVsdGktaW5wdXQgaWNvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRpdGxlOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciBsaXN0IGl0ZW0gb3B0aW9ucyBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYnlsaW5lLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYnlsaW5lID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBBY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHVzZXIgc2hpZnRzIGZvY3VzIGZyb20gdGhlIGRyb3Bkb3duLlxuICAgICAqIC0gYGNsb3NlYCB3aWxsIGNsb3NlIHRoZSBkcm9wZG93biBwcmVzZXJ2aW5nIHByZXZpb3VzbHkgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogLSBgY2xvc2VBbmRTZWxlY3RgIHdpbGwgY2xvc2UgdGhlIGRyb3Bkb3duIGFuZCBzZWxlY3QgbGFzdCBmb2N1c2VkIGRyb3Bkb3duIGl0ZW0uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0YWJPdXRTdHJhdGVneTogJ2Nsb3NlJyB8ICdjbG9zZUFuZFNlbGVjdCcgPSAnY2xvc2VBbmRTZWxlY3QnO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGNsaWNrZWQuIFVzZSAqJGV2ZW50KiB0byByZXRyaWV2ZSBpdC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBpdGVtQ2xpY2tlZDogRXZlbnRFbWl0dGVyPENvbWJvYm94SXRlbT4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvYm94SXRlbT4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkLCB3aGVuIHRoZSBjb21ib2JveCdzIHBvcG92ZXIgYm9keSBpcyBvcGVuZWQgb3IgY2xvc2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgb3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgaW5wdXQgdGV4dCBjaGFuZ2VzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGlucHV0VGV4dENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChMaXN0Q29tcG9uZW50KVxuICAgIGxpc3RDb21wb25lbnQ6IExpc3RDb21wb25lbnQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0RWxlbWVudCcpXG4gICAgc2VhcmNoSW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFBvcG92ZXJDb21wb25lbnQpXG4gICAgcG9wb3ZlckNvbXBvbmVudDogUG9wb3ZlckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZChJbnB1dEdyb3VwQ29tcG9uZW50KVxuICAgIGlucHV0R3JvdXA6IElucHV0R3JvdXBDb21wb25lbnQ7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oRkRfTElTVF9NRVNTQUdFX0RJUkVDVElWRSlcbiAgICBsaXN0TWVzc2FnZXM6IFF1ZXJ5TGlzdDxMaXN0TWVzc2FnZURpcmVjdGl2ZT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRyb2xUZW1wbGF0ZScpXG4gICAgY29udHJvbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xpc3RUZW1wbGF0ZScpXG4gICAgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvKiogS2V5cywgdGhhdCB3b24ndCB0cmlnZ2VyIHRoZSBwb3BvdmVyJ3Mgb3BlbiBzdGF0ZSwgd2hlbiBkaXNwYXRjaGVkIG9uIHNlYXJjaCBpbnB1dCAqL1xuICAgIHJlYWRvbmx5IG5vbk9wZW5pbmdLZXlzOiBudW1iZXJbXSA9IFtcbiAgICAgICAgRVNDQVBFLFxuICAgICAgICBFTlRFUixcbiAgICAgICAgTEVGVF9BUlJPVyxcbiAgICAgICAgUklHSFRfQVJST1csXG4gICAgICAgIERPV05fQVJST1csXG4gICAgICAgIFVQX0FSUk9XLFxuICAgICAgICBDT05UUk9MLFxuICAgICAgICBUQUIsXG4gICAgICAgIFNISUZUXG4gICAgXTtcblxuICAgIC8qKiBLZXlzLCB0aGF0IHdpbGwgY2xvc2UgcG9wb3ZlcidzIGJvZHksIHdoZW4gZGlzcGF0Y2hlZCBvbiBzZWFyY2ggaW5wdXQgKi9cbiAgICByZWFkb25seSBjbG9zaW5nS2V5czogbnVtYmVyW10gPSBbRVNDQVBFXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgX3JlcG9zaXRpb25TY3JvbGxTdHJhdGVneTogUmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5O1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNvbWJvYm94IGlzIG9wZW5lZC4gKi9cbiAgICBvcGVuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgY291cCBpcyBpbiB0aGUgc2hlbGxiYXIuIE9ubHkgZm9yIGludGVybmFsIHVzZSBieSBjb21ib2JveCBjb21wb25lbnRcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgaW5TaGVsbGJhciA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBkaXNwbGF5ZWRWYWx1ZXM6IGFueVtdID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGlucHV0VGV4dFZhbHVlID0gJyc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNsZWFySW5wdXRCdG5Gb2N1c2VkID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9keW5hbWljQ29tcG9uZW50U2VydmljZTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3JlcG9zaXRpb25TY3JvbGxTdHJhdGVneSA9IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKHsgYXV0b0Nsb3NlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEcm9wZG93bkJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZnJlc2hEaXNwbGF5ZWRWYWx1ZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZHJvcGRvd25WYWx1ZXMgJiYgKGNoYW5nZXMuZHJvcGRvd25WYWx1ZXMgfHwgY2hhbmdlcy5zZWFyY2hUZXJtKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaERpc3BsYXllZFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZGRTaGVsbGJhckNsYXNzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRVcE1vYmlsZU1vZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25JbnB1dEtleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGV2ZW50ID09PSAncGFzdGVFdmVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVEFCKSAmJiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBFTlRFUikpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRE9XTl9BUlJPVykpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0RGlzcGxheWVkVmFsdWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMubGlzdENvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hvb3NlT3RoZXJJdGVtKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVVBfQVJST1cpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hvb3NlT3RoZXJJdGVtKC0xKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgdGhpcy5jbG9zaW5nS2V5cykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMub3Blbk9uS2V5Ym9hcmRFdmVudCAmJlxuICAgICAgICAgICAgICAgICFldmVudC5jdHJsS2V5ICYmXG4gICAgICAgICAgICAgICAgIWV2ZW50LmFsdEtleSAmJlxuICAgICAgICAgICAgICAgICFLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgdGhpcy5ub25PcGVuaW5nS2V5cylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHlWYWx1ZSAmJiBLZXlVdGlsLmlzS2V5VHlwZShldmVudCwgJ2NvbnRyb2wnKSAmJiAhS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEJBQ0tTUEFDRSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0Q29tcG9uZW50LnNldEl0ZW1BY3RpdmUoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkl0ZW1LZXlEb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIEVOVEVSKSB8fCBLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgU1BBQ0UpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vbk1lbnVDbGlja0hhbmRsZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbk1lbnVDbGlja0hhbmRsZXIodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSB0aGlzLmRyb3Bkb3duVmFsdWVzLmZpbmRJbmRleCgoX3ZhbHVlKSA9PiBfdmFsdWUgPT09IHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsaWNrQWN0aW9ucyh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckhpZ2hsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KHsgaXRlbTogdmFsdWUsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEhhbmRsZSBkaWFsb2cgZGlzbWlzc2luZywgY2xvc2VzIHBvcG92ZXIgYW5kIHNldHMgYmFja3VwIGRhdGEuICovXG4gICAgZGlhbG9nRGlzbWlzcyh0ZXJtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHQgPSB0aGlzLmRpc3BsYXlGbih0ZXJtKTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0ZXJtKTtcbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2VIYW5kbGUoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKiBIYW5kbGUgZGlhbG9nIGFwcHJvdmFsLCBjbG9zZXMgcG9wb3ZlciBhbmQgcHJvcGFnYXRlcyBkYXRhIGNoYW5nZXMuICovXG4gICAgZGlhbG9nQXBwcm92ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKiogSWYgdHJ1ZSB2YWx1ZSBlbXB0eSAqL1xuICAgIGdldCBpc0VtcHR5VmFsdWUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pbnB1dFRleHQgfHwgdGhpcy5pbnB1dFRleHQ/LnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqIElucHV0IHRleHQgb2YgdGhlIGlucHV0LiAqL1xuICAgIHNldCBpbnB1dFRleHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmlucHV0VGV4dFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXRUZXh0Q2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaW5wdXRUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0VGV4dFZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBHZXQgdGhlIGdseXBoIHZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNvbWJvYm94IGlzIHVzZWQgYXMgYSBzZWFyY2ggZmllbGQgb3Igbm90LiAqL1xuICAgIGdldCBnbHlwaFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VhcmNoID8gJ3NlYXJjaCcgOiB0aGlzLmdseXBoO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hhbmRsZUNsZWFyU2VhcmNoVGVybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHRWYWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLmlucHV0VGV4dENoYW5nZS5lbWl0KCcnKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmRyb3Bkb3duVmFsdWVzIHx8IFtdO1xuICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0VGV4dFZhbHVlID0gdGhpcy5kaXNwbGF5Rm4odmFsdWUpO1xuICAgICAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHBhc3NlZCB0byBsaXN0IGNvbXBvbmVudCAqL1xuICAgIGhhbmRsZUxpc3RGb2N1c0VzY2FwZShkaXJlY3Rpb246IEZvY3VzRXNjYXBlRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGFuZGxlU2VhcmNoVGVybUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHRoaXMuaW5wdXRUZXh0KTtcbiAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50LnJlZnJlc2hQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblByaW1hcnlCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgLy8gUHJldmVudCBwcmltYXJ5IGJ1dHRvbiBjbGljayBiZWhhdmlvdXIgb24gbW9iaWxlc1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaEZuKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVzZXREaXNwbGF5ZWRWYWx1ZXMoKTtcbiAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2VIYW5kbGUoIXRoaXMub3Blbik7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJIaWdobGlnaHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaXNPcGVuQ2hhbmdlSGFuZGxlKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICAvKiogUmVzZXQgZGlzcGxheWVkIHZhbHVlcyBvbiBldmVyeSBtb2JpbGUgb3BlbiAqL1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUgJiYgIXRoaXMub3Blbikge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXREaXNwbGF5ZWRWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcGVuICE9PSBpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGlzT3BlbjtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGlzT3Blbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3BlbiAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmx1cigpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgaGFuZGxlcyBjb21wbGV0ZSBldmVudCBmcm9tIGF1dG8gY29tcGxldGUgZGlyZWN0aXZlLCBzZXR0aW5nIHRoZSBuZXcgdmFsdWUsIGFuZCBjbG9zaW5nIHBvcG92ZXIgKi9cbiAgICBoYW5kbGVBdXRvQ29tcGxldGUoZXZlbnQ6IEF1dG9Db21wbGV0ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VGV4dCAhPT0gZXZlbnQudGVybSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFRleHQgPSBldmVudC50ZXJtO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWFyY2hUZXJtQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LmZvcmNlQ2xvc2UgJiYgdGhpcy5pbnB1dFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGFuZGxlQmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUF1dG9Db21wbGV0ZSh7XG4gICAgICAgICAgICAgICAgdGVybTogdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICBmb3JjZUNsb3NlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNsZWFySW5wdXRCdG5Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhcklucHV0QnRuRm9jdXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjbGVhcklucHV0QnRuQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhcklucHV0QnRuRm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBDdXJyZW50IHNlbGVjdCB2YWx1ZSAqL1xuICAgIGdldFZhbHVlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9jbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFRleHQgPSB0aGlzLl92YWx1ZSA/IHRoaXMuaW5wdXRUZXh0IDogJyc7XG4gICAgICAgIGlmICh0aGlzLnRhYk91dFN0cmF0ZWd5ID09PSAnY2xvc2VBbmRTZWxlY3QnKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c2VkSXRlbSA9IHRoaXMubGlzdENvbXBvbmVudC5nZXRBY3RpdmVJdGVtKCk7XG4gICAgICAgICAgICBpZiAoZm9jdXNlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDbGlja0FjdGlvbnMoZm9jdXNlZEl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzT3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgcGlja3Mgb3RoZXIgdmFsdWUgbW92ZWQgZnJvbSBjdXJyZW50IG9uZSBieSBvZmZzZXQsIGNhbGxlZCBvbmx5IHdoZW4gY29tYm9ib3ggaXMgY2xvc2VkICovXG4gICAgcHJpdmF0ZSBfY2hvb3NlT3RoZXJJdGVtKG9mZnNldDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZVZhbHVlOiBhbnkgPSB0aGlzLl9nZXRPcHRpb25PYmplY3RCeURpc3BsYXllZFZhbHVlKHRoaXMuaW5wdXRUZXh0VmFsdWUpO1xuICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gdGhpcy5kcm9wZG93blZhbHVlcy5maW5kSW5kZXgoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gYWN0aXZlVmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5kcm9wZG93blZhbHVlc1tpbmRleCArIG9mZnNldF0pIHtcbiAgICAgICAgICAgIHRoaXMub25NZW51Q2xpY2tIYW5kbGVyKHRoaXMuZHJvcGRvd25WYWx1ZXNbaW5kZXggKyBvZmZzZXRdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCByZXNldCBmaWx0ZXJpbmcgZm9yIGRpc3BsYXllZCB2YWx1ZXMuIEl0IG92ZXJyaWRlcyBkaXNwbGF5ZWQgdmFsdWVzIGJ5IGFsbCBwb3NzaWJsZSBkcm9wZG93biB2YWx1ZXMgKi9cbiAgICBwcml2YXRlIF9yZXNldERpc3BsYXllZFZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmRyb3Bkb3duVmFsdWVzIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfYWRkU2hlbGxiYXJDbGFzcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5TaGVsbGJhcikge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmZC1zaGVsbGJhcl9faW5wdXQtZ3JvdXAtaW5wdXQnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0R3JvdXApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuc2V0SW5TaGVsbGJhcih0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdERpc3BsYXkoc3RyOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7c3RyfWA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0RmlsdGVyKGNvbnRlbnRBcnJheTogYW55W10sIHNlYXJjaFRlcm06IGFueSk6IGFueVtdIHtcbiAgICAgICAgdGhpcy5maWx0ZXJIaWdobGlnaHQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaFRlcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hMb3dlciA9IHNlYXJjaFRlcm0udG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybSA9IHRoaXMuZGlzcGxheUZuKGl0ZW0pLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluY2x1ZGVzID8gdGVybS5pbmNsdWRlcyhzZWFyY2hMb3dlcikgOiB0ZXJtLnN0YXJ0c1dpdGgoc2VhcmNoTG93ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZWFyY2hUZXJtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRBcnJheS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT09IHNlYXJjaFRlcm0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkgfHwgW107XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9oYW5kbGVDbGlja0FjdGlvbnModGVybTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWxsT25TZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGVybSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0VGV4dCA9IHRoaXMuZGlzcGxheUZuKHRlcm0pO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuaW5wdXRUZXh0O1xuICAgICAgICAgICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZVNlYXJjaFRlcm1DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldE9wdGlvbk9iamVjdEJ5RGlzcGxheWVkVmFsdWUoZGlzcGxheVZhbHVlOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93blZhbHVlcy5maW5kKCh2YWx1ZSkgPT4gdGhpcy5kaXNwbGF5Rm4odmFsdWUpID09PSBkaXNwbGF5VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfcmVmcmVzaERpc3BsYXllZFZhbHVlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFZhbHVlcyA9IHRoaXMuZmlsdGVyRm4odGhpcy5kcm9wZG93blZhbHVlcywgdGhpcy5pbnB1dFRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRWYWx1ZXMgPSB0aGlzLmRyb3Bkb3duVmFsdWVzIHx8IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9wcm9wYWdhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbW11bmljYXRlQnlPYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0T3B0aW9uT2JqZWN0QnlEaXNwbGF5ZWRWYWx1ZSh0aGlzLmlucHV0VGV4dCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwbGF5Rm4odmFsdWUpICE9PSB0aGlzLmRpc3BsYXlGbih0aGlzLmdldFZhbHVlKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbW11bmljYXRlQnlPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHRoaXMuZGlzcGxheUZuKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0VXBNb2JpbGVNb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IENPTUJPQk9YX0NPTVBPTkVOVCwgdXNlVmFsdWU6IHRoaXMgfV0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMuX2luamVjdG9yXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2R5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmNyZWF0ZUR5bmFtaWNNb2R1bGUoXG4gICAgICAgICAgICB7IGxpc3RUZW1wbGF0ZTogdGhpcy5saXN0VGVtcGxhdGUsIGNvbnRyb2xUZW1wbGF0ZTogdGhpcy5jb250cm9sVGVtcGxhdGUgfSxcbiAgICAgICAgICAgIENvbWJvYm94TW9iaWxlTW9kdWxlLFxuICAgICAgICAgICAgQ29tYm9ib3hNb2JpbGVDb21wb25lbnQsXG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGlzU2VsZWN0ZWQodGVybTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRlcm1WYWx1ZSA9IHRoaXMuY29tbXVuaWNhdGVCeU9iamVjdCA/IHRlcm0gOiB0aGlzLmRpc3BsYXlGbih0ZXJtKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKSA9PT0gdGVybVZhbHVlO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2JpbGUgPyBtb2JpbGVUZW1wbGF0ZSA6IGRlc2t0b3BUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Rlc2t0b3BUZW1wbGF0ZT5cbiAgICA8ZmQtcG9wb3ZlclxuICAgICAgICBhZGRpdGlvbmFsQm9keUNsYXNzPVwiZmQtcG9wb3Zlci1jdXN0b20tbGlzdFwiXG4gICAgICAgIFtjbGFzcy5mZC1jb21ib2JveC1mdWxsLXdpZHRoXT1cImlzU2VhcmNoXCJcbiAgICAgICAgW2lzT3Blbl09XCJvcGVuICYmIGRpc3BsYXllZFZhbHVlcyAmJiBkaXNwbGF5ZWRWYWx1ZXMubGVuZ3RoID4gMFwiXG4gICAgICAgIChpc09wZW5DaGFuZ2UpPVwiaXNPcGVuQ2hhbmdlSGFuZGxlKCRldmVudClcIlxuICAgICAgICBbZmlsbENvbnRyb2xNb2RlXT1cImZpbGxDb250cm9sTW9kZVwiXG4gICAgICAgIFtzY3JvbGxTdHJhdGVneV09XCJfcmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5XCJcbiAgICAgICAgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCJcbiAgICAgICAgW3RyaWdnZXJzXT1cInRyaWdnZXJzXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRPbmx5XCJcbiAgICAgICAgW21heFdpZHRoXT1cIjY0MFwiXG4gICAgICAgIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImNsb3NlT25PdXRzaWRlQ2xpY2tcIlxuICAgID5cbiAgICAgICAgPGZkLXBvcG92ZXItY29udHJvbD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgIDxmZC1wb3BvdmVyLWJvZHkgW2hpZGRlbl09XCIhZGlzcGxheWVkVmFsdWVzLmxlbmd0aFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2ZkLXBvcG92ZXItYm9keT5cbiAgICA8L2ZkLXBvcG92ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LXRlcm09XCJ0ZXJtXCIgI2l0ZW1Tb3VyY2U+XG4gICAgPHNwYW5cbiAgICAgICAgZmQtbGlzdC10aXRsZVxuICAgICAgICAqbmdJZj1cIiFpdGVtVGVtcGxhdGU7IGVsc2UgY3VzdG9tUmVuZGVyZXJUZW1wbGF0ZVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwidGVybSB8IGRpc3BsYXlGblBpcGUgOiBkaXNwbGF5Rm4gfCBoaWdobGlnaHQgOiBpbnB1dFRleHQgOiBoaWdobGlnaHRpbmcgJiYgZmlsdGVySGlnaGxpZ2h0XCJcbiAgICAgICAgZmRUcnVuY2F0ZWRUaXRsZVxuICAgID5cbiAgICA8L3NwYW4+XG4gICAgPG5nLXRlbXBsYXRlICNjdXN0b21SZW5kZXJlclRlbXBsYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogdGVybSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9iaWxlVGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICBbYnV0dG9uXT1cInNob3dEcm9wZG93bkJ1dHRvblwiXG4gICAgICAgIFtnbHlwaF09XCJzaG93RHJvcGRvd25CdXR0b24gPyBnbHlwaFZhbHVlIDogbnVsbFwiXG4gICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXG4gICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2lzQ29udHJvbF09XCJ0cnVlXCJcbiAgICAgICAgW2lzRXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBvcGVuICYmIGRpc3BsYXllZFZhbHVlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgW3Nob3dGb2N1c109XCIhY2xlYXJJbnB1dEJ0bkZvY3VzZWRcIlxuICAgICAgICBbZ2x5cGhBcmlhTGFiZWxdPVwiYXJpYUxhYmVsIHx8ICgncGxhdGZvcm1NdWx0aUNvbWJvYm94LmlucHV0R2x5cGhBcmlhTGFiZWwnIHwgZmRUcmFuc2xhdGUpXCJcbiAgICAgICAgW2ljb25UaXRsZV09XCJ0aXRsZSB8fCAoJ3BsYXRmb3JtTXVsdGlDb21ib2JveC5pbnB1dEdseXBoQXJpYUxhYmVsJyB8IGZkVHJhbnNsYXRlKVwiXG4gICAgICAgIChhZGRPbkJ1dHRvbkNsaWNrZWQpPVwib25QcmltYXJ5QnV0dG9uQ2xpY2soKVwiXG4gICAgICAgIChjbGljayk9XCJtb2JpbGUgJiYgaXNPcGVuQ2hhbmdlSGFuZGxlKHRydWUpXCJcbiAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI3NlYXJjaElucHV0RWxlbWVudFxuICAgICAgICAgICAgZmRrQXV0b0NvbXBsZXRlXG4gICAgICAgICAgICBmZC1pbnB1dC1ncm91cC1pbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJjb21ib2JveElkICsgJy1saXN0LXJlc3VsdHMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlID8gJ2xpc3QnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiYXV0b0NvbXBsZXRlICYmICFtb2JpbGUgPyBjb21ib2JveElkICsgJy1yZXN1bHQnIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiIW1vYmlsZSAmJiBvcGVuICYmIGRpc3BsYXllZFZhbHVlcy5sZW5ndGhcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJyZWFkT25seSB8fCBkaXNhYmxlZCA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICBbZW5hYmxlXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgIFtkaXNwbGF5Rm5dPVwiZGlzcGxheUZuXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImRyb3Bkb3duVmFsdWVzXCJcbiAgICAgICAgICAgIFtpbnB1dFRleHRdPVwiaW5wdXRUZXh0XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkT25seVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW2lkXT1cImlucHV0SWRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dFRleHRcIlxuICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwiaGFuZGxlQXV0b0NvbXBsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleWRvd25IYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgICAgKHBhc3RlKT1cIm9uSW5wdXRLZXlkb3duSGFuZGxlcigncGFzdGVFdmVudCcpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZVNlYXJjaFRlcm1DaGFuZ2UoKVwiXG4gICAgICAgICAgICAoYmx1cik9XCJoYW5kbGVCbHVyKClcIlxuICAgICAgICAvPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJmZC1pbnB1dC1ncm91cF9fYWRkb24gZmQtaW5wdXQtZ3JvdXBfX2FkZG9uLS1idXR0b25cIlxuICAgICAgICAgICAgW2NsYXNzLmZkLXNoZWxsYmFyX19pbnB1dC1ncm91cC1hZGRvbl09XCJpblNoZWxsYmFyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNTZWFyY2ggJiYgc2hvd0NsZWFyQnV0dG9uICYmIGlucHV0VGV4dCAmJiBpbnB1dFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWlucHV0LWdyb3VwX19idXR0b25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwiaW5TaGVsbGJhciA/ICdzdGFuZGFyZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIGlucHV0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtc2hlbGxiYXJfX2J1dHRvbl09XCJpblNoZWxsYmFyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJjbGVhckJ1dHRvbkZvY3VzYWJsZSA/IDAgOiAtMVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNsZWFySW5wdXRCdG5Gb2N1cygpXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJjbGVhcklucHV0QnRuQmx1cigpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX2hhbmRsZUNsZWFyU2VhcmNoVGVybSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtaWNvbiBnbHlwaD1cImRlY2xpbmVcIj48L2ZkLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG4gICAgPGRpdiBbaWRdPVwiY29tYm9ib3hJZCArICctbGlzdC1yZXN1bHRzJ1wiIGNsYXNzPVwiZmQtY29tYm9ib3gtY291bnQtbGlzdC1yZXN1bHRzXCI+XG4gICAgICAgIHt7IGRpc3BsYXllZFZhbHVlcy5sZW5ndGggfHwgMCB9fSByZXN1bHQgbGlzdCBpdGVtc1xuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0VGVtcGxhdGU+XG4gICAgPHVsXG4gICAgICAgIGZkLWxpc3RcbiAgICAgICAgY2xhc3M9XCJmZC1jb21ib2JveC1jdXN0b20tbGlzdFwiXG4gICAgICAgIFtkcm9wZG93bk1vZGVdPVwidHJ1ZVwiXG4gICAgICAgIFtpZF09XCJjb21ib2JveElkICsgJy1yZXN1bHQnXCJcbiAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY29tYm9ib3hJZCArICctc2VhcmNoJ1wiXG4gICAgICAgIFtzdHlsZS5tYXhIZWlnaHRdPVwiIW1vYmlsZSAmJiBtYXhIZWlnaHRcIlxuICAgICAgICBbaGFzTWVzc2FnZV09XCJsaXN0TWVzc2FnZXMgJiYgbGlzdE1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICBbYnlsaW5lXT1cImJ5bGluZVwiXG4gICAgICAgIChrZXlkb3duLnRhYik9XCJfY2xvc2UoKVwiXG4gICAgICAgIChrZXlkb3duLnNoaWZ0LnRhYik9XCJfY2xvc2UoKVwiXG4gICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JvdXBGbjsgZWxzZSBmbGF0TGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgZGlzcGxheWVkVmFsdWVzIHwgbGlzdEdyb3VwUGlwZSA6IGdyb3VwRm5cIj5cbiAgICAgICAgICAgICAgICA8bGkgcm9sZT1cImdyb3VwXCIgZmQtbGlzdC1ncm91cC1oZWFkZXIgW3RhYmluZGV4XT1cIjBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZmQtbGlzdC10aXRsZT57eyBncm91cC5rZXkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cImdyb3VwLmtleVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jb21ib2JveC1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGVybSBvZiBncm91cC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm1cIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWVudUNsaWNrSGFuZGxlcih0ZXJtKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRlcm06IHRlcm0gfVwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2ZsYXRMaXN0PlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY29tYm9ib3gtbGlzdC1pdGVtXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGVybSBvZiBkaXNwbGF5ZWRWYWx1ZXNcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJpc1NlbGVjdGVkKHRlcm0pXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlEb3duSGFuZGxlcigkZXZlbnQsIHRlcm0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NZW51Q2xpY2tIYW5kbGVyKHRlcm0pXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGVybVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdGVybTogdGVybSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvdWw+XG48L25nLXRlbXBsYXRlPlxuIl19