@fundamental-ngx/core 0.33.3 → 0.33.4-rc.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +1 -3
  2. package/action-bar/package.json +1 -1
  3. package/action-sheet/package.json +1 -1
  4. package/alert/package.json +1 -1
  5. package/avatar/package.json +1 -1
  6. package/avatar-group/package.json +1 -1
  7. package/bar/package.json +1 -1
  8. package/breadcrumb/package.json +1 -1
  9. package/busy-indicator/package.json +1 -1
  10. package/button/package.json +1 -1
  11. package/calendar/package.json +1 -1
  12. package/card/package.json +1 -1
  13. package/carousel/package.json +1 -1
  14. package/checkbox/checkbox/checkbox.component.d.ts +30 -35
  15. package/checkbox/esm2020/checkbox/checkbox.component.mjs +61 -80
  16. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  17. package/checkbox/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  18. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs +59 -77
  19. package/checkbox/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  20. package/checkbox/package.json +1 -1
  21. package/combobox/package.json +1 -1
  22. package/date-picker/package.json +1 -1
  23. package/datetime/package.json +1 -1
  24. package/datetime-picker/package.json +1 -1
  25. package/dialog/package.json +1 -1
  26. package/dynamic-page/package.json +1 -1
  27. package/dynamic-side-content/package.json +1 -1
  28. package/esm2020/checkbox/checkbox/checkbox.component.mjs +61 -80
  29. package/esm2020/list/list-item/list-item.component.mjs +6 -2
  30. package/esm2020/message-box/message-box-body/message-box-body.component.mjs +12 -10
  31. package/esm2020/message-box/message-box-footer/message-box-footer.component.mjs +12 -9
  32. package/esm2020/message-box/message-box-header/message-box-header.component.mjs +30 -16
  33. package/esm2020/message-box/message-box-semantic-icon/message-box-semantic-icon.component.mjs +12 -14
  34. package/esm2020/message-box/message-box.component.mjs +5 -15
  35. package/esm2020/message-box/utils/message-box-config.class.mjs +3 -2
  36. package/esm2020/multi-input/multi-input.component.mjs +38 -11
  37. package/esm2020/upload-collection/upload-collection-item.directive.mjs +81 -8
  38. package/esm2020/utils/helpers/range-selector.mjs +113 -0
  39. package/esm2020/utils/public_api.mjs +2 -1
  40. package/facets/package.json +1 -1
  41. package/feed-input/package.json +1 -1
  42. package/feed-list-item/package.json +1 -1
  43. package/fesm2015/fundamental-ngx-core-checkbox.mjs +59 -77
  44. package/fesm2015/fundamental-ngx-core-checkbox.mjs.map +1 -1
  45. package/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  46. package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  47. package/fesm2015/fundamental-ngx-core-message-box.mjs +67 -56
  48. package/fesm2015/fundamental-ngx-core-message-box.mjs.map +1 -1
  49. package/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  50. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  51. package/fesm2015/fundamental-ngx-core-upload-collection.mjs +80 -7
  52. package/fesm2015/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  53. package/fesm2015/fundamental-ngx-core-utils.mjs +114 -1
  54. package/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  55. package/fesm2020/fundamental-ngx-core-checkbox.mjs +59 -77
  56. package/fesm2020/fundamental-ngx-core-checkbox.mjs.map +1 -1
  57. package/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  58. package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  59. package/fesm2020/fundamental-ngx-core-message-box.mjs +62 -55
  60. package/fesm2020/fundamental-ngx-core-message-box.mjs.map +1 -1
  61. package/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  62. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  63. package/fesm2020/fundamental-ngx-core-upload-collection.mjs +80 -7
  64. package/fesm2020/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  65. package/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  66. package/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  67. package/file-uploader/package.json +1 -1
  68. package/fixed-card-layout/package.json +1 -1
  69. package/flexible-column-layout/package.json +1 -1
  70. package/form/package.json +1 -1
  71. package/formatted-text/package.json +1 -1
  72. package/grid-list/package.json +1 -1
  73. package/icon/package.json +1 -1
  74. package/illustrated-message/package.json +1 -1
  75. package/infinite-scroll/package.json +1 -1
  76. package/info-label/package.json +1 -1
  77. package/inline-help/package.json +1 -1
  78. package/input-group/package.json +1 -1
  79. package/layout-grid/package.json +1 -1
  80. package/layout-panel/package.json +1 -1
  81. package/link/package.json +1 -1
  82. package/list/esm2020/list-item/list-item.component.mjs +6 -2
  83. package/list/fesm2015/fundamental-ngx-core-list.mjs +5 -1
  84. package/list/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
  85. package/list/fesm2020/fundamental-ngx-core-list.mjs +5 -1
  86. package/list/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
  87. package/list/package.json +1 -1
  88. package/menu/package.json +1 -1
  89. package/message-box/esm2020/message-box-body/message-box-body.component.mjs +12 -10
  90. package/message-box/esm2020/message-box-footer/message-box-footer.component.mjs +12 -9
  91. package/message-box/esm2020/message-box-header/message-box-header.component.mjs +30 -16
  92. package/message-box/esm2020/message-box-semantic-icon/message-box-semantic-icon.component.mjs +12 -14
  93. package/message-box/esm2020/message-box.component.mjs +5 -15
  94. package/message-box/esm2020/utils/message-box-config.class.mjs +3 -2
  95. package/message-box/fesm2015/fundamental-ngx-core-message-box.mjs +67 -56
  96. package/message-box/fesm2015/fundamental-ngx-core-message-box.mjs.map +1 -1
  97. package/message-box/fesm2020/fundamental-ngx-core-message-box.mjs +62 -55
  98. package/message-box/fesm2020/fundamental-ngx-core-message-box.mjs.map +1 -1
  99. package/message-box/message-box-body/message-box-body.component.d.ts +6 -4
  100. package/message-box/message-box-footer/message-box-footer.component.d.ts +6 -4
  101. package/message-box/message-box-header/message-box-header.component.d.ts +16 -8
  102. package/message-box/message-box-semantic-icon/message-box-semantic-icon.component.d.ts +6 -4
  103. package/message-box/message-box.component.d.ts +4 -9
  104. package/message-box/package.json +1 -1
  105. package/message-box/utils/message-box-config.class.d.ts +2 -4
  106. package/message-strip/package.json +1 -1
  107. package/message-toast/package.json +1 -1
  108. package/micro-process-flow/package.json +1 -1
  109. package/mobile-mode/package.json +1 -1
  110. package/multi-input/esm2020/multi-input.component.mjs +38 -11
  111. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs +40 -11
  112. package/multi-input/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  113. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs +38 -11
  114. package/multi-input/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  115. package/multi-input/multi-input.component.d.ts +8 -1
  116. package/multi-input/package.json +1 -1
  117. package/nested-list/package.json +1 -1
  118. package/notification/package.json +1 -1
  119. package/object-identifier/package.json +1 -1
  120. package/object-marker/package.json +1 -1
  121. package/object-number/package.json +1 -1
  122. package/object-status/package.json +1 -1
  123. package/package.json +1 -1
  124. package/pagination/package.json +1 -1
  125. package/panel/package.json +1 -1
  126. package/popover/package.json +1 -1
  127. package/product-switch/package.json +1 -1
  128. package/progress-indicator/package.json +1 -1
  129. package/quick-view/package.json +1 -1
  130. package/radio/package.json +1 -1
  131. package/rating-indicator/package.json +1 -1
  132. package/resizable-card-layout/package.json +1 -1
  133. package/scroll-spy/package.json +1 -1
  134. package/scrollbar/package.json +1 -1
  135. package/segmented-button/package.json +1 -1
  136. package/select/package.json +1 -1
  137. package/shared/package.json +1 -1
  138. package/shellbar/package.json +1 -1
  139. package/side-navigation/package.json +1 -1
  140. package/slider/package.json +1 -1
  141. package/split-button/package.json +1 -1
  142. package/splitter/package.json +1 -1
  143. package/status-indicator/package.json +1 -1
  144. package/step-input/package.json +1 -1
  145. package/switch/package.json +1 -1
  146. package/table/package.json +1 -1
  147. package/tabs/package.json +1 -1
  148. package/text/package.json +1 -1
  149. package/tile/package.json +1 -1
  150. package/time/package.json +1 -1
  151. package/time-picker/package.json +1 -1
  152. package/timeline/package.json +1 -1
  153. package/title/package.json +1 -1
  154. package/token/package.json +1 -1
  155. package/toolbar/package.json +1 -1
  156. package/tree/package.json +1 -1
  157. package/upload-collection/esm2020/upload-collection-item.directive.mjs +81 -8
  158. package/upload-collection/fesm2015/fundamental-ngx-core-upload-collection.mjs +80 -7
  159. package/upload-collection/fesm2015/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  160. package/upload-collection/fesm2020/fundamental-ngx-core-upload-collection.mjs +80 -7
  161. package/upload-collection/fesm2020/fundamental-ngx-core-upload-collection.mjs.map +1 -1
  162. package/upload-collection/package.json +1 -1
  163. package/upload-collection/upload-collection-item.directive.d.ts +32 -2
  164. package/utils/esm2020/helpers/range-selector.mjs +113 -0
  165. package/utils/esm2020/public_api.mjs +2 -1
  166. package/utils/fesm2015/fundamental-ngx-core-utils.mjs +114 -1
  167. package/utils/fesm2015/fundamental-ngx-core-utils.mjs.map +1 -1
  168. package/utils/fesm2020/fundamental-ngx-core-utils.mjs +114 -1
  169. package/utils/fesm2020/fundamental-ngx-core-utils.mjs.map +1 -1
  170. package/utils/helpers/range-selector.d.ts +84 -0
  171. package/utils/package.json +1 -1
  172. package/utils/public_api.d.ts +1 -0
  173. package/vertical-navigation/package.json +1 -1
  174. package/wizard/package.json +1 -1
@@ -7,12 +7,12 @@ import { PopoverComponent } from '@fundamental-ngx/core/popover';
7
7
  import { MenuKeyboardService } from '@fundamental-ngx/core/menu';
8
8
  import { TokenizerComponent } from '@fundamental-ngx/core/token';
9
9
  import { ListComponent } from '@fundamental-ngx/core/list';
10
- import { ContentDensityService, DynamicComponentService, RtlService, applyCssClass, KeyUtil, FocusTrapService, uuidv4 } from '@fundamental-ngx/core/utils';
10
+ import { ContentDensityService, DynamicComponentService, RtlService, applyCssClass, KeyUtil, FocusTrapService, uuidv4, RangeSelector } from '@fundamental-ngx/core/utils';
11
11
  import { MultiInputMobileComponent } from './multi-input-mobile/multi-input-mobile.component';
12
12
  import { MultiInputMobileModule } from './multi-input-mobile/multi-input-mobile.module';
13
13
  import { MULTI_INPUT_COMPONENT } from './multi-input.interface';
14
14
  import { SelectionModel } from '@angular/cdk/collections';
15
- import { map, startWith } from 'rxjs/operators';
15
+ import { distinctUntilChanged, first, map, shareReplay, startWith } from 'rxjs/operators';
16
16
  import { uniqBy } from 'lodash-es';
17
17
  import * as i0 from "@angular/core";
18
18
  import * as i1 from "@fundamental-ngx/core/utils";
@@ -143,6 +143,8 @@ export class MultiInputComponent {
143
143
  /** @hidden */
144
144
  this._subscriptions = new Subscription();
145
145
  /** @hidden */
146
+ this._rangeSelector = new RangeSelector();
147
+ /** @hidden */
146
148
  this.onChange = () => { };
147
149
  /** @hidden */
148
150
  this.onTouched = () => { };
@@ -179,8 +181,10 @@ export class MultiInputComponent {
179
181
  if (!this.inputId) {
180
182
  this.inputId = uuidv4();
181
183
  }
182
- this._subscriptions.add(this._searchTermCtrl.valueChanges.subscribe((searchTerm) => {
184
+ this._subscriptions.add(this._searchTermCtrl.valueChanges.pipe(distinctUntilChanged()).subscribe((searchTerm) => {
183
185
  this.searchTermChange.emit(searchTerm);
186
+ // resetting existing selection state, if any
187
+ this._rangeSelector.reset();
184
188
  }));
185
189
  }
186
190
  /** @hidden */
@@ -285,10 +289,34 @@ export class MultiInputComponent {
285
289
  this._propagateChange();
286
290
  }
287
291
  /** @hidden */
288
- _handleSelect(checked, value, resetSearch = true, event) {
289
- if (event) {
290
- event.preventDefault(); // prevent this function from being called twice when checkbox updates
292
+ _onCheckboxKeyup(value, event, index) {
293
+ if (KeyUtil.isKeyCode(event, [SPACE, ENTER])) {
294
+ this._onCheckboxClick(value, event, index);
295
+ }
296
+ }
297
+ /** @hidden */
298
+ async _onCheckboxClick(value, event, index, isListItem = false) {
299
+ const toggledSelection = !this._selectionModel.isSelected(value);
300
+ this._rangeSelector.onRangeElementToggled(index, event);
301
+ const sub = this.viewModel$.pipe(first()).subscribe((vm) => {
302
+ this._rangeSelector.applyValueToEachInRange((idx) => this._handleSelect(toggledSelection, vm.displayedOptions[idx].value, false));
303
+ });
304
+ this._subscriptions.add(sub);
305
+ if (isListItem) {
306
+ this.openChangeHandle(false);
291
307
  }
308
+ else {
309
+ // stop propagation on the checkbox so event doesn't reach the list item
310
+ event.stopPropagation();
311
+ }
312
+ }
313
+ /** @hidden */
314
+ _onTokenClick(value, resetSearch, event) {
315
+ event?.preventDefault(); // prevent this function from being called twice when checkbox updates
316
+ this._handleSelect(false, value, resetSearch);
317
+ }
318
+ /** @hidden */
319
+ _handleSelect(checked, value, resetSearch = true) {
292
320
  const previousLength = this._selectionModel.selected.length;
293
321
  if (checked) {
294
322
  this._selectionModel.select(value);
@@ -307,7 +335,6 @@ export class MultiInputComponent {
307
335
  // On Mobile mode changes are propagated only on approve.
308
336
  this._propagateChange();
309
337
  }
310
- /** @hidden */
311
338
  _handleInputKeydown(event) {
312
339
  if (KeyUtil.isKeyCode(event, DOWN_ARROW) && !this.mobile) {
313
340
  if (event.altKey) {
@@ -512,7 +539,7 @@ export class MultiInputComponent {
512
539
  selectedOptions,
513
540
  displayedOptions
514
541
  };
515
- }));
542
+ }), shareReplay({ refCount: true, bufferSize: 1 }));
516
543
  }
517
544
  }
518
545
  MultiInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.2", ngImport: i0, type: MultiInputComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.DynamicComponentService }, { token: i0.Injector }, { token: i0.ViewContainerRef }, { token: i1.RtlService, optional: true }, { token: i1.ContentDensityService, optional: true }, { token: i1.FocusTrapService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
@@ -523,7 +550,7 @@ MultiInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
523
550
  multi: true
524
551
  },
525
552
  MenuKeyboardService
526
- ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_handleSelect(false, option.value, true, $event)\"\n (onRemove)=\"_handleSelect(false, option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions\"\n fd-list-item\n (click)=\"dialogApprove()\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n (ngModelChange)=\"_handleSelect($event, option.value, false)\"\n [ngModel]=\"_selectionModel.isSelected(option.value)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], components: [{ type: i2.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i2.PopoverControlComponent, selector: "fd-popover-control" }, { type: i2.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i3.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "compact", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby"], outputs: ["addOnButtonClicked", "search"] }, { type: i4.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "ariaRoleDescription", "compact", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { type: i4.TokenComponent, selector: "fd-token", inputs: ["disabled", "compact", "selected", "readOnly", "deleteButtonLabel", "ariaRoleDescription"], outputs: ["onCloseClick", "onRemove", "onTokenClick"] }, { type: i5.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "compact", "type", "class"] }, { type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "compact", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "tabindex", "noData", "action", "interactive", "growing", "counter", "unread"], outputs: ["keyDown"] }, { type: i7.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "compact", "tristate", "tristateSelectable", "labelClass", "required", "values"], outputs: ["focusChange"] }, { type: i8.LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.InputGroupInputDirective, selector: "[fd-input-group-input]", inputs: ["class", "compact"] }, { type: i1.AutoCompleteDirective, selector: "[fd-auto-complete]", inputs: ["options", "inputText", "enable", "displayFn"], outputs: ["onComplete"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }], pipes: { "async": i9.AsyncPipe, "highlight": i1.SearchHighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
553
+ ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "controlTemplate", first: true, predicate: ["control"], descendants: true, read: TemplateRef }, { propertyName: "listTemplate", first: true, predicate: ["list"], descendants: true, read: TemplateRef }, { propertyName: "listComponent", first: true, predicate: ListComponent, descendants: true }, { propertyName: "searchInputElement", first: true, predicate: ["searchInputElement"], descendants: true, read: ElementRef }, { propertyName: "tokenizer", first: true, predicate: TokenizerComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, true, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions; let idx = index\"\n fd-list-item\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n [value]=\"_selectionModel.isSelected(option.value)\"\n (click)=\"_onCheckboxClick(option.value, $event, idx)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"], components: [{ type: i2.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { type: i2.PopoverControlComponent, selector: "fd-popover-control" }, { type: i2.PopoverBodyComponent, selector: "fd-popover-body" }, { type: i3.InputGroupComponent, selector: "fd-input-group", inputs: ["inputTemplate", "placement", "compact", "required", "inline", "placeholder", "addOnText", "buttonFocusable", "type", "glyph", "button", "disabled", "readonly", "state", "isControl", "showFocus", "isExpanded", "glyphAriaLabel", "iconTitle", "ariaLabelledby"], outputs: ["addOnButtonClicked", "search"] }, { type: i4.TokenizerComponent, selector: "fd-tokenizer", inputs: ["class", "disableKeyboardDeletion", "ariaRoleDescription", "compact", "compactCollapse", "tokenizerFocusable", "inputValue", "glyph", "moreTerm", "open"], outputs: ["moreClickedEvent"] }, { type: i4.TokenComponent, selector: "fd-token", inputs: ["disabled", "compact", "selected", "readOnly", "deleteButtonLabel", "ariaRoleDescription"], outputs: ["onCloseClick", "onRemove", "onTokenClick"] }, { type: i5.FormControlComponent, selector: "[fd-form-control]", inputs: ["state", "compact", "type", "class"] }, { type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "compact", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline"], outputs: ["focusEscapeList"] }, { type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "tabindex", "noData", "action", "interactive", "growing", "counter", "unread"], outputs: ["keyDown"] }, { type: i7.CheckboxComponent, selector: "fd-checkbox", inputs: ["ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "compact", "tristate", "tristateSelectable", "labelClass", "required", "values"], outputs: ["focusChange"] }, { type: i8.LinkComponent, selector: "[fdLink], [fd-link]", inputs: ["class", "emphasized", "disabled", "inverted", "subtle"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.InputGroupInputDirective, selector: "[fd-input-group-input]", inputs: ["class", "compact"] }, { type: i1.AutoCompleteDirective, selector: "[fd-auto-complete]", inputs: ["options", "inputText", "enable", "displayFn"], outputs: ["onComplete"] }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }], pipes: { "async": i9.AsyncPipe, "highlight": i1.SearchHighlightPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
527
554
  __decorate([
528
555
  applyCssClass,
529
556
  __metadata("design:type", Function),
@@ -541,7 +568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
541
568
  multi: true
542
569
  },
543
570
  MenuKeyboardService
544
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_handleSelect(false, option.value, true, $event)\"\n (onRemove)=\"_handleSelect(false, option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions\"\n fd-list-item\n (click)=\"dialogApprove()\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n (ngModelChange)=\"_handleSelect($event, option.value, false)\"\n [ngModel]=\"_selectionModel.isSelected(option.value)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
571
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"viewModel$ | async as vm\">\n <div class=\"fd-multi-input fd-multi-input-custom\">\n <div class=\"fd-multi-input-field\">\n <ng-container [ngTemplateOutlet]=\"control\" *ngIf=\"mobile && !open\"></ng-container>\n <fd-popover\n additionalBodyClass=\"fd-popover-custom-list\"\n *ngIf=\"!mobile\"\n [isOpen]=\"open\"\n (isOpenChange)=\"openChangeHandle($event)\"\n (input)=\"!open && openChangeHandle(true)\"\n [triggers]=\"[]\"\n [maxWidth]=\"bodyMaxWidth\"\n [focusTrapped]=\"true\"\n [disabled]=\"disabled\"\n [fillControlMode]=\"fillControlMode\"\n class=\"fd-multi-input-popover-custom\"\n >\n <fd-popover-control>\n <form (submit)=\"_onSubmit()\">\n <ng-container *ngTemplateOutlet=\"control\"></ng-container>\n </form>\n </fd-popover-control>\n <fd-popover-body\n [attr.aria-hidden]=\"!open\"\n [class.fd-popover__body--hidden]=\"!vm.displayedOptions.length\"\n >\n <ng-container *ngTemplateOutlet=\"list\"></ng-container>\n <ng-content></ng-content>\n </fd-popover-body>\n </fd-popover>\n </div>\n </div>\n\n <ng-template #control>\n <fd-input-group\n class=\"fd-multi-input-input-group-custom\"\n [state]=\"state\"\n [buttonFocusable]=\"buttonFocusable\"\n [button]=\"displayAddonButton\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n [isExpanded]=\"open && !mobile && vm.displayedOptions.length > 0\"\n [isControl]=\"true\"\n [glyph]=\"displayAddonButton ? glyph : ''\"\n [iconTitle]=\"title\"\n (addOnButtonClicked)=\"_addOnButtonClicked()\"\n >\n <fd-tokenizer\n [compactCollapse]=\"compactCollapse\"\n [compact]=\"compact\"\n [open]=\"open\"\n [tokenizerFocusable]=\"false\"\n (moreClickedEvent)=\"_moreClicked()\"\n class=\"fd-multi-input-tokenizer-custom\"\n [class.fd-multi-input-tokenizer-custom--compact]=\"compact\"\n tabindex=\"-1\"\n >\n <fd-token\n *ngFor=\"let option of vm.selectedOptions\"\n [compact]=\"compact\"\n [disabled]=\"disabled\"\n (onCloseClick)=\"_onTokenClick(option.value, true, $event)\"\n (onRemove)=\"_onTokenClick(option.value, false)\"\n >\n <span [innerHtml]=\"option.label\"></span>\n </fd-token>\n <input\n type=\"text\"\n class=\"fd-input fd-tokenizer__input fd-multi-input-tokenizer-input\"\n autocomplete=\"off\"\n fd-form-control\n fd-input-group-input\n fd-auto-complete\n (onComplete)=\"_handleComplete($event)\"\n #searchInputElement\n [displayFn]=\"displayFn\"\n [inputText]=\"_searchTermCtrl.value\"\n [options]=\"dropdownValues\"\n [enable]=\"autoComplete && !mobile\"\n [placeholder]=\"placeholder\"\n [formControl]=\"_searchTermCtrl\"\n [compact]=\"compact\"\n [attr.aria-required]=\"required\"\n [class.fd-input--compact]=\"compact\"\n (keydown)=\"_handleInputKeydown($event)\"\n [attr.id]=\"inputId\"\n />\n </fd-tokenizer>\n </fd-input-group>\n </ng-template>\n\n <ng-template #list>\n <ul\n *ngIf=\"vm.displayedOptions.length\"\n fd-list\n class=\"fd-multi-input-menu-overflow\"\n [selection]=\"true\"\n [mobileMode]=\"mobile\"\n [compact]=\"compact\"\n [style.maxHeight]=\"!mobile ? maxHeight : 'auto'\"\n (focusEscapeList)=\"handleListFocusEscape($event)\"\n [style.minWidth]=\"'100%'\"\n >\n <li\n *ngFor=\"let option of vm.displayedOptions; let idx = index\"\n fd-list-item\n (click)=\"_onCheckboxClick(option.value, $event, idx, true)\"\n (keyup)=\"_onCheckboxKeyup(option.value, $event, idx)\"\n [selected]=\"_selectionModel.isSelected(option.value)\"\n >\n <fd-checkbox\n [compact]=\"compact\"\n [value]=\"_selectionModel.isSelected(option.value)\"\n (click)=\"_onCheckboxClick(option.value, $event, idx)\"\n >\n <!-- TODO -->\n </fd-checkbox>\n <ng-container\n [ngTemplateOutlet]=\"itemSource\"\n [ngTemplateOutletContext]=\"{ option: option }\"\n ></ng-container>\n </li>\n <li\n *ngIf=\"showAllButton && vm.displayedOptions.length < dropdownValues.length\"\n fd-list-item\n class=\"fd-multi-input-show-all\"\n (keyDown)=\"_showAllKeyDown($event)\"\n (click)=\"_showAllClicked($event)\"\n >\n <a fd-link tabindex=\"0\">Show All ({{ dropdownValues.length }})</a>\n </li>\n </ul>\n </ng-template>\n\n <ng-template let-option=\"option\" #itemSource>\n <span\n *ngIf=\"!itemTemplate\"\n fd-list-title\n [innerHtml]=\"option.label | highlight: _searchTermCtrl.value:highlight\"\n >\n </span>\n\n <ng-container *ngIf=\"itemTemplate\">\n <ng-container\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: option.item }\"\n ></ng-container>\n </ng-container>\n </ng-template>\n</ng-container>\n", styles: [".fd-multi-input-tokenizer-custom{width:calc(100% - 2.25rem)}.fd-multi-input-tokenizer-custom--compact{width:calc(100% - 2rem)}.fd-multi-input-input-group-custom{max-width:100%}.fd-multi-input-custom{display:block}.fd-multi-input-item{cursor:pointer;padding:0}.fd-multi-input-popover-size{overflow:auto;display:block}.fd-multi-input-popover-custom.fd-popover-custom{max-width:100%;display:block}.fd-multi-input-popover-custom.fd-popover-custom .fd-tokenizer{height:100%}.fd-multi-input-menu-overflow{max-width:37.5rem;overflow:auto}.fd-input.fd-multi-input-tokenizer-input{margin-top:0;margin-bottom:0;padding-left:0;background-color:transparent}.fd-multi-input-show-all{width:100%;display:flex;justify-content:flex-end;background-color:transparent}.fd-multi-input-show-all .fd-link:active{color:inherit}.fd-multi-input-checkbox{width:100%;cursor:pointer}.fd-multi-input-checkbox .fd-checkbox__label{color:inherit}.fd-list--multi-input{max-width:100%}.fd-popover__body--hidden{display:none}\n"] }]
545
572
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.DynamicComponentService }, { type: i0.Injector }, { type: i0.ViewContainerRef }, { type: i1.RtlService, decorators: [{
546
573
  type: Optional
547
574
  }] }, { type: i1.ContentDensityService, decorators: [{
@@ -644,4 +671,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
644
671
  * function is responsible for order which css classes are applied
645
672
  */
646
673
  buildComponentCssClass: [] } });
647
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQ0gscUJBQXFCLEVBRXJCLHVCQUF1QixFQUN2QixVQUFVLEVBQ1YsYUFBYSxFQUViLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIs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aW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERPV05fQVJST1csIFRBQiwgU1BBQ0UsIEVOVEVSLCBVUF9BUlJPVywgRVNDQVBFIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvcG9wb3Zlcic7XG5pbXBvcnQgeyBNZW51S2V5Ym9hcmRTZXJ2aWNlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21lbnUnO1xuaW1wb3J0IHsgRm9ybVN0YXRlcywgUG9wb3ZlckZpbGxNb2RlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgeyBNb2JpbGVNb2RlQ29uZmlnIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL21vYmlsZS1tb2RlJztcbmltcG9ydCB7IFRva2VuaXplckNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS90b2tlbic7XG5pbXBvcnQgeyBMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2xpc3QnO1xuaW1wb3J0IHtcbiAgICBDb250ZW50RGVuc2l0eVNlcnZpY2UsXG4gICAgQ3NzQ2xhc3NCdWlsZGVyLFxuICAgIER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgIFJ0bFNlcnZpY2UsXG4gICAgYXBwbHlDc3NDbGFzcyxcbiAgICBGb2N1c0VzY2FwZURpcmVjdGlvbixcbiAgICBLZXlVdGlsLFxuICAgIEZvY3VzVHJhcFNlcnZpY2UsXG4gICAgdXVpZHY0XG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS91dGlscyc7XG5cbmltcG9ydCB7IE11bHRpSW5wdXRNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuL211bHRpLWlucHV0LW1vYmlsZS9tdWx0aS1pbnB1dC1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpSW5wdXRNb2JpbGVNb2R1bGUgfSBmcm9tICcuL211bHRpLWlucHV0LW1vYmlsZS9tdWx0aS1pbnB1dC1tb2JpbGUubW9kdWxlJztcbmltcG9ydCB7IE1VTFRJX0lOUFVUX0NPTVBPTkVOVCwgTXVsdGlJbnB1dEludGVyZmFjZSB9IGZyb20gJy4vbXVsdGktaW5wdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgdW5pcUJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuLyoqXG4gKiBJbnB1dCBmaWVsZCB3aXRoIG11bHRpcGxlIHNlbGVjdGlvbiBlbmFibGVkLiBTaG91bGQgYmUgdXNlZCB3aGVuIGEgdXNlciBjYW4gc2VsZWN0IGJldHdlZW4gYVxuICogbGltaXRlZCBudW1iZXIgb2YgcHJlLWRlZmluZWQgb3B0aW9ucyB3aXRoIGEgZmlsdGVyLWVuYWJsZWQgY29udGV4dC5cbiAqXG4gKiBTdXBwb3J0cyBBbmd1bGFyIEZvcm1zLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLW11bHRpLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL211bHRpLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlJbnB1dENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBNZW51S2V5Ym9hcmRTZXJ2aWNlXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpSW5wdXRDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE11bHRpSW5wdXRJbnRlcmZhY2UsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBDc3NDbGFzc0J1aWxkZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgICAvKiogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGluIGNvbXBhY3QgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbXBhY3Q/OiBib29sZWFuO1xuXG4gICAgLyoqIElmIGl0IGlzIG1hbmRhdG9yeSBmaWVsZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRvIHVzZSBjb3p5IHZpc3VhbHMgYnV0IGNvbXBhY3QgY29sbGFwc2luZyBiZWhhdmlvci4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNvbXBhY3RDb2xsYXBzZSA9IGZhbHNlO1xuXG4gICAgLyoqIE1heCBoZWlnaHQgb2YgdGhlIHBvcG92ZXIuIEFueSBvdmVyZmxvd2luZyBlbGVtZW50cyB3aWxsIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBzY3JvbGxpbmcuICovXG4gICAgQElucHV0KClcbiAgICBtYXhIZWlnaHQgPSAnMzAwcHgnO1xuXG4gICAgLyoqIEljb24gb2YgdGhlIGJ1dHRvbiBvbiB0aGUgcmlnaHQgb2YgdGhlIGlucHV0IGZpZWxkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2x5cGggPSAndmFsdWUtaGVscCc7XG5cbiAgICAvKiogVmFsdWVzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdW5maWx0ZXJlZCBkcm9wZG93bi4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRyb3Bkb3duVmFsdWVzOiBhbnlbXSA9IFtdO1xuXG4gICAgLyoqIFNlYXJjaCB0ZXJtLCBvciBtb3JlIHNwZWNpZmljYWxseSB0aGUgdmFsdWUgb2YgdGhlIGlubmVyIGlucHV0IGZpZWxkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHNlYXJjaFRlcm0oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgc2VhcmNoVGVybSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogSWQgYXR0cmlidXRlIGZvciBpbnB1dCBlbGVtZW50IGluc2lkZSBNdWx0aUlucHV0IGNvbXBvbmVudCAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5wdXRJZCA9ICcnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHNlYXJjaCB0ZXJtIHNob3VsZCBiZSBoaWdobGlnaHRlZCBpbiByZXN1bHRzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlnaGxpZ2h0ID0gdHJ1ZTtcblxuICAgIC8qKiBTZWxlY3RlZCBkcm9wZG93biBpdGVtcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWxlY3RlZCgpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZDtcbiAgICB9XG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlczogYW55W10pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgICAgdmFsdWVzPy5mb3JFYWNoKChpdGVtKSA9PiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiB1c2VyJ3MgY3VzdG9tIGNsYXNzZXMgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsYXNzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZnVuY3Rpb24uIEFjY2VwdHMgYW4gYXJyYXkgYW5kIGEgc3RyaW5nIGFzIGFyZ3VtZW50cywgYW5kIG91dHB1dHMgYW4gYXJyYXkuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIG11bHRpIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZmlsdGVyRm4gPSB0aGlzLl9kZWZhdWx0RmlsdGVyO1xuXG4gICAgLyoqXG4gICAgICogVmFsdWUgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhbnkgcHJvcGVydHksIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdmFsdWUuXG4gICAgICogQW4gYXJyb3cgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSAqdGhpcyoga2V5d29yZCBpbiB0aGUgY2FsbGluZyBjb21wb25lbnQuXG4gICAgICogU2VlIG11bHRpIGlucHV0IGV4YW1wbGVzIGZvciBkZXRhaWxzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgdmFsdWVGbiA9IHRoaXMuX2RlZmF1bHRWYWx1ZUZuO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGxheSBmdW5jdGlvbi4gQWNjZXB0cyBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVcbiAgICAgKiBpdGVtcyBwYXNzZWQgdG8gZHJvcGRvd25WYWx1ZXMgYXMgYXJndW1lbnQsIGFuZCBvdXRwdXRzIGEgc3RyaW5nLlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc3BsYXlGbiA9IHRoaXMuX2RlZmF1bHREaXNwbGF5O1xuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZnVuY3Rpb24uIFVzZWQgZm9yIHN1Ym1pdHRpbmcgbmV3IHRva2Vucy4gQWNjZXB0cyBhIHN0cmluZyBieSBkZWZhdWx0LlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5ld1Rva2VuUGFyc2VGbiA9IHRoaXMuX2RlZmF1bHRQYXJzZTtcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGZ1bmN0aW9uLiBVc2VkIHRvIGNoZWNrIGlmIG5ldyB0b2tlbiBjYW4gYmUgYWRkZWQgaW50byBsaXN0LlxuICAgICAqIFdvcmtzIG9ubHksIHdoZW4gYGFsbG93TmV3VG9rZW5zYCBvcHRpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIG5ld1Rva2VuVmFsaWRhdGVGbiA9IHRoaXMuX2RlZmF1bHRUb2tlblZhbGlkYXRlO1xuXG4gICAgLyoqIEFyaWEgbGFiZWwgZm9yIHRoZSBtdWx0aSBpbnB1dCBib2R5LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbXVsdGlJbnB1dEJvZHlMYWJlbCA9ICdNdWx0aSBpbnB1dCBib2R5JztcblxuICAgIC8qKlxuICAgICAqIFByZXNldCBvcHRpb25zIGZvciB0aGUgU2VsZWN0IGJvZHkgd2lkdGgsIHdoYXRldmVyIGlzIGNob3NlbiwgdGhlIGJvZHkgaGFzIGEgNjAwcHggbGltaXQuXG4gICAgICogKiBgYXQtbGVhc3RgIHdpbGwgYXBwbHkgYSBtaW5pbXVtIHdpZHRoIHRvIHRoZSBib2R5IGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIHRoZSBjb250cm9sLiAtIERlZmF1bHRcbiAgICAgKiAqIGBlcXVhbGAgd2lsbCBhcHBseSBhIHdpZHRoIHRvIHRoZSBib2R5IGVxdWl2YWxlbnQgdG8gdGhlIHdpZHRoIG9mIHRoZSBjb250cm9sLlxuICAgICAqICogJ2ZpdC1jb250ZW50JyB3aWxsIGFwcGx5IHdpZHRoIG5lZWRlZCB0byBwcm9wZXJseSBkaXNwbGF5IGl0ZW1zIGluc2lkZSwgaW5kZXBlbmRlbnQgb2YgY29udHJvbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZpbGxDb250cm9sTW9kZTogUG9wb3ZlckZpbGxNb2RlID0gJ2F0LWxlYXN0JztcblxuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUgb2YgdGhlIGZvcm0gY29udHJvbCAtIGFwcGxpZXMgY3NzIGNsYXNzZXMuXG4gICAgICogIENhbiBiZSBgc3VjY2Vzc2AsIGBlcnJvcmAsIGB3YXJuaW5nYCwgYGluZm9ybWF0aW9uYCBvciBibGFuayBmb3IgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHN0YXRlOiBGb3JtU3RhdGVzO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBBZGRPbiBCdXR0b24gc2hvdWxkIGJlIGZvY3VzYWJsZVxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGJ1dHRvbkZvY3VzYWJsZSA9IHRydWU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbXVsdGktaW5wdXQgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBuZXcgdG9rZW5zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dOZXdUb2tlbnMgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1pbnB1dCBzaG91bGQgYmUgYnVpbHQgb24gbW9iaWxlIG1vZGUgKi9cbiAgICBASW5wdXQoKVxuICAgIG1vYmlsZSA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG11bHRpLWlucHV0IHNob3VsZCBoYXZlIHNob3cgYWxsIGJ1dHRvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dBbGxCdXR0b24gPSB0cnVlO1xuXG4gICAgLyoqIE1heCB3aWR0aCBvZiBtdWx0aSBpbnB1dCBib2R5IGluIFBYICovXG4gICAgQElucHV0KClcbiAgICBib2R5TWF4V2lkdGg6IG51bWJlciA9IG51bGw7XG5cbiAgICAvKiogTXVsdGkgSW5wdXQgTW9iaWxlIENvbmZpZ3VyYXRpb24sIGl0J3MgYXBwbGllZCBvbmx5LCB3aGVuIG1vYmlsZSBpcyBlbmFibGVkICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGVDb25maWc6IE1vYmlsZU1vZGVDb25maWcgPSB7IGhhc0Nsb3NlQnV0dG9uOiB0cnVlLCBhcHByb3ZlQnV0dG9uVGV4dDogJ1NlbGVjdCcgfTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IHRvIHJldHVybiByZXN1bHRzIHdoZXJlIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSBlbnRpcmUgc3RyaW5nLiBCeSBkZWZhdWx0LCBvbmx5IHJlc3VsdHMgdGhhdCBzdGFydFxuICAgICAqIHdpdGggdGhlIGlucHV0IHNlYXJjaCB0ZXJtIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpbmNsdWRlcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRlbXBsYXRlIHdpdGggd2hpY2ggdG8gZGlzcGxheSB0aGUgaW5kaXZpZHVhbCBsaXN0ZWQgaXRlbXMuXG4gICAgICogVXNlIGl0IGJ5IHBhc3NpbmcgYW4gbmctdGVtcGxhdGUgd2l0aCBpbXBsaWNpdCBjb250ZW50LiBTZWUgZXhhbXBsZXMgZm9yIG1vcmUgaW5mby5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0b29sdGlwIGZvciB0aGUgbXVsdGktaW5wdXQgaWNvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHRpdGxlOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHNob3VsZCBiZSBlbmFibGVkOyBFbmFibGVkIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKVxuICAgIGF1dG9Db21wbGV0ZSA9IHRydWU7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWFyY2ggdGVybSBjaGFuZ2VzLiBVc2UgKiRldmVudCogdG8gYWNjZXNzIHRoZSBuZXcgdGVybS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWFyY2hUZXJtQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgaXRlbXMgY2hhbmdlLiBVc2UgKiRldmVudCogdG8gYWNjZXNzIHRoZSBuZXcgc2VsZWN0ZWQgYXJyYXkuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG4gICAgLyoqIFdoZXRoZXIgbXVsdGkgaW5wdXQgcG9wb3ZlciBib2R5IHNob3VsZCBiZSBvcGVuZWQgKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW4gPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHRoZSBhZGRvbiBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5QWRkb25CdXR0b24gPSB0cnVlO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQsIHdoZW4gdGhlIG11bHRpIGlucHV0J3MgcG9wb3ZlciBib2R5IGlzIG9wZW5lZCBvciBjbG9zZWQgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBvcGVuQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudClcbiAgICBwb3BvdmVyUmVmOiBQb3BvdmVyQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdjb250cm9sJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIGNvbnRyb2xUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnbGlzdCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBsaXN0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoTGlzdENvbXBvbmVudClcbiAgICBsaXN0Q29tcG9uZW50OiBMaXN0Q29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dEVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBzZWFyY2hJbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoVG9rZW5pemVyQ29tcG9uZW50KVxuICAgIHRva2VuaXplcjogVG9rZW5pemVyQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBvcHRpb25JdGVtcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9wdGlvbkl0ZW1bXT4oW10pO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfc2VhcmNoVGVybUN0cmwgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWFkb25seSBfc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgdmlld01vZGVsJDogT2JzZXJ2YWJsZTxWaWV3TW9kZWw+ID0gdGhpcy5fZ2V0Vmlld01vZGVsKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9kaXI6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0UmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZHluYW1pY0NvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX3J0bFNlcnZpY2U6IFJ0bFNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnREZW5zaXR5U2VydmljZTogQ29udGVudERlbnNpdHlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IF9mb2N1c1RyYXBTZXJ2aWNlOiBGb2N1c1RyYXBTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX2NvbnRlbnREZW5zaXR5U2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlLl9pc0NvbXBhY3REZW5zaXR5LnN1YnNjcmliZSgoaXNDb21wYWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGFjdCA9IGlzQ29tcGFjdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnVpbGRDb21wb25lbnRDc3NDbGFzcygpO1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgdGhpcy5fcnRsU2VydmljZT8ucnRsLnN1YnNjcmliZSgoaXNSdGwpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXIgPSBpc1J0bCA/ICdydGwnIDogJ2x0cic7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghdGhpcy5pbnB1dElkKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0SWQgPSB1dWlkdjQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgdGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoc2VhcmNoVGVybSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybUNoYW5nZS5lbWl0KHNlYXJjaFRlcm0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZHJvcGRvd25WYWx1ZXMgfHwgY2hhbmdlcy5zZWFyY2hUZXJtIHx8IGNoYW5nZXMudmFsdWVGbiB8fCBjaGFuZ2VzLmRpc3BsYXlGbikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uSXRlbXMgPSAodGhpcy5kcm9wZG93blZhbHVlcyA/PyBbXSkubWFwKChpdGVtKSA9PiB0aGlzLl9nZXRPcHRpb25JdGVtKGl0ZW0pKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uSXRlbXMkLm5leHQob3B0aW9uSXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPyB0aGlzLl9zZWFyY2hUZXJtQ3RybC5kaXNhYmxlKCkgOiB0aGlzLl9zZWFyY2hUZXJtQ3RybC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFVwTW9iaWxlTW9kZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIEBhcHBseUNzc0NsYXNzXG4gICAgLyoqIENzc0NsYXNzQnVpbGRlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAgICAgKiBmdW5jdGlvbiBtdXN0IHJldHVybiBzaW5nbGUgc3RyaW5nXG4gICAgICogZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIG9yZGVyIHdoaWNoIGNzcyBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAgICovXG4gICAgYnVpbGRDb21wb25lbnRDc3NDbGFzcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIC8vIFRPRE86IHRoaXMgaWNvbiBmbGlwIG1heSBiZSBhZGRyZXNzZWQgaW4gc3R5bGVzIGluIHRoZSBmdXR1cmVcbiAgICAgICAgaWYgKHRoaXMuZ2x5cGggPT09ICd2YWx1ZS1oZWxwJyAmJiB0aGlzLl9kaXIgPT09ICdydGwnKSB7XG4gICAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5lbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2FwLWljb24tLXZhbHVlLWhlbHAnKTtcbiAgICAgICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvbi5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGVYKC0xKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gWydmZC1tdWx0aS1pbnB1dCcsICdmZC1tdWx0aS1pbnB1dC1jdXN0b20nLCB0aGlzLmNsYXNzXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGVsZW1lbnRSZWYoKTogRWxlbWVudFJlZjxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWY7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoc2VsZWN0ZWQ6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUoc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIE1ldGhvZCBwYXNzZWQgdG8gbGlzdCBjb21wb25lbnQgKi9cbiAgICBoYW5kbGVMaXN0Rm9jdXNFc2NhcGUoZGlyZWN0aW9uOiBGb2N1c0VzY2FwZURpcmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9wZW5DaGFuZ2VIYW5kbGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcGVuICYmIHRoaXMub3BlbiAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZW4gIT09IG9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcblxuICAgICAgICBpZiAoIXRoaXMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3BvdmVyT3BlbkhhbmRsZShvcGVuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNldFNlYXJjaFRlcm0oKTtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFyZW50Rm9jdXNUcmFwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVQYXJlbnRGb2N1c1RyYXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9rZW5pemVyLnJlbW92ZVNlbGVjdGVkVG9rZW5zKCk7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHRoYXQgc2VsZWN0cyBhbGwgcG9zc2libGUgb3B0aW9ucy4gKi9cbiAgICBzZWxlY3RBbGxJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IFsuLi50aGlzLmRyb3Bkb3duVmFsdWVzXTtcblxuICAgICAgICAvLyBPbiBNb2JpbGUgbW9kZSBjaGFuZ2VzIGFyZSBwcm9wYWdhdGVkIG9ubHkgb24gYXBwcm92ZS5cbiAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlU2VsZWN0KGNoZWNrZWQ6IGFueSwgdmFsdWU6IGFueSwgcmVzZXRTZWFyY2ggPSB0cnVlLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50IHRoaXMgZnVuY3Rpb24gZnJvbSBiZWluZyBjYWxsZWQgdHdpY2Ugd2hlbiBjaGVja2JveCB1cGRhdGVzXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0xlbmd0aCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aDtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgcG9wb3ZlciBwbGFjZW1lbnQgdXBkYXRlXG4gICAgICAgIGlmICh0aGlzLl9zaG91bGRQb3BvdmVyQmVVcGRhdGVkKHByZXZpb3VzTGVuZ3RoLCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5sZW5ndGgpKSB7XG4gICAgICAgICAgICB0aGlzLnBvcG92ZXJSZWYucmVmcmVzaFBvc2l0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9oYW5kbGVJbnB1dEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKSAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbRE9XTl9BUlJPVywgVVBfQVJST1csIEVOVEVSXSkpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRVNDQVBFKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVEFCKSAmJiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnYWxwaGFiZXRpY2FsJykgfHwgS2V5VXRpbC5pc0tleVR5cGUoZXZlbnQsICdudW1lcmljJykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd0FsbENsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93QWxsS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFtTUEFDRSwgRU5URVJdKSkge1xuICAgICAgICAgICAgdGhpcy5fc2hvd0FsbENsaWNrZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25TdWJtaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFRlcm07XG4gICAgICAgIGlmIChzZWFyY2hUZXJtID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3QgPSB0aGlzLl9zZWxlY3RGaXJzdEZpbHRlcmVkKHNlYXJjaFRlcm0pO1xuICAgICAgICBpZiAoIWlzRXhpc3QgJiYgdGhpcy5hbGxvd05ld1Rva2VucyAmJiB0aGlzLm5ld1Rva2VuVmFsaWRhdGVGbih0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5uZXdUb2tlblBhcnNlRm4odGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fYWRkTmV3VG9rZW5Ub0Ryb3BEb3duVmFsdWVzKG5ld1Rva2VuKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNlbGVjdCh0cnVlLCBuZXdUb2tlbik7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hhbmRsZUNvbXBsZXRlKHsgdGVybSB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHRlcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGRpYWxvZyBkaXNtaXNzaW5nLCBjbG9zZXMgcG9wb3ZlciBhbmQgc2V0cyBiYWNrdXAgZGF0YS5cbiAgICAgKi9cbiAgICBkaWFsb2dEaXNtaXNzKHNlbGVjdGVkQmFja3VwOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWRCYWNrdXA7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBkaWFsb2cgYXBwcm92YWwsIGNsb3NlcyBwb3BvdmVyIGFuZCBwcm9wYWdhdGVzIGRhdGEgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBkaWFsb2dBcHByb3ZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UodHJ1ZSk7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21vcmVDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfYWRkT25CdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUoIXRoaXMub3Blbik7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBkaXNhYmxlUGFyZW50Rm9jdXNUcmFwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c1RyYXBTZXJ2aWNlPy5wYXVzZUN1cnJlbnRGb2N1c1RyYXAoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGVuYWJsZVBhcmVudEZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNUcmFwU2VydmljZT8udW5wYXVzZUN1cnJlbnRGb2N1c1RyYXAoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2FkZE5ld1Rva2VuVG9Ecm9wRG93blZhbHVlcyhuZXdUb2tlbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3Bkb3duVmFsdWVzLnB1c2gobmV3VG9rZW4pO1xuICAgICAgICBjb25zdCBuZXdPcHRpb24gPSB0aGlzLl9nZXRPcHRpb25JdGVtKG5ld1Rva2VuKTtcbiAgICAgICAgdGhpcy5vcHRpb25JdGVtcyQubmV4dChbLi4udGhpcy5vcHRpb25JdGVtcyQudmFsdWUsIG5ld09wdGlvbl0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0Rmlyc3RGaWx0ZXJlZChzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHNlYXJjaFRlcm0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID4gMCAmJiAhdGhpcy5pbmNsdWRlcyAmJiB0aGlzLmF1dG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KHRydWUsIGZpbHRlcmVkWzBdKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcihjb250ZW50QXJyYXk6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJyk6IGFueVtdIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZFZhbHVlID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybSA9IHR5cGVvZiBkaXNwbGF5ZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBkaXNwbGF5ZWRWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmNsdWRlcyA/IHRlcm0uaW5jbHVkZXMoc2VhcmNoTG93ZXIpIDogdGVybS5zdGFydHNXaXRoKHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsdWVGbih2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdERpc3BsYXkoc3RyOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFBhcnNlKHN0cjogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2RlZmF1bHRUb2tlblZhbGlkYXRlKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXN0cjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3BvcG92ZXJPcGVuSGFuZGxlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb3BhZ2F0ZUNoYW5nZShlbWl0SW5Nb2JpbGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZW1pdEluTW9iaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IFsuLi50aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZF07XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHNlbGVjdGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Nob3VsZFBvcG92ZXJCZVVwZGF0ZWQocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMucG9wb3ZlclJlZiAmJlxuICAgICAgICAgICAgKChwcmV2aW91c0xlbmd0aCA9PT0gMCAmJiBjdXJyZW50TGVuZ3RoID09PSAxKSB8fCAocHJldmlvdXNMZW5ndGggPT09IDEgJiYgY3VycmVudExlbmd0aCA9PT0gMCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9zZXRVcE1vYmlsZU1vZGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTVVMVElfSU5QVVRfQ09NUE9ORU5ULCB1c2VWYWx1ZTogdGhpcyB9XSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuY3JlYXRlRHluYW1pY01vZHVsZShcbiAgICAgICAgICAgIHsgbGlzdFRlbXBsYXRlOiB0aGlzLmxpc3RUZW1wbGF0ZSwgY29udHJvbFRlbXBsYXRlOiB0aGlzLmNvbnRyb2xUZW1wbGF0ZSB9LFxuICAgICAgICAgICAgTXVsdGlJbnB1dE1vYmlsZU1vZHVsZSxcbiAgICAgICAgICAgIE11bHRpSW5wdXRNb2JpbGVDb21wb25lbnQsXG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Jlc2V0U2VhcmNoVGVybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybUN0cmwuc2V0VmFsdWUoJycpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0T3B0aW9uSXRlbShpdGVtOiBhbnkpOiBPcHRpb25JdGVtIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5kaXNwbGF5Rm4oaXRlbSksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZuKGl0ZW0pXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRWaWV3TW9kZWwoKTogT2JzZXJ2YWJsZTxWaWV3TW9kZWw+IHtcbiAgICAgICAgbGV0IHByZXZpb3VzbHlTZWxlY3RlZDogT3B0aW9uSXRlbVtdID0gW107XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSkpLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtcyQsXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFssIG9wdGlvbkl0ZW1zXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG5vdCB1c2luZyBcInNlYXJjaFRlcm1cIiB2YWx1ZSBmcm9tIGNvbWJpbmVMYXRlc3QgYXMgaXQgd2lsbCBiZSB3cm9uZyBmb3IgbGF0ZSBzdWJzY3JpYmVycywgaWYgYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5ZWRPcHRpb25zID0gb3B0aW9uSXRlbXM7XG4gICAgICAgICAgICAgICAgaWYgKHNlYXJjaFRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHNlYXJjaFRlcm0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRPcHRpb25zID0gKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpID8gZmlsdGVyZWQgOiBbXSkubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0T3B0aW9uSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCBvcHRpb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSdyZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIGNvbnN0IG9yZGVyTWFwID0gbmV3IE1hcCh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5tYXAoKHYsIGkpID0+IFt2LCBpXSkpO1xuICAgICAgICAgICAgICAgIC8vIGNvbWJpbmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIG9wdGlvbnMgd2l0aCBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGRpc3BsYXkgc2VsZWN0ZWQgaXRlbXMgZXZlbiBpZiB0aGV5J3JlIG5vdCBwcmVzZW50IGluIHRoZSBsaXN0IG9mIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZS5nLiBpZiBvbmx5IGEgc3Vic2V0IG9mIGFsbCBvcHRpb25zIGlzIHByb3ZpZGVkIHRvIHRoZSBjb250cm9sKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTm90VW5pcXVlID0gb3B0aW9uSXRlbXNcbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChwcmV2aW91c2x5U2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQoaXRlbS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHVuaXFCeShzZWxlY3RlZE5vdFVuaXF1ZSwgJ3ZhbHVlJykuc29ydChcbiAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+IG9yZGVyTWFwLmdldChhLnZhbHVlKSAtIG9yZGVyTWFwLmdldChiLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBwcmV2aW91c2x5U2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRPcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5pbnRlcmZhY2UgT3B0aW9uSXRlbTxUID0gYW55PiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogYW55O1xuICAgIGl0ZW06IFQ7XG59XG5cbmludGVyZmFjZSBWaWV3TW9kZWwge1xuICAgIHNlbGVjdGVkT3B0aW9uczogT3B0aW9uSXRlbVtdO1xuICAgIGRpc3BsYXllZE9wdGlvbnM6IE9wdGlvbkl0ZW1bXTtcbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3TW9kZWwkIHwgYXN5bmMgYXMgdm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmQtbXVsdGktaW5wdXQgZmQtbXVsdGktaW5wdXQtY3VzdG9tXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1maWVsZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250cm9sXCIgKm5nSWY9XCJtb2JpbGUgJiYgIW9wZW5cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxmZC1wb3BvdmVyXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEJvZHlDbGFzcz1cImZkLXBvcG92ZXItY3VzdG9tLWxpc3RcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgW2lzT3Blbl09XCJvcGVuXCJcbiAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cIm9wZW5DaGFuZ2VIYW5kbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cIiFvcGVuICYmIG9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSlcIlxuICAgICAgICAgICAgICAgIFt0cmlnZ2Vyc109XCJbXVwiXG4gICAgICAgICAgICAgICAgW21heFdpZHRoXT1cImJvZHlNYXhXaWR0aFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtmaWxsQ29udHJvbE1vZGVdPVwiZmlsbENvbnRyb2xNb2RlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LXBvcG92ZXItY3VzdG9tXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSAoc3VibWl0KT1cIl9vblN1Ym1pdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICAgICAgPGZkLXBvcG92ZXItYm9keVxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhb3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1wb3BvdmVyX19ib2R5LS1oaWRkZW5dPVwiIXZtLmRpc3BsYXllZE9wdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXItYm9keT5cbiAgICAgICAgICAgIDwvZmQtcG9wb3Zlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRyb2w+XG4gICAgICAgIDxmZC1pbnB1dC1ncm91cFxuICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1pbnB1dC1ncm91cC1jdXN0b21cIlxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcbiAgICAgICAgICAgIFtidXR0b25Gb2N1c2FibGVdPVwiYnV0dG9uRm9jdXNhYmxlXCJcbiAgICAgICAgICAgIFtidXR0b25dPVwiZGlzcGxheUFkZG9uQnV0dG9uXCJcbiAgICAgICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGVkXT1cIm9wZW4gJiYgIW1vYmlsZSAmJiB2bS5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgW2lzQ29udHJvbF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtnbHlwaF09XCJkaXNwbGF5QWRkb25CdXR0b24gPyBnbHlwaCA6ICcnXCJcbiAgICAgICAgICAgIFtpY29uVGl0bGVdPVwidGl0bGVcIlxuICAgICAgICAgICAgKGFkZE9uQnV0dG9uQ2xpY2tlZCk9XCJfYWRkT25CdXR0b25DbGlja2VkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZmQtdG9rZW5pemVyXG4gICAgICAgICAgICAgICAgW2NvbXBhY3RDb2xsYXBzZV09XCJjb21wYWN0Q29sbGFwc2VcIlxuICAgICAgICAgICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgIFtvcGVuXT1cIm9wZW5cIlxuICAgICAgICAgICAgICAgIFt0b2tlbml6ZXJGb2N1c2FibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChtb3JlQ2xpY2tlZEV2ZW50KT1cIl9tb3JlQ2xpY2tlZCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LXRva2VuaXplci1jdXN0b21cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1tdWx0aS1pbnB1dC10b2tlbml6ZXItY3VzdG9tLS1jb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmZC10b2tlblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHZtLnNlbGVjdGVkT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAob25DbG9zZUNsaWNrKT1cIl9oYW5kbGVTZWxlY3QoZmFsc2UsIG9wdGlvbi52YWx1ZSwgdHJ1ZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvblJlbW92ZSk9XCJfaGFuZGxlU2VsZWN0KGZhbHNlLCBvcHRpb24udmFsdWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm9wdGlvbi5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2ZkLXRva2VuPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtaW5wdXQgZmQtdG9rZW5pemVyX19pbnB1dCBmZC1tdWx0aS1pbnB1dC10b2tlbml6ZXItaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBmZC1mb3JtLWNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgZmQtaW5wdXQtZ3JvdXAtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgZmQtYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAob25Db21wbGV0ZSk9XCJfaGFuZGxlQ29tcGxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICNzZWFyY2hJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGbl09XCJkaXNwbGF5Rm5cIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRUZXh0XT1cIl9zZWFyY2hUZXJtQ3RybC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImRyb3Bkb3duVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgW2VuYWJsZV09XCJhdXRvQ29tcGxldGUgJiYgIW1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJfc2VhcmNoVGVybUN0cmxcIlxuICAgICAgICAgICAgICAgICAgICBbY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1pbnB1dC0tY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX2hhbmRsZUlucHV0S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiaW5wdXRJZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZmQtdG9rZW5pemVyPlxuICAgICAgICA8L2ZkLWlucHV0LWdyb3VwPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgI2xpc3Q+XG4gICAgICAgIDx1bFxuICAgICAgICAgICAgKm5nSWY9XCJ2bS5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICBmZC1saXN0XG4gICAgICAgICAgICBjbGFzcz1cImZkLW11bHRpLWlucHV0LW1lbnUtb3ZlcmZsb3dcIlxuICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFttb2JpbGVNb2RlXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICBbY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXhIZWlnaHRdPVwiIW1vYmlsZSA/IG1heEhlaWdodCA6ICdhdXRvJ1wiXG4gICAgICAgICAgICAoZm9jdXNFc2NhcGVMaXN0KT1cImhhbmRsZUxpc3RGb2N1c0VzY2FwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW5XaWR0aF09XCInMTAwJSdcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHZtLmRpc3BsYXllZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIGZkLWxpc3QtaXRlbVxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dBcHByb3ZlKClcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24udmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgW2NvbXBhY3RdPVwiY29tcGFjdFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIl9oYW5kbGVTZWxlY3QoJGV2ZW50LCBvcHRpb24udmFsdWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbi52YWx1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgICAgIDwvZmQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBvcHRpb24gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FsbEJ1dHRvbiAmJiB2bS5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aCA8IGRyb3Bkb3duVmFsdWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1zaG93LWFsbFwiXG4gICAgICAgICAgICAgICAgKGtleURvd24pPVwiX3Nob3dBbGxLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfc2hvd0FsbENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGEgZmQtbGluayB0YWJpbmRleD1cIjBcIj5TaG93IEFsbCAoe3sgZHJvcGRvd25WYWx1ZXMubGVuZ3RoIH19KTwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uPVwib3B0aW9uXCIgI2l0ZW1Tb3VyY2U+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiFpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgZmQtbGlzdC10aXRsZVxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQ6IF9zZWFyY2hUZXJtQ3RybC52YWx1ZTpoaWdobGlnaHRcIlxuICAgICAgICA+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbi5pdGVtIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbXVsdGktaW5wdXQvbXVsdGktaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQ0gscUJBQXFCLEVBRXJCLHVCQUF1QixFQUN2QixVQUFVLEVBQ1YsYUFBYSxFQUViLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIs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Z0I7Z0JBSzNCLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUszQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFLeEMsYUFBYTtzQkFEWixTQUFTO3VCQUFDLGFBQWE7Z0JBS3hCLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBS3JELFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxrQkFBa0I7O1FBd0c3Qjs7O1dBR0c7UUFDSCxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRE9XTl9BUlJPVywgVEFCLCBTUEFDRSwgRU5URVIsIFVQX0FSUk9XLCBFU0NBUEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9wb3BvdmVyJztcbmltcG9ydCB7IE1lbnVLZXlib2FyZFNlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbWVudSc7XG5pbXBvcnQgeyBGb3JtU3RhdGVzLCBQb3BvdmVyRmlsbE1vZGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvc2hhcmVkJztcbmltcG9ydCB7IE1vYmlsZU1vZGVDb25maWcgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbW9iaWxlLW1vZGUnO1xuaW1wb3J0IHsgVG9rZW5pemVyQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3Rva2VuJztcbmltcG9ydCB7IExpc3RDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvbGlzdCc7XG5pbXBvcnQge1xuICAgIENvbnRlbnREZW5zaXR5U2VydmljZSxcbiAgICBDc3NDbGFzc0J1aWxkZXIsXG4gICAgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgUnRsU2VydmljZSxcbiAgICBhcHBseUNzc0NsYXNzLFxuICAgIEZvY3VzRXNjYXBlRGlyZWN0aW9uLFxuICAgIEtleVV0aWwsXG4gICAgRm9jdXNUcmFwU2VydmljZSxcbiAgICB1dWlkdjQsXG4gICAgUmFuZ2VTZWxlY3RvclxufSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvdXRpbHMnO1xuXG5pbXBvcnQgeyBNdWx0aUlucHV0TW9iaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9tdWx0aS1pbnB1dC1tb2JpbGUvbXVsdGktaW5wdXQtbW9iaWxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNdWx0aUlucHV0TW9iaWxlTW9kdWxlIH0gZnJvbSAnLi9tdWx0aS1pbnB1dC1tb2JpbGUvbXVsdGktaW5wdXQtbW9iaWxlLm1vZHVsZSc7XG5pbXBvcnQgeyBNVUxUSV9JTlBVVF9DT01QT05FTlQsIE11bHRpSW5wdXRJbnRlcmZhY2UgfSBmcm9tICcuL211bHRpLWlucHV0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlyc3QsIG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHVuaXFCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8qKlxuICogSW5wdXQgZmllbGQgd2l0aCBtdWx0aXBsZSBzZWxlY3Rpb24gZW5hYmxlZC4gU2hvdWxkIGJlIHVzZWQgd2hlbiBhIHVzZXIgY2FuIHNlbGVjdCBiZXR3ZWVuIGFcbiAqIGxpbWl0ZWQgbnVtYmVyIG9mIHByZS1kZWZpbmVkIG9wdGlvbnMgd2l0aCBhIGZpbHRlci1lbmFibGVkIGNvbnRleHQuXG4gKlxuICogU3VwcG9ydHMgQW5ndWxhciBGb3Jtcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1tdWx0aS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tdWx0aS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKSdcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpSW5wdXRDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgTWVudUtleWJvYXJkU2VydmljZVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUlucHV0Q29tcG9uZW50XG4gICAgaW1wbGVtZW50cyBNdWx0aUlucHV0SW50ZXJmYWNlLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQ3NzQ2xhc3NCdWlsZGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gICAgLyoqIFBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXQgZmllbGQuICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZWhvbGRlciA9ICcnO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBpbiBjb21wYWN0IG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBjb21wYWN0PzogYm9vbGVhbjtcblxuICAgIC8qKiBJZiBpdCBpcyBtYW5kYXRvcnkgZmllbGQgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0byB1c2UgY296eSB2aXN1YWxzIGJ1dCBjb21wYWN0IGNvbGxhcHNpbmcgYmVoYXZpb3IuICovXG4gICAgQElucHV0KClcbiAgICBjb21wYWN0Q29sbGFwc2UgPSBmYWxzZTtcblxuICAgIC8qKiBNYXggaGVpZ2h0IG9mIHRoZSBwb3BvdmVyLiBBbnkgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2lsbCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggc2Nyb2xsaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4SGVpZ2h0ID0gJzMwMHB4JztcblxuICAgIC8qKiBJY29uIG9mIHRoZSBidXR0b24gb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdseXBoID0gJ3ZhbHVlLWhlbHAnO1xuXG4gICAgLyoqIFZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHVuZmlsdGVyZWQgZHJvcGRvd24uICovXG4gICAgQElucHV0KClcbiAgICBkcm9wZG93blZhbHVlczogYW55W10gPSBbXTtcblxuICAgIC8qKiBTZWFyY2ggdGVybSwgb3IgbW9yZSBzcGVjaWZpY2FsbHkgdGhlIHZhbHVlIG9mIHRoZSBpbm5lciBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBzZWFyY2hUZXJtKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZTtcbiAgICB9XG4gICAgc2V0IHNlYXJjaFRlcm0odmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqIElkIGF0dHJpYnV0ZSBmb3IgaW5wdXQgZWxlbWVudCBpbnNpZGUgTXVsdGlJbnB1dCBjb21wb25lbnQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlucHV0SWQgPSAnJztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBzZWFyY2ggdGVybSBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgaW4gcmVzdWx0cy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZ2hsaWdodCA9IHRydWU7XG5cbiAgICAvKiogU2VsZWN0ZWQgZHJvcGRvd24gaXRlbXMuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgc2VsZWN0ZWQoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIHNldCBzZWxlY3RlZCh2YWx1ZXM6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgICAgIHZhbHVlcz8uZm9yRWFjaCgoaXRlbSkgPT4gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGl0ZW0pKTtcbiAgICB9XG5cbiAgICAvKiogdXNlcidzIGN1c3RvbSBjbGFzc2VzICovXG4gICAgQElucHV0KClcbiAgICBjbGFzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGZ1bmN0aW9uLiBBY2NlcHRzIGFuIGFycmF5IGFuZCBhIHN0cmluZyBhcyBhcmd1bWVudHMsIGFuZCBvdXRwdXRzIGFuIGFycmF5LlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGZpbHRlckZuID0gdGhpcy5fZGVmYXVsdEZpbHRlcjtcblxuICAgIC8qKlxuICAgICAqIFZhbHVlIGZ1bmN0aW9uLiBBY2NlcHRzIGFuIG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZVxuICAgICAqIGl0ZW1zIHBhc3NlZCB0byBkcm9wZG93blZhbHVlcyBhcyBhcmd1bWVudCwgYW5kIG91dHB1dHMgYW55IHByb3BlcnR5LCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHZhbHVlLlxuICAgICAqIEFuIGFycm93IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgKnRoaXMqIGtleXdvcmQgaW4gdGhlIGNhbGxpbmcgY29tcG9uZW50LlxuICAgICAqIFNlZSBtdWx0aSBpbnB1dCBleGFtcGxlcyBmb3IgZGV0YWlscy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbHVlRm4gPSB0aGlzLl9kZWZhdWx0VmFsdWVGbjtcblxuICAgIC8qKlxuICAgICAqIERpc3BsYXkgZnVuY3Rpb24uIEFjY2VwdHMgYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlXG4gICAgICogaXRlbXMgcGFzc2VkIHRvIGRyb3Bkb3duVmFsdWVzIGFzIGFyZ3VtZW50LCBhbmQgb3V0cHV0cyBhIHN0cmluZy5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNwbGF5Rm4gPSB0aGlzLl9kZWZhdWx0RGlzcGxheTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGZ1bmN0aW9uLiBVc2VkIGZvciBzdWJtaXR0aW5nIG5ldyB0b2tlbnMuIEFjY2VwdHMgYSBzdHJpbmcgYnkgZGVmYXVsdC5cbiAgICAgKiBBbiBhcnJvdyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlICp0aGlzKiBrZXl3b3JkIGluIHRoZSBjYWxsaW5nIGNvbXBvbmVudC5cbiAgICAgKiBTZWUgbXVsdGkgaW5wdXQgZXhhbXBsZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBuZXdUb2tlblBhcnNlRm4gPSB0aGlzLl9kZWZhdWx0UGFyc2U7XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBmdW5jdGlvbi4gVXNlZCB0byBjaGVjayBpZiBuZXcgdG9rZW4gY2FuIGJlIGFkZGVkIGludG8gbGlzdC5cbiAgICAgKiBXb3JrcyBvbmx5LCB3aGVuIGBhbGxvd05ld1Rva2Vuc2Agb3B0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBuZXdUb2tlblZhbGlkYXRlRm4gPSB0aGlzLl9kZWZhdWx0VG9rZW5WYWxpZGF0ZTtcblxuICAgIC8qKiBBcmlhIGxhYmVsIGZvciB0aGUgbXVsdGkgaW5wdXQgYm9keS4gKi9cbiAgICBASW5wdXQoKVxuICAgIG11bHRpSW5wdXRCb2R5TGFiZWwgPSAnTXVsdGkgaW5wdXQgYm9keSc7XG5cbiAgICAvKipcbiAgICAgKiBQcmVzZXQgb3B0aW9ucyBmb3IgdGhlIFNlbGVjdCBib2R5IHdpZHRoLCB3aGF0ZXZlciBpcyBjaG9zZW4sIHRoZSBib2R5IGhhcyBhIDYwMHB4IGxpbWl0LlxuICAgICAqICogYGF0LWxlYXN0YCB3aWxsIGFwcGx5IGEgbWluaW11bSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC4gLSBEZWZhdWx0XG4gICAgICogKiBgZXF1YWxgIHdpbGwgYXBwbHkgYSB3aWR0aCB0byB0aGUgYm9keSBlcXVpdmFsZW50IHRvIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbC5cbiAgICAgKiAqICdmaXQtY29udGVudCcgd2lsbCBhcHBseSB3aWR0aCBuZWVkZWQgdG8gcHJvcGVybHkgZGlzcGxheSBpdGVtcyBpbnNpZGUsIGluZGVwZW5kZW50IG9mIGNvbnRyb2wuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmaWxsQ29udHJvbE1vZGU6IFBvcG92ZXJGaWxsTW9kZSA9ICdhdC1sZWFzdCc7XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIHN0YXRlIG9mIHRoZSBmb3JtIGNvbnRyb2wgLSBhcHBsaWVzIGNzcyBjbGFzc2VzLlxuICAgICAqICBDYW4gYmUgYHN1Y2Nlc3NgLCBgZXJyb3JgLCBgd2FybmluZ2AsIGBpbmZvcm1hdGlvbmAgb3IgYmxhbmsgZm9yIGRlZmF1bHQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzdGF0ZTogRm9ybVN0YXRlcztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgQWRkT24gQnV0dG9uIHNob3VsZCBiZSBmb2N1c2FibGVcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBidXR0b25Gb2N1c2FibGUgPSB0cnVlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIG11bHRpLWlucHV0IGFsbG93cyB0aGUgY3JlYXRpb24gb2YgbmV3IHRva2Vucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFsbG93TmV3VG9rZW5zID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbXVsdGktaW5wdXQgc2hvdWxkIGJlIGJ1aWx0IG9uIG1vYmlsZSBtb2RlICovXG4gICAgQElucHV0KClcbiAgICBtb2JpbGUgPSBmYWxzZTtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBtdWx0aS1pbnB1dCBzaG91bGQgaGF2ZSBzaG93IGFsbCBidXR0b24uICovXG4gICAgQElucHV0KClcbiAgICBzaG93QWxsQnV0dG9uID0gdHJ1ZTtcblxuICAgIC8qKiBNYXggd2lkdGggb2YgbXVsdGkgaW5wdXQgYm9keSBpbiBQWCAqL1xuICAgIEBJbnB1dCgpXG4gICAgYm9keU1heFdpZHRoOiBudW1iZXIgPSBudWxsO1xuXG4gICAgLyoqIE11bHRpIElucHV0IE1vYmlsZSBDb25maWd1cmF0aW9uLCBpdCdzIGFwcGxpZWQgb25seSwgd2hlbiBtb2JpbGUgaXMgZW5hYmxlZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgbW9iaWxlQ29uZmlnOiBNb2JpbGVNb2RlQ29uZmlnID0geyBoYXNDbG9zZUJ1dHRvbjogdHJ1ZSwgYXBwcm92ZUJ1dHRvblRleHQ6ICdTZWxlY3QnIH07XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byByZXR1cm4gcmVzdWx0cyB3aGVyZSB0aGUgaW5wdXQgbWF0Y2hlcyB0aGUgZW50aXJlIHN0cmluZy4gQnkgZGVmYXVsdCwgb25seSByZXN1bHRzIHRoYXQgc3RhcnRcbiAgICAgKiB3aXRoIHRoZSBpbnB1dCBzZWFyY2ggdGVybSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaW5jbHVkZXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0ZW1wbGF0ZSB3aXRoIHdoaWNoIHRvIGRpc3BsYXkgdGhlIGluZGl2aWR1YWwgbGlzdGVkIGl0ZW1zLlxuICAgICAqIFVzZSBpdCBieSBwYXNzaW5nIGFuIG5nLXRlbXBsYXRlIHdpdGggaW1wbGljaXQgY29udGVudC4gU2VlIGV4YW1wbGVzIGZvciBtb3JlIGluZm8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG9vbHRpcCBmb3IgdGhlIG11bHRpLWlucHV0IGljb24uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGF1dG9jb21wbGV0ZSBzaG91bGQgYmUgZW5hYmxlZDsgRW5hYmxlZCBieSBkZWZhdWx0ICovXG4gICAgQElucHV0KClcbiAgICBhdXRvQ29tcGxldGUgPSB0cnVlO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VhcmNoIHRlcm0gY2hhbmdlcy4gVXNlICokZXZlbnQqIHRvIGFjY2VzcyB0aGUgbmV3IHRlcm0uICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VhcmNoVGVybUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIGl0ZW1zIGNoYW5nZS4gVXNlICokZXZlbnQqIHRvIGFjY2VzcyB0aGUgbmV3IHNlbGVjdGVkIGFycmF5LiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIC8qKiBXaGV0aGVyIG11bHRpIGlucHV0IHBvcG92ZXIgYm9keSBzaG91bGQgYmUgb3BlbmVkICovXG4gICAgQElucHV0KClcbiAgICBvcGVuID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSB0aGUgYWRkb24gYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzcGxheUFkZG9uQnV0dG9uID0gdHJ1ZTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkLCB3aGVuIHRoZSBtdWx0aSBpbnB1dCdzIHBvcG92ZXIgYm9keSBpcyBvcGVuZWQgb3IgY2xvc2VkICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgb3BlbkNoYW5nZTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFBvcG92ZXJDb21wb25lbnQpXG4gICAgcG9wb3ZlclJlZjogUG9wb3ZlckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnY29udHJvbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBjb250cm9sVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xpc3QnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKExpc3RDb21wb25lbnQpXG4gICAgbGlzdENvbXBvbmVudDogTGlzdENvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnc2VhcmNoSW5wdXRFbGVtZW50JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgc2VhcmNoSW5wdXRFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKFRva2VuaXplckNvbXBvbmVudClcbiAgICB0b2tlbml6ZXI6IFRva2VuaXplckNvbXBvbmVudDtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgb3B0aW9uSXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPcHRpb25JdGVtW10+KFtdKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgX3NlYXJjaFRlcm1DdHJsID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVhZG9ubHkgX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlYWRvbmx5IHZpZXdNb2RlbCQ6IE9ic2VydmFibGU8Vmlld01vZGVsPiA9IHRoaXMuX2dldFZpZXdNb2RlbCgpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfZGlyOiBzdHJpbmc7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX3JhbmdlU2VsZWN0b3IgPSBuZXcgUmFuZ2VTZWxlY3RvcigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9keW5hbWljQ29tcG9uZW50U2VydmljZTogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfcnRsU2VydmljZTogUnRsU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBfY29udGVudERlbnNpdHlTZXJ2aWNlOiBDb250ZW50RGVuc2l0eVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzVHJhcFNlcnZpY2U6IEZvY3VzVHJhcFNlcnZpY2VcbiAgICApIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5fY29udGVudERlbnNpdHlTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50RGVuc2l0eVNlcnZpY2UuX2lzQ29tcGFjdERlbnNpdHkuc3Vic2NyaWJlKChpc0NvbXBhY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wYWN0ID0gaXNDb21wYWN0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50Q3NzQ2xhc3MoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9ydGxTZXJ2aWNlPy5ydGwuc3Vic2NyaWJlKChpc1J0bCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RpciA9IGlzUnRsID8gJ3J0bCcgOiAnbHRyJztcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50Q3NzQ2xhc3MoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlucHV0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRJZCA9IHV1aWR2NCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZUNoYW5nZXMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKS5zdWJzY3JpYmUoKHNlYXJjaFRlcm0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFRlcm1DaGFuZ2UuZW1pdChzZWFyY2hUZXJtKTtcbiAgICAgICAgICAgICAgICAvLyByZXNldHRpbmcgZXhpc3Rpbmcgc2VsZWN0aW9uIHN0YXRlLCBpZiBhbnlcbiAgICAgICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLnJlc2V0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLmJ1aWxkQ29tcG9uZW50Q3NzQ2xhc3MoKTtcblxuICAgICAgICBpZiAoY2hhbmdlcy5kcm9wZG93blZhbHVlcyB8fCBjaGFuZ2VzLnNlYXJjaFRlcm0gfHwgY2hhbmdlcy52YWx1ZUZuIHx8IGNoYW5nZXMuZGlzcGxheUZuKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25JdGVtcyA9ICh0aGlzLmRyb3Bkb3duVmFsdWVzID8/IFtdKS5tYXAoKGl0ZW0pID0+IHRoaXMuX2dldE9wdGlvbkl0ZW0oaXRlbSkpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtcyQubmV4dChvcHRpb25JdGVtcyk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA/IHRoaXMuX3NlYXJjaFRlcm1DdHJsLmRpc2FibGUoKSA6IHRoaXMuX3NlYXJjaFRlcm1DdHJsLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VXBNb2JpbGVNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgQGFwcGx5Q3NzQ2xhc3NcbiAgICAvKiogQ3NzQ2xhc3NCdWlsZGVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICAgICAqIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHNpbmdsZSBzdHJpbmdcbiAgICAgKiBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3Igb3JkZXIgd2hpY2ggY3NzIGNsYXNzZXMgYXJlIGFwcGxpZWRcbiAgICAgKi9cbiAgICBidWlsZENvbXBvbmVudENzc0NsYXNzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpY29uIGZsaXAgbWF5IGJlIGFkZHJlc3NlZCBpbiBzdHlsZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICBpZiAodGhpcy5nbHlwaCA9PT0gJ3ZhbHVlLWhlbHAnICYmIHRoaXMuX2RpciA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGljb24gPSB0aGlzLmVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zYXAtaWNvbi0tdmFsdWUtaGVscCcpO1xuICAgICAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICAgICAgICBpY29uLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZVgoLTEpJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbJ2ZkLW11bHRpLWlucHV0JywgJ2ZkLW11bHRpLWlucHV0LWN1c3RvbScsIHRoaXMuY2xhc3NdO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChzZWxlY3RlZDogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgd3JpdGVWYWx1ZShzZWxlY3RlZDogYW55W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogTWV0aG9kIHBhc3NlZCB0byBsaXN0IGNvbXBvbmVudCAqL1xuICAgIGhhbmRsZUxpc3RGb2N1c0VzY2FwZShkaXJlY3Rpb246IEZvY3VzRXNjYXBlRGlyZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICd1cCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb3BlbkNoYW5nZUhhbmRsZShvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wZW4gJiYgdGhpcy5vcGVuICYmICF0aGlzLm1vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3BlbiAhPT0gb3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuXG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcG92ZXJPcGVuSGFuZGxlKG9wZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgICAgICAgICAgdGhpcy5lbmFibGVQYXJlbnRGb2N1c1RyYXAoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVBhcmVudEZvY3VzVHJhcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50b2tlbml6ZXIucmVtb3ZlU2VsZWN0ZWRUb2tlbnMoKTtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBNZXRob2QgdGhhdCBzZWxlY3RzIGFsbCBwb3NzaWJsZSBvcHRpb25zLiAqL1xuICAgIHNlbGVjdEFsbEl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gWy4uLnRoaXMuZHJvcGRvd25WYWx1ZXNdO1xuXG4gICAgICAgIC8vIE9uIE1vYmlsZSBtb2RlIGNoYW5nZXMgYXJlIHByb3BhZ2F0ZWQgb25seSBvbiBhcHByb3ZlLlxuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9vbkNoZWNrYm94S2V5dXAodmFsdWU6IGFueSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbU1BBQ0UsIEVOVEVSXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hlY2tib3hDbGljayh2YWx1ZSwgZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgYXN5bmMgX29uQ2hlY2tib3hDbGljayhcbiAgICAgICAgdmFsdWU6IGFueSxcbiAgICAgICAgZXZlbnQ6IFBvaW50ZXJFdmVudCB8IEtleWJvYXJkRXZlbnQsXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIGlzTGlzdEl0ZW0gPSBmYWxzZVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0b2dnbGVkU2VsZWN0aW9uID0gIXRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodmFsdWUpO1xuICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLm9uUmFuZ2VFbGVtZW50VG9nZ2xlZChpbmRleCwgZXZlbnQpO1xuICAgICAgICBjb25zdCBzdWIgPSB0aGlzLnZpZXdNb2RlbCQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKHZtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yYW5nZVNlbGVjdG9yLmFwcGx5VmFsdWVUb0VhY2hJblJhbmdlKChpZHgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KHRvZ2dsZWRTZWxlY3Rpb24sIHZtLmRpc3BsYXllZE9wdGlvbnNbaWR4XS52YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoc3ViKTtcbiAgICAgICAgaWYgKGlzTGlzdEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9wIHByb3BhZ2F0aW9uIG9uIHRoZSBjaGVja2JveCBzbyBldmVudCBkb2Vzbid0IHJlYWNoIHRoZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25Ub2tlbkNsaWNrKHZhbHVlOiBhbnksIHJlc2V0U2VhcmNoOiBib29sZWFuLCBldmVudD86IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTsgLy8gcHJldmVudCB0aGlzIGZ1bmN0aW9uIGZyb20gYmVpbmcgY2FsbGVkIHR3aWNlIHdoZW4gY2hlY2tib3ggdXBkYXRlc1xuICAgICAgICB0aGlzLl9oYW5kbGVTZWxlY3QoZmFsc2UsIHZhbHVlLCByZXNldFNlYXJjaCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfaGFuZGxlU2VsZWN0KGNoZWNrZWQ6IGFueSwgdmFsdWU6IGFueSwgcmVzZXRTZWFyY2ggPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoO1xuICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwb3BvdmVyIHBsYWNlbWVudCB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFBvcG92ZXJCZVVwZGF0ZWQocHJldmlvdXNMZW5ndGgsIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9wb3ZlclJlZi5yZWZyZXNoUG9zaXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNldFNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRTZWFyY2hUZXJtKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlYXJjaElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cbiAgICAgICAgLy8gT24gTW9iaWxlIG1vZGUgY2hhbmdlcyBhcmUgcHJvcGFnYXRlZCBvbmx5IG9uIGFwcHJvdmUuXG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZSgpO1xuICAgIH1cblxuICAgIF9oYW5kbGVJbnB1dEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBET1dOX0FSUk9XKSAmJiAhdGhpcy5tb2JpbGUpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBbRE9XTl9BUlJPVywgVVBfQVJST1csIEVOVEVSXSkpIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZSh0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRVNDQVBFKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgVEFCKSAmJiB0aGlzLm9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb21wb25lbnQuc2V0SXRlbUFjdGl2ZSgwKTtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlUeXBlKGV2ZW50LCAnYWxwaGFiZXRpY2FsJykgfHwgS2V5VXRpbC5pc0tleVR5cGUoZXZlbnQsICdudW1lcmljJykpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuQ2hhbmdlSGFuZGxlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd0FsbENsaWNrZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF9zaG93QWxsS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoS2V5VXRpbC5pc0tleUNvZGUoZXZlbnQsIFtTUEFDRSwgRU5URVJdKSkge1xuICAgICAgICAgICAgdGhpcy5fc2hvd0FsbENsaWNrZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfb25TdWJtaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFRlcm07XG4gICAgICAgIGlmIChzZWFyY2hUZXJtID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3QgPSB0aGlzLl9zZWxlY3RGaXJzdEZpbHRlcmVkKHNlYXJjaFRlcm0pO1xuICAgICAgICBpZiAoIWlzRXhpc3QgJiYgdGhpcy5hbGxvd05ld1Rva2VucyAmJiB0aGlzLm5ld1Rva2VuVmFsaWRhdGVGbih0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Rva2VuID0gdGhpcy5uZXdUb2tlblBhcnNlRm4odGhpcy5fc2VhcmNoVGVybUN0cmwudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fYWRkTmV3VG9rZW5Ub0Ryb3BEb3duVmFsdWVzKG5ld1Rva2VuKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNlbGVjdCh0cnVlLCBuZXdUb2tlbik7XG4gICAgICAgICAgICB0aGlzLl9zZWFyY2hUZXJtQ3RybC5zZXRWYWx1ZSgnJyk7XG4gICAgICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hhbmRsZUNvbXBsZXRlKHsgdGVybSB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGVybSA9IHRlcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGRpYWxvZyBkaXNtaXNzaW5nLCBjbG9zZXMgcG9wb3ZlciBhbmQgc2V0cyBiYWNrdXAgZGF0YS5cbiAgICAgKi9cbiAgICBkaWFsb2dEaXNtaXNzKHNlbGVjdGVkQmFja3VwOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWRCYWNrdXA7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBkaWFsb2cgYXBwcm92YWwsIGNsb3NlcyBwb3BvdmVyIGFuZCBwcm9wYWdhdGVzIGRhdGEgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBkaWFsb2dBcHByb3ZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2UodHJ1ZSk7XG4gICAgICAgIHRoaXMub3BlbkNoYW5nZUhhbmRsZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2VhcmNoVGVybSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX21vcmVDbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfYWRkT25CdXR0b25DbGlja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wZW5DaGFuZ2VIYW5kbGUoIXRoaXMub3Blbik7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBkaXNhYmxlUGFyZW50Rm9jdXNUcmFwKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c1RyYXBTZXJ2aWNlPy5wYXVzZUN1cnJlbnRGb2N1c1RyYXAoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGVuYWJsZVBhcmVudEZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNUcmFwU2VydmljZT8udW5wYXVzZUN1cnJlbnRGb2N1c1RyYXAoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2FkZE5ld1Rva2VuVG9Ecm9wRG93blZhbHVlcyhuZXdUb2tlbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3Bkb3duVmFsdWVzLnB1c2gobmV3VG9rZW4pO1xuICAgICAgICBjb25zdCBuZXdPcHRpb24gPSB0aGlzLl9nZXRPcHRpb25JdGVtKG5ld1Rva2VuKTtcbiAgICAgICAgdGhpcy5vcHRpb25JdGVtcyQubmV4dChbLi4udGhpcy5vcHRpb25JdGVtcyQudmFsdWUsIG5ld09wdGlvbl0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0Rmlyc3RGaWx0ZXJlZChzZWFyY2hUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHNlYXJjaFRlcm0pO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJlZCkgJiYgZmlsdGVyZWQubGVuZ3RoID4gMCAmJiAhdGhpcy5pbmNsdWRlcyAmJiB0aGlzLmF1dG9Db21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0KHRydWUsIGZpbHRlcmVkWzBdKTtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEZpbHRlcihjb250ZW50QXJyYXk6IGFueVtdLCBzZWFyY2hUZXJtOiBzdHJpbmcgPSAnJyk6IGFueVtdIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoTG93ZXIgPSBzZWFyY2hUZXJtLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBjb250ZW50QXJyYXkuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZFZhbHVlID0gdGhpcy5kaXNwbGF5Rm4oaXRlbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybSA9IHR5cGVvZiBkaXNwbGF5ZWRWYWx1ZSA9PT0gJ3N0cmluZycgPyBkaXNwbGF5ZWRWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmNsdWRlcyA/IHRlcm0uaW5jbHVkZXMoc2VhcmNoTG93ZXIpIDogdGVybS5zdGFydHNXaXRoKHNlYXJjaExvd2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsdWVGbih2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdERpc3BsYXkoc3RyOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZGVmYXVsdFBhcnNlKHN0cjogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2RlZmF1bHRUb2tlblZhbGlkYXRlKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXN0cjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3BvcG92ZXJPcGVuSGFuZGxlKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcGVuID0gb3BlbjtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Byb3BhZ2F0ZUNoYW5nZShlbWl0SW5Nb2JpbGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZW1pdEluTW9iaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IFsuLi50aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZF07XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHNlbGVjdGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaGFuZ2UuZW1pdChzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Nob3VsZFBvcG92ZXJCZVVwZGF0ZWQocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIXRoaXMucG9wb3ZlclJlZiAmJlxuICAgICAgICAgICAgKChwcmV2aW91c0xlbmd0aCA9PT0gMCAmJiBjdXJyZW50TGVuZ3RoID09PSAxKSB8fCAocHJldmlvdXNMZW5ndGggPT09IDEgJiYgY3VycmVudExlbmd0aCA9PT0gMCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9zZXRVcE1vYmlsZU1vZGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTVVMVElfSU5QVVRfQ09NUE9ORU5ULCB1c2VWYWx1ZTogdGhpcyB9XSxcbiAgICAgICAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3JcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuY3JlYXRlRHluYW1pY01vZHVsZShcbiAgICAgICAgICAgIHsgbGlzdFRlbXBsYXRlOiB0aGlzLmxpc3RUZW1wbGF0ZSwgY29udHJvbFRlbXBsYXRlOiB0aGlzLmNvbnRyb2xUZW1wbGF0ZSB9LFxuICAgICAgICAgICAgTXVsdGlJbnB1dE1vYmlsZU1vZHVsZSxcbiAgICAgICAgICAgIE11bHRpSW5wdXRNb2JpbGVDb21wb25lbnQsXG4gICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Jlc2V0U2VhcmNoVGVybSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2VhcmNoVGVybUN0cmwuc2V0VmFsdWUoJycpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0T3B0aW9uSXRlbShpdGVtOiBhbnkpOiBPcHRpb25JdGVtIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5kaXNwbGF5Rm4oaXRlbSksXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZuKGl0ZW0pXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRWaWV3TW9kZWwoKTogT2JzZXJ2YWJsZTxWaWV3TW9kZWw+IHtcbiAgICAgICAgbGV0IHByZXZpb3VzbHlTZWxlY3RlZDogT3B0aW9uSXRlbVtdID0gW107XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLl9zZWFyY2hUZXJtQ3RybC52YWx1ZSkpLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25JdGVtcyQsXG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFssIG9wdGlvbkl0ZW1zXSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIG5vdCB1c2luZyBcInNlYXJjaFRlcm1cIiB2YWx1ZSBmcm9tIGNvbWJpbmVMYXRlc3QgYXMgaXQgd2lsbCBiZSB3cm9uZyBmb3IgbGF0ZSBzdWJzY3JpYmVycywgaWYgYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuX3NlYXJjaFRlcm1DdHJsLnZhbHVlO1xuICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5ZWRPcHRpb25zID0gb3B0aW9uSXRlbXM7XG4gICAgICAgICAgICAgICAgaWYgKHNlYXJjaFRlcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLmZpbHRlckZuKHRoaXMuZHJvcGRvd25WYWx1ZXMsIHNlYXJjaFRlcm0pO1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRPcHRpb25zID0gKEFycmF5LmlzQXJyYXkoZmlsdGVyZWQpID8gZmlsdGVyZWQgOiBbXSkubWFwKChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0T3B0aW9uSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCBvcHRpb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSdyZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIGNvbnN0IG9yZGVyTWFwID0gbmV3IE1hcCh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5tYXAoKHYsIGkpID0+IFt2LCBpXSkpO1xuICAgICAgICAgICAgICAgIC8vIGNvbWJpbmluZyBwcmV2aW91c2x5IHNlbGVjdGVkIG9wdGlvbnMgd2l0aCBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGRpc3BsYXkgc2VsZWN0ZWQgaXRlbXMgZXZlbiBpZiB0aGV5J3JlIG5vdCBwcmVzZW50IGluIHRoZSBsaXN0IG9mIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZS5nLiBpZiBvbmx5IGEgc3Vic2V0IG9mIGFsbCBvcHRpb25zIGlzIHByb3ZpZGVkIHRvIHRoZSBjb250cm9sKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTm90VW5pcXVlID0gb3B0aW9uSXRlbXNcbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChwcmV2aW91c2x5U2VsZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQoaXRlbS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9ucyA9IHVuaXFCeShzZWxlY3RlZE5vdFVuaXF1ZSwgJ3ZhbHVlJykuc29ydChcbiAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+IG9yZGVyTWFwLmdldChhLnZhbHVlKSAtIG9yZGVyTWFwLmdldChiLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBwcmV2aW91c2x5U2VsZWN0ZWQgPSBzZWxlY3RlZE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWRPcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KVxuICAgICAgICApO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIE9wdGlvbkl0ZW08VCA9IGFueT4ge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IGFueTtcbiAgICBpdGVtOiBUO1xufVxuXG5pbnRlcmZhY2UgVmlld01vZGVsIHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IE9wdGlvbkl0ZW1bXTtcbiAgICBkaXNwbGF5ZWRPcHRpb25zOiBPcHRpb25JdGVtW107XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidmlld01vZGVsJCB8IGFzeW5jIGFzIHZtXCI+XG4gICAgPGRpdiBjbGFzcz1cImZkLW11bHRpLWlucHV0IGZkLW11bHRpLWlucHV0LWN1c3RvbVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udHJvbFwiICpuZ0lmPVwibW9iaWxlICYmICFvcGVuXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxCb2R5Q2xhc3M9XCJmZC1wb3BvdmVyLWN1c3RvbS1saXN0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFtb2JpbGVcIlxuICAgICAgICAgICAgICAgIFtpc09wZW5dPVwib3BlblwiXG4gICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJvcGVuQ2hhbmdlSGFuZGxlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCIhb3BlbiAmJiBvcGVuQ2hhbmdlSGFuZGxlKHRydWUpXCJcbiAgICAgICAgICAgICAgICBbdHJpZ2dlcnNdPVwiW11cIlxuICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCJib2R5TWF4V2lkdGhcIlxuICAgICAgICAgICAgICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbZmlsbENvbnRyb2xNb2RlXT1cImZpbGxDb250cm9sTW9kZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1wb3BvdmVyLWN1c3RvbVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZkLXBvcG92ZXItY29udHJvbD5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gKHN1Ym1pdCk9XCJfb25TdWJtaXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRyb2xcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlci1jb250cm9sPlxuICAgICAgICAgICAgICAgIDxmZC1wb3BvdmVyLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIW9wZW5cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtcG9wb3Zlcl9fYm9keS0taGlkZGVuXT1cIiF2bS5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPC9mZC1wb3BvdmVyLWJvZHk+XG4gICAgICAgICAgICA8L2ZkLXBvcG92ZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNjb250cm9sPlxuICAgICAgICA8ZmQtaW5wdXQtZ3JvdXBcbiAgICAgICAgICAgIGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtaW5wdXQtZ3JvdXAtY3VzdG9tXCJcbiAgICAgICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXG4gICAgICAgICAgICBbYnV0dG9uRm9jdXNhYmxlXT1cImJ1dHRvbkZvY3VzYWJsZVwiXG4gICAgICAgICAgICBbYnV0dG9uXT1cImRpc3BsYXlBZGRvbkJ1dHRvblwiXG4gICAgICAgICAgICBbY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbaXNFeHBhbmRlZF09XCJvcGVuICYmICFtb2JpbGUgJiYgdm0uZGlzcGxheWVkT3B0aW9ucy5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgIFtpc0NvbnRyb2xdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZ2x5cGhdPVwiZGlzcGxheUFkZG9uQnV0dG9uID8gZ2x5cGggOiAnJ1wiXG4gICAgICAgICAgICBbaWNvblRpdGxlXT1cInRpdGxlXCJcbiAgICAgICAgICAgIChhZGRPbkJ1dHRvbkNsaWNrZWQpPVwiX2FkZE9uQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGZkLXRva2VuaXplclxuICAgICAgICAgICAgICAgIFtjb21wYWN0Q29sbGFwc2VdPVwiY29tcGFjdENvbGxhcHNlXCJcbiAgICAgICAgICAgICAgICBbY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICBbb3Blbl09XCJvcGVuXCJcbiAgICAgICAgICAgICAgICBbdG9rZW5pemVyRm9jdXNhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAobW9yZUNsaWNrZWRFdmVudCk9XCJfbW9yZUNsaWNrZWQoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC10b2tlbml6ZXItY3VzdG9tXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtbXVsdGktaW5wdXQtdG9rZW5pemVyLWN1c3RvbS0tY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB2bS5zZWxlY3RlZE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICBbY29tcGFjdF09XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xvc2VDbGljayk9XCJfb25Ub2tlbkNsaWNrKG9wdGlvbi52YWx1ZSwgdHJ1ZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvblJlbW92ZSk9XCJfb25Ub2tlbkNsaWNrKG9wdGlvbi52YWx1ZSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwib3B0aW9uLmxhYmVsXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZmQtdG9rZW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1pbnB1dCBmZC10b2tlbml6ZXJfX2lucHV0IGZkLW11bHRpLWlucHV0LXRva2VuaXplci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIGZkLWZvcm0tY29udHJvbFxuICAgICAgICAgICAgICAgICAgICBmZC1pbnB1dC1ncm91cC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICBmZC1hdXRvLWNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIChvbkNvbXBsZXRlKT1cIl9oYW5kbGVDb21wbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgI3NlYXJjaElucHV0RWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZuXT1cImRpc3BsYXlGblwiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dFRleHRdPVwiX3NlYXJjaFRlcm1DdHJsLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZHJvcGRvd25WYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICBbZW5hYmxlXT1cImF1dG9Db21wbGV0ZSAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cIl9zZWFyY2hUZXJtQ3RybFwiXG4gICAgICAgICAgICAgICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZkLWlucHV0LS1jb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJfaGFuZGxlSW5wdXRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJpbnB1dElkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9mZC10b2tlbml6ZXI+XG4gICAgICAgIDwvZmQtaW5wdXQtZ3JvdXA+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbGlzdD5cbiAgICAgICAgPHVsXG4gICAgICAgICAgICAqbmdJZj1cInZtLmRpc3BsYXllZE9wdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgIGZkLWxpc3RcbiAgICAgICAgICAgIGNsYXNzPVwiZmQtbXVsdGktaW5wdXQtbWVudS1vdmVyZmxvd1wiXG4gICAgICAgICAgICBbc2VsZWN0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgW21vYmlsZU1vZGVdPVwibW9iaWxlXCJcbiAgICAgICAgICAgIFtjb21wYWN0XT1cImNvbXBhY3RcIlxuICAgICAgICAgICAgW3N0eWxlLm1heEhlaWdodF09XCIhbW9iaWxlID8gbWF4SGVpZ2h0IDogJ2F1dG8nXCJcbiAgICAgICAgICAgIChmb2N1c0VzY2FwZUxpc3QpPVwiaGFuZGxlTGlzdEZvY3VzRXNjYXBlKCRldmVudClcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbldpZHRoXT1cIicxMDAlJ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygdm0uZGlzcGxheWVkT3B0aW9uczsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBmZC1saXN0LWl0ZW1cbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiX29uQ2hlY2tib3hDbGljayhvcHRpb24udmFsdWUsICRldmVudCwgaWR4LCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cIl9vbkNoZWNrYm94S2V5dXAob3B0aW9uLnZhbHVlLCAkZXZlbnQsIGlkeClcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24udmFsdWUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZmQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgW2NvbXBhY3RdPVwiY29tcGFjdFwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJfc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24udmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIl9vbkNoZWNrYm94Q2xpY2sob3B0aW9uLnZhbHVlLCAkZXZlbnQsIGlkeClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIC0tPlxuICAgICAgICAgICAgICAgIDwvZmQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtU291cmNlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBvcHRpb24gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FsbEJ1dHRvbiAmJiB2bS5kaXNwbGF5ZWRPcHRpb25zLmxlbmd0aCA8IGRyb3Bkb3duVmFsdWVzLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgZmQtbGlzdC1pdGVtXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1tdWx0aS1pbnB1dC1zaG93LWFsbFwiXG4gICAgICAgICAgICAgICAgKGtleURvd24pPVwiX3Nob3dBbGxLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJfc2hvd0FsbENsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGEgZmQtbGluayB0YWJpbmRleD1cIjBcIj5TaG93IEFsbCAoe3sgZHJvcGRvd25WYWx1ZXMubGVuZ3RoIH19KTwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uPVwib3B0aW9uXCIgI2l0ZW1Tb3VyY2U+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiFpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgZmQtbGlzdC10aXRsZVxuICAgICAgICAgICAgW2lubmVySHRtbF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQ6IF9zZWFyY2hUZXJtQ3RybC52YWx1ZTpoaWdobGlnaHRcIlxuICAgICAgICA+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9wdGlvbi5pdGVtIH1cIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG4iXX0=