@energycap/components 0.39.24 → 0.39.25-ECAP-26539-Item-Picker-Select-All.20240916-1615

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.
@@ -4,13 +4,14 @@ import { debounceTime, takeUntil } from 'rxjs/operators';
4
4
  import { TableSelectableRowContext } from '../../display/table/table-selectable-row.component';
5
5
  import { Overlay } from '../../display/view-overlay/view-overlay.component';
6
6
  import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- import * as i2 from "@ngx-translate/core";
7
+ import * as i1 from "@ngx-translate/core";
8
+ import * as i2 from "@angular/common";
9
9
  import * as i3 from "../button/button.component";
10
10
  import * as i4 from "../../display/view-overlay/view-overlay.component";
11
11
  import * as i5 from "../../display/table/table.component";
12
12
  import * as i6 from "../../display/table/searchable-table.component";
13
13
  import * as i7 from "../../display/table/table-selectable-row.component";
14
+ import * as i8 from "../link-button/link-button.component";
14
15
  ;
15
16
  export class ItemPickerSelectableContext extends TableSelectableRowContext {
16
17
  constructor() {
@@ -26,10 +27,16 @@ export class ItemPickerSelectableContext extends TableSelectableRowContext {
26
27
  * AdvancedRowClickBehavior is disabled for ItemPicker.
27
28
  */
28
29
  this.disableAdvancedRowClickBehavior = true;
30
+ /** When true the user has opted to select all items across all pages. Due to api pagination
31
+ * we don't have all of the items locally, so the host will need to tell the API to operate on all
32
+ * via api filters or other means.
33
+ */
34
+ this.isSelectingAllItems = false;
29
35
  }
30
36
  }
31
37
  export class ItemPickerComponent {
32
- constructor() {
38
+ constructor(translateService) {
39
+ this.translateService = translateService;
33
40
  /** Identifier for the component. This will be added to the beginning of all internal action elements */
34
41
  this.id = '';
35
42
  /** Title displayed above the available items table */
@@ -42,6 +49,12 @@ export class ItemPickerComponent {
42
49
  * to inherit the default message.
43
50
  */
44
51
  this.noDataMessage = '';
52
+ /** Used to enable select all items across pages. When true the button to select all items will be visible in the available items header when
53
+ * the header checkbox is checked and there are multiple pages of results
54
+ */
55
+ this.enableSelectAllItems = false;
56
+ /** Used to display a message in the selected items table when the select all items button is clicked */
57
+ this.selectAllItemsMessage = '';
45
58
  /** List of available items to pick from */
46
59
  this.availableItems = [];
47
60
  /**
@@ -55,6 +68,17 @@ export class ItemPickerComponent {
55
68
  /** Track by used for the searchable table rows */
56
69
  this.trackByIndex = (index) => index;
57
70
  this.tableStatus = new Overlay('pending');
71
+ /** Text to display next to the checkbox in the available items header. Used to dislay how many items are
72
+ * selected when select all items is enabled
73
+ */
74
+ this.availableCheckboxText = '';
75
+ /** When set to true the select all items button will show in the available items header. This is
76
+ * shown when the user has enabled select all for the item picker and the user selects the header checkbox
77
+ * with more than one page of results.
78
+ */
79
+ this.showSelectAllItemsButton = false;
80
+ /** The total number of items returned from the api across all pages */
81
+ this.totalItemsBeforePaging = 0;
58
82
  /** Used to shut down our subscriptions when the component is destroyed */
59
83
  this.destroyed = new Subject();
60
84
  }
@@ -77,6 +101,9 @@ export class ItemPickerComponent {
77
101
  * If any of the items have `preventRemove` set, their indices are added to the context.
78
102
  */
79
103
  onItemsChange(results) {
104
+ if (this.selectionContext.isSelectingAllItems) {
105
+ this.onClearSelectionClick();
106
+ }
80
107
  let newNonDependentCheckboxes = [];
81
108
  results.items.forEach((item, index) => {
82
109
  // Check to see if any of the items are marked to be selected by default and if so
@@ -92,25 +119,24 @@ export class ItemPickerComponent {
92
119
  }
93
120
  });
94
121
  this.selectionContext.nonDependentCheckboxes = newNonDependentCheckboxes;
122
+ // When the user filters the list we should reset the select all items
123
+ this.selectionContext.isSelectingAllItems = false;
95
124
  this.availableItems = results.items;
125
+ this.totalItemsBeforePaging = results.totalItemsBeforePaging;
126
+ this.updateAvailableCheckboxText();
96
127
  }
97
128
  /**
98
129
  * Called when the clear selection link button is clicked
99
130
  */
100
131
  onClearSelectionClick() {
101
- // Remove removable items from map
102
- // This is safe. See https://stackoverflow.com/questions/35940216/es6-is-it-dangerous-to-delete-elements-from-set-map-during-set-map-iteration
103
- for (const [key, val] of this.selectionContext.selectedItemsMap) {
104
- if (!val.preventRemove) {
105
- this.selectionContext.selectedItemsMap.delete(key);
106
- }
107
- }
132
+ this.clearSelectedItemsMap();
108
133
  this.selectionContext.rowCheckboxes.controls.forEach((control, index) => {
109
134
  if (!this.availableItems[index].preventRemove) {
110
135
  control.setValue(false);
111
136
  }
112
137
  });
113
138
  this.selectedItems = Array.from(this.selectionContext.selectedItemsMap.values());
139
+ this.selectionContext.isSelectingAllItems = false;
114
140
  }
115
141
  /**
116
142
  * Called when the remove item button is clicked for a selected item
@@ -130,6 +156,30 @@ export class ItemPickerComponent {
130
156
  this.selectedItems = Array.from(this.selectionContext.selectedItemsMap.values());
131
157
  }
132
158
  }
159
+ /**
160
+ * Click handler for the select all items button
161
+ */
162
+ selectAllItems() {
163
+ this.clearSelectedItemsMap();
164
+ this.selectionContext.isSelectingAllItems = true;
165
+ this.showSelectAllItemsButton = false;
166
+ this.updateAvailableCheckboxText();
167
+ }
168
+ /**
169
+ * Removes all items from the selected items map. This was split from the onClearSelectionClick function to allow
170
+ * selectAllItems to call this function but keep the row checkbox values in place. This was needed because when you are
171
+ * selecting all items across all pages we want the current page of items to remain checked.
172
+ *
173
+ */
174
+ clearSelectedItemsMap() {
175
+ // Remove removable items from map
176
+ // This is safe. See https://stackoverflow.com/questions/35940216/es6-is-it-dangerous-to-delete-elements-from-set-map-during-set-map-iteration
177
+ for (const [key, val] of this.selectionContext.selectedItemsMap) {
178
+ if (!val.preventRemove) {
179
+ this.selectionContext.selectedItemsMap.delete(key);
180
+ }
181
+ }
182
+ }
133
183
  /**
134
184
  * Watch for changes to the row checkboxes form array and update the selected items
135
185
  * list
@@ -150,8 +200,39 @@ export class ItemPickerComponent {
150
200
  });
151
201
  this.selectedItems = Array.from(this.selectionContext?.selectedItemsMap.values());
152
202
  this.selectedItemsClearable = this.selectedItems.length > 0 && this.selectedItems.some(i => !i.preventRemove);
203
+ this.updateAvailableCheckboxText();
204
+ });
205
+ this.selectionContext.selectAllCheckbox.valueChanges.pipe(debounceTime(10), takeUntil(this.destroyed)).subscribe((checked) => {
206
+ if (this.enableSelectAllItems) {
207
+ const onePageOfData = this.availableItems.length === this.totalItemsBeforePaging;
208
+ if (checked && !onePageOfData) {
209
+ this.showSelectAllItemsButton = true;
210
+ }
211
+ else if (!checked) {
212
+ if (this.selectionContext.isSelectingAllItems) {
213
+ // We were selecting all items, clear the selection to allow the user to start over
214
+ this.onClearSelectionClick();
215
+ }
216
+ this.showSelectAllItemsButton = false;
217
+ this.selectionContext.isSelectingAllItems = false;
218
+ }
219
+ }
153
220
  });
154
221
  }
222
+ updateAvailableCheckboxText() {
223
+ if (!this.selectionContext.isSelectingAllItems) {
224
+ const checkedCount = this.selectionContext.rowCheckboxes.controls.map(c => c.value).filter(v => v).length;
225
+ if (checkedCount > 0) {
226
+ this.availableCheckboxText = this.translateService.instant('CountSelected_TC', { count: checkedCount });
227
+ }
228
+ else {
229
+ this.availableCheckboxText = '';
230
+ }
231
+ }
232
+ else {
233
+ this.availableCheckboxText = this.translateService.instant('AllItemPickerItemsSelected_SC', { count: this.totalItemsBeforePaging, itemName: this.itemName });
234
+ }
235
+ }
155
236
  /**
156
237
  * Watch to be told if changes to the map were made outside of the component and if so update
157
238
  * the array displayed in the selected list and select checkboxes for visible available items
@@ -189,12 +270,12 @@ export class ItemPickerComponent {
189
270
  }
190
271
  }
191
272
  }
192
- ItemPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
193
- ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\" class=\"selected-items flex-grow d-flex flex-column\">\r\n <ec-table [scrollable]=\"true\"\r\n class=\"flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle | translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i5.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i6.SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: i7.TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
273
+ ItemPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
274
+ ItemPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ItemPickerComponent, selector: "ec-item-picker", inputs: { id: "id", availableTitle: "availableTitle", selectedTitle: "selectedTitle", itemName: "itemName", formModel: "formModel", customAvailableHeaderTemplate: "customAvailableHeaderTemplate", customAvailableItemTemplate: "customAvailableItemTemplate", customSelectedItemTemplate: "customSelectedItemTemplate", ready: "ready", getItems: "getItems", selectionContext: "selectionContext", noDataMessage: "noDataMessage", noSelectedItemsMessage: "noSelectedItemsMessage", enableSelectAllItems: "enableSelectAllItems", selectAllItemsMessage: "selectAllItemsMessage" }, viewQueries: [{ propertyName: "defaultAvailableHeaderTemplate", first: true, predicate: ["defaultAvailableHeaderTemplate"], descendants: true, static: true }, { propertyName: "defaultAvailableItemTemplate", first: true, predicate: ["defaultAvailableItemTemplate"], descendants: true, static: true }, { propertyName: "defaultSelectedItemTemplate", first: true, predicate: ["defaultSelectedItemTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id) || selectionContext.isSelectingAllItems\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto text-heading-2\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <!-- <th *ngIf=\"!enableSelectAllItems\" class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th> -->\r\n\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i5.TableComponent, selector: "ec-table", inputs: ["id", "scrollable", "resizable", "condensed", "sortable", "selectionContext", "selectionToolbarTemplate", "selectable", "isForm", "sort", "resizableColumns"], outputs: ["sortChange"] }, { kind: "component", type: i6.SearchableTableComponent, selector: "ec-searchable-table", inputs: ["id", "resizable", "sortable", "sort", "autofocus", "tableClasses", "searchboxPlaceholder", "formModel", "noDataMessage", "noSearchResultsMessage", "ready", "getItems", "refresh", "status", "tableLayoutFixed", "searchboxTabIndex", "maxItemCount", "hideSearchControl", "hideHeader", "objectType", "hideFooter", "pageable", "pageSize", "maxTabs", "searchboxReadonly", "selectionContext", "selectionToolbarTemplate", "additionalCountText", "selectable", "customContentTemplate", "removeCard", "overlayClasses", "fillParentHeight"], outputs: ["sortChange", "pageChange", "itemsChange"] }, { kind: "component", type: i7.TableSelectableRowComponent, selector: "[ecTableSelectableRow]", inputs: ["id", "ecTableSelectableRow", "selectionContext", "rowIndex", "lockedColOptions", "isSelected", "isCheckboxDisabled"] }, { kind: "component", type: i8.LinkButtonComponent, selector: "button[ecLinkButton]" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
194
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ItemPickerComponent, decorators: [{
195
276
  type: Component,
196
- args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id)\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\" class=\"selected-items flex-grow d-flex flex-column\">\r\n <ec-table [scrollable]=\"true\"\r\n class=\"flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle | translate}}</span>\r\n <a *ngIf=\"selectedItemsClearable\"\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n href=\"javascript:void(0)\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</a>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"] }]
197
- }], ctorParameters: function () { return []; }, propDecorators: { id: [{
277
+ args: [{ selector: 'ec-item-picker', template: "<div ecOverlay\r\n class=\"d-flex flex-grow card\"\r\n [status]=\"tableStatus?.status\"\r\n [message]=\"tableStatus?.message\"\r\n [displayAsMask]=\"true\">\r\n <ec-searchable-table id=\"{{id}}_searchableTable\"\r\n class=\"flex-grow\"\r\n [fillParentHeight]=\"true\"\r\n [hideHeader]=\"true\"\r\n [hideSearchControl]=\"true\"\r\n [removeCard]=\"true\"\r\n [pageable]=\"true\"\r\n [pageSize]=\"50\"\r\n [objectType]=\"itemName\"\r\n [formModel]=\"formModel\"\r\n [ready]=\"ready\"\r\n [getItems]=\"getItems\"\r\n [selectable]=\"true\"\r\n [noDataMessage]=\"noDataMessage\"\r\n [selectionContext]=\"selectionContext\"\r\n [status]=\"tableStatus\"\r\n (itemsChange)=\"onItemsChange($event)\"\r\n [style.--ec-searchable-table-flex-properties]=\"(availableItems.length || tableStatus.status === 'pending' || tableStatus.status === 'error' ) ? '1 1 auto' : '0 1 auto'\"\r\n [style.--ec-searchable-table-height-caption-footer]=\"'calc(2.5rem + 1px)'\"\r\n [tableLayoutFixed]=\"true\">\r\n <header *ngIf=\"customAvailableHeaderTemplate\"\r\n class=\"card-header flex-shrink\"\r\n style=\"height: 3rem;\">\r\n <h3 class=\"card-title\">{{availableTitle | translate}}</h3>\r\n </header>\r\n <thead>\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n class=\"border-bottom-0\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableHeaderTemplate;\"></ng-container>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngFor=\"let item of availableItems; index as rowIndex; trackBy: trackByIndex\">\r\n <tr ecTableSelectableRow\r\n [selectionContext]=\"selectionContext\"\r\n [rowIndex]=\"rowIndex\"\r\n [isCheckboxDisabled]=\"item.preventRemove || selectionContext.isSelectingAllItems\"\r\n [isSelected]=\"selectionContext?.selectedItemsMap.has(item.id) || selectionContext.isSelectingAllItems\"\r\n [style.--ec-table-selectable-row-vertical-align-checkbox-td]=\"'middle'\">\r\n <ng-container *ngTemplateOutlet=\"internalizedAvailableItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </ec-searchable-table>\r\n\r\n <section id=\"{{id}}_selectedItems\"\r\n class=\"selected-items flex-grow d-flex flex-column\">\r\n <div *ngIf=\"selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-column flex-grow\">\r\n <div class=\"d-flex align-items-center border-bottom px-2\"\r\n style=\"height: 3rem;\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n <span class=\"m-auto text-heading-2\"\r\n [innerHtml]=\"selectAllItemsMessage | translate\"></span>\r\n </div>\r\n <ec-table *ngIf=\"!selectionContext.isSelectingAllItems\"\r\n [scrollable]=\"true\"\r\n class=\"d-flex flex-grow is-fixed\">\r\n <colgroup>\r\n <col>\r\n <col style=\"width: 2rem;\">\r\n </colgroup>\r\n <thead>\r\n <tr style=\"height: 3rem;\">\r\n <th colspan=\"2\"\r\n class=\"p-2 border-bottom-0\">\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"text-heading-2 font-color-primary flex-grow text-truncate\">{{selectedTitle |\r\n translate}}</span>\r\n <button *ngIf=\"selectedItemsClearable\"\r\n ecLinkButton\r\n id=\"{{id}}_clearSelection\"\r\n class=\"pl-2 ml-auto font-size-base\"\r\n (click)=\"onClearSelectionClick()\"\r\n translate>ClearSelection_TC</button>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <ng-container *ngIf=\"selectedItems.length\">\r\n <tr *ngFor=\"let item of selectedItems; last as isLast\"\r\n id=\"selected_row_{{item.id}}\"\r\n [class.border-bottom]=\"!isLast\">\r\n <td class=\"p-2\">\r\n <ng-container\r\n *ngTemplateOutlet=\"internalizedSelectedItemTemplate; context: {$implicit: item}\">\r\n </ng-container>\r\n </td>\r\n\r\n <td class=\"actions-col text-right\"\r\n style=\"vertical-align: middle;\">\r\n <ec-button id=\"{{id}}_removeSelected_{{item.id}}\"\r\n *ngIf=\"!item.preventRemove\"\r\n type=\"icon\"\r\n icon=\"ec-icon icon-cancel\"\r\n (clicked)=\"removeSelectedItem(item)\">\r\n </ec-button>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n <tr *ngIf=\"!selectedItems.length\">\r\n <td *ngIf=\"!noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate\r\n [translateParams]=\"{itemName: itemName | translate}\">ItemPickerNoItemsSelected_SC</td>\r\n <td *ngIf=\"noSelectedItemsMessage\"\r\n colspan=\"2\"\r\n class=\"p-2 no-data-message\"\r\n translate>{{noSelectedItemsMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </ec-table>\r\n\r\n <footer id=\"selectedItemsFooter\"\r\n *ngIf=\"selectedItems.length && !selectionContext.isSelectingAllItems\"\r\n class=\"d-flex flex-shrink px-2 border-top align-items-center\"\r\n style=\"height: calc(2.5rem + 1px);\">\r\n <span class=\"ml-auto text-caption-1 font-color-hint\">\r\n {{selectedItems.length}} {{itemName | translate}}\r\n </span>\r\n </footer>\r\n </section>\r\n</div>\r\n\r\n<ng-template #defaultAvailableHeaderTemplate>\r\n <!-- <th *ngIf=\"!enableSelectAllItems\" class=\"text-heading-2 font-color-primary border-bottom-0\">{{availableTitle | translate}}</th> -->\r\n\r\n <th class=\"text-heading-2 font-color-primary border-bottom-0\">\r\n <div class=\"d-flex align-items-center \">\r\n <span *ngIf=\"!availableCheckboxText\"\r\n class=\"text-truncate\">{{availableTitle | translate}}</span>\r\n <span *ngIf=\"availableCheckboxText\"\r\n id=\"selectedCount\">{{availableCheckboxText}}</span>\r\n <button *ngIf=\"showSelectAllItemsButton\"\r\n ecLinkButton\r\n id=\"selectAllItemsButton\"\r\n (click)=\"selectAllItems()\"\r\n class=\"ml-2\">\r\n {{ ('SelectAllItemPickerItems_TC') | translate:{ count: totalItemsBeforePaging, itemName: itemName } }}\r\n </button>\r\n </div>\r\n </th>\r\n</ng-template>\r\n\r\n<ng-template #defaultAvailableItemTemplate\r\n let-item>\r\n <td>{{item.label}}</td>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectedItemTemplate\r\n let-item>\r\n {{item.label}}\r\n</ng-template>", styles: [":host{display:flex}ec-searchable-table{border-right:2px solid var(--ec-border-color)}.selected-items{max-width:var(--ec-item-picker-max-width-selected-items, 50%)}.no-data-message{white-space:normal}\n"] }]
278
+ }], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { id: [{
198
279
  type: Input
199
280
  }], availableTitle: [{
200
281
  type: Input
@@ -220,6 +301,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
220
301
  type: Input
221
302
  }], noSelectedItemsMessage: [{
222
303
  type: Input
304
+ }], enableSelectAllItems: [{
305
+ type: Input
306
+ }], selectAllItemsMessage: [{
307
+ type: Input
223
308
  }], defaultAvailableHeaderTemplate: [{
224
309
  type: ViewChild,
225
310
  args: ['defaultAvailableHeaderTemplate', { static: true }]
@@ -230,4 +315,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
230
315
  type: ViewChild,
231
316
  args: ['defaultSelectedItemTemplate', { static: true }]
232
317
  }] } });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2l0ZW0tcGlja2VyL2l0ZW0tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9pdGVtLXBpY2tlci9pdGVtLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNkMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7OztBQWMzRSxDQUFDO0FBRUYsTUFBTSxPQUFPLDJCQUErQixTQUFRLHlCQUF5QjtJQUE3RTs7UUFDRSxxRkFBcUY7UUFDOUUscUJBQWdCLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFaEU7OztXQUdHO1FBQ0ksNEJBQXVCLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFOUQ7O1dBRUc7UUFDYSxvQ0FBK0IsR0FBWSxJQUFJLENBQUM7SUFDbEUsQ0FBQztDQUFBO0FBT0QsTUFBTSxPQUFPLG1CQUFtQjtJQStFOUI7UUE3RUEsd0dBQXdHO1FBQ3hGLE9BQUUsR0FBWSxFQUFFLENBQUM7UUFFakMsc0RBQXNEO1FBQ3RDLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBRTVDLG9EQUFvRDtRQUNwQyxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUUz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QUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsU0FBUztzQkFBeEIsS0FBSztnQkFHVSw2QkFBNkI7c0JBQTVDLEtBQUs7Z0JBR1UsMkJBQTJCO3NCQUExQyxLQUFLO2dCQUdVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFHVSxLQUFLO3NCQUFwQixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBR1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUtVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBTVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQTRCaUUsOEJBQThCO3NCQUFwRyxTQUFTO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDUSw0QkFBNEI7c0JBQWhHLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNTLDJCQUEyQjtzQkFBOUYsU0FBUzt1QkFBQyw2QkFBNkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBUYWJsZVNlYXJjaFJlc3VsdHMgfSBmcm9tICcuLi8uLi9kaXNwbGF5L3RhYmxlL3NlYXJjaGFibGUtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFnaW5nSW5mbyB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFibGUvdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUYWJsZVNlbGVjdGFibGVSb3dDb250ZXh0IH0gZnJvbSAnLi4vLi4vZGlzcGxheS90YWJsZS90YWJsZS1zZWxlY3RhYmxlLXJvdy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBPdmVybGF5IH0gZnJvbSAnLi4vLi4vZGlzcGxheS92aWV3LW92ZXJsYXkvdmlldy1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAnLi4vbWVudS9tZW51LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tlckl0ZW08VFZhbHVlID0gYW55LCBTSXRlbXMgPSBhbnk+IGV4dGVuZHMgTWVudUl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGVuIHNldCB0byB0cnVlIHRoZSBhdmFpbGFibGUgaXRlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIGxpc3QgKi9cclxuICBkZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xyXG5cclxuICAvKiogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGl0ZW0gd2lsbCBub3QgYmUgYWxsb3dlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGVkIGxpc3QgKi9cclxuICBwcmV2ZW50UmVtb3ZlPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFJlZGVmaW5pbmcgdG8gZ2V0IHRoZSB0eXBpbmcgKi9cclxuICB2YWx1ZTogVFZhbHVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIEl0ZW1QaWNrZXJTZWxlY3RhYmxlQ29udGV4dDxUPiBleHRlbmRzIFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQge1xyXG4gIC8qKiBpZC92YWx1ZSBtYXAgb2YgdGhlIHNlbGVjdGVkIGl0ZW1zLiBVc2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgaXMgc2VsZWN0ZWQgKi9cclxuICBwdWJsaWMgc2VsZWN0ZWRJdGVtc01hcDogTWFwPHN0cmluZywgUGlja2VySXRlbTxUPj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIGEgd2F5IHRvIHRlbGwgdGhlIHBpY2tlciBjb21wb25lbnQgdGhhdCB0aGUgbWFwIHdhcyBtb2RpZmllZCBleHRlcm5hbGx5IGFuZCB0byB1cGRhdGVcclxuICAgKiB0aGUgYXZhaWxhYmxlL3NlbGVjdGVkIGxpc3RzXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXNNYXBDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yIGlzIGRpc2FibGVkIGZvciBJdGVtUGlja2VyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBkaXNhYmxlQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yOiBib29sZWFuID0gdHJ1ZTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlYy1pdGVtLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2l0ZW0tcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pdGVtLXBpY2tlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJdGVtUGlja2VyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8qKiBJZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50LiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGJlZ2lubmluZyBvZiBhbGwgaW50ZXJuYWwgYWN0aW9uIGVsZW1lbnRzICovXHJcbiAgQElucHV0KCkgcHVibGljIGlkPzogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBUaXRsZSBkaXNwbGF5ZWQgYWJvdmUgdGhlIGF2YWlsYWJsZSBpdGVtcyB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhdmFpbGFibGVUaXRsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBUaXRsZSBkaXNwbGF5ZWQgYWJvdmUgdGhlIHNlbGVjdGVkIGl0ZW1zIGxpc3QgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWRUaXRsZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBUaGUgdHlwZSBvZiBpdGVtIGJlaW5nIHNlbGVjdGVkLiBFeC4gTWV0ZXJzLCBBZGRyZXNzZXMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaXRlbU5hbWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogRm9ybSBncm91cCB0aGF0IGlzIGdpdmVuIHRvIHRoZSBpbnRlcm5hbCBTZWFyY2hhYmxlIFRhYmxlICovXHJcbiAgQElucHV0KCkgcHVibGljIGZvcm1Nb2RlbD86IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBmb3Igd2hlbiBhIGN1c3RvbSBoZWFkZXIgaXMgbmVlZGVkIGZvciB0aGUgYXZhaWxhYmxlIGl0ZW1zIHRhYmxlICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbUF2YWlsYWJsZUhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFRlbXBsYXRlIGZvciB3aGVuIGEgY3VzdG9tIGF2YWlsYWJsZSBpdGVtIGlzIG5lZWRlZC4gRGVmYXVsdCB0ZW1wbGF0ZSBpcyBhIGxhYmVsIG9ubHkgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tQXZhaWxhYmxlSXRlbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFRlbXBsYXRlIGZvciB3aGVuIGEgY3VzdG9tIHNlbGVjdGVkIGl0ZW0gaXMgbmVlZGVkLiBEZWZhdWx0IHRlbXBsYXRlIGlzIGEgbGFiZWwgb25seSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21TZWxlY3RlZEl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBVc2VkIGJ5IHRoZSBpbnRlcm5hbCBTZWFyY2hhYmxlIFRhYmxlIHRvIGtub3cgd2hlbiB0aGUgcGFnZSBpcyByZWFkeSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkeT86IE9ic2VydmFibGU8dm9pZD47XHJcblxyXG4gIC8qKiBVc2VkIGJ5IFNlYXJjaGFibGUgVGFibGUgdG8gcmV0cmlldmUgdGhlIGF2YWlsYWJsZSBpdGVtcyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRJdGVtcz86IChzZWFyY2g/OiBzdHJpbmcsIHBhZ2VDaGFuZ2VJbmZvPzogUGFnaW5nSW5mbykgPT4gT2JzZXJ2YWJsZTxUYWJsZVNlYXJjaFJlc3VsdHM+O1xyXG5cclxuICAvKiogVXNlZCB0byBtYWludGFpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGNoZWNrYm94IHNlbGVjdGlvbiBhcyB3ZWxsIGFzIHRoZSBzZWxlY3RlZCBpdGVtcyBsaXN0ICovXHJcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGlvbkNvbnRleHQhOiBJdGVtUGlja2VyU2VsZWN0YWJsZUNvbnRleHQ8VD47XHJcblxyXG4gIC8qKiBVc2VkIGJ5IHRoZSBpbnRlcm5hbCBTZWFyY2hhYmxlIFRhYmxlIHdoZW4gdGhlcmUgaXMgbm8gYXZhaWxhYmxlIGl0ZW1zIHRvIGNob29zZSBmcm9tIGJhc2VkIG9uIHRoZSBnZXRJdGVtcyByZXN1bHRzLiBEbyBub3Qgc3VwcGx5XHJcbiAgICogIHRvIGluaGVyaXQgdGhlIGRlZmF1bHQgbWVzc2FnZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbm9EYXRhTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbm8gc2VsZWN0ZWQgaXRlbXMgbWVzc2FnZS4gSWYgcHJvdmlkZWQgdGhpcyB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBtZXNzYWdlIHdpdGggdGhlIGl0ZW0gbmFtZVxyXG4gICAqIGludGVycG9sYXRpb24gd2lsbCBiZSB1c2VkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBub1NlbGVjdGVkSXRlbXNNZXNzYWdlPzogc3RyaW5nO1xyXG5cclxuICAvKiogTGlzdCBvZiBhdmFpbGFibGUgaXRlbXMgdG8gcGljayBmcm9tICovXHJcbiAgcHVibGljIGF2YWlsYWJsZUl0ZW1zOiBQaWNrZXJJdGVtW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0ZWQgaXRlbXMgYXJyYXkuIENyZWF0ZWQgZnJvbSB0aGUgc2VsZWN0ZWQgaXRlbXMgbWFwLiBCaW5kaW5nIHRvIHRoZVxyXG4gICAqIG1hcCBpdGVyYXRlIHZhbHVlcyBjYXVzZWQgYW5ndWxhciBcImV4cHJlc3Npb24gY2hhbmdlZFwiIGVycm9ycyBzbyBhZnRlciBhIG1hcFxyXG4gICAqIHVwZGF0ZSB0aGlzIGdldHMgc2V0IHRvIHRoZSB2YWx1ZXNcclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0ZWRJdGVtczogUGlja2VySXRlbVtdID0gW107XHJcblxyXG4gIC8qKiBUcnVlIGlmIHRoZXJlIGFyZSBzZWxlY3RlZCBpdGVtcyBhbmQgYXQgbGVhc3Qgb25lIGNhbiBiZSByZW1vdmVkICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXNDbGVhcmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRyYWNrIGJ5IHVzZWQgZm9yIHRoZSBzZWFyY2hhYmxlIHRhYmxlIHJvd3MgKi9cclxuICBwdWJsaWMgdHJhY2tCeUluZGV4ID0gKGluZGV4OiBudW1iZXIpID0+IGluZGV4O1xyXG5cclxuICBwdWJsaWMgdGFibGVTdGF0dXM6IE92ZXJsYXkgPSBuZXcgT3ZlcmxheSgncGVuZGluZycpO1xyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSB0aGUgYXZhaWxhYmxlIGFuZCBzZWxlY3RlZCBpdGVtcyBhcyB3ZWxsIGFzIHRoZSBhdmFpbGFibGUgaXRlbSBoZWFkZXIuXHJcbiAgICogVGhpcyB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBpZiBhIGN1c3RvbSBpcyBub3QgcHJvdmlkZWRcclxuICAgKi9cclxuICBwdWJsaWMgaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBEZWZhdWx0IHRlbXBsYXRlcyB1c2VkIGlmIGEgY3VzdG9tIHRlbXBsYXRlIGlzIG5vdCBwcm92aWRlZCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBVc2VkIHRvIHNodXQgZG93biBvdXIgc3Vic2NyaXB0aW9ucyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldHVwUm93Q2hlY2tib3hlc1dhdGNoZXIoKTtcclxuICAgIHRoaXMuc2V0dXBTZWxlY3RlZEl0ZW1zQ2hhbmdlZFdhdGNoZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIGFuZCByZWFjdCBpZiB0aGUgY3VzdG9tIGl0ZW0gdGVtcGxhdGUgdmFsdWUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0SW50ZXJuYWxpemVkVGVtcGxhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3llZC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIGJ5IHRoZSBzZWFyY2hhYmxlIHRhYmxlIHdoZW4gYSBuZXcgc2V0IG9mIGl0ZW1zIGFyZSByZXR1cm5lZCBmcm9tIHRoZSBnZXRJdGVtcyBjYWxsLlxyXG4gICAqIElmIGFueSBvZiB0aGUgaXRlbXMgaGF2ZSBgcHJldmVudFJlbW92ZWAgc2V0LCB0aGVpciBpbmRpY2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dC5cclxuICAgKi9cclxuICBwdWJsaWMgb25JdGVtc0NoYW5nZShyZXN1bHRzOiBUYWJsZVNlYXJjaFJlc3VsdHMpIHtcclxuICAgIGxldCBuZXdOb25EZXBlbmRlbnRDaGVja2JveGVzOiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgICg8UGlja2VySXRlbVtdPnJlc3VsdHMuaXRlbXMpLmZvckVhY2goKGl0ZW0sIGluZGV4KSAgPT4ge1xyXG4gICAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBpdGVtcyBhcmUgbWFya2VkIHRvIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYW5kIGlmIHNvXHJcbiAgICAgIC8vIGFkZCB0aGVtIHRvIHRoZSBtYXAuXHJcbiAgICAgIGlmIChpdGVtLmRlZmF1bHRTZWxlY3RlZCAmJiAhdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhpdGVtLmlkKSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5zZXQoaXRlbS5pZCwgaXRlbSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGl0ZW1zIGFyZSBtYXJrZWQgdG8gcHJldmVudCBSZW1vdmFsLCBhbmQgaWYgc29cclxuICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIG5vbi1kZXBlbmRlbnQgY2hlY2tib3hlcyBhcnJheS4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBtYXN0ZXJcclxuICAgICAgLy8gY2hlY2tib3ggZnJvbSB0b2dnbGluZyB0aGVtLlxyXG4gICAgICBpZiAoaXRlbS5wcmV2ZW50UmVtb3ZlKSB7XHJcbiAgICAgICAgbmV3Tm9uRGVwZW5kZW50Q2hlY2tib3hlcy5wdXNoKGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Lm5vbkRlcGVuZGVudENoZWNrYm94ZXMgPSBuZXdOb25EZXBlbmRlbnRDaGVja2JveGVzO1xyXG5cclxuICAgIHRoaXMuYXZhaWxhYmxlSXRlbXMgPSAoPFBpY2tlckl0ZW1bXT5yZXN1bHRzLml0ZW1zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjbGVhciBzZWxlY3Rpb24gbGluayBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKSB7XHJcbiAgICAvLyBSZW1vdmUgcmVtb3ZhYmxlIGl0ZW1zIGZyb20gbWFwXHJcbiAgICAvLyBUaGlzIGlzIHNhZmUuICBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU5NDAyMTYvZXM2LWlzLWl0LWRhbmdlcm91cy10by1kZWxldGUtZWxlbWVudHMtZnJvbS1zZXQtbWFwLWR1cmluZy1zZXQtbWFwLWl0ZXJhdGlvblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwKSB7XHJcbiAgICAgIGlmICghdmFsLnByZXZlbnRSZW1vdmUpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5yb3dDaGVja2JveGVzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYoIXRoaXMuYXZhaWxhYmxlSXRlbXNbaW5kZXhdLnByZXZlbnRSZW1vdmUpe1xyXG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmFsc2UpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXAudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbW92ZSBpdGVtIGJ1dHRvbiBpcyBjbGlja2VkIGZvciBhIHNlbGVjdGVkIGl0ZW1cclxuICAgKiBAcGFyYW0gcmVtb3ZlSXRlbVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0ocmVtb3ZlSXRlbTogUGlja2VySXRlbSk6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kSW5kZXggPSB0aGlzLmF2YWlsYWJsZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAvLyBVcGRhdGUgdGhlIHJvdyBjaGVja2JveCBzaW5jZSB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIHBhZ2UgYmVpbmcgdmlld2VkXHJcbiAgICAgIC8vIFRoZSB2YWx1ZSBjaGFuZ2UgaGFuZGxlciBmb3Igcm93IGNoZWNrYm94ZXMgd2lsbCB1cGRhdGUgdGhlIG1hcC9zZWxlY3RlZCBpdGVtc1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChmb3VuZEluZGV4KS5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGUgaXRlbSBiZWluZyByZW1vdmVkIGlzIG5vdCBvbiB0aGUgY3VycmVudCBwYWdlIHNvIGp1c3QgdXBkYXRlIHRoZVxyXG4gICAgICAvLyBtYXAvc2VsZWN0ZWQgaXRlbXNcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXAuZGVsZXRlKHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSByb3cgY2hlY2tib3hlcyBmb3JtIGFycmF5IGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW1zXHJcbiAgICogbGlzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBSb3dDaGVja2JveGVzV2F0Y2hlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8ucm93Q2hlY2tib3hlcy52YWx1ZUNoYW5nZXMucGlwZShcclxuICAgICAgLy8gRGVib3VuY2UgMTAgaXMgc2ltcGx5IHRvIG5vdCBzcGFtIHRoZSBjaGFuZ2UgaGFuZGxlciBvbiBsb2FkL3BhZ2UgY2hhbmdlXHJcbiAgICAgIC8vIE90aGVyd2lzZSB0aGlzIHdpbGwgZ2V0IGNhbGxlZCBldmVyeSB0aW1lIGEgbmV3IHJvdyBpcyBhZGRlZCB0byB0aGUgdGFibGVcclxuICAgICAgZGVib3VuY2VUaW1lKDEwKSxcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKVxyXG4gICAgKS5zdWJzY3JpYmUoKHJvd1ZhbHVlczogYm9vbGVhbltdKSA9PiB7XHJcbiAgICAgIHJvd1ZhbHVlcy5mb3JFYWNoKChzZWxlY3RlZCwgaW5kZXgpID0+IHtcclxuICAgICAgICBsZXQgYXZhaWxhYmxlSXRlbSA9IHRoaXMuYXZhaWxhYmxlSXRlbXNbaW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkICYmIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5oYXMoYXZhaWxhYmxlSXRlbS5pZCkpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUoYXZhaWxhYmxlSXRlbS5pZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCAmJiAhdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhhdmFpbGFibGVJdGVtLmlkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnNldChhdmFpbGFibGVJdGVtLmlkLCBhdmFpbGFibGVJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAudmFsdWVzKCkpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmFibGUgPSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkSXRlbXMuc29tZShpID0+ICFpLnByZXZlbnRSZW1vdmUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCB0byBiZSB0b2xkIGlmIGNoYW5nZXMgdG8gdGhlIG1hcCB3ZXJlIG1hZGUgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpZiBzbyB1cGRhdGVcclxuICAgKiB0aGUgYXJyYXkgZGlzcGxheWVkIGluIHRoZSBzZWxlY3RlZCBsaXN0IGFuZCBzZWxlY3QgY2hlY2tib3hlcyBmb3IgdmlzaWJsZSBhdmFpbGFibGUgaXRlbXNcclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwU2VsZWN0ZWRJdGVtc0NoYW5nZWRXYXRjaGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXBDaGFuZ2VkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhpdGVtLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChpbmRleCkuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbnRlcm5hbGl6ZWRUZW1wbGF0ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlID0gdGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jdXN0b21BdmFpbGFibGVJdGVtVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUgPSB0aGlzLmN1c3RvbUF2YWlsYWJsZUl0ZW1UZW1wbGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkQXZhaWxhYmxlSXRlbVRlbXBsYXRlID0gdGhpcy5kZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkU2VsZWN0ZWRJdGVtVGVtcGxhdGUgPSB0aGlzLmN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGVjT3ZlcmxheVxyXG4gICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3JvdyBjYXJkXCJcclxuICAgICBbc3RhdHVzXT1cInRhYmxlU3RhdHVzPy5zdGF0dXNcIlxyXG4gICAgIFttZXNzYWdlXT1cInRhYmxlU3RhdHVzPy5tZXNzYWdlXCJcclxuICAgICBbZGlzcGxheUFzTWFza109XCJ0cnVlXCI+XHJcbiAgICA8ZWMtc2VhcmNoYWJsZS10YWJsZSBpZD1cInt7aWR9fV9zZWFyY2hhYmxlVGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGxQYXJlbnRIZWlnaHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZUhlYWRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VhcmNoQ29udHJvbF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmVDYXJkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtvYmplY3RUeXBlXT1cIml0ZW1OYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtTW9kZWxdPVwiZm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkeV09XCJyZWFkeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0SXRlbXNdPVwiZ2V0SXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbm9EYXRhTWVzc2FnZV09XCJub0RhdGFNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Db250ZXh0XT1cInNlbGVjdGlvbkNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ0YWJsZVN0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbXNDaGFuZ2UpPVwib25JdGVtc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWVjLXNlYXJjaGFibGUtdGFibGUtZmxleC1wcm9wZXJ0aWVzXT1cIihhdmFpbGFibGVJdGVtcy5sZW5ndGggfHwgdGFibGVTdGF0dXMuc3RhdHVzID09PSAncGVuZGluZycgfHwgdGFibGVTdGF0dXMuc3RhdHVzID09PSAnZXJyb3InICkgPyAnMSAxIGF1dG8nIDogJzAgMSBhdXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy1zZWFyY2hhYmxlLXRhYmxlLWhlaWdodC1jYXB0aW9uLWZvb3Rlcl09XCInY2FsYygyLjVyZW0gKyAxcHgpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVMYXlvdXRGaXhlZF09XCJ0cnVlXCI+XHJcbiAgICAgICAgPGhlYWRlciAqbmdJZj1cImN1c3RvbUF2YWlsYWJsZUhlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1oZWFkZXIgZmxleC1zaHJpbmtcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDNyZW07XCI+XHJcbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImNhcmQtdGl0bGVcIj57e2F2YWlsYWJsZVRpdGxlIHwgdHJhbnNsYXRlfX08L2gzPlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyIGVjVGFibGVTZWxlY3RhYmxlUm93XHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0aW9uQ29udGV4dF09XCJzZWxlY3Rpb25Db250ZXh0XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLWJvdHRvbS0wXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU7XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYXZhaWxhYmxlSXRlbXM7IGluZGV4IGFzIHJvd0luZGV4OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDx0ciBlY1RhYmxlU2VsZWN0YWJsZVJvd1xyXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Db250ZXh0XT1cInNlbGVjdGlvbkNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzQ2hlY2tib3hEaXNhYmxlZF09XCJpdGVtLnByZXZlbnRSZW1vdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cInNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGl0ZW0uaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy10YWJsZS1zZWxlY3RhYmxlLXJvdy12ZXJ0aWNhbC1hbGlnbi1jaGVja2JveC10ZF09XCInbWlkZGxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgPC9lYy1zZWFyY2hhYmxlLXRhYmxlPlxyXG5cclxuICAgIDxzZWN0aW9uIGlkPVwie3tpZH19X3NlbGVjdGVkSXRlbXNcIiBjbGFzcz1cInNlbGVjdGVkLWl0ZW1zIGZsZXgtZ3JvdyBkLWZsZXggZmxleC1jb2x1bW5cIj5cclxuICAgICAgICA8ZWMtdGFibGUgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93IGlzLWZpeGVkXCI+XHJcbiAgICAgICAgICAgIDxjb2xncm91cD5cclxuICAgICAgICAgICAgICAgIDxjb2w+XHJcbiAgICAgICAgICAgICAgICA8Y29sIHN0eWxlPVwid2lkdGg6IDJyZW07XCI+XHJcbiAgICAgICAgICAgIDwvY29sZ3JvdXA+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImhlaWdodDogM3JlbTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtMiBib3JkZXItYm90dG9tLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGZsZXgtZ3JvdyB0ZXh0LXRydW5jYXRlXCI+e3tzZWxlY3RlZFRpdGxlIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cInNlbGVjdGVkSXRlbXNDbGVhcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fY2xlYXJTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwbC0yIG1sLWF1dG8gZm9udC1zaXplLWJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhclNlbGVjdGlvbkNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPkNsZWFyU2VsZWN0aW9uX1RDPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuXHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyBsYXN0IGFzIGlzTGFzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0ZWRfcm93X3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ib3R0b21dPVwiIWlzTGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9ucy1jb2wgdGV4dC1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWMtYnV0dG9uIGlkPVwie3tpZH19X3JlbW92ZVNlbGVjdGVkX3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5wcmV2ZW50UmVtb3ZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZWMtaWNvbiBpY29uLWNhbmNlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lYy1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIXNlbGVjdGVkSXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIW5vU2VsZWN0ZWRJdGVtc01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIG5vLWRhdGEtbWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cIntpdGVtTmFtZTogaXRlbU5hbWUgfCB0cmFuc2xhdGV9XCI+SXRlbVBpY2tlck5vSXRlbXNTZWxlY3RlZF9TQzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibm9TZWxlY3RlZEl0ZW1zTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHNwYW49XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgbm8tZGF0YS1tZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPnt7bm9TZWxlY3RlZEl0ZW1zTWVzc2FnZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC9lYy10YWJsZT5cclxuXHJcbiAgICAgICAgPGZvb3RlciBpZD1cInNlbGVjdGVkSXRlbXNGb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LXNocmluayBweC0yIGJvcmRlci10b3AgYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDIuNXJlbSArIDFweCk7XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtYXV0byB0ZXh0LWNhcHRpb24tMSBmb250LWNvbG9yLWhpbnRcIj5cclxuICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRJdGVtcy5sZW5ndGh9fSB7e2l0ZW1OYW1lIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZm9vdGVyPlxyXG4gICAgPC9zZWN0aW9uPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlPlxyXG4gICAgPHRoIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGJvcmRlci1ib3R0b20tMFwiPnt7YXZhaWxhYmxlVGl0bGUgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRBdmFpbGFibGVJdGVtVGVtcGxhdGVcclxuICAgICAgICAgICAgIGxldC1pdGVtPlxyXG4gICAgPHRkPnt7aXRlbS5sYWJlbH19PC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIHt7aXRlbS5sYWJlbH19XHJcbjwvbmctdGVtcGxhdGU+Il19
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2l0ZW0tcGlja2VyL2l0ZW0tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9pdGVtLXBpY2tlci9pdGVtLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNkMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbURBQW1ELENBQUM7Ozs7Ozs7Ozs7QUFlM0UsQ0FBQztBQUVGLE1BQU0sT0FBTywyQkFBK0IsU0FBUSx5QkFBeUI7SUFBN0U7O1FBQ0UscUZBQXFGO1FBQzlFLHFCQUFnQixHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLDRCQUF1QixHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRTlEOztXQUVHO1FBQ2Esb0NBQStCLEdBQVksSUFBSSxDQUFDO1FBRWhFOzs7V0FHRztRQUNJLHdCQUFtQixHQUFZLEtBQUssQ0FBQztJQUM5QyxDQUFDO0NBQUE7QUFPRCxNQUFNLE9BQU8sbUJBQW1CO0lBc0c5QixZQUNVLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBckc1Qyx3R0FBd0c7UUFDeEYsT0FBRSxHQUFZLEVBQUUsQ0FB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SSxDQUFDLDBCQUEwQixDQUFDO1NBQ3pFO2FBQU07WUFDTCxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1NBQzFFO0lBQ0gsQ0FBQzs7Z0hBL1RVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDJqQ0NwRGhDLDZvUkEyS2M7MkZEdkhELG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxnQkFBZ0I7dUdBT1YsRUFBRTtzQkFBakIsS0FBSztnQkFHVSxjQUFjO3NCQUE3QixLQUFLO2dCQUdVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBR1UsUUFBUTtzQkFBdkIsS0FBSztnQkFHVSxTQUFTO3NCQUF4QixLQUFLO2dCQUdVLDZCQUE2QjtzQkFBNUMsS0FBSztnQkFHVSwyQkFBMkI7c0JBQTFDLEtBQUs7Z0JBR1UsMEJBQTBCO3NCQUF6QyxLQUFLO2dCQUdVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBR1UsUUFBUTtzQkFBdkIsS0FBSztnQkFHVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFNVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBS1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUdVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkEyQ2lFLDhCQUE4QjtzQkFBcEcsU0FBUzt1QkFBQyxnQ0FBZ0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1EsNEJBQTRCO3NCQUFoRyxTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDUywyQkFBMkI7c0JBQTlGLFNBQVM7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgVGFibGVTZWFyY2hSZXN1bHRzIH0gZnJvbSAnLi4vLi4vZGlzcGxheS90YWJsZS9zZWFyY2hhYmxlLXRhYmxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBhZ2luZ0luZm8gfSBmcm9tICcuLi8uLi9kaXNwbGF5L3RhYmxlL3RhYmxlLXBhZ2luYXRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RhYmxlUm93Q29udGV4dCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdGFibGUvdGFibGUtc2VsZWN0YWJsZS1yb3cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3ZlcmxheSB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdmlldy1vdmVybGF5L3ZpZXctb3ZlcmxheS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJy4uL21lbnUvbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBpY2tlckl0ZW08VFZhbHVlID0gYW55LCBTSXRlbXMgPSBhbnk+IGV4dGVuZHMgTWVudUl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGVuIHNldCB0byB0cnVlIHRoZSBhdmFpbGFibGUgaXRlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNlbGVjdGVkIGxpc3QgKi9cclxuICBkZWZhdWx0U2VsZWN0ZWQ/OiBib29sZWFuO1xyXG5cclxuICAvKiogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGl0ZW0gd2lsbCBub3QgYmUgYWxsb3dlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGVkIGxpc3QgKi9cclxuICBwcmV2ZW50UmVtb3ZlPzogYm9vbGVhbjtcclxuXHJcbiAgLyoqIFJlZGVmaW5pbmcgdG8gZ2V0IHRoZSB0eXBpbmcgKi9cclxuICB2YWx1ZTogVFZhbHVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGNsYXNzIEl0ZW1QaWNrZXJTZWxlY3RhYmxlQ29udGV4dDxUPiBleHRlbmRzIFRhYmxlU2VsZWN0YWJsZVJvd0NvbnRleHQge1xyXG4gIC8qKiBpZC92YWx1ZSBtYXAgb2YgdGhlIHNlbGVjdGVkIGl0ZW1zLiBVc2VkIGZvciBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgaXMgc2VsZWN0ZWQgKi9cclxuICBwdWJsaWMgc2VsZWN0ZWRJdGVtc01hcDogTWFwPHN0cmluZywgUGlja2VySXRlbTxUPj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEdpdmVzIGEgd2F5IHRvIHRlbGwgdGhlIHBpY2tlciBjb21wb25lbnQgdGhhdCB0aGUgbWFwIHdhcyBtb2RpZmllZCBleHRlcm5hbGx5IGFuZCB0byB1cGRhdGVcclxuICAgKiB0aGUgYXZhaWxhYmxlL3NlbGVjdGVkIGxpc3RzXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXNNYXBDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yIGlzIGRpc2FibGVkIGZvciBJdGVtUGlja2VyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBkaXNhYmxlQWR2YW5jZWRSb3dDbGlja0JlaGF2aW9yOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFdoZW4gdHJ1ZSB0aGUgdXNlciBoYXMgb3B0ZWQgdG8gc2VsZWN0IGFsbCBpdGVtcyBhY3Jvc3MgYWxsIHBhZ2VzLiBEdWUgdG8gYXBpIHBhZ2luYXRpb25cclxuICAgKiAgd2UgZG9uJ3QgaGF2ZSBhbGwgb2YgdGhlIGl0ZW1zIGxvY2FsbHksIHNvIHRoZSBob3N0IHdpbGwgbmVlZCB0byB0ZWxsIHRoZSBBUEkgdG8gb3BlcmF0ZSBvbiBhbGxcclxuICAgKiAgdmlhIGFwaSBmaWx0ZXJzIG9yIG90aGVyIG1lYW5zLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc1NlbGVjdGluZ0FsbEl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtaXRlbS1waWNrZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pdGVtLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaXRlbS1waWNrZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSXRlbVBpY2tlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuICAvKiogSWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgYWxsIGludGVybmFsIGFjdGlvbiBlbGVtZW50cyAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogVGl0bGUgZGlzcGxheWVkIGFib3ZlIHRoZSBhdmFpbGFibGUgaXRlbXMgdGFibGUgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgYXZhaWxhYmxlVGl0bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogVGl0bGUgZGlzcGxheWVkIGFib3ZlIHRoZSBzZWxlY3RlZCBpdGVtcyBsaXN0ICovXHJcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkVGl0bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogVGhlIHR5cGUgb2YgaXRlbSBiZWluZyBzZWxlY3RlZC4gRXguIE1ldGVycywgQWRkcmVzc2VzICovXHJcbiAgQElucHV0KCkgcHVibGljIGl0ZW1OYW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIEZvcm0gZ3JvdXAgdGhhdCBpcyBnaXZlbiB0byB0aGUgaW50ZXJuYWwgU2VhcmNoYWJsZSBUYWJsZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JtTW9kZWw/OiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICAvKiogVGVtcGxhdGUgZm9yIHdoZW4gYSBjdXN0b20gaGVhZGVyIGlzIG5lZWRlZCBmb3IgdGhlIGF2YWlsYWJsZSBpdGVtcyB0YWJsZSAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBmb3Igd2hlbiBhIGN1c3RvbSBhdmFpbGFibGUgaXRlbSBpcyBuZWVkZWQuIERlZmF1bHQgdGVtcGxhdGUgaXMgYSBsYWJlbCBvbmx5ICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbUF2YWlsYWJsZUl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBUZW1wbGF0ZSBmb3Igd2hlbiBhIGN1c3RvbSBzZWxlY3RlZCBpdGVtIGlzIG5lZWRlZC4gRGVmYXVsdCB0ZW1wbGF0ZSBpcyBhIGxhYmVsIG9ubHkgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tU2VsZWN0ZWRJdGVtVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKiogVXNlZCBieSB0aGUgaW50ZXJuYWwgU2VhcmNoYWJsZSBUYWJsZSB0byBrbm93IHdoZW4gdGhlIHBhZ2UgaXMgcmVhZHkgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcmVhZHk/OiBPYnNlcnZhYmxlPHZvaWQ+O1xyXG5cclxuICAvKiogVXNlZCBieSBTZWFyY2hhYmxlIFRhYmxlIHRvIHJldHJpZXZlIHRoZSBhdmFpbGFibGUgaXRlbXMgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZ2V0SXRlbXM/OiAoc2VhcmNoPzogc3RyaW5nLCBwYWdlQ2hhbmdlSW5mbz86IFBhZ2luZ0luZm8pID0+IE9ic2VydmFibGU8VGFibGVTZWFyY2hSZXN1bHRzPjtcclxuXHJcbiAgLyoqIFVzZWQgdG8gbWFpbnRhaW4gdGhlIGF2YWlsYWJsZSBpdGVtcyBjaGVja2JveCBzZWxlY3Rpb24gYXMgd2VsbCBhcyB0aGUgc2VsZWN0ZWQgaXRlbXMgbGlzdCAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3Rpb25Db250ZXh0ITogSXRlbVBpY2tlclNlbGVjdGFibGVDb250ZXh0PFQ+O1xyXG5cclxuICAvKiogVXNlZCBieSB0aGUgaW50ZXJuYWwgU2VhcmNoYWJsZSBUYWJsZSB3aGVuIHRoZXJlIGlzIG5vIGF2YWlsYWJsZSBpdGVtcyB0byBjaG9vc2UgZnJvbSBiYXNlZCBvbiB0aGUgZ2V0SXRlbXMgcmVzdWx0cy4gRG8gbm90IHN1cHBseVxyXG4gICAqICB0byBpbmhlcml0IHRoZSBkZWZhdWx0IG1lc3NhZ2UuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vRGF0YU1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG5vIHNlbGVjdGVkIGl0ZW1zIG1lc3NhZ2UuIElmIHByb3ZpZGVkIHRoaXMgd2lsbCBiZSB1c2VkLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgbWVzc2FnZSB3aXRoIHRoZSBpdGVtIG5hbWVcclxuICAgKiBpbnRlcnBvbGF0aW9uIHdpbGwgYmUgdXNlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbm9TZWxlY3RlZEl0ZW1zTWVzc2FnZT86IHN0cmluZztcclxuXHJcbiAgLyoqIFVzZWQgdG8gZW5hYmxlIHNlbGVjdCBhbGwgaXRlbXMgYWNyb3NzIHBhZ2VzLiBXaGVuIHRydWUgdGhlIGJ1dHRvbiB0byBzZWxlY3QgYWxsIGl0ZW1zIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlciB3aGVuXHJcbiAgICogIHRoZSBoZWFkZXIgY2hlY2tib3ggaXMgY2hlY2tlZCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIHBhZ2VzIG9mIHJlc3VsdHNcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlU2VsZWN0QWxsSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFVzZWQgdG8gZGlzcGxheSBhIG1lc3NhZ2UgaW4gdGhlIHNlbGVjdGVkIGl0ZW1zIHRhYmxlIHdoZW4gdGhlIHNlbGVjdCBhbGwgaXRlbXMgYnV0dG9uIGlzIGNsaWNrZWQgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0QWxsSXRlbXNNZXNzYWdlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqIExpc3Qgb2YgYXZhaWxhYmxlIGl0ZW1zIHRvIHBpY2sgZnJvbSAqL1xyXG4gIHB1YmxpYyBhdmFpbGFibGVJdGVtczogUGlja2VySXRlbVtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdGVkIGl0ZW1zIGFycmF5LiBDcmVhdGVkIGZyb20gdGhlIHNlbGVjdGVkIGl0ZW1zIG1hcC4gQmluZGluZyB0byB0aGVcclxuICAgKiBtYXAgaXRlcmF0ZSB2YWx1ZXMgY2F1c2VkIGFuZ3VsYXIgXCJleHByZXNzaW9uIGNoYW5nZWRcIiBlcnJvcnMgc28gYWZ0ZXIgYSBtYXBcclxuICAgKiB1cGRhdGUgdGhpcyBnZXRzIHNldCB0byB0aGUgdmFsdWVzXHJcbiAgICovXHJcbiAgcHVibGljIHNlbGVjdGVkSXRlbXM6IFBpY2tlckl0ZW1bXSA9IFtdO1xyXG5cclxuICAvKiogVHJ1ZSBpZiB0aGVyZSBhcmUgc2VsZWN0ZWQgaXRlbXMgYW5kIGF0IGxlYXN0IG9uZSBjYW4gYmUgcmVtb3ZlZCAqL1xyXG4gIHB1YmxpYyBzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUcmFjayBieSB1c2VkIGZvciB0aGUgc2VhcmNoYWJsZSB0YWJsZSByb3dzICovXHJcbiAgcHVibGljIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKSA9PiBpbmRleDtcclxuXHJcbiAgcHVibGljIHRhYmxlU3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnKTtcclxuXHJcbiAgLyoqIFRleHQgdG8gZGlzcGxheSBuZXh0IHRvIHRoZSBjaGVja2JveCBpbiB0aGUgYXZhaWxhYmxlIGl0ZW1zIGhlYWRlci4gVXNlZCB0byBkaXNsYXkgaG93IG1hbnkgaXRlbXMgYXJlXHJcbiAgICogIHNlbGVjdGVkIHdoZW4gc2VsZWN0IGFsbCBpdGVtcyBpcyBlbmFibGVkXHJcbiAgICovXHJcbiAgcHVibGljIGF2YWlsYWJsZUNoZWNrYm94VGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIC8qKiBXaGVuIHNldCB0byB0cnVlIHRoZSBzZWxlY3QgYWxsIGl0ZW1zIGJ1dHRvbiB3aWxsIHNob3cgaW4gdGhlIGF2YWlsYWJsZSBpdGVtcyBoZWFkZXIuIFRoaXMgaXNcclxuICAgKiAgc2hvd24gd2hlbiB0aGUgdXNlciBoYXMgZW5hYmxlZCBzZWxlY3QgYWxsIGZvciB0aGUgaXRlbSBwaWNrZXIgYW5kIHRoZSB1c2VyIHNlbGVjdHMgdGhlIGhlYWRlciBjaGVja2JveFxyXG4gICAqICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFnZSBvZiByZXN1bHRzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzaG93U2VsZWN0QWxsSXRlbXNCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgcmV0dXJuZWQgZnJvbSB0aGUgYXBpIGFjcm9zcyBhbGwgcGFnZXMgKi9cclxuICBwdWJsaWMgdG90YWxJdGVtc0JlZm9yZVBhZ2luZz86IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlbXBsYXRlIHVzZWQgdG8gZGlzcGxheSB0aGUgYXZhaWxhYmxlIGFuZCBzZWxlY3RlZCBpdGVtcyBhcyB3ZWxsIGFzIHRoZSBhdmFpbGFibGUgaXRlbSBoZWFkZXIuXHJcbiAgICogVGhpcyB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBpZiBhIGN1c3RvbSBpcyBub3QgcHJvdmlkZWRcclxuICAgKi9cclxuICBwdWJsaWMgaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHB1YmxpYyBpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBEZWZhdWx0IHRlbXBsYXRlcyB1c2VkIGlmIGEgY3VzdG9tIHRlbXBsYXRlIGlzIG5vdCBwcm92aWRlZCAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgZGVmYXVsdEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdkZWZhdWx0U2VsZWN0ZWRJdGVtVGVtcGxhdGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIGRlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKiBVc2VkIHRvIHNodXQgZG93biBvdXIgc3Vic2NyaXB0aW9ucyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0dXBSb3dDaGVja2JveGVzV2F0Y2hlcigpO1xyXG4gICAgdGhpcy5zZXR1cFNlbGVjdGVkSXRlbXNDaGFuZ2VkV2F0Y2hlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGNoYW5nZXMgYW5kIHJlYWN0IGlmIHRoZSBjdXN0b20gaXRlbSB0ZW1wbGF0ZSB2YWx1ZSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRJbnRlcm5hbGl6ZWRUZW1wbGF0ZXMoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgYnkgdGhlIHNlYXJjaGFibGUgdGFibGUgd2hlbiBhIG5ldyBzZXQgb2YgaXRlbXMgYXJlIHJldHVybmVkIGZyb20gdGhlIGdldEl0ZW1zIGNhbGwuXHJcbiAgICogSWYgYW55IG9mIHRoZSBpdGVtcyBoYXZlIGBwcmV2ZW50UmVtb3ZlYCBzZXQsIHRoZWlyIGluZGljZXMgYXJlIGFkZGVkIHRvIHRoZSBjb250ZXh0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkl0ZW1zQ2hhbmdlKHJlc3VsdHM6IFRhYmxlU2VhcmNoUmVzdWx0cykge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zKSB7XHJcbiAgICAgIHRoaXMub25DbGVhclNlbGVjdGlvbkNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld05vbkRlcGVuZGVudENoZWNrYm94ZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgKDxQaWNrZXJJdGVtW10+cmVzdWx0cy5pdGVtcykuZm9yRWFjaCgoaXRlbSwgaW5kZXgpICA9PiB7XHJcbiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIGl0ZW1zIGFyZSBtYXJrZWQgdG8gYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBhbmQgaWYgc29cclxuICAgICAgLy8gYWRkIHRoZW0gdG8gdGhlIG1hcC5cclxuICAgICAgaWYgKGl0ZW0uZGVmYXVsdFNlbGVjdGVkICYmICF0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnNldChpdGVtLmlkLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBvZiB0aGUgaXRlbXMgYXJlIG1hcmtlZCB0byBwcmV2ZW50IFJlbW92YWwsIGFuZCBpZiBzb1xyXG4gICAgICAvLyBhZGQgdGhlbSB0byB0aGUgbm9uLWRlcGVuZGVudCBjaGVja2JveGVzIGFycmF5LiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hc3RlclxyXG4gICAgICAvLyBjaGVja2JveCBmcm9tIHRvZ2dsaW5nIHRoZW0uXHJcbiAgICAgIGlmIChpdGVtLnByZXZlbnRSZW1vdmUpIHtcclxuICAgICAgICBuZXdOb25EZXBlbmRlbnRDaGVja2JveGVzLnB1c2goaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQubm9uRGVwZW5kZW50Q2hlY2tib3hlcyA9IG5ld05vbkRlcGVuZGVudENoZWNrYm94ZXM7XHJcblxyXG4gICAgLy8gV2hlbiB0aGUgdXNlciBmaWx0ZXJzIHRoZSBsaXN0IHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0IGFsbCBpdGVtc1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmF2YWlsYWJsZUl0ZW1zID0gKDxQaWNrZXJJdGVtW10+cmVzdWx0cy5pdGVtcyk7XHJcbiAgICB0aGlzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmcgPSByZXN1bHRzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmc7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBdmFpbGFibGVDaGVja2JveFRleHQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjbGVhciBzZWxlY3Rpb24gbGluayBidXR0b24gaXMgY2xpY2tlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtc01hcCgpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5yb3dDaGVja2JveGVzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmF2YWlsYWJsZUl0ZW1zW2luZGV4XS5wcmV2ZW50UmVtb3ZlKSB7XHJcbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShmYWxzZSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbW92ZSBpdGVtIGJ1dHRvbiBpcyBjbGlja2VkIGZvciBhIHNlbGVjdGVkIGl0ZW1cclxuICAgKiBAcGFyYW0gcmVtb3ZlSXRlbVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZW1vdmVTZWxlY3RlZEl0ZW0ocmVtb3ZlSXRlbTogUGlja2VySXRlbSk6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kSW5kZXggPSB0aGlzLmF2YWlsYWJsZUl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgaWYgKGZvdW5kSW5kZXggPiAtMSkge1xyXG4gICAgICAvLyBVcGRhdGUgdGhlIHJvdyBjaGVja2JveCBzaW5jZSB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIHBhZ2UgYmVpbmcgdmlld2VkXHJcbiAgICAgIC8vIFRoZSB2YWx1ZSBjaGFuZ2UgaGFuZGxlciBmb3Igcm93IGNoZWNrYm94ZXMgd2lsbCB1cGRhdGUgdGhlIG1hcC9zZWxlY3RlZCBpdGVtc1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChmb3VuZEluZGV4KS5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBUaGUgaXRlbSBiZWluZyByZW1vdmVkIGlzIG5vdCBvbiB0aGUgY3VycmVudCBwYWdlIHNvIGp1c3QgdXBkYXRlIHRoZVxyXG4gICAgICAvLyBtYXAvc2VsZWN0ZWQgaXRlbXNcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXAuZGVsZXRlKHJlbW92ZUl0ZW0uaWQpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFxyXG4gIC8qKiBcclxuICAgKiBDbGljayBoYW5kbGVyIGZvciB0aGUgc2VsZWN0IGFsbCBpdGVtcyBidXR0b25cclxuICAgKi9cclxuICBwdWJsaWMgc2VsZWN0QWxsSXRlbXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtc01hcCgpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zID0gdHJ1ZTtcclxuICAgIHRoaXMuc2hvd1NlbGVjdEFsbEl0ZW1zQnV0dG9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZUNoZWNrYm94VGV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSB0aGUgc2VsZWN0ZWQgaXRlbXMgbWFwLiBUaGlzIHdhcyBzcGxpdCBmcm9tIHRoZSBvbkNsZWFyU2VsZWN0aW9uQ2xpY2sgZnVuY3Rpb24gdG8gYWxsb3dcclxuICAgKiBzZWxlY3RBbGxJdGVtcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYnV0IGtlZXAgdGhlIHJvdyBjaGVja2JveCB2YWx1ZXMgaW4gcGxhY2UuIFRoaXMgd2FzIG5lZWRlZCBiZWNhdXNlIHdoZW4geW91IGFyZVxyXG4gICAqIHNlbGVjdGluZyBhbGwgaXRlbXMgYWNyb3NzIGFsbCBwYWdlcyB3ZSB3YW50IHRoZSBjdXJyZW50IHBhZ2Ugb2YgaXRlbXMgdG8gcmVtYWluIGNoZWNrZWQuXHJcbiAgICogXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhclNlbGVjdGVkSXRlbXNNYXAoKTogdm9pZCB7XHJcbiAgICAvLyBSZW1vdmUgcmVtb3ZhYmxlIGl0ZW1zIGZyb20gbWFwXHJcbiAgICAvLyBUaGlzIGlzIHNhZmUuICBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU5NDAyMTYvZXM2LWlzLWl0LWRhbmdlcm91cy10by1kZWxldGUtZWxlbWVudHMtZnJvbS1zZXQtbWFwLWR1cmluZy1zZXQtbWFwLWl0ZXJhdGlvblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwKSB7XHJcbiAgICAgIGlmICghdmFsLnByZXZlbnRSZW1vdmUpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0ZWRJdGVtc01hcC5kZWxldGUoa2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIHJvdyBjaGVja2JveGVzIGZvcm0gYXJyYXkgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbXNcclxuICAgKiBsaXN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cFJvd0NoZWNrYm94ZXNXYXRjaGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5yb3dDaGVja2JveGVzLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICAvLyBEZWJvdW5jZSAxMCBpcyBzaW1wbHkgdG8gbm90IHNwYW0gdGhlIGNoYW5nZSBoYW5kbGVyIG9uIGxvYWQvcGFnZSBjaGFuZ2VcclxuICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgd2lsbCBnZXQgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBuZXcgcm93IGlzIGFkZGVkIHRvIHRoZSB0YWJsZVxyXG4gICAgICBkZWJvdW5jZVRpbWUoMTApLFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpXHJcbiAgICApLnN1YnNjcmliZSgocm93VmFsdWVzOiBib29sZWFuW10pID0+IHtcclxuICAgICAgcm93VmFsdWVzLmZvckVhY2goKHNlbGVjdGVkLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGxldCBhdmFpbGFibGVJdGVtID0gdGhpcy5hdmFpbGFibGVJdGVtc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhhdmFpbGFibGVJdGVtLmlkKSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLmRlbGV0ZShhdmFpbGFibGVJdGVtLmlkKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkICYmICF0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuaGFzKGF2YWlsYWJsZUl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQ/LnNlbGVjdGVkSXRlbXNNYXAuc2V0KGF2YWlsYWJsZUl0ZW0uaWQsIGF2YWlsYWJsZUl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC52YWx1ZXMoKSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyYWJsZSA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5zb21lKGkgPT4gIWkucHJldmVudFJlbW92ZSk7XHJcbiAgICAgIHRoaXMudXBkYXRlQXZhaWxhYmxlQ2hlY2tib3hUZXh0KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQuc2VsZWN0QWxsQ2hlY2tib3gudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDEwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSkuc3Vic2NyaWJlKChjaGVja2VkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZVNlbGVjdEFsbEl0ZW1zKSB7XHJcbiAgICAgICAgY29uc3Qgb25lUGFnZU9mRGF0YSA9IHRoaXMuYXZhaWxhYmxlSXRlbXMubGVuZ3RoID09PSB0aGlzLnRvdGFsSXRlbXNCZWZvcmVQYWdpbmc7XHJcblxyXG4gICAgICAgIGlmIChjaGVja2VkICYmICFvbmVQYWdlT2ZEYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dTZWxlY3RBbGxJdGVtc0J1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICghY2hlY2tlZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIHdlcmUgc2VsZWN0aW5nIGFsbCBpdGVtcywgY2xlYXIgdGhlIHNlbGVjdGlvbiB0byBhbGxvdyB0aGUgdXNlciB0byBzdGFydCBvdmVyXHJcbiAgICAgICAgICAgIHRoaXMub25DbGVhclNlbGVjdGlvbkNsaWNrKCk7XHJcbiAgICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgICB0aGlzLnNob3dTZWxlY3RBbGxJdGVtc0J1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBdmFpbGFibGVDaGVja2JveFRleHQoKSB7XHJcbiAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25Db250ZXh0LmlzU2VsZWN0aW5nQWxsSXRlbXMpIHtcclxuICAgICAgICBjb25zdCBjaGVja2VkQ291bnQgPSB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5jb250cm9scy5tYXAoYyA9PiBjLnZhbHVlKS5maWx0ZXIodiA9PiB2KS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNoZWNrZWRDb3VudCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0NvdW50U2VsZWN0ZWRfVEMnLCB7IGNvdW50OiBjaGVja2VkQ291bnQgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlQ2hlY2tib3hUZXh0ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0FsbEl0ZW1QaWNrZXJJdGVtc1NlbGVjdGVkX1NDJywgeyBjb3VudDogdGhpcy50b3RhbEl0ZW1zQmVmb3JlUGFnaW5nLCBpdGVtTmFtZTogdGhpcy5pdGVtTmFtZSB9KTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYXRjaCB0byBiZSB0b2xkIGlmIGNoYW5nZXMgdG8gdGhlIG1hcCB3ZXJlIG1hZGUgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpZiBzbyB1cGRhdGVcclxuICAgKiB0aGUgYXJyYXkgZGlzcGxheWVkIGluIHRoZSBzZWxlY3RlZCBsaXN0IGFuZCBzZWxlY3QgY2hlY2tib3hlcyBmb3IgdmlzaWJsZSBhdmFpbGFibGUgaXRlbXNcclxuICAgKi9cclxuICBwcml2YXRlIHNldHVwU2VsZWN0ZWRJdGVtc0NoYW5nZWRXYXRjaGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3Rpb25Db250ZXh0LnNlbGVjdGVkSXRlbXNNYXBDaGFuZ2VkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcclxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25Db250ZXh0Py5zZWxlY3RlZEl0ZW1zTWFwLnZhbHVlcygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uQ29udGV4dC5zZWxlY3RlZEl0ZW1zTWFwLmhhcyhpdGVtLmlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRleHQucm93Q2hlY2tib3hlcy5hdChpbmRleCkuc2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRJbnRlcm5hbGl6ZWRUZW1wbGF0ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmludGVybmFsaXplZEF2YWlsYWJsZUhlYWRlclRlbXBsYXRlID0gdGhpcy5jdXN0b21BdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRBdmFpbGFibGVIZWFkZXJUZW1wbGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jdXN0b21BdmFpbGFibGVJdGVtVGVtcGxhdGUpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGUgPSB0aGlzLmN1c3RvbUF2YWlsYWJsZUl0ZW1UZW1wbGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkQXZhaWxhYmxlSXRlbVRlbXBsYXRlID0gdGhpcy5kZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJuYWxpemVkU2VsZWN0ZWRJdGVtVGVtcGxhdGUgPSB0aGlzLmN1c3RvbVNlbGVjdGVkSXRlbVRlbXBsYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZSA9IHRoaXMuZGVmYXVsdFNlbGVjdGVkSXRlbVRlbXBsYXRlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGVjT3ZlcmxheVxyXG4gICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZ3JvdyBjYXJkXCJcclxuICAgICBbc3RhdHVzXT1cInRhYmxlU3RhdHVzPy5zdGF0dXNcIlxyXG4gICAgIFttZXNzYWdlXT1cInRhYmxlU3RhdHVzPy5tZXNzYWdlXCJcclxuICAgICBbZGlzcGxheUFzTWFza109XCJ0cnVlXCI+XHJcbiAgICA8ZWMtc2VhcmNoYWJsZS10YWJsZSBpZD1cInt7aWR9fV9zZWFyY2hhYmxlVGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3dcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGxQYXJlbnRIZWlnaHRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZUhlYWRlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlU2VhcmNoQ29udHJvbF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmVDYXJkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cIjUwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtvYmplY3RUeXBlXT1cIml0ZW1OYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtTW9kZWxdPVwiZm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkeV09XCJyZWFkeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0SXRlbXNdPVwiZ2V0SXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbbm9EYXRhTWVzc2FnZV09XCJub0RhdGFNZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Db250ZXh0XT1cInNlbGVjdGlvbkNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXR1c109XCJ0YWJsZVN0YXR1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbXNDaGFuZ2UpPVwib25JdGVtc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS4tLWVjLXNlYXJjaGFibGUtdGFibGUtZmxleC1wcm9wZXJ0aWVzXT1cIihhdmFpbGFibGVJdGVtcy5sZW5ndGggfHwgdGFibGVTdGF0dXMuc3RhdHVzID09PSAncGVuZGluZycgfHwgdGFibGVTdGF0dXMuc3RhdHVzID09PSAnZXJyb3InICkgPyAnMSAxIGF1dG8nIDogJzAgMSBhdXRvJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy1zZWFyY2hhYmxlLXRhYmxlLWhlaWdodC1jYXB0aW9uLWZvb3Rlcl09XCInY2FsYygyLjVyZW0gKyAxcHgpJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVMYXlvdXRGaXhlZF09XCJ0cnVlXCI+XHJcbiAgICAgICAgPGhlYWRlciAqbmdJZj1cImN1c3RvbUF2YWlsYWJsZUhlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1oZWFkZXIgZmxleC1zaHJpbmtcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IDNyZW07XCI+XHJcbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImNhcmQtdGl0bGVcIj57e2F2YWlsYWJsZVRpdGxlIHwgdHJhbnNsYXRlfX08L2gzPlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyIGVjVGFibGVTZWxlY3RhYmxlUm93XHJcbiAgICAgICAgICAgICAgICBbc2VsZWN0aW9uQ29udGV4dF09XCJzZWxlY3Rpb25Db250ZXh0XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLWJvdHRvbS0wXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW50ZXJuYWxpemVkQXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU7XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuXHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGF2YWlsYWJsZUl0ZW1zOyBpbmRleCBhcyByb3dJbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgZWNUYWJsZVNlbGVjdGFibGVSb3dcclxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uQ29udGV4dF09XCJzZWxlY3Rpb25Db250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0NoZWNrYm94RGlzYWJsZWRdPVwiaXRlbS5wcmV2ZW50UmVtb3ZlIHx8IHNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwic2VsZWN0aW9uQ29udGV4dD8uc2VsZWN0ZWRJdGVtc01hcC5oYXMoaXRlbS5pZCkgfHwgc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS1lYy10YWJsZS1zZWxlY3RhYmxlLXJvdy12ZXJ0aWNhbC1hbGlnbi1jaGVja2JveC10ZF09XCInbWlkZGxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRBdmFpbGFibGVJdGVtVGVtcGxhdGU7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGl0ZW19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgPC9lYy1zZWFyY2hhYmxlLXRhYmxlPlxyXG5cclxuICAgIDxzZWN0aW9uIGlkPVwie3tpZH19X3NlbGVjdGVkSXRlbXNcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3RlZC1pdGVtcyBmbGV4LWdyb3cgZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWdyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgYm9yZGVyLWJvdHRvbSBweC0yXCJcclxuICAgICAgICAgICAgICAgICBzdHlsZT1cImhlaWdodDogM3JlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGZsZXgtZ3JvdyB0ZXh0LXRydW5jYXRlXCI+e3tzZWxlY3RlZFRpdGxlIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZEl0ZW1zQ2xlYXJhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWNMaW5rQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tpZH19X2NsZWFyU2VsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwbC0yIG1sLWF1dG8gZm9udC1zaXplLWJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhclNlbGVjdGlvbkNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+Q2xlYXJTZWxlY3Rpb25fVEM8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1hdXRvIHRleHQtaGVhZGluZy0yXCJcclxuICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJzZWxlY3RBbGxJdGVtc01lc3NhZ2UgfCB0cmFuc2xhdGVcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGVjLXRhYmxlICpuZ0lmPVwiIXNlbGVjdGlvbkNvbnRleHQuaXNTZWxlY3RpbmdBbGxJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWdyb3cgaXMtZml4ZWRcIj5cclxuICAgICAgICAgICAgPGNvbGdyb3VwPlxyXG4gICAgICAgICAgICAgICAgPGNvbD5cclxuICAgICAgICAgICAgICAgIDxjb2wgc3R5bGU9XCJ3aWR0aDogMnJlbTtcIj5cclxuICAgICAgICAgICAgPC9jb2xncm91cD5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiaGVpZ2h0OiAzcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIGJvcmRlci1ib3R0b20tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWhlYWRpbmctMiBmb250LWNvbG9yLXByaW1hcnkgZmxleC1ncm93IHRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkVGl0bGUgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNlbGVjdGVkSXRlbXNDbGVhcmFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY0xpbmtCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fY2xlYXJTZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBsLTIgbWwtYXV0byBmb250LXNpemUtYmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsZWFyU2VsZWN0aW9uQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5DbGVhclNlbGVjdGlvbl9UQzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuXHJcbiAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyBsYXN0IGFzIGlzTGFzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0ZWRfcm93X3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ib3R0b21dPVwiIWlzTGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnRlcm5hbGl6ZWRTZWxlY3RlZEl0ZW1UZW1wbGF0ZTsgY29udGV4dDogeyRpbXBsaWNpdDogaXRlbX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYWN0aW9ucy1jb2wgdGV4dC1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWMtYnV0dG9uIGlkPVwie3tpZH19X3JlbW92ZVNlbGVjdGVkX3t7aXRlbS5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXRlbS5wcmV2ZW50UmVtb3ZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZWMtaWNvbiBpY29uLWNhbmNlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lYy1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIXNlbGVjdGVkSXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIW5vU2VsZWN0ZWRJdGVtc01lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0yIG5vLWRhdGEtbWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cIntpdGVtTmFtZTogaXRlbU5hbWUgfCB0cmFuc2xhdGV9XCI+SXRlbVBpY2tlck5vSXRlbXNTZWxlY3RlZF9TQzwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibm9TZWxlY3RlZEl0ZW1zTWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHNwYW49XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLTIgbm8tZGF0YS1tZXNzYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPnt7bm9TZWxlY3RlZEl0ZW1zTWVzc2FnZX19PC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC9lYy10YWJsZT5cclxuXHJcbiAgICAgICAgPGZvb3RlciBpZD1cInNlbGVjdGVkSXRlbXNGb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1zLmxlbmd0aCAmJiAhc2VsZWN0aW9uQ29udGV4dC5pc1NlbGVjdGluZ0FsbEl0ZW1zXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtc2hyaW5rIHB4LTIgYm9yZGVyLXRvcCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IGNhbGMoMi41cmVtICsgMXB4KTtcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC1hdXRvIHRleHQtY2FwdGlvbi0xIGZvbnQtY29sb3ItaGludFwiPlxyXG4gICAgICAgICAgICAgICAge3tzZWxlY3RlZEl0ZW1zLmxlbmd0aH19IHt7aXRlbU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9mb290ZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhaWxhYmxlSGVhZGVyVGVtcGxhdGU+XHJcbiAgICA8IS0tIDx0aCAqbmdJZj1cIiFlbmFibGVTZWxlY3RBbGxJdGVtc1wiIGNsYXNzPVwidGV4dC1oZWFkaW5nLTIgZm9udC1jb2xvci1wcmltYXJ5IGJvcmRlci1ib3R0b20tMFwiPnt7YXZhaWxhYmxlVGl0bGUgfCB0cmFuc2xhdGV9fTwvdGg+IC0tPlxyXG5cclxuICAgIDx0aCBjbGFzcz1cInRleHQtaGVhZGluZy0yIGZvbnQtY29sb3ItcHJpbWFyeSBib3JkZXItYm90dG9tLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYXZhaWxhYmxlQ2hlY2tib3hUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+e3thdmFpbGFibGVUaXRsZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImF2YWlsYWJsZUNoZWNrYm94VGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0ZWRDb3VudFwiPnt7YXZhaWxhYmxlQ2hlY2tib3hUZXh0fX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93U2VsZWN0QWxsSXRlbXNCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGVjTGlua0J1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsSXRlbXNCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGxJdGVtcygpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5cclxuICAgICAgICAgICAgICAgIHt7ICgnU2VsZWN0QWxsSXRlbVBpY2tlckl0ZW1zX1RDJykgfCB0cmFuc2xhdGU6eyBjb3VudDogdG90YWxJdGVtc0JlZm9yZVBhZ2luZywgaXRlbU5hbWU6IGl0ZW1OYW1lIH0gfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RoPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhaWxhYmxlSXRlbVRlbXBsYXRlXHJcbiAgICAgICAgICAgICBsZXQtaXRlbT5cclxuICAgIDx0ZD57e2l0ZW0ubGFiZWx9fTwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3RlZEl0ZW1UZW1wbGF0ZVxyXG4gICAgICAgICAgICAgbGV0LWl0ZW0+XHJcbiAgICB7e2l0ZW0ubGFiZWx9fVxyXG48L25nLXRlbXBsYXRlPiJdfQ==