@valtimo/task-management 12.14.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/valtimo-task-management.mjs +144 -343
  2. package/fesm2022/valtimo-task-management.mjs.map +1 -1
  3. package/lib/components/index.d.ts +3 -4
  4. package/lib/components/index.d.ts.map +1 -1
  5. package/lib/components/task-management-column-modal/task-management-column-modal.component.d.ts +14 -14
  6. package/lib/components/task-management-column-modal/task-management-column-modal.component.d.ts.map +1 -1
  7. package/lib/components/task-management-columns/task-management-columns.component.d.ts +10 -12
  8. package/lib/components/task-management-columns/task-management-columns.component.d.ts.map +1 -1
  9. package/lib/components/task-management-detail/task-management-detail.component.d.ts +4 -15
  10. package/lib/components/task-management-detail/task-management-detail.component.d.ts.map +1 -1
  11. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts +1 -1
  12. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts.map +1 -1
  13. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts +9 -11
  14. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts.map +1 -1
  15. package/lib/services/task-management-api.service.d.ts +6 -5
  16. package/lib/services/task-management-api.service.d.ts.map +1 -1
  17. package/lib/services/task-management-search-fields.service.d.ts +3 -3
  18. package/lib/services/task-management-search-fields.service.d.ts.map +1 -1
  19. package/package.json +4 -6
  20. package/public_api.d.ts +0 -1
  21. package/public_api.d.ts.map +1 -1
  22. package/esm2022/lib/components/index.mjs +0 -21
  23. package/esm2022/lib/components/task-management/index.mjs +0 -17
  24. package/esm2022/lib/components/task-management/task-management.component.mjs +0 -73
  25. package/esm2022/lib/components/task-management-column-modal/index.mjs +0 -17
  26. package/esm2022/lib/components/task-management-column-modal/task-management-column-modal.component.mjs +0 -373
  27. package/esm2022/lib/components/task-management-columns/index.mjs +0 -17
  28. package/esm2022/lib/components/task-management-columns/task-management-columns.component.mjs +0 -218
  29. package/esm2022/lib/components/task-management-detail/index.mjs +0 -17
  30. package/esm2022/lib/components/task-management-detail/task-management-detail.component.mjs +0 -68
  31. package/esm2022/lib/components/task-management-search-fields/task-management-search-fields.component.mjs +0 -178
  32. package/esm2022/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.mjs +0 -359
  33. package/esm2022/lib/models/index.mjs +0 -17
  34. package/esm2022/lib/models/task-management.model.mjs +0 -22
  35. package/esm2022/lib/services/index.mjs +0 -19
  36. package/esm2022/lib/services/task-management-api.service.mjs +0 -48
  37. package/esm2022/lib/services/task-management-search-fields.service.mjs +0 -47
  38. package/esm2022/lib/services/task-management.service.mjs +0 -36
  39. package/esm2022/lib/task-management-routing.module.mjs +0 -50
  40. package/esm2022/lib/task-management.module.mjs +0 -31
  41. package/esm2022/public_api.mjs +0 -23
  42. package/esm2022/valtimo-task-management.mjs +0 -5
  43. package/lib/components/task-management/index.d.ts +0 -2
  44. package/lib/components/task-management/index.d.ts.map +0 -1
  45. package/lib/components/task-management/task-management.component.d.ts +0 -20
  46. package/lib/components/task-management/task-management.component.d.ts.map +0 -1
  47. package/lib/components/task-management-column-modal/index.d.ts +0 -2
  48. package/lib/components/task-management-column-modal/index.d.ts.map +0 -1
  49. package/lib/components/task-management-columns/index.d.ts +0 -2
  50. package/lib/components/task-management-columns/index.d.ts.map +0 -1
  51. package/lib/components/task-management-detail/index.d.ts +0 -2
  52. package/lib/components/task-management-detail/index.d.ts.map +0 -1
  53. package/lib/task-management-routing.module.d.ts +0 -9
  54. package/lib/task-management-routing.module.d.ts.map +0 -1
  55. package/lib/task-management.module.d.ts +0 -9
  56. package/lib/task-management.module.d.ts.map +0 -1
@@ -1,178 +0,0 @@
1
- /*
2
- * Copyright 2015-2024 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { CommonModule } from '@angular/common';
17
- import { ChangeDetectionStrategy, Component } from '@angular/core';
18
- import { TranslateModule } from '@ngx-translate/core';
19
- import { CarbonListModule, ConfirmationModalModule, ViewType, } from '@valtimo/components';
20
- import { TaskListSearchFieldFieldType, } from '@valtimo/task';
21
- import { ButtonModule, IconModule } from 'carbon-components-angular';
22
- import { BehaviorSubject, combineLatest, filter, map, of, switchMap, take, tap, } from 'rxjs';
23
- import { TaskManagementSearchFieldsModalComponent } from '../task-management-search-fields-modal/task-management-search-fields-modal.component';
24
- import * as i0 from "@angular/core";
25
- import * as i1 from "@valtimo/document";
26
- import * as i2 from "@angular/router";
27
- import * as i3 from "../../services";
28
- import * as i4 from "@ngx-translate/core";
29
- import * as i5 from "@angular/common";
30
- import * as i6 from "@valtimo/components";
31
- import * as i7 from "carbon-components-angular";
32
- export class TaskManagementSearchFieldsComponent {
33
- constructor(documentService, route, searchFieldsService, trasnlateService) {
34
- this.documentService = documentService;
35
- this.route = route;
36
- this.searchFieldsService = searchFieldsService;
37
- this.trasnlateService = trasnlateService;
38
- this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName), tap((docDefName) => this.searchFieldsService.setDocumentDefinitionName(docDefName)));
39
- this._refresh$ = new BehaviorSubject(null);
40
- this.searchFields$ = combineLatest([
41
- this.documentDefinitionName$,
42
- this._refresh$,
43
- this.trasnlateService.stream('key'),
44
- ]).pipe(switchMap(() => this.searchFieldsService.getTaskListSearchFields()), map((searchFields) => this.mapTranslations(searchFields)));
45
- this.fields$ = this.trasnlateService.stream('key').pipe(map(() => [
46
- {
47
- key: 'title',
48
- label: 'searchFieldsOverview.title',
49
- viewType: ViewType.TEXT,
50
- },
51
- {
52
- key: 'key',
53
- label: 'searchFieldsOverview.key',
54
- viewType: ViewType.TEXT,
55
- },
56
- {
57
- key: 'path',
58
- label: 'searchFieldsOverview.path',
59
- viewType: ViewType.TEXT,
60
- },
61
- {
62
- key: 'dataTypeTranslation',
63
- label: 'searchFieldsOverview.dataType',
64
- viewType: ViewType.TEXT,
65
- },
66
- {
67
- key: 'fieldTypeTranslation',
68
- label: 'searchFieldsOverview.fieldType',
69
- viewType: ViewType.TEXT,
70
- },
71
- ]));
72
- this.deleteModalOpen$ = new BehaviorSubject(false);
73
- this.fieldModalOpen$ = new BehaviorSubject(false);
74
- this.itemToDelete$ = new BehaviorSubject(null);
75
- this.prefillData$ = new BehaviorSubject(null);
76
- this.ACTION_ITEMS = [
77
- {
78
- label: 'interface.edit',
79
- callback: this.editField.bind(this),
80
- type: 'normal',
81
- },
82
- {
83
- label: 'interface.delete',
84
- callback: this.deleteField.bind(this),
85
- type: 'danger',
86
- },
87
- ];
88
- }
89
- editField(item) {
90
- if (!!item.dropdownDataProvider) {
91
- this.documentService
92
- .getDropdownData(item.dropdownDataProvider, item.ownerId, item.key)
93
- .pipe(take(1))
94
- .subscribe(dropdownValues => {
95
- item.dropdownValues = dropdownValues;
96
- this.prefillData$.next(item);
97
- this.fieldModalOpen$.next(true);
98
- });
99
- return;
100
- }
101
- this.prefillData$.next(item);
102
- this.fieldModalOpen$.next(true);
103
- }
104
- onItemsReordered(event) {
105
- this.searchFieldsService
106
- .orderTaskListSearchFields(event)
107
- .pipe(take(1))
108
- .subscribe(() => this._refresh$.next(null));
109
- }
110
- onAddButtonClick() {
111
- this.fieldModalOpen$.next(true);
112
- }
113
- onCloseEvent(searchField, prefillData) {
114
- this.fieldModalOpen$.next(false);
115
- this.prefillData$.next(null);
116
- if (!searchField)
117
- return;
118
- const hasDropdownValues = searchField.fieldType === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||
119
- searchField.fieldType === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN;
120
- (!prefillData
121
- ? this.searchFieldsService.createTaskListSearchField(searchField)
122
- : this.searchFieldsService.updateTaskListSearchField(searchField))
123
- .pipe(take(1), switchMap((field) => {
124
- return hasDropdownValues
125
- ? this.documentService.postDropdownData(field.dropdownDataProvider ?? '', field.ownerId, field.key, searchField.dropdownValues ?? {})
126
- : of(field);
127
- }))
128
- .subscribe(() => this._refresh$.next(null));
129
- }
130
- onDeleteFieldConfirm(item) {
131
- if (!item)
132
- return;
133
- combineLatest([
134
- this.searchFieldsService.deleteTaskListSearchField(item.key),
135
- item.dropdownDataProvider
136
- ? this.documentService.deleteDropdownData(item.dropdownDataProvider, item.ownerId, item.key)
137
- : of(null),
138
- ])
139
- .pipe(take(1))
140
- .subscribe(() => this._refresh$.next(null));
141
- }
142
- deleteField(item) {
143
- this.itemToDelete$.next(item);
144
- this.deleteModalOpen$.next(true);
145
- }
146
- mapTranslations(searchFields) {
147
- return searchFields.map((searchField) => ({
148
- ...searchField,
149
- dataTypeTranslation: this.trasnlateService.instant(`searchFields.${searchField.dataType.toLowerCase()}`),
150
- fieldTypeTranslation: this.trasnlateService.instant(`searchFieldsOverview.${this.fieldTypeTranslation(searchField.fieldType)}`),
151
- }));
152
- }
153
- fieldTypeTranslation(fieldType) {
154
- switch (fieldType) {
155
- case TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN:
156
- return 'single-select-dropdown';
157
- case TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN:
158
- return 'multi-select-dropdown';
159
- default:
160
- return fieldType.toLowerCase();
161
- }
162
- }
163
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TaskManagementSearchFieldsService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
164
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskManagementSearchFieldsComponent, isStandalone: true, selector: "valtimo-task-management-search-fields", ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n fieldModalOpen: fieldModalOpen$ | async,\n fields: fields$ | async,\n itemToDelete: itemToDelete$ | async,\n prefillData: prefillData$ | async,\n searchFields: searchFields$ | async,\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"ACTION_ITEMS\"\n [fields]=\"obs.fields\"\n [items]=\"obs.searchFields\"\n [dragAndDrop]=\"true\"\n (itemsReordered)=\"onItemsReordered($event)\"\n (rowClicked)=\"editField($event)\"\n >\n <ng-container carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addButton\"></ng-container>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addButton\"\n [description]=\"'searchFieldsOverview.noSearchfieldsDescription' | translate\"\n [title]=\"'searchFieldsOverview.noSearchfieldsTitle' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <valtimo-task-management-search-fields-modal\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [open]=\"obs.fieldModalOpen\"\n [prefillData]=\"obs.prefillData\"\n (closeEvent)=\"onCloseEvent($event, obs.prefillData)\"\n ></valtimo-task-management-search-fields-modal>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n [outputOnConfirm]=\"obs.itemToDelete\"\n [showModalSubject$]=\"deleteModalOpen$\"\n titleTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n (confirmEvent)=\"onDeleteFieldConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-container>\n\n<ng-template #addButton>\n <button cdsButton=\"primary\" (click)=\"onAddButtonClick()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFieldsOverview.add' | translate }}\n </button>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i6.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "component", type: i6.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i7.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i7.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: TaskManagementSearchFieldsModalComponent, selector: "valtimo-task-management-search-fields-modal", inputs: ["open", "documentDefinitionName", "prefillData"], outputs: ["closeEvent"] }, { kind: "ngmodule", type: ConfirmationModalModule }, { kind: "component", type: i6.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
165
- }
166
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskManagementSearchFieldsComponent, decorators: [{
167
- type: Component,
168
- args: [{ selector: 'valtimo-task-management-search-fields', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
169
- CommonModule,
170
- TranslateModule,
171
- CarbonListModule,
172
- ButtonModule,
173
- IconModule,
174
- TaskManagementSearchFieldsModalComponent,
175
- ConfirmationModalModule,
176
- ], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n fieldModalOpen: fieldModalOpen$ | async,\n fields: fields$ | async,\n itemToDelete: itemToDelete$ | async,\n prefillData: prefillData$ | async,\n searchFields: searchFields$ | async,\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"ACTION_ITEMS\"\n [fields]=\"obs.fields\"\n [items]=\"obs.searchFields\"\n [dragAndDrop]=\"true\"\n (itemsReordered)=\"onItemsReordered($event)\"\n (rowClicked)=\"editField($event)\"\n >\n <ng-container carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addButton\"></ng-container>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addButton\"\n [description]=\"'searchFieldsOverview.noSearchfieldsDescription' | translate\"\n [title]=\"'searchFieldsOverview.noSearchfieldsTitle' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <valtimo-task-management-search-fields-modal\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [open]=\"obs.fieldModalOpen\"\n [prefillData]=\"obs.prefillData\"\n (closeEvent)=\"onCloseEvent($event, obs.prefillData)\"\n ></valtimo-task-management-search-fields-modal>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n [outputOnConfirm]=\"obs.itemToDelete\"\n [showModalSubject$]=\"deleteModalOpen$\"\n titleTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n (confirmEvent)=\"onDeleteFieldConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-container>\n\n<ng-template #addButton>\n <button cdsButton=\"primary\" (click)=\"onAddButtonClick()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFieldsOverview.add' | translate }}\n </button>\n</ng-template>\n" }]
177
- }], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TaskManagementSearchFieldsService }, { type: i4.TranslateService }] });
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUVMLGdCQUFnQixFQUVoQix1QkFBdUIsRUFDdkIsUUFBUSxHQUNULE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUdMLDRCQUE0QixHQUM3QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sc0ZBQXNGLENBQUM7Ozs7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LEtBQUssNEJBQTRCLENBQUMscUJBQXFCO2dCQUNyRCxPQUFPLHVCQUF1QixDQUFDO1lBQ2pDO2dCQUNFLE9BQU8sU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDOytHQTlLVSxtQ0FBbUM7bUdBQW5DLG1DQUFtQyxpR0M5RGhELHVnRkFxRUEsMkNEaEJJLFlBQVksOFZBQ1osZUFBZSwyRkFDZixnQkFBZ0IsdzFCQUNoQixZQUFZLGdNQUNaLFVBQVUsNk5BQ1Ysd0NBQXdDLDJLQUN4Qyx1QkFBdUI7OzRGQUdkLG1DQUFtQztrQkFmL0MsU0FBUzsrQkFDRSx1Q0FBdUMsbUJBRWhDLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVix3Q0FBd0M7d0JBQ3hDLHVCQUF1QjtxQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGlvbkl0ZW0sXG4gIENhcmJvbkxpc3RNb2R1bGUsXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29uZmlybWF0aW9uTW9kYWxNb2R1bGUsXG4gIFZpZXdUeXBlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1xuICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duVmFsdWUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGQsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUsXG59IGZyb20gJ0B2YWx0aW1vL3Rhc2snO1xuaW1wb3J0IHtCdXR0b25Nb2R1bGUsIEljb25Nb2R1bGV9IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7VGFza01hbmFnZW1lbnRTZWFyY2hGaWVsZHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1Rhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzTW9kYWxDb21wb25lbnR9IGZyb20gJy4uL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJ3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIENhcmJvbkxpc3RNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgVGFza01hbmFnZW1lbnRTZWFyY2hGaWVsZHNNb2RhbENvbXBvbmVudCxcbiAgICBDb25maXJtYXRpb25Nb2RhbE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza01hbmFnZW1lbnRTZWFyY2hGaWVsZHNDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgbWFwKHBhcmFtcyA9PiBwYXJhbXMubmFtZSB8fCAnJyksXG4gICAgZmlsdGVyKGRvY0RlZk5hbWUgPT4gISFkb2NEZWZOYW1lKSxcbiAgICB0YXAoKGRvY0RlZk5hbWU6IHN0cmluZykgPT4gdGhpcy5zZWFyY2hGaWVsZHNTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jRGVmTmFtZSkpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVmcmVzaCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hGaWVsZHMkOiBPYnNlcnZhYmxlPFRhc2tMaXN0U2VhcmNoRmllbGRbXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLFxuICAgIHRoaXMuX3JlZnJlc2gkLFxuICAgIHRoaXMudHJhc25sYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnNlYXJjaEZpZWxkc1NlcnZpY2UuZ2V0VGFza0xpc3RTZWFyY2hGaWVsZHMoKSksXG4gICAgbWFwKChzZWFyY2hGaWVsZHM6IFRhc2tMaXN0U2VhcmNoRmllbGRbXSkgPT4gdGhpcy5tYXBUcmFuc2xhdGlvbnMoc2VhcmNoRmllbGRzKSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzJDogT2JzZXJ2YWJsZTxDb2x1bW5Db25maWdbXT4gPSB0aGlzLnRyYXNubGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKS5waXBlKFxuICAgIG1hcCgoKSA9PiBbXG4gICAgICB7XG4gICAgICAgIGtleTogJ3RpdGxlJyxcbiAgICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy50aXRsZScsXG4gICAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAna2V5JyxcbiAgICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5rZXknLFxuICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuVEVYVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3BhdGgnLFxuICAgICAgICBsYWJlbDogJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnLFxuICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuVEVYVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2RhdGFUeXBlVHJhbnNsYXRpb24nLFxuICAgICAgICBsYWJlbDogJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRhdGFUeXBlJyxcbiAgICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdmaWVsZFR5cGVUcmFuc2xhdGlvbicsXG4gICAgICAgIGxhYmVsOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZmllbGRUeXBlJyxcbiAgICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgICB9LFxuICAgIF0pXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZU1vZGFsT3BlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkTW9kYWxPcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbVRvRGVsZXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJlZmlsbERhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbD4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IEFDVElPTl9JVEVNUzogQWN0aW9uSXRlbVtdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiAnaW50ZXJmYWNlLmVkaXQnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMuZWRpdEZpZWxkLmJpbmQodGhpcyksXG4gICAgICB0eXBlOiAnbm9ybWFsJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnaW50ZXJmYWNlLmRlbGV0ZScsXG4gICAgICBjYWxsYmFjazogdGhpcy5kZWxldGVGaWVsZC5iaW5kKHRoaXMpLFxuICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VhcmNoRmllbGRzU2VydmljZTogVGFza01hbmFnZW1lbnRTZWFyY2hGaWVsZHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhc25sYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIGVkaXRGaWVsZChpdGVtOiBUYXNrTGlzdFNlYXJjaEZpZWxkKTogdm9pZCB7XG4gICAgaWYgKCEhaXRlbS5kcm9wZG93bkRhdGFQcm92aWRlcikge1xuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgLmdldERyb3Bkb3duRGF0YShpdGVtLmRyb3Bkb3duRGF0YVByb3ZpZGVyLCBpdGVtLm93bmVySWQsIGl0ZW0ua2V5KVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKGRyb3Bkb3duVmFsdWVzID0+IHtcbiAgICAgICAgICBpdGVtLmRyb3Bkb3duVmFsdWVzID0gZHJvcGRvd25WYWx1ZXMgYXMgVGFza0xpc3RTZWFyY2hEcm9wZG93blZhbHVlO1xuICAgICAgICAgIHRoaXMucHJlZmlsbERhdGEkLm5leHQoaXRlbSk7XG4gICAgICAgICAgdGhpcy5maWVsZE1vZGFsT3BlbiQubmV4dCh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcmVmaWxsRGF0YSQubmV4dChpdGVtKTtcbiAgICB0aGlzLmZpZWxkTW9kYWxPcGVuJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uSXRlbXNSZW9yZGVyZWQoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaEZpZWxkc1NlcnZpY2VcbiAgICAgIC5vcmRlclRhc2tMaXN0U2VhcmNoRmllbGRzKGV2ZW50KVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaCQubmV4dChudWxsKSk7XG4gIH1cblxuICBwdWJsaWMgb25BZGRCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkTW9kYWxPcGVuJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xvc2VFdmVudChcbiAgICBzZWFyY2hGaWVsZDogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwsXG4gICAgcHJlZmlsbERhdGE6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRNb2RhbE9wZW4kLm5leHQoZmFsc2UpO1xuICAgIHRoaXMucHJlZmlsbERhdGEkLm5leHQobnVsbCk7XG4gICAgaWYgKCFzZWFyY2hGaWVsZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaGFzRHJvcGRvd25WYWx1ZXM6IGJvb2xlYW4gPVxuICAgICAgc2VhcmNoRmllbGQuZmllbGRUeXBlID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV04gfHxcbiAgICAgIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5NVUxUSV9TRUxFQ1RfRFJPUERPV047XG5cbiAgICAoIXByZWZpbGxEYXRhXG4gICAgICA/IHRoaXMuc2VhcmNoRmllbGRzU2VydmljZS5jcmVhdGVUYXNrTGlzdFNlYXJjaEZpZWxkKHNlYXJjaEZpZWxkKVxuICAgICAgOiB0aGlzLnNlYXJjaEZpZWxkc1NlcnZpY2UudXBkYXRlVGFza0xpc3RTZWFyY2hGaWVsZChzZWFyY2hGaWVsZClcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChmaWVsZDogVGFza0xpc3RTZWFyY2hGaWVsZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBoYXNEcm9wZG93blZhbHVlc1xuICAgICAgICAgICAgPyB0aGlzLmRvY3VtZW50U2VydmljZS5wb3N0RHJvcGRvd25EYXRhKFxuICAgICAgICAgICAgICAgIGZpZWxkLmRyb3Bkb3duRGF0YVByb3ZpZGVyID8/ICcnLFxuICAgICAgICAgICAgICAgIGZpZWxkLm93bmVySWQsXG4gICAgICAgICAgICAgICAgZmllbGQua2V5LFxuICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkLmRyb3Bkb3duVmFsdWVzID8/IHt9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogb2YoZmllbGQpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWZyZXNoJC5uZXh0KG51bGwpKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlbGV0ZUZpZWxkQ29uZmlybShpdGVtOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghaXRlbSkgcmV0dXJuO1xuXG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnNlYXJjaEZpZWxkc1NlcnZpY2UuZGVsZXRlVGFza0xpc3RTZWFyY2hGaWVsZChpdGVtLmtleSksXG4gICAgICBpdGVtLmRyb3Bkb3duRGF0YVByb3ZpZGVyXG4gICAgICAgID8gdGhpcy5kb2N1bWVudFNlcnZpY2UuZGVsZXRlRHJvcGRvd25EYXRhKGl0ZW0uZHJvcGRvd25EYXRhUHJvdmlkZXIsIGl0ZW0ub3duZXJJZCwgaXRlbS5rZXkpXG4gICAgICAgIDogb2YobnVsbCksXG4gICAgXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3JlZnJlc2gkLm5leHQobnVsbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVGaWVsZChpdGVtOiBUYXNrTGlzdFNlYXJjaEZpZWxkKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtVG9EZWxldGUkLm5leHQoaXRlbSk7XG4gICAgdGhpcy5kZWxldGVNb2RhbE9wZW4kLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG1hcFRyYW5zbGF0aW9ucyhcbiAgICBzZWFyY2hGaWVsZHM6IFRhc2tMaXN0U2VhcmNoRmllbGRbXVxuICApOiAoVGFza0xpc3RTZWFyY2hGaWVsZCAmIHtkYXRhVHlwZVRyYW5zbGF0aW9uOiBzdHJpbmc7IGZpZWxkVHlwZVRyYW5zbGF0aW9uOiBzdHJpbmd9KVtdIHtcbiAgICByZXR1cm4gc2VhcmNoRmllbGRzLm1hcCgoc2VhcmNoRmllbGQ6IFRhc2tMaXN0U2VhcmNoRmllbGQpID0+ICh7XG4gICAgICAuLi5zZWFyY2hGaWVsZCxcbiAgICAgIGRhdGFUeXBlVHJhbnNsYXRpb246IHRoaXMudHJhc25sYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBgc2VhcmNoRmllbGRzLiR7c2VhcmNoRmllbGQuZGF0YVR5cGUudG9Mb3dlckNhc2UoKX1gXG4gICAgICApLFxuICAgICAgZmllbGRUeXBlVHJhbnNsYXRpb246IHRoaXMudHJhc25sYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBgc2VhcmNoRmllbGRzT3ZlcnZpZXcuJHt0aGlzLmZpZWxkVHlwZVRyYW5zbGF0aW9uKHNlYXJjaEZpZWxkLmZpZWxkVHlwZSl9YFxuICAgICAgKSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGZpZWxkVHlwZVRyYW5zbGF0aW9uKGZpZWxkVHlwZTogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcbiAgICAgIGNhc2UgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOOlxuICAgICAgICByZXR1cm4gJ3NpbmdsZS1zZWxlY3QtZHJvcGRvd24nO1xuICAgICAgY2FzZSBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTjpcbiAgICAgICAgcmV0dXJuICdtdWx0aS1zZWxlY3QtZHJvcGRvd24nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZpZWxkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIGZpZWxkTW9kYWxPcGVuOiBmaWVsZE1vZGFsT3BlbiQgfCBhc3luYyxcbiAgICBmaWVsZHM6IGZpZWxkcyQgfCBhc3luYyxcbiAgICBpdGVtVG9EZWxldGU6IGl0ZW1Ub0RlbGV0ZSQgfCBhc3luYyxcbiAgICBwcmVmaWxsRGF0YTogcHJlZmlsbERhdGEkIHwgYXN5bmMsXG4gICAgc2VhcmNoRmllbGRzOiBzZWFyY2hGaWVsZHMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPHZhbHRpbW8tY2FyYm9uLWxpc3RcbiAgICBbYWN0aW9uSXRlbXNdPVwiQUNUSU9OX0lURU1TXCJcbiAgICBbZmllbGRzXT1cIm9icy5maWVsZHNcIlxuICAgIFtpdGVtc109XCJvYnMuc2VhcmNoRmllbGRzXCJcbiAgICBbZHJhZ0FuZERyb3BdPVwidHJ1ZVwiXG4gICAgKGl0ZW1zUmVvcmRlcmVkKT1cIm9uSXRlbXNSZW9yZGVyZWQoJGV2ZW50KVwiXG4gICAgKHJvd0NsaWNrZWQpPVwiZWRpdEZpZWxkKCRldmVudClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciBjYXJib25Ub29sYmFyQ29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkQnV0dG9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dmFsdGltby1uby1yZXN1bHRzXG4gICAgICBbYWN0aW9uXT1cImFkZEJ1dHRvblwiXG4gICAgICBbZGVzY3JpcHRpb25dPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm5vU2VhcmNoZmllbGRzRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcubm9TZWFyY2hmaWVsZHNUaXRsZScgfCB0cmFuc2xhdGVcIlxuICAgID48L3ZhbHRpbW8tbm8tcmVzdWx0cz5cbiAgPC92YWx0aW1vLWNhcmJvbi1saXN0PlxuXG4gIDx2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsXG4gICAgW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdPVwiZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1wiXG4gICAgW29wZW5dPVwib2JzLmZpZWxkTW9kYWxPcGVuXCJcbiAgICBbcHJlZmlsbERhdGFdPVwib2JzLnByZWZpbGxEYXRhXCJcbiAgICAoY2xvc2VFdmVudCk9XCJvbkNsb3NlRXZlbnQoJGV2ZW50LCBvYnMucHJlZmlsbERhdGEpXCJcbiAgPjwvdmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbD5cblxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBjb25maXJtQnV0dG9uVGV4dFRyYW5zbGF0aW9uS2V5PVwiaW50ZXJmYWNlLmRlbGV0ZVwiXG4gICAgY29uZmlybUJ1dHRvblR5cGU9XCJkYW5nZXJcIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkQ29uZmlybWF0aW9uXCJcbiAgICBbb3V0cHV0T25Db25maXJtXT1cIm9icy5pdGVtVG9EZWxldGVcIlxuICAgIFtzaG93TW9kYWxTdWJqZWN0JF09XCJkZWxldGVNb2RhbE9wZW4kXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwic2VhcmNoRmllbGRzT3ZlcnZpZXcuZGVsZXRlU2VhcmNoRmllbGRcIlxuICAgIChjb25maXJtRXZlbnQpPVwib25EZWxldGVGaWVsZENvbmZpcm0oJGV2ZW50KVwiXG4gID48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjYWRkQnV0dG9uPlxuICA8YnV0dG9uIGNkc0J1dHRvbj1cInByaW1hcnlcIiAoY2xpY2spPVwib25BZGRCdXR0b25DbGljaygpXCI+XG4gICAgPHN2ZyBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPjwvc3ZnPlxuXG4gICAge3sgJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmFkZCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19