@pepperi-addons/ngx-composite-lib 0.0.10-beta.4 → 0.0.10-beta.42

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 (114) hide show
  1. package/bundles/pepperi-addons-ngx-composite-lib-color-settings.umd.js +2 -1
  2. package/bundles/pepperi-addons-ngx-composite-lib-color-settings.umd.js.map +1 -1
  3. package/bundles/pepperi-addons-ngx-composite-lib-dimx-export.umd.js +771 -0
  4. package/bundles/pepperi-addons-ngx-composite-lib-dimx-export.umd.js.map +1 -0
  5. package/bundles/pepperi-addons-ngx-composite-lib-file-status-panel.umd.js +119 -0
  6. package/bundles/pepperi-addons-ngx-composite-lib-file-status-panel.umd.js.map +1 -0
  7. package/bundles/pepperi-addons-ngx-composite-lib-generic-list.umd.js +493 -105
  8. package/bundles/pepperi-addons-ngx-composite-lib-generic-list.umd.js.map +1 -1
  9. package/bundles/pepperi-addons-ngx-composite-lib-group-buttons-settings.umd.js +4 -1
  10. package/bundles/pepperi-addons-ngx-composite-lib-group-buttons-settings.umd.js.map +1 -1
  11. package/bundles/pepperi-addons-ngx-composite-lib-shadow-settings.umd.js.map +1 -1
  12. package/bundles/pepperi-addons-ngx-composite-lib.umd.js +586 -51
  13. package/bundles/pepperi-addons-ngx-composite-lib.umd.js.map +1 -1
  14. package/color-settings/package.json +0 -3
  15. package/core/common/directives/index.d.ts +1 -0
  16. package/core/common/directives/public-api.d.ts +1 -0
  17. package/core/common/directives/reset-configuration-field.directive.d.ts +38 -0
  18. package/core/common/index.d.ts +1 -0
  19. package/core/common/public-api.d.ts +2 -0
  20. package/core/common/services/index.d.ts +1 -0
  21. package/core/common/services/public-api.d.ts +1 -0
  22. package/core/common/services/utilities.service.d.ts +6 -0
  23. package/core/index.d.ts +1 -0
  24. package/core/public-api.d.ts +1 -0
  25. package/dimx-export/dimx.component.d.ts +73 -0
  26. package/dimx-export/dimx.model.d.ts +7 -0
  27. package/dimx-export/dimx.module.d.ts +15 -0
  28. package/dimx-export/dimx.service.d.ts +20 -0
  29. package/dimx-export/package.json +16 -0
  30. package/{draggable-item/pepperi-addons-ngx-composite-lib-draggable-item.d.ts → dimx-export/pepperi-addons-ngx-composite-lib-dimx-export.d.ts} +1 -1
  31. package/dimx-export/public-api.d.ts +3 -0
  32. package/esm2015/color-settings/color-settings.component.js +9 -8
  33. package/esm2015/color-settings/color-settings.model.js +1 -1
  34. package/esm2015/core/common/directives/index.js +5 -0
  35. package/esm2015/core/common/directives/public-api.js +5 -0
  36. package/esm2015/core/common/directives/reset-configuration-field.directive.js +153 -0
  37. package/esm2015/core/common/index.js +5 -0
  38. package/esm2015/core/common/public-api.js +6 -0
  39. package/esm2015/core/common/services/index.js +5 -0
  40. package/esm2015/core/common/services/public-api.js +5 -0
  41. package/esm2015/core/common/services/utilities.service.js +19 -0
  42. package/esm2015/core/index.js +5 -0
  43. package/esm2015/core/public-api.js +5 -0
  44. package/esm2015/dimx-export/dimx.component.js +241 -0
  45. package/esm2015/dimx-export/dimx.model.js +8 -0
  46. package/esm2015/dimx-export/dimx.module.js +49 -0
  47. package/esm2015/dimx-export/dimx.service.js +50 -0
  48. package/esm2015/dimx-export/pepperi-addons-ngx-composite-lib-dimx-export.js +5 -0
  49. package/esm2015/dimx-export/public-api.js +7 -0
  50. package/esm2015/file-status-panel/file-status-panel.component.js +34 -0
  51. package/esm2015/file-status-panel/file-status-panel.model.js +8 -0
  52. package/esm2015/file-status-panel/file-status-panel.module.js +40 -0
  53. package/esm2015/file-status-panel/pepperi-addons-ngx-composite-lib-file-status-panel.js +5 -0
  54. package/esm2015/file-status-panel/public-api.js +7 -0
  55. package/esm2015/generic-list/generic-list.component.js +337 -80
  56. package/esm2015/generic-list/generic-list.model.js +1 -1
  57. package/esm2015/generic-list/generic-list.module.js +18 -6
  58. package/esm2015/generic-list/generic-list.service.js +42 -0
  59. package/esm2015/generic-list/public-api.js +2 -1
  60. package/esm2015/group-buttons-settings/group-buttons-settings.component.js +5 -2
  61. package/esm2015/ngx-composite-lib.module.js +28 -9
  62. package/esm2015/public-api.js +2 -1
  63. package/esm2015/shadow-settings/shadow-settings.model.js +1 -1
  64. package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.js +8 -7
  65. package/fesm2015/pepperi-addons-ngx-composite-lib-color-settings.js.map +1 -1
  66. package/fesm2015/pepperi-addons-ngx-composite-lib-dimx-export.js +350 -0
  67. package/fesm2015/pepperi-addons-ngx-composite-lib-dimx-export.js.map +1 -0
  68. package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.js +90 -0
  69. package/fesm2015/pepperi-addons-ngx-composite-lib-file-status-panel.js.map +1 -0
  70. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.js +391 -85
  71. package/fesm2015/pepperi-addons-ngx-composite-lib-generic-list.js.map +1 -1
  72. package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.js +4 -1
  73. package/fesm2015/pepperi-addons-ngx-composite-lib-group-buttons-settings.js.map +1 -1
  74. package/fesm2015/pepperi-addons-ngx-composite-lib-shadow-settings.js.map +1 -1
  75. package/fesm2015/pepperi-addons-ngx-composite-lib.js +225 -13
  76. package/fesm2015/pepperi-addons-ngx-composite-lib.js.map +1 -1
  77. package/file-status-panel/file-status-panel.component.d.ts +14 -0
  78. package/file-status-panel/file-status-panel.model.d.ts +6 -0
  79. package/file-status-panel/file-status-panel.module.d.ts +12 -0
  80. package/file-status-panel/package.json +10 -0
  81. package/file-status-panel/pepperi-addons-ngx-composite-lib-file-status-panel.d.ts +5 -0
  82. package/file-status-panel/public-api.d.ts +3 -0
  83. package/generic-list/generic-list.component.d.ts +68 -22
  84. package/generic-list/generic-list.model.d.ts +35 -5
  85. package/generic-list/generic-list.module.d.ts +2 -1
  86. package/generic-list/generic-list.service.d.ts +13 -0
  87. package/generic-list/package.json +0 -1
  88. package/generic-list/public-api.d.ts +1 -0
  89. package/group-buttons-settings/group-buttons-settings.component.d.ts +2 -1
  90. package/group-buttons-settings/package.json +0 -3
  91. package/ngx-composite-lib.module.d.ts +6 -1
  92. package/package.json +2 -2
  93. package/public-api.d.ts +1 -0
  94. package/shadow-settings/package.json +0 -3
  95. package/src/assets/i18n/en.ngx-composite-lib.json +5 -2
  96. package/src/core/style/abstracts/functions.scss +0 -0
  97. package/src/core/style/abstracts/mixins.scss +0 -0
  98. package/src/core/style/abstracts/variables.scss +0 -0
  99. package/src/core/style/base/helpers.scss +0 -0
  100. package/src/core/style/components/general.scss +0 -0
  101. package/styling.scss +11 -0
  102. package/bundles/pepperi-addons-ngx-composite-lib-draggable-item.umd.js +0 -112
  103. package/bundles/pepperi-addons-ngx-composite-lib-draggable-item.umd.js.map +0 -1
  104. package/draggable-item/draggable-item.component.d.ts +0 -11
  105. package/draggable-item/draggable-item.module.d.ts +0 -11
  106. package/draggable-item/package.json +0 -13
  107. package/draggable-item/public-api.d.ts +0 -2
  108. package/esm2015/draggable-item/draggable-item.component.js +0 -40
  109. package/esm2015/draggable-item/draggable-item.module.js +0 -36
  110. package/esm2015/draggable-item/pepperi-addons-ngx-composite-lib-draggable-item.js +0 -5
  111. package/esm2015/draggable-item/public-api.js +0 -6
  112. package/fesm2015/pepperi-addons-ngx-composite-lib-draggable-item.js +0 -84
  113. package/fesm2015/pepperi-addons-ngx-composite-lib-draggable-item.js.map +0 -1
  114. package/styles.scss +0 -38
@@ -1,55 +1,219 @@
1
1
  import { __awaiter } from "tslib";
2
- import { Component, ViewChild, Input, Output, EventEmitter, } from '@angular/core';
3
- import { PepRowData, PepGuid, } from '@pepperi-addons/ngx-lib';
4
- import { PepListComponent } from '@pepperi-addons/ngx-lib/list';
2
+ import { Component, ViewChild, Input, Output, EventEmitter, ViewContainerRef } from '@angular/core';
3
+ import { PepRowData, PepGuid, UIControl, } from '@pepperi-addons/ngx-lib';
4
+ import { PepListComponent, PepSelectionData, DEFAULT_PAGE_SIZE } from '@pepperi-addons/ngx-lib/list';
5
5
  import { DataViewFieldTypes } from '@pepperi-addons/papi-sdk/dist/entities/data-view';
6
+ import { DataViewConverter } from '@pepperi-addons/data-views';
7
+ import { Subscription } from 'rxjs';
6
8
  import * as i0 from "@angular/core";
7
- import * as i1 from "@pepperi-addons/ngx-lib";
8
- import * as i2 from "@ngx-translate/core";
9
- import * as i3 from "@pepperi-addons/ngx-lib/page-layout";
10
- import * as i4 from "@pepperi-addons/ngx-lib/top-bar";
11
- import * as i5 from "@pepperi-addons/ngx-lib/list";
12
- import * as i6 from "@pepperi-addons/ngx-lib/search";
13
- import * as i7 from "@angular/common";
9
+ import * as i1 from "./generic-list.service";
10
+ import * as i2 from "@pepperi-addons/ngx-lib";
11
+ import * as i3 from "@ngx-translate/core";
12
+ import * as i4 from "@pepperi-addons/ngx-lib/page-layout";
13
+ import * as i5 from "@pepperi-addons/ngx-lib/top-bar";
14
+ import * as i6 from "@pepperi-addons/ngx-lib/list";
15
+ import * as i7 from "@pepperi-addons/ngx-lib/search";
16
+ import * as i8 from "@pepperi-addons/ngx-lib/bread-crumbs";
17
+ import * as i9 from "@angular/common";
14
18
  export class GenericListComponent {
15
- // PepScreenSizeType = PepScreenSizeType;
16
- // screenSize: PepScreenSizeType;
17
- constructor(dataConvertorService, layoutService, translate) {
18
- this.dataConvertorService = dataConvertorService;
19
- this.layoutService = layoutService;
20
- this.translate = translate;
21
- this.dataObjects = [];
22
- this.searchString = '';
19
+ constructor(_resolver, _genericListService, _dataConvertorService, _layoutService, _translate) {
20
+ this._resolver = _resolver;
21
+ this._genericListService = _genericListService;
22
+ this._dataConvertorService = _dataConvertorService;
23
+ this._layoutService = _layoutService;
24
+ this._translate = _translate;
25
+ this._dataSource = {
26
+ init: (params) => __awaiter(this, void 0, void 0, function* () {
27
+ return {
28
+ dataView: {
29
+ Type: 'Grid'
30
+ },
31
+ totalCount: -1,
32
+ items: []
33
+ };
34
+ })
35
+ };
36
+ this.actions = {
37
+ get: (data) => __awaiter(this, void 0, void 0, function* () {
38
+ return [];
39
+ })
40
+ };
41
+ this.uuidMapping = 'key';
23
42
  this.addPadding = false;
24
43
  this.title = '';
25
44
  this.inline = false;
26
45
  this.showSearch = false;
27
- this.allowSelection = true;
28
- this.noDataMessage = "No data";
29
- this.allowMultipleSelection = false;
46
+ this.showTopBar = false;
47
+ this.breadCrumbsItems = new Array();
30
48
  this.fieldClick = new EventEmitter();
31
- // @Output()
32
- // onAddClicked = new EventEmitter<void>();
49
+ this.valueChange = new EventEmitter();
50
+ this.breadCrumbItemClick = new EventEmitter();
51
+ this._resize$ = new Subscription();
52
+ this._dataView = {
53
+ Type: 'Grid'
54
+ };
55
+ this._tableInputs = {
56
+ supportSorting: false,
57
+ selectionType: 'single',
58
+ pager: {
59
+ type: 'scroll'
60
+ },
61
+ noDataFoundMsg: ''
62
+ };
63
+ this.totalRowCount = -1;
64
+ this.searchString = '';
65
+ this._sorting = undefined;
33
66
  this.menuHandlers = {};
34
67
  this.menuActions = [];
35
- this.layoutService.onResize$.pipe().subscribe((size) => {
36
- // this.screenSize = size;
68
+ this._resize$ = this._layoutService.onResize$.pipe().subscribe((size) => {
69
+ //
70
+ });
71
+ }
72
+ set pepListContainer(val) {
73
+ this._pepListContainer = val;
74
+ }
75
+ set dataSource(val) {
76
+ this._dataSource = val;
77
+ this.searchString = '';
78
+ this._sorting = undefined;
79
+ this.initTable();
80
+ }
81
+ set noDataFoundMsg(val) {
82
+ this._tableInputs.noDataFoundMsg = val;
83
+ }
84
+ set selectionType(val) {
85
+ this._tableInputs.selectionType = val;
86
+ }
87
+ set supportSorting(val) {
88
+ this._tableInputs.supportSorting = val;
89
+ }
90
+ set pager(val) {
91
+ this._tableInputs.pager = val;
92
+ }
93
+ set pepList(val) {
94
+ this._genericListService.pepList = val;
95
+ }
96
+ get pepList() {
97
+ return this._genericListService.pepList;
98
+ }
99
+ ngOnInit() {
100
+ //
101
+ }
102
+ initTable() {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
105
+ var _a, _b, _c, _d, _e;
106
+ if (this._dataSource &&
107
+ this._pepListContainer) {
108
+ if (this._pepListContainer.length > 0) {
109
+ this._pepListContainer.remove();
110
+ }
111
+ const factory = this._resolver.resolveComponentFactory(PepListComponent);
112
+ const componentRef = this._pepListContainer.createComponent(factory);
113
+ this.pepList = componentRef.instance;
114
+ //merge selector inputs with callback inputs
115
+ const tableInputs = yield this.loadTableInputs();
116
+ const fromIndex = 0;
117
+ let toIndex = 0;
118
+ if (((_a = tableInputs.pager) === null || _a === void 0 ? void 0 : _a.type) === 'pages') {
119
+ toIndex = fromIndex + (((_b = tableInputs.pager) === null || _b === void 0 ? void 0 : _b.size) || DEFAULT_PAGE_SIZE) - 1;
120
+ }
121
+ else {
122
+ toIndex = 100; //TO DO - get reesult from - this.customList.getTopItems()
123
+ }
124
+ const data = yield this.loadData(fromIndex, toIndex);
125
+ this.totalRowCount = (data === null || data === void 0 ? void 0 : data.totalCount) || 0;
126
+ componentRef.instance.viewType = 'table';
127
+ componentRef.instance.supportSorting = tableInputs.supportSorting;
128
+ componentRef.instance.selectionTypeForActions = tableInputs.selectionType;
129
+ componentRef.instance.pagerType = tableInputs.pager.type;
130
+ if (tableInputs.pager.type === 'pages') {
131
+ componentRef.instance.pageSize = ((_c = tableInputs.pager) === null || _c === void 0 ? void 0 : _c.size) || DEFAULT_PAGE_SIZE;
132
+ componentRef.instance.pageIndex = ((_d = tableInputs.pager) === null || _d === void 0 ? void 0 : _d.index) || 0;
133
+ }
134
+ componentRef.instance.noDataFoundMsg = tableInputs.noDataFoundMsg;
135
+ componentRef.instance.fieldClick.subscribe(($event) => {
136
+ this.onCustomizeFieldClick($event);
137
+ });
138
+ componentRef.instance.selectedItemsChange.subscribe(($event) => {
139
+ this.onSelectedItemsChanged($event);
140
+ });
141
+ componentRef.instance.loadItems.subscribe(($event) => {
142
+ this.onLoadItems($event);
143
+ });
144
+ componentRef.instance.loadPage.subscribe(($event) => {
145
+ this.onLoadPage($event);
146
+ });
147
+ componentRef.instance.valueChange.subscribe(($event) => {
148
+ this.onValueChanged($event);
149
+ });
150
+ componentRef.instance.sortingChange.subscribe(($event) => {
151
+ this.onSortingChange($event);
152
+ });
153
+ let convertedList = [];
154
+ if (data) {
155
+ if (((_e = data === null || data === void 0 ? void 0 : data.items) === null || _e === void 0 ? void 0 : _e.length) > 0) {
156
+ convertedList = this._dataConvertorService.convertListData(data.items);
157
+ }
158
+ const uiControl = this.getUiControl(DataViewConverter.toUIControlData(data.dataView));
159
+ componentRef.instance.initListData(uiControl, data.totalCount, convertedList);
160
+ }
161
+ }
162
+ }), 0);
37
163
  });
38
164
  }
165
+ /**
166
+ * checks if the object contains property
167
+ * @param obj object
168
+ * @param prop property name
169
+ * @returns true if contains, false otherwise
170
+ */
171
+ hasProperty(obj, prop) {
172
+ return Object.prototype.hasOwnProperty.call(obj, prop);
173
+ }
174
+ /**
175
+ * loads callback inputs in case they are provided and merge with selector inputs
176
+ * @returns merged pep-list inputs
177
+ */
178
+ loadTableInputs() {
179
+ return __awaiter(this, void 0, void 0, function* () {
180
+ const tableInputs = Object.assign({}, this._tableInputs);
181
+ if (this._dataSource.inputs) {
182
+ const inputs = yield this._dataSource.inputs();
183
+ if (inputs) {
184
+ Object.entries(inputs).forEach((item) => {
185
+ if (this.hasProperty(tableInputs, item[0])) {
186
+ tableInputs[item[0]] = item[1];
187
+ }
188
+ });
189
+ }
190
+ }
191
+ return tableInputs;
192
+ });
193
+ }
194
+ getUiControl(data) {
195
+ const uiControl = new UIControl();
196
+ uiControl.ControlFields = [];
197
+ if (data === null || data === void 0 ? void 0 : data.ControlFields) {
198
+ uiControl.ControlFields = data.ControlFields.map((field) => this.convertToUiControlField(field));
199
+ }
200
+ return uiControl;
201
+ }
39
202
  loadMenuItems() {
40
- if (this.allowSelection) {
203
+ if (this._tableInputs.selectionType !== 'none') {
41
204
  this.getMenuActions().then(x => this.menuActions = x);
42
205
  }
43
206
  }
44
207
  convertToPepRowData(object, dataView) {
45
208
  const row = new PepRowData();
209
+ row.UUID = object[this.uuidMapping] || undefined;
46
210
  row.Fields = [];
47
211
  if ((dataView === null || dataView === void 0 ? void 0 : dataView.Fields) && dataView.Columns) {
48
212
  for (let index = 0; index < dataView.Fields.length; index++) {
49
- let field = dataView.Fields[index];
213
+ const field = dataView.Fields[index];
50
214
  row.Fields.push({
51
215
  ApiName: field.FieldID,
52
- Title: this.translate.instant(field.Title),
216
+ Title: this._translate.instant(field.Title),
53
217
  XAlignment: 1,
54
218
  FormattedValue: (object[field.FieldID] || '').toString(),
55
219
  Value: (object[field.FieldID] || '').toString(),
@@ -64,86 +228,169 @@ export class GenericListComponent {
64
228
  }
65
229
  return row;
66
230
  }
231
+ convertToUiControlField(field) {
232
+ return {
233
+ ApiName: field.ApiName,
234
+ FieldType: field.FieldType,
235
+ Title: field.Title,
236
+ ReadOnly: field.ReadOnlyField,
237
+ ColumnWidth: field.ColumnWidth,
238
+ ColumnWidthType: 1,
239
+ Layout: {
240
+ X: field.Layout.X,
241
+ Y: field.Layout.Y,
242
+ Width: field.Layout.Width,
243
+ Height: field.Layout.Field_Height,
244
+ XAlignment: field.Layout.xAlignment,
245
+ YAlignment: field.Layout.yAlignment,
246
+ }
247
+ };
248
+ }
67
249
  getMenuActions() {
68
- var _a;
69
250
  return __awaiter(this, void 0, void 0, function* () {
70
- const actions = yield ((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.getActions(this.getMenuObjects()));
71
251
  const res = [];
72
- this.menuHandlers = {};
73
- actions === null || actions === void 0 ? void 0 : actions.forEach(item => {
74
- const uuid = PepGuid.newGuid();
75
- this.menuHandlers[uuid] = item.handler;
76
- res.push({
77
- key: uuid,
78
- text: item.title
252
+ const result = this.getMenuObjects();
253
+ if (result.success) {
254
+ const actions = yield this.actions.get(result.data);
255
+ this.menuHandlers = {};
256
+ actions === null || actions === void 0 ? void 0 : actions.forEach(item => {
257
+ const uuid = PepGuid.newGuid();
258
+ this.menuHandlers[uuid] = item.handler;
259
+ res.push({
260
+ key: uuid,
261
+ text: item.title
262
+ });
79
263
  });
80
- });
264
+ }
81
265
  return res;
82
266
  });
83
267
  }
84
268
  getMenuObjects() {
85
- var _a, _b, _c;
86
- let uuids = (_b = (_a = this.customList) === null || _a === void 0 ? void 0 : _a.getSelectedItemsData().rows) !== null && _b !== void 0 ? _b : [];
87
- if ((_c = this.customList) === null || _c === void 0 ? void 0 : _c.getIsAllSelectedForActions()) {
88
- uuids = this.dataObjects.map(obj => obj.UID).filter(x => uuids.indexOf(x) != -1);
269
+ const menuObjects = {
270
+ success: false,
271
+ data: new PepSelectionData()
272
+ };
273
+ if (this.pepList) {
274
+ menuObjects.success = true;
275
+ menuObjects.data = this.pepList.getSelectedItemsData();
89
276
  }
90
- const objects = uuids.map(uuid => this.getObject(uuid));
91
- return objects;
277
+ return menuObjects;
92
278
  }
93
- getObject(uuid) {
94
- return this.dataObjects.find(obj => obj.UID === uuid);
279
+ onActionItemClicked(action) {
280
+ const result = this.getMenuObjects();
281
+ if (result.success) {
282
+ this.menuHandlers[action.source.key](result.data);
283
+ }
95
284
  }
96
- ngOnInit() {
285
+ onSearchChanged(event) {
286
+ this.searchString = event.value;
287
+ this.initTable();
97
288
  }
98
- ngAfterViewInit() {
99
- this.reload();
289
+ onSelectedItemsChanged(selectedRowsCount) {
290
+ //loading menu items after pep-list selected items are updated
291
+ setTimeout(() => {
292
+ this.loadMenuItems();
293
+ }, 0);
100
294
  }
101
- onMenuItemClicked(action) {
102
- this.menuHandlers[action.source.key](this.getMenuObjects());
295
+ onCustomizeFieldClick(fieldClickEvent) {
296
+ this.fieldClick.emit(fieldClickEvent);
103
297
  }
104
- onSearchChanged(event) {
105
- this.searchString = event.value;
106
- this.reload();
298
+ onBreadCrumbItemClick(event) {
299
+ this.breadCrumbItemClick.emit(event);
300
+ }
301
+ onValueChanged(event) {
302
+ this.valueChange.emit(event);
107
303
  }
108
- reload() {
304
+ onSortingChange(event) {
305
+ this._sorting = event;
306
+ this.initTable();
307
+ }
308
+ loadData(fromIndex, toIndex) {
309
+ var _a;
109
310
  return __awaiter(this, void 0, void 0, function* () {
110
- if (this.customList && this.dataSource) {
111
- this.dataObjects = yield this.dataSource.getList({
112
- searchString: this.searchString
113
- });
114
- const dataView = yield this.dataSource.getDataView();
115
- const tableData = this.dataObjects.map(x => this.convertToPepRowData(x, dataView));
116
- const data = this.dataConvertorService.convertListData(tableData);
117
- data.forEach((obj, i) => {
118
- this.dataObjects[i].UID = obj.UID;
311
+ const data = yield this._dataSource.init({
312
+ searchString: this.searchString || undefined,
313
+ sorting: this._sorting || undefined,
314
+ fromIndex: fromIndex,
315
+ toIndex: toIndex
316
+ });
317
+ if (data) {
318
+ this._dataView = data.dataView;
319
+ if (((_a = data.items) === null || _a === void 0 ? void 0 : _a.length) > 0) {
320
+ data.items = data.items.map(item => this.convertToPepRowData(item, data.dataView));
321
+ }
322
+ }
323
+ return data;
324
+ });
325
+ }
326
+ updateDataList(fromIndex, toIndex, pageIndex = undefined) {
327
+ return __awaiter(this, void 0, void 0, function* () {
328
+ if (this._dataSource.update) {
329
+ const dataList = yield this._dataSource.update({
330
+ searchString: this.searchString || undefined,
331
+ sorting: this._sorting || undefined,
332
+ fromIndex: fromIndex,
333
+ toIndex: toIndex,
334
+ pageIndex: pageIndex
119
335
  });
120
- const uiControl = this.dataConvertorService.getUiControl(tableData[0]);
121
- this.customList.initListData(uiControl, data.length, data);
122
- this.loadMenuItems();
336
+ if ((dataList === null || dataList === void 0 ? void 0 : dataList.length) > 0) {
337
+ return dataList.map(item => this.convertToPepRowData(item, this._dataView));
338
+ }
339
+ else {
340
+ return [];
341
+ }
342
+ }
343
+ else {
344
+ return [];
123
345
  }
124
346
  });
125
347
  }
126
- selectedRowsChanged(selectedRowsCount) {
127
- this.loadMenuItems();
348
+ /**
349
+ * loads virtual scroll items from api
350
+ */
351
+ onLoadItems(event) {
352
+ return __awaiter(this, void 0, void 0, function* () {
353
+ const list = yield this.updateDataList(event.fromIndex, event.toIndex);
354
+ const convertedList = this._dataConvertorService.convertListData(list);
355
+ this.pepList.updateItems(convertedList, event);
356
+ });
128
357
  }
129
- onCustomizeFieldClick(fieldClickEvent) {
130
- this.fieldClick.emit(fieldClickEvent);
358
+ /**
359
+ * loads paging bulk from api
360
+ */
361
+ onLoadPage(event) {
362
+ return __awaiter(this, void 0, void 0, function* () {
363
+ const fromIndex = event.pageIndex * event.pageSize;
364
+ const toIndex = Math.min(fromIndex + event.pageSize - 1, this.totalRowCount - 1);
365
+ const list = yield this.updateDataList(fromIndex, toIndex, event.pageIndex);
366
+ const convertedList = this._dataConvertorService.convertListData(list);
367
+ this.pepList.updatePage(convertedList, event);
368
+ });
369
+ }
370
+ ngOnDestroy() {
371
+ if (this._resize$) {
372
+ this._resize$.unsubscribe();
373
+ }
131
374
  }
132
375
  }
133
- GenericListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: GenericListComponent, deps: [{ token: i1.PepDataConvertorService }, { token: i1.PepLayoutService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
134
- GenericListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: GenericListComponent, selector: "pep-generic-list", inputs: { dataSource: "dataSource", addPadding: "addPadding", title: "title", inline: "inline", showSearch: "showSearch", allowSelection: "allowSelection", noDataMessage: "noDataMessage", allowMultipleSelection: "allowMultipleSelection" }, outputs: { fieldClick: "fieldClick" }, viewQueries: [{ propertyName: "customList", first: true, predicate: PepListComponent, descendants: true }], ngImport: i0, template: "<div *ngIf=\"inline\" class=\"inline-container\" [ngClass]=\"{ 'add-padding': addPadding }\">\n <div class=\"inline-top-bar-container\">\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n</div>\n\n<pep-page-layout *ngIf=\"!inline\" [addPadding]=\"addPadding\">\n <ng-container pep-top-area>\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </ng-container>\n\n <div pep-main-area class=\"main-area-container\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n </div>\n</pep-page-layout>\n \n<ng-template #topBarTemplate>\n <pep-top-bar [title]=\"title\" [inline]=\"inline\">\n <div header-start-content>\n <ng-content select=\"[left-buttons]\"></ng-content>\n </div>\n <div header-end-content>\n <ng-content select=\"[right-buttons]\"></ng-content>\n </div>\n <pep-list-actions [sizeType]=\"inline ? 'sm' : 'md'\" [actions]=\"menuActions\" (actionClick)=\"onMenuItemClicked($event)\"></pep-list-actions>\n <pep-list-total [sizeType]=\"inline ? 'sm' : 'md'\" [totalRows]=\"customList ? customList.totalRows : -1\"></pep-list-total>\n\n <pep-search *ngIf=\"showSearch\" [sizeType]=\"inline ? 'sm' : 'md'\" (search)=\"onSearchChanged($event)\">\n </pep-search>\n </pep-top-bar>\n</ng-template>\n\n<ng-template #listTemplate>\n <div #listContainer class=\"list-container\">\n <pep-list viewType=\"table\" [supportSorting]=\"false\"\n [selectionTypeForActions]=\"allowMultipleSelection ? 'multi' : (allowSelection ? 'single' : 'none')\" [noDataFoundMsg]=\"noDataMessage\"\n (fieldClick)=\"onCustomizeFieldClick($event)\"\n (selectedItemsChange)=\"selectedRowsChanged($event)\">\n </pep-list>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:block}.main-area-container{display:grid;height:inherit}.list-container{height:100%}.inline-container{height:inherit;display:grid;grid-template-rows:auto 1fr}.inline-container.add-padding{padding-inline:var(--pep-spacing-lg, 1rem)}.inline-container ::ng-deep .pep-top-bar-container.inline{height:auto;overflow:hidden}\n"], components: [{ type: i3.PepPageLayoutComponent, selector: "pep-page-layout", inputs: ["addPadding", "showShadow"] }, { type: i4.PepTopBarComponent, selector: "pep-top-bar", inputs: ["inline", "title"], outputs: ["footerStateChange"] }, { type: i5.PepListActionsComponent, selector: "pep-list-actions", inputs: ["actions", "sizeType", "xPosition", "hidden"], outputs: ["actionClick", "stateChange", "menuClick"] }, { type: i5.PepListTotalComponent, selector: "pep-list-total", inputs: ["totalRows", "totalAmount", "isMapView", "sizeType"] }, { type: i6.PepSearchComponent, selector: "pep-search", inputs: ["triggerOn", "autoCompleteTop", "shrinkInSmallScreen", "sizeType", "autoCompleteValues", "value", "searchControl", "useAsWebComponent"], outputs: ["search", "autocompleteChange", "stateChange"] }, { type: i5.PepListComponent, selector: "pep-list", inputs: ["noDataFoundMsg", "selectionTypeForActions", "showCardSelection", "hideAllSelectionInMulti", "cardSize", "firstFieldAsLink", "supportSorting", "supportResizing", "disabled", "lockItemInnerEvents", "printMode", "isReport", "totalsRow", "pagerType", "pageSize", "pageIndex", "scrollAnimationTime", "scrollDebounceTime", "scrollThrottlingTime", "viewType", "parentScroll", "lockEvents", "useAsWebComponent"], outputs: ["itemClick", "fieldClick", "valueChange", "sortingChange", "selectedItemsChange", "selectedItemChange", "selectAllClick", "listLoad", "loadItems", "loadPage", "startIndexChange"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
376
+ GenericListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: GenericListComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.PepGenericListService }, { token: i2.PepDataConvertorService }, { token: i2.PepLayoutService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
377
+ GenericListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: GenericListComponent, selector: "pep-generic-list", inputs: { dataSource: "dataSource", actions: "actions", uuidMapping: "uuidMapping", addPadding: "addPadding", title: "title", inline: "inline", showSearch: "showSearch", noDataFoundMsg: "noDataFoundMsg", selectionType: "selectionType", supportSorting: "supportSorting", pager: "pager", showTopBar: "showTopBar", breadCrumbsItems: "breadCrumbsItems" }, outputs: { fieldClick: "fieldClick", valueChange: "valueChange", breadCrumbItemClick: "breadCrumbItemClick" }, viewQueries: [{ propertyName: "pepListContainer", first: true, predicate: ["pepListContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div *ngIf=\"inline\" class=\"inline-container\" [ngClass]=\"{ 'add-padding': addPadding }\">\n <div>\n <div *ngIf=\"showTopBar\" class=\"inline-top-bar-container\">\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </div>\n <ng-container *ngIf=\"breadCrumbsItems.length > 0\">\n <ng-container *ngTemplateOutlet=\"breadCrumbsTemplate\"></ng-container>\n </ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n</div>\n\n<pep-page-layout *ngIf=\"!inline\" [addPadding]=\"addPadding\">\n <ng-container *ngIf=\"showTopBar\" pep-top-area>\n <ng-container *ngTemplateOutlet=\"topBarTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"breadCrumbsItems.length > 0\" pep-top-area>\n <ng-container *ngTemplateOutlet=\"breadCrumbsTemplate\"></ng-container>\n </ng-container>\n <div pep-main-area class=\"main-area-container\">\n <ng-container *ngTemplateOutlet=\"listTemplate\"></ng-container>\n </div>\n</pep-page-layout>\n\n<ng-template #topBarTemplate>\n <pep-top-bar [title]=\"title\" [inline]=\"inline\">\n <div header-start-content>\n <ng-content select=\"[left-buttons]\"></ng-content>\n </div>\n <div header-end-content>\n <ng-content select=\"[right-buttons]\"></ng-content>\n </div>\n\n <pep-list-actions *ngIf=\"menuActions.length > 0\" [sizeType]=\"inline ? 'sm' : 'md'\" [actions]=\"menuActions\"\n (actionClick)=\"onActionItemClicked($event)\"></pep-list-actions>\n <pep-list-total [sizeType]=\"inline ? 'sm' : 'md'\" [totalRows]=\"totalRowCount\">\n </pep-list-total>\n\n <pep-search *ngIf=\"showSearch\" [value]=\"searchString\" [sizeType]=\"inline ? 'sm' : 'md'\"\n (search)=\"onSearchChanged($event)\">\n </pep-search>\n </pep-top-bar>\n</ng-template>\n\n<ng-template #breadCrumbsTemplate>\n <pep-bread-crumbs class=\"bread-crumbs\" [items]=\"breadCrumbsItems\" [addSpacing]=\"true\" [displayType]=\"'items'\"\n (itemClick)=\"onBreadCrumbItemClick($event)\"></pep-bread-crumbs>\n</ng-template>\n\n<ng-template #listTemplate>\n <div class=\"list-container\">\n <ng-container #pepListContainer></ng-container>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:block}.main-area-container{display:grid;height:inherit}.list-container{height:100%}.inline-container{height:inherit;display:grid;grid-template-rows:auto 1fr}.inline-container.add-padding{padding-inline:var(--pep-spacing-lg, 1rem)}.noDataFoundMsg{height:100%;width:100%;background:rgba(26,26,26,.12);display:flex;justify-content:center;align-items:center}.bread-crumbs{padding:var(--pep-spacing-lg, 1rem) 0 var(--pep-spacing-sm, .5rem) 0}\n"], components: [{ type: i4.PepPageLayoutComponent, selector: "pep-page-layout", inputs: ["addPadding", "showShadow"] }, { type: i5.PepTopBarComponent, selector: "pep-top-bar", inputs: ["inline", "title"], outputs: ["footerStateChange"] }, { type: i6.PepListActionsComponent, selector: "pep-list-actions", inputs: ["actions", "sizeType", "xPosition", "hidden"], outputs: ["actionClick", "stateChange", "menuClick"] }, { type: i6.PepListTotalComponent, selector: "pep-list-total", inputs: ["totalRows", "totalAmount", "isMapView", "sizeType"] }, { type: i7.PepSearchComponent, selector: "pep-search", inputs: ["triggerOn", "autoCompleteTop", "sizeType", "autoCompleteValues", "shrink", "value", "searchControl", "useAsWebComponent"], outputs: ["search", "autocompleteChange", "stateChange"] }, { type: i8.PepBreadCrumbsComponent, selector: "pep-bread-crumbs", inputs: ["addSpacing", "items", "displayType"], outputs: ["itemClick"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
135
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: GenericListComponent, decorators: [{
136
379
  type: Component,
137
380
  args: [{
138
381
  selector: 'pep-generic-list',
139
382
  templateUrl: './generic-list.component.html',
140
- styleUrls: ['./generic-list.component.scss'],
383
+ styleUrls: ['./generic-list.component.scss']
141
384
  }]
142
- }], ctorParameters: function () { return [{ type: i1.PepDataConvertorService }, { type: i1.PepLayoutService }, { type: i2.TranslateService }]; }, propDecorators: { customList: [{
385
+ }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i1.PepGenericListService }, { type: i2.PepDataConvertorService }, { type: i2.PepLayoutService }, { type: i3.TranslateService }]; }, propDecorators: { pepListContainer: [{
143
386
  type: ViewChild,
144
- args: [PepListComponent]
387
+ args: ['pepListContainer', { read: ViewContainerRef }]
145
388
  }], dataSource: [{
146
389
  type: Input
390
+ }], actions: [{
391
+ type: Input
392
+ }], uuidMapping: [{
393
+ type: Input
147
394
  }], addPadding: [{
148
395
  type: Input
149
396
  }], title: [{
@@ -152,13 +399,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImpor
152
399
  type: Input
153
400
  }], showSearch: [{
154
401
  type: Input
155
- }], allowSelection: [{
402
+ }], noDataFoundMsg: [{
403
+ type: Input
404
+ }], selectionType: [{
405
+ type: Input
406
+ }], supportSorting: [{
156
407
  type: Input
157
- }], noDataMessage: [{
408
+ }], pager: [{
158
409
  type: Input
159
- }], allowMultipleSelection: [{
410
+ }], showTopBar: [{
411
+ type: Input
412
+ }], breadCrumbsItems: [{
160
413
  type: Input
161
414
  }], fieldClick: [{
162
415
  type: Output
416
+ }], valueChange: [{
417
+ type: Output
418
+ }], breadCrumbItemClick: [{
419
+ type: Output
163
420
  }] } });
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2dlbmVyaWMtbGlzdC9nZW5lcmljLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbXBvc2l0ZS1saWIvZ2VuZXJpYy1saXN0L2dlbmVyaWMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFHVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBQ2YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUdILFVBQVUsRUFFVixPQUFPLEdBQ1IsTUFBTSx5QkFBeUIsQ0FBQztBQUVuQyxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ25CLE1BQU0sOEJBQThCLENBQUM7QUFPdEMsT0FBTyxFQUFxQixrQkFBa0IsRUFBZ0IsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7O0FBVXZILE1BQU0sT0FBTyxvQkFBb0I7SUFzQzdCLHlDQUF5QztJQUN6QyxpQ0FBaUM7SUFFakMsWUFDWSxvQkFBNkMsRUFDN0MsYUFBK0IsRUFDL0IsU0FBMkI7UUFGM0IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF5QjtRQUM3QyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUF2Q3ZDLGdCQUFXLEdBQVUsRUFBRSxDQUFBO1FBRXZCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBRzFCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFHNUIsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUduQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBR3hCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFHNUIsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFHL0Isa0JBQWEsR0FBVyxTQUFTLENBQUM7UUFHbEMsMkJBQXNC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cUJBQXFCLENBQUMsZUFBd0M7UUFDMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7aUhBeEpRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLDJYQUNsQixnQkFBZ0IsZ0RDdEMvQiw0NERBeUNjOzJGREpELG9CQUFvQjtrQkFMaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixXQUFXLEVBQUUsK0JBQStCO29CQUM1QyxTQUFTLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQztpQkFDL0M7NEtBRWdDLFVBQVU7c0JBQXRDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUczQixVQUFVO3NCQURULEtBQUs7Z0JBT04sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gICAgUGVwRGF0YUNvbnZlcnRvclNlcnZpY2UsXG4gICAgUGVwTGF5b3V0U2VydmljZSxcbiAgICBQZXBSb3dEYXRhLFxuICAgIFBlcFNjcmVlblNpemVUeXBlLFxuICAgIFBlcEd1aWQsXG4gIH0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWInO1xuaW1wb3J0IHsgSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9mb3JtJztcbmltcG9ydCB7XG4gICAgUGVwTGlzdENvbXBvbmVudFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9saXN0JztcbmltcG9ydCB7XG4gICAgUGVwTWVudUl0ZW0sXG4gICAgSVBlcE1lbnVJdGVtQ2xpY2tFdmVudCxcbn0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWIvbWVudSc7XG5pbXBvcnQgeyBJUGVwU2VhcmNoQ2xpY2tFdmVudCB9IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL3NlYXJjaCc7XG4gIFxuaW1wb3J0IHsgR3JpZERhdGFWaWV3RmllbGQsIERhdGFWaWV3RmllbGRUeXBlcywgR3JpZERhdGFWaWV3IH0gZnJvbSAnQHBlcHBlcmktYWRkb25zL3BhcGktc2RrL2Rpc3QvZW50aXRpZXMvZGF0YS12aWV3JztcbmltcG9ydCB7IEdlbmVyaWNMaXN0RGF0YVNvdXJjZSB9IGZyb20gJy4vZ2VuZXJpYy1saXN0Lm1vZGVsJztcblxuaW1wb3J0ICogYXMgdHdlZW4gZnJvbSAnQHR3ZWVuanMvdHdlZW4uanMnXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGVwLWdlbmVyaWMtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKFBlcExpc3RDb21wb25lbnQpIGN1c3RvbUxpc3Q6IFBlcExpc3RDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gICAgXG4gICAgQElucHV0KClcbiAgICBkYXRhU291cmNlOiBHZW5lcmljTGlzdERhdGFTb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgZGF0YU9iamVjdHM6IGFueVtdID0gW11cbiAgXG4gICAgc2VhcmNoU3RyaW5nOiBzdHJpbmcgPSAnJztcbiAgXG4gICAgQElucHV0KClcbiAgICBhZGRQYWRkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHRpdGxlOiBzdHJpbmcgPSAnJztcbiAgXG4gICAgQElucHV0KClcbiAgICBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gICAgQElucHV0KClcbiAgICBzaG93U2VhcmNoOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgICBASW5wdXQoKVxuICAgIG5vRGF0YU1lc3NhZ2U6IHN0cmluZyA9IFwiTm8gZGF0YVwiO1xuICBcbiAgICBASW5wdXQoKVxuICAgIGFsbG93TXVsdGlwbGVTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gICAgQE91dHB1dCgpXG4gICAgZmllbGRDbGljazogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+KCk7XG5cbiAgICAvLyBAT3V0cHV0KClcbiAgICAvLyBvbkFkZENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBtZW51SGFuZGxlcnM6IHsgW2tleTogc3RyaW5nXTogKG9iajogYW55KSA9PiBQcm9taXNlPHZvaWQ+IH0gPSB7fTtcbiAgICBtZW51QWN0aW9uczogQXJyYXk8UGVwTWVudUl0ZW0+ID0gW107XG4gICAgLy8gUGVwU2NyZWVuU2l6ZVR5cGUgPSBQZXBTY3JlZW5TaXplVHlwZTtcbiAgICAvLyBzY3JlZW5TaXplOiBQZXBTY3JlZW5TaXplVHlwZTtcbiAgXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGF0YUNvbnZlcnRvclNlcnZpY2U6IFBlcERhdGFDb252ZXJ0b3JTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxheW91dFNlcnZpY2U6IFBlcExheW91dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5vblJlc2l6ZSQucGlwZSgpLnN1YnNjcmliZSgoc2l6ZSkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5zY3JlZW5TaXplID0gc2l6ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGxvYWRNZW51SXRlbXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmdldE1lbnVBY3Rpb25zKCkudGhlbih4ID0+IHRoaXMubWVudUFjdGlvbnMgPSB4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9QZXBSb3dEYXRhKG9iamVjdDogYW55LCBkYXRhVmlldzogR3JpZERhdGFWaWV3KSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IG5ldyBQZXBSb3dEYXRhKCk7XG4gICAgICAgIHJvdy5GaWVsZHMgPSBbXTtcblxuICAgICAgICBpZiAoZGF0YVZpZXc/LkZpZWxkcyAmJiBkYXRhVmlldy5Db2x1bW5zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YVZpZXcuRmllbGRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBmaWVsZCA9IGRhdGFWaWV3LkZpZWxkc1tpbmRleF0gYXMgR3JpZERhdGFWaWV3RmllbGRcbiAgICAgICAgICAgICAgICByb3cuRmllbGRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBBcGlOYW1lOiBmaWVsZC5GaWVsZElELFxuICAgICAgICAgICAgICAgICAgICBUaXRsZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChmaWVsZC5UaXRsZSksXG4gICAgICAgICAgICAgICAgICAgIFhBbGlnbm1lbnQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlOiAob2JqZWN0W2ZpZWxkLkZpZWxkSURdIHx8ICcnKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBWYWx1ZTogKG9iamVjdFtmaWVsZC5GaWVsZElEXSB8fCAnJykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uV2lkdGg6IGRhdGFWaWV3LkNvbHVtbnNbaW5kZXhdLldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBPcHRpb25hbFZhbHVlczogW10sXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZTogRGF0YVZpZXdGaWVsZFR5cGVzW2ZpZWxkLlR5cGVdLFxuICAgICAgICAgICAgICAgICAgICBSZWFkT25seTogZmllbGQuUmVhZE9ubHksXG4gICAgICAgICAgICAgICAgICAgIEVuYWJsZWQ6ICFmaWVsZC5SZWFkT25seVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgYXN5bmMgZ2V0TWVudUFjdGlvbnMoKTogUHJvbWlzZTxQZXBNZW51SXRlbVtdPiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2U/LmdldEFjdGlvbnModGhpcy5nZXRNZW51T2JqZWN0cygpKTtcbiAgICAgICAgY29uc3QgcmVzOiBQZXBNZW51SXRlbVtdID0gW11cbiAgICAgICAgdGhpcy5tZW51SGFuZGxlcnMgPSB7fTtcbiAgICBcbiAgICAgICAgYWN0aW9ucz8uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBQZXBHdWlkLm5ld0d1aWQoKTtcbiAgICAgICAgICAgIHRoaXMubWVudUhhbmRsZXJzW3V1aWRdID0gaXRlbS5oYW5kbGVyO1xuICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogdXVpZCxcbiAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtLnRpdGxlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICBcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgZ2V0TWVudU9iamVjdHMoKSB7XG4gICAgICAgIGxldCB1dWlkcyA9IHRoaXMuY3VzdG9tTGlzdD8uZ2V0U2VsZWN0ZWRJdGVtc0RhdGEoKS5yb3dzID8/IFtdO1xuICAgICAgICBpZiAodGhpcy5jdXN0b21MaXN0Py5nZXRJc0FsbFNlbGVjdGVkRm9yQWN0aW9ucygpKSB7XG4gICAgICAgICAgICB1dWlkcyA9IHRoaXMuZGF0YU9iamVjdHMubWFwKG9iaiA9PiBvYmouVUlEKS5maWx0ZXIoeCA9PiB1dWlkcy5pbmRleE9mKHgpICE9IC0xKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvYmplY3RzID0gdXVpZHMubWFwKHV1aWQgPT4gdGhpcy5nZXRPYmplY3QodXVpZCkpXG4gICAgICAgIHJldHVybiBvYmplY3RzO1xuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBnZXRPYmplY3QodXVpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFPYmplY3RzLmZpbmQob2JqID0+IG9iai5VSUQgPT09IHV1aWQpO1xuICAgIH1cbiAgICBcbiAgICBuZ09uSW5pdCgpIHtcbiAgICB9XG4gIFxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIFxuICAgIG9uTWVudUl0ZW1DbGlja2VkKGFjdGlvbjogSVBlcE1lbnVJdGVtQ2xpY2tFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1lbnVIYW5kbGVyc1thY3Rpb24uc291cmNlLmtleV0odGhpcy5nZXRNZW51T2JqZWN0cygpKTtcbiAgICB9XG4gIFxuICAgIG9uU2VhcmNoQ2hhbmdlZChldmVudDogSVBlcFNlYXJjaENsaWNrRXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hTdHJpbmcgPSBldmVudC52YWx1ZVxuICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgXG4gICAgYXN5bmMgcmVsb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21MaXN0ICYmIHRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhT2JqZWN0cyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5nZXRMaXN0KHtcbiAgICAgICAgICAgICAgc2VhcmNoU3RyaW5nOiB0aGlzLnNlYXJjaFN0cmluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlldyA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5nZXREYXRhVmlldygpO1xuICAgICAgICAgICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5kYXRhT2JqZWN0cy5tYXAoeCA9PiB0aGlzLmNvbnZlcnRUb1BlcFJvd0RhdGEoeCwgZGF0YVZpZXcpKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFDb252ZXJ0b3JTZXJ2aWNlLmNvbnZlcnRMaXN0RGF0YSh0YWJsZURhdGEpO1xuICAgICAgICAgICAgZGF0YS5mb3JFYWNoKChvYmosIGkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhT2JqZWN0c1tpXS5VSUQgPSBvYmouVUlEO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbCA9IHRoaXMuZGF0YUNvbnZlcnRvclNlcnZpY2UuZ2V0VWlDb250cm9sKHRhYmxlRGF0YVswXSk7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUxpc3QuaW5pdExpc3REYXRhKHVpQ29udHJvbCwgZGF0YS5sZW5ndGgsIGRhdGEpO1xuICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RlZFJvd3NDaGFuZ2VkKHNlbGVjdGVkUm93c0NvdW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgb25DdXN0b21pemVGaWVsZENsaWNrKGZpZWxkQ2xpY2tFdmVudDogSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQpIHtcbiAgICAgICAgdGhpcy5maWVsZENsaWNrLmVtaXQoZmllbGRDbGlja0V2ZW50KTtcbiAgICB9XG4gIFxufVxuICAiLCI8ZGl2ICpuZ0lmPVwiaW5saW5lXCIgY2xhc3M9XCJpbmxpbmUtY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieyAnYWRkLXBhZGRpbmcnOiBhZGRQYWRkaW5nIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5saW5lLXRvcC1iYXItY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3BCYXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48cGVwLXBhZ2UtbGF5b3V0ICpuZ0lmPVwiIWlubGluZVwiIFthZGRQYWRkaW5nXT1cImFkZFBhZGRpbmdcIj5cbiAgICA8bmctY29udGFpbmVyIHBlcC10b3AtYXJlYT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvcEJhclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IHBlcC1tYWluLWFyZWEgY2xhc3M9XCJtYWluLWFyZWEtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvcGVwLXBhZ2UtbGF5b3V0PlxuICAgIFxuPG5nLXRlbXBsYXRlICN0b3BCYXJUZW1wbGF0ZT5cbiAgICA8cGVwLXRvcC1iYXIgW3RpdGxlXT1cInRpdGxlXCIgW2lubGluZV09XCJpbmxpbmVcIj5cbiAgICAgICAgPGRpdiBoZWFkZXItc3RhcnQtY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltsZWZ0LWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBoZWFkZXItZW5kLWNvbnRlbnQ+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcmlnaHQtYnV0dG9uc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cGVwLWxpc3QtYWN0aW9ucyBbc2l6ZVR5cGVdPVwiaW5saW5lID8gJ3NtJyA6ICdtZCdcIiBbYWN0aW9uc109XCJtZW51QWN0aW9uc1wiIChhY3Rpb25DbGljayk9XCJvbk1lbnVJdGVtQ2xpY2tlZCgkZXZlbnQpXCI+PC9wZXAtbGlzdC1hY3Rpb25zPlxuICAgICAgICA8cGVwLWxpc3QtdG90YWwgW3NpemVUeXBlXT1cImlubGluZSA/ICdzbScgOiAnbWQnXCIgW3RvdGFsUm93c109XCJjdXN0b21MaXN0ID8gY3VzdG9tTGlzdC50b3RhbFJvd3MgOiAtMVwiPjwvcGVwLWxpc3QtdG90YWw+XG5cbiAgICAgICAgPHBlcC1zZWFyY2ggKm5nSWY9XCJzaG93U2VhcmNoXCIgW3NpemVUeXBlXT1cImlubGluZSA/ICdzbScgOiAnbWQnXCIgKHNlYXJjaCk9XCJvblNlYXJjaENoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L3BlcC1zZWFyY2g+XG4gICAgPC9wZXAtdG9wLWJhcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdFRlbXBsYXRlPlxuICAgIDxkaXYgI2xpc3RDb250YWluZXIgY2xhc3M9XCJsaXN0LWNvbnRhaW5lclwiPlxuICAgICAgICA8cGVwLWxpc3Qgdmlld1R5cGU9XCJ0YWJsZVwiIFtzdXBwb3J0U29ydGluZ109XCJmYWxzZVwiXG4gICAgICAgICAgICBbc2VsZWN0aW9uVHlwZUZvckFjdGlvbnNdPVwiYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiA/ICdtdWx0aScgOiAoYWxsb3dTZWxlY3Rpb24gPyAnc2luZ2xlJyA6ICdub25lJylcIiBbbm9EYXRhRm91bmRNc2ddPVwibm9EYXRhTWVzc2FnZVwiXG4gICAgICAgICAgICAoZmllbGRDbGljayk9XCJvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoc2VsZWN0ZWRJdGVtc0NoYW5nZSk9XCJzZWxlY3RlZFJvd3NDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgICAgPC9wZXAtbGlzdD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21wb3NpdGUtbGliL2dlbmVyaWMtbGlzdC9nZW5lcmljLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbXBvc2l0ZS1saWIvZ2VuZXJpYy1saXN0L2dlbmVyaWMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osZ0JBQWdCLEVBRW5CLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFHSCxVQUFVLEVBRVYsT0FBTyxFQUNQLFNBQVMsR0FDWixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBSWhCLGlCQUFpQixFQUVwQixNQUFNLDhCQUE4QixDQUFDO0FBWXRDLE9BQU8sRUFBcUIsa0JBQWtCLEVBQWdCLE1BQU0sa0RBQWtELENBQUM7QUFRdkgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7QUFTcEMsTUFBTSxPQUFPLG9CQUFvQjtJQStHN0IsWUFDWSxTQUFtQyxFQUNuQyxtQkFBMEMsRUFDMUMscUJBQThDLEVBQzlDLGNBQWdDLEVBQ2hDLFVBQTRCO1FBSjVCLGNBQVMsR0FBVCxTQUFTLENBQTBCO1FBQ25DLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBdUI7UUFDMUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF5QjtRQUM5QyxtQkFBYyxHQUFkLGNBQWMsQ0FBa0I7UUFDaEMsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUE3R3hDLGdCQUFXLEdBQThCO1lBQ3JDLElBQUksRUFBRSxDQUFPLE1BQVcsRUFBRSxFQUFFO2dCQUN4QixPQUFPO29CQUNILFFBQVEsRUFBRTt3QkFDTixJQUFJLEVBQUUsTUFBTTtxQkFDZjtvQkFDRCxVQUFVLEVBQUUsQ0FBQyxDQUFDO29CQUNkLEtBQUssRUFBRSxFQUFFO2lCQUNaLENBQUE7WUFDTCxDQUFDLENBQUE7U0FDSixDQUFBO1FBVUQsWUFBTyxHQUEyQjtZQUM5QixHQUFHLEVBQUUsQ0FBTyxJQUFTLEVBQUUsRUFBRTtnQkFDckIsT0FBTyxFQUFFLENBQUE7WUFDYixDQUFDLENBQUE7U0FDSixDQUFDO1FBR0YsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUduQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBR1gsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUF1Qm5CLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHbkIscUJBQWdCLEdBQXdCLElBQUksS0FBSyxFQUFxQixDQUFDO1FBR3ZFLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUd6RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBR2hFLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFnQyxDQUFDO1FBVS9ELGFBQVEsR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU1QyxjQUFTLEdBQWlCO1lBQzlCLElBQUksRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUNNLGlCQUFZLEdBQStCO1lBQy9DLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLEtBQUssRUFBRTtnQkFDSCxJQUFJLEVBQUUsUUFBUTthQUNqQjtZQUNELGNBQWMsRUFBRSxFQUFFO1NBQ3JCLENBQUM7UUFDRixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ1YsYUFBUSxHQUEyQyxTQUFTLENBQUM7UUFFckUsaUJBQVksR0FBbUQsRUFBRSxDQUFDO1FBQ2xFLGdCQUFXLEdBQXVCLEVBQUUsQ0FBQztRQVNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3BFLGNBQWM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBdkhELElBQ0ksZ0JBQWdCLENBQUMsR0FBcUI7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztJQUNqQyxDQUFDO0lBYUQsSUFDSSxVQUFVLENBQUMsR0FBOEI7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUF3QkQsSUFDSSxjQUFjLENBQUMsR0FBVztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQ0ksYUFBYSxDQUFDLEdBQXlCO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFDSSxjQUFjLENBQUMsR0FBWTtRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQ0ksS0FBSyxDQUFDLEdBQXlCO1FBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBaUJELElBQUksT0FBTyxDQUFDLEdBQXFCO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQWtDRCxRQUFRO1FBQ0osRUFBRTtJQUNOLENBQUM7SUFFYSxTQUFTOztZQUNuQixVQUFVLENBQUMsR0FBUyxFQUFFOztnQkFDbEIsSUFBSSxJQUFJLENBQUMsV0FBVztvQkFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUV4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ25DO29CQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDekUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckUsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO29CQUVyQyw0Q0FBNEM7b0JBQzVDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUVqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFFaEIsSUFBSSxDQUFBLE1BQUEsV0FBVyxDQUFDLEtBQUssMENBQUUsSUFBSSxNQUFLLE9BQU8sRUFBRTt3QkFDckMsT0FBTyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUEsTUFBQSxXQUFXLENBQUMsS0FBSywwQ0FBRSxJQUFJLEtBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzVFO3lCQUFNO3dCQUNILE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQSwwREFBMEQ7cUJBQzNFO29CQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsVUFBVSxLQUFJLENBQUMsQ0FBQztvQkFFM0MsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO29CQUN6QyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDO29CQUNsRSxZQUFZLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7b0JBQzFFLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUN6RCxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTt3QkFDcEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsQ0FBQSxNQUFBLFdBQVcsQ0FBQyxLQUFLLDBDQUFFLElBQUksS0FBSSxpQkFBaUIsQ0FBQzt3QkFDOUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQSxNQUFBLFdBQVcsQ0FBQyxLQUFLLDBDQUFFLEtBQUssS0FBSSxDQUFDLENBQUM7cUJBQ25FO29CQUNELFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7b0JBRWxFLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNsRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxDQUFDO29CQUVILFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQzNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsQ0FBQyxDQUFDLENBQUE7b0JBRUYsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdCLENBQUMsQ0FBQyxDQUFDO29CQUVILFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztvQkFFSCxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDL0IsQ0FBQyxDQUFDLENBQUM7b0JBRUgsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLENBQUMsQ0FBQyxDQUFDO29CQUVILElBQUksYUFBYSxHQUFxQixFQUFFLENBQUM7b0JBQ3pDLElBQUksSUFBSSxFQUFFO3dCQUNOLElBQUksQ0FBQSxNQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxLQUFLLDBDQUFFLE1BQU0sSUFBRyxDQUFDLEVBQUU7NEJBQ3pCLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDMUU7d0JBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQ3RGLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUNqRjtpQkFDSjtZQUNMLENBQUMsQ0FBQSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRVYsQ0FBQztLQUFBO0lBRUQ7Ozs7O01BS0U7SUFDTSxXQUFXLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDVyxlQUFlOztZQUN6QixNQUFNLFdBQVcscUJBQWEsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3pCLE1BQU0sTUFBTSxHQUErQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzNFLElBQUksTUFBTSxFQUFFO29CQUNSLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7d0JBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ3hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2xDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7WUFFRCxPQUFPLFdBQVcsQ0FBQztRQUN2QixDQUFDO0tBQUE7SUFFTyxZQUFZLENBQUMsSUFBUztRQUMxQixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLGFBQWEsRUFBRTtZQUNyQixTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN6RztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFO1lBQzVDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQ3RCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQzVCLENBQUM7U0FDTDtJQUNMLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxNQUFXLEVBQUUsUUFBc0I7UUFDM0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM3QixHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ2pELEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLElBQUksQ0FBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsTUFBTSxLQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN6RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBc0IsQ0FBQTtnQkFDekQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDM0MsVUFBVSxFQUFFLENBQUM7b0JBQ2IsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7b0JBQ3hELEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO29CQUMvQyxXQUFXLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLO29CQUMxQyxlQUFlLEVBQUUsRUFBRTtvQkFDbkIsY0FBYyxFQUFFLEVBQUU7b0JBQ2xCLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUN6QyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRO2lCQUMzQixDQUFDLENBQUE7YUFDTDtTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBVTtRQUN0QyxPQUFPO1lBQ0gsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQzdCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixlQUFlLEVBQUUsQ0FBQztZQUNsQixNQUFNLEVBQUU7Z0JBQ0osQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakIsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSztnQkFDekIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDakMsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbkMsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVTthQUN0QztTQUNKLENBQUE7SUFDTCxDQUFDO0lBRWEsY0FBYzs7WUFDeEIsTUFBTSxHQUFHLEdBQWtCLEVBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUNoQixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO29CQUN2QyxHQUFHLENBQUMsSUFBSSxDQUFDO3dCQUNMLEdBQUcsRUFBRSxJQUFJO3dCQUNULElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztxQkFDbkIsQ0FBQyxDQUFBO2dCQUNOLENBQUMsQ0FBQyxDQUFBO2FBQ0w7WUFFRCxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7S0FBQTtJQUVPLGNBQWM7UUFDbEIsTUFBTSxXQUFXLEdBQVE7WUFDckIsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsSUFBSSxnQkFBZ0IsRUFBRTtTQUMvQixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsV0FBVyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDM0IsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDMUQ7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsbUJBQW1CLENBQUMsTUFBOEI7UUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JEO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUEyQjtRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxpQkFBeUI7UUFDNUMsOERBQThEO1FBQzlELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELHFCQUFxQixDQUFDLGVBQXdDO1FBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxLQUFtQztRQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBb0M7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFpQztRQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVhLFFBQVEsQ0FBQyxTQUFpQixFQUFFLE9BQWU7OztZQUNyRCxNQUFNLElBQUksR0FBNEIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDOUQsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksU0FBUztnQkFDNUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUztnQkFDbkMsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLE9BQU8sRUFBRSxPQUFPO2FBQ25CLENBQUMsQ0FBQztZQUVILElBQUksSUFBSSxFQUFFO2dCQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFFL0IsSUFBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsTUFBTSxJQUFHLENBQUMsRUFBRTtvQkFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7aUJBQ3RGO2FBQ0o7WUFFRCxPQUFPLElBQUksQ0FBQzs7S0FDZjtJQUdhLGNBQWMsQ0FBQyxTQUFpQixFQUFFLE9BQWUsRUFBRSxZQUFnQyxTQUFTOztZQUN0RyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO29CQUMzQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxTQUFTO29CQUM1QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxTQUFTO29CQUNuQyxTQUFTLEVBQUUsU0FBUztvQkFDcEIsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFNBQVMsRUFBRSxTQUFTO2lCQUN2QixDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFBLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxNQUFNLElBQUcsQ0FBQyxFQUFFO29CQUN0QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUMvRTtxQkFBTTtvQkFDSCxPQUFPLEVBQUUsQ0FBQztpQkFDYjthQUNKO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxDQUFDO2FBQ2I7UUFDTCxDQUFDO0tBQUE7SUFFRDs7T0FFRztJQUNHLFdBQVcsQ0FBQyxLQUE2Qjs7WUFDM0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7S0FBQTtJQUVEOztPQUVHO0lBQ0csVUFBVSxDQUFDLEtBQTRCOztZQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFDbkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQztLQUFBO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDOztpSEE3YVEsb0JBQW9CO3FHQUFwQixvQkFBb0Isd21CQUVVLGdCQUFnQiw2QkM1RDNELCt5RUFxRGM7MkZES0Qsb0JBQW9CO2tCQUxoQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFdBQVcsRUFBRSwrQkFBK0I7b0JBQzVDLFNBQVMsRUFBRSxDQUFDLCtCQUErQixDQUFDO2lCQUMvQzt1UEFJTyxnQkFBZ0I7c0JBRG5CLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBaUJyRCxVQUFVO3NCQURiLEtBQUs7Z0JBU04sT0FBTztzQkFETixLQUFLO2dCQVFOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSUYsY0FBYztzQkFEakIsS0FBSztnQkFNRixhQUFhO3NCQURoQixLQUFLO2dCQU1GLGNBQWM7c0JBRGpCLEtBQUs7Z0JBTUYsS0FBSztzQkFEUixLQUFLO2dCQU1OLFVBQVU7c0JBRFQsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixVQUFVO3NCQURULE1BQU07Z0JBSVAsV0FBVztzQkFEVixNQUFNO2dCQUlQLG1CQUFtQjtzQkFEbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7XG4gICAgUGVwRGF0YUNvbnZlcnRvclNlcnZpY2UsXG4gICAgUGVwTGF5b3V0U2VydmljZSxcbiAgICBQZXBSb3dEYXRhLFxuICAgIE9iamVjdHNEYXRhUm93LFxuICAgIFBlcEd1aWQsXG4gICAgVUlDb250cm9sLFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5pbXBvcnQgeyBJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudCB9IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2Zvcm0nO1xuaW1wb3J0IHtcbiAgICBQZXBMaXN0Q29tcG9uZW50LFxuICAgIFBlcFNlbGVjdGlvbkRhdGEsXG4gICAgSVBlcExpc3RMb2FkUGFnZUV2ZW50LFxuICAgIFBlcExpc3RTZWxlY3Rpb25UeXBlLFxuICAgIElQZXBMaXN0U29ydGluZ0NoYW5nZUV2ZW50LFxuICAgIERFRkFVTFRfUEFHRV9TSVpFLFxuICAgIElQZXBMaXN0TG9hZEl0ZW1zRXZlbnRcbn0gZnJvbSAnQHBlcHBlcmktYWRkb25zL25neC1saWIvbGlzdCc7XG5pbXBvcnQge1xuICAgIFBlcE1lbnVJdGVtLFxuICAgIElQZXBNZW51SXRlbUNsaWNrRXZlbnQsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL21lbnUnO1xuaW1wb3J0IHsgSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9mb3JtJztcbmltcG9ydCB7XG4gICAgUGVwQnJlYWRDcnVtYkl0ZW0sXG4gICAgSVBlcEJyZWFkQ3J1bWJJdGVtQ2xpY2tFdmVudFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9icmVhZC1jcnVtYnMnO1xuaW1wb3J0IHsgSVBlcFNlYXJjaENsaWNrRXZlbnQgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYi9zZWFyY2gnO1xuXG5pbXBvcnQgeyBHcmlkRGF0YVZpZXdGaWVsZCwgRGF0YVZpZXdGaWVsZFR5cGVzLCBHcmlkRGF0YVZpZXcgfSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvcGFwaS1zZGsvZGlzdC9lbnRpdGllcy9kYXRhLXZpZXcnO1xuaW1wb3J0IHtcbiAgICBJUGVwR2VuZXJpY0xpc3RJbml0RGF0YSxcbiAgICBJUGVwR2VuZXJpY0xpc3REYXRhU291cmNlLFxuICAgIElQZXBHZW5lcmljTGlzdFBhZ2VyLFxuICAgIElQZXBHZW5lcmljTGlzdEFjdGlvbnMsXG4gICAgSVBlcEdlbmVyaWNMaXN0VGFibGVJbnB1dHMsXG59IGZyb20gJy4vZ2VuZXJpYy1saXN0Lm1vZGVsJztcbmltcG9ydCB7IERhdGFWaWV3Q29udmVydGVyIH0gZnJvbSAnQHBlcHBlcmktYWRkb25zL2RhdGEtdmlld3MnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQZXBHZW5lcmljTGlzdFNlcnZpY2UgfSBmcm9tICcuL2dlbmVyaWMtbGlzdC5zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3BlcC1nZW5lcmljLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmljLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2dlbmVyaWMtbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdlbmVyaWNMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIF9wZXBMaXN0Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkO1xuICAgIEBWaWV3Q2hpbGQoJ3BlcExpc3RDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICBzZXQgcGVwTGlzdENvbnRhaW5lcih2YWw6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgdGhpcy5fcGVwTGlzdENvbnRhaW5lciA9IHZhbDtcbiAgICB9XG5cbiAgICBfZGF0YVNvdXJjZTogSVBlcEdlbmVyaWNMaXN0RGF0YVNvdXJjZSA9IHtcbiAgICAgICAgaW5pdDogYXN5bmMgKHBhcmFtczogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGFWaWV3OiB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdHcmlkJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudDogLTEsXG4gICAgICAgICAgICAgICAgaXRlbXM6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KClcbiAgICBzZXQgZGF0YVNvdXJjZSh2YWw6IElQZXBHZW5lcmljTGlzdERhdGFTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IHZhbDtcbiAgICAgICAgdGhpcy5zZWFyY2hTdHJpbmcgPSAnJztcbiAgICAgICAgdGhpcy5fc29ydGluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIGFjdGlvbnM6IElQZXBHZW5lcmljTGlzdEFjdGlvbnMgPSB7XG4gICAgICAgIGdldDogYXN5bmMgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQElucHV0KClcbiAgICB1dWlkTWFwcGluZyA9ICdrZXknO1xuXG4gICAgQElucHV0KClcbiAgICBhZGRQYWRkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHRpdGxlID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIGlubGluZSA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBzaG93U2VhcmNoID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBub0RhdGFGb3VuZE1zZyh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl90YWJsZUlucHV0cy5ub0RhdGFGb3VuZE1zZyA9IHZhbDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3Rpb25UeXBlKHZhbDogUGVwTGlzdFNlbGVjdGlvblR5cGUpIHtcbiAgICAgICAgdGhpcy5fdGFibGVJbnB1dHMuc2VsZWN0aW9uVHlwZSA9IHZhbDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBzdXBwb3J0U29ydGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fdGFibGVJbnB1dHMuc3VwcG9ydFNvcnRpbmcgPSB2YWw7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgcGFnZXIodmFsOiBJUGVwR2VuZXJpY0xpc3RQYWdlcikge1xuICAgICAgICB0aGlzLl90YWJsZUlucHV0cy5wYWdlciA9IHZhbDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3dUb3BCYXIgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgYnJlYWRDcnVtYnNJdGVtczogUGVwQnJlYWRDcnVtYkl0ZW1bXSA9IG5ldyBBcnJheTxQZXBCcmVhZENydW1iSXRlbT4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGZpZWxkQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgYnJlYWRDcnVtYkl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEJyZWFkQ3J1bWJJdGVtQ2xpY2tFdmVudD4oKTtcblxuICAgIHNldCBwZXBMaXN0KHZhbDogUGVwTGlzdENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9nZW5lcmljTGlzdFNlcnZpY2UucGVwTGlzdCA9IHZhbDtcbiAgICB9XG5cbiAgICBnZXQgcGVwTGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dlbmVyaWNMaXN0U2VydmljZS5wZXBMaXN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2l6ZSQ6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIHByaXZhdGUgX2RhdGFWaWV3OiBHcmlkRGF0YVZpZXcgPSB7XG4gICAgICAgIFR5cGU6ICdHcmlkJ1xuICAgIH07XG4gICAgcHJpdmF0ZSBfdGFibGVJbnB1dHM6IElQZXBHZW5lcmljTGlzdFRhYmxlSW5wdXRzID0ge1xuICAgICAgICBzdXBwb3J0U29ydGluZzogZmFsc2UsXG4gICAgICAgIHNlbGVjdGlvblR5cGU6ICdzaW5nbGUnLFxuICAgICAgICBwYWdlcjoge1xuICAgICAgICAgICAgdHlwZTogJ3Njcm9sbCdcbiAgICAgICAgfSxcbiAgICAgICAgbm9EYXRhRm91bmRNc2c6ICcnXG4gICAgfTtcbiAgICB0b3RhbFJvd0NvdW50ID0gLTE7XG4gICAgc2VhcmNoU3RyaW5nID0gJyc7XG4gICAgcHJpdmF0ZSBfc29ydGluZzogSVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBtZW51SGFuZGxlcnM6IHsgW2tleTogc3RyaW5nXTogKG9iajogYW55KSA9PiBQcm9taXNlPHZvaWQ+IH0gPSB7fTtcbiAgICBtZW51QWN0aW9uczogQXJyYXk8UGVwTWVudUl0ZW0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBfZ2VuZXJpY0xpc3RTZXJ2aWNlOiBQZXBHZW5lcmljTGlzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX2RhdGFDb252ZXJ0b3JTZXJ2aWNlOiBQZXBEYXRhQ29udmVydG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0U2VydmljZTogUGVwTGF5b3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZSQgPSB0aGlzLl9sYXlvdXRTZXJ2aWNlLm9uUmVzaXplJC5waXBlKCkuc3Vic2NyaWJlKChzaXplKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRUYWJsZSgpIHtcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3BlcExpc3RDb250YWluZXIpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wZXBMaXN0Q29udGFpbmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVwTGlzdENvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuX3Jlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFBlcExpc3RDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3BlcExpc3RDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xuICAgICAgICAgICAgICAgIHRoaXMucGVwTGlzdCA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZTtcblxuICAgICAgICAgICAgICAgIC8vbWVyZ2Ugc2VsZWN0b3IgaW5wdXRzIHdpdGggY2FsbGJhY2sgaW5wdXRzXG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVJbnB1dHMgPSBhd2FpdCB0aGlzLmxvYWRUYWJsZUlucHV0cygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgdG9JbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAodGFibGVJbnB1dHMucGFnZXI/LnR5cGUgPT09ICdwYWdlcycpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9JbmRleCA9IGZyb21JbmRleCArICh0YWJsZUlucHV0cy5wYWdlcj8uc2l6ZSB8fCBERUZBVUxUX1BBR0VfU0laRSkgLSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvSW5kZXggPSAxMDA7Ly9UTyBETyAtIGdldCByZWVzdWx0IGZyb20gLSB0aGlzLmN1c3RvbUxpc3QuZ2V0VG9wSXRlbXMoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmxvYWREYXRhKGZyb21JbmRleCwgdG9JbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbFJvd0NvdW50ID0gZGF0YT8udG90YWxDb3VudCB8fCAwO1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnZpZXdUeXBlID0gJ3RhYmxlJztcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc3VwcG9ydFNvcnRpbmcgPSB0YWJsZUlucHV0cy5zdXBwb3J0U29ydGluZztcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPSB0YWJsZUlucHV0cy5zZWxlY3Rpb25UeXBlO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5wYWdlclR5cGUgPSB0YWJsZUlucHV0cy5wYWdlci50eXBlO1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZUlucHV0cy5wYWdlci50eXBlID09PSAncGFnZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5wYWdlU2l6ZSA9IHRhYmxlSW5wdXRzLnBhZ2VyPy5zaXplIHx8IERFRkFVTFRfUEFHRV9TSVpFO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucGFnZUluZGV4ID0gdGFibGVJbnB1dHMucGFnZXI/LmluZGV4IHx8IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5ub0RhdGFGb3VuZE1zZyA9IHRhYmxlSW5wdXRzLm5vRGF0YUZvdW5kTXNnO1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmZpZWxkQ2xpY2suc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZWxlY3RlZEl0ZW1zQ2hhbmdlLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UubG9hZEl0ZW1zLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkSXRlbXMoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5sb2FkUGFnZS5zdWJzY3JpYmUoKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTG9hZFBhZ2UoJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS52YWx1ZUNoYW5nZS5zdWJzY3JpYmUoKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKCRldmVudClcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zb3J0aW5nQ2hhbmdlLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Tb3J0aW5nQ2hhbmdlKCRldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29udmVydGVkTGlzdDogT2JqZWN0c0RhdGFSb3dbXSA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhPy5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkTGlzdCA9IHRoaXMuX2RhdGFDb252ZXJ0b3JTZXJ2aWNlLmNvbnZlcnRMaXN0RGF0YShkYXRhLml0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2wgPSB0aGlzLmdldFVpQ29udHJvbChEYXRhVmlld0NvbnZlcnRlci50b1VJQ29udHJvbERhdGEoZGF0YS5kYXRhVmlldykpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuaW5pdExpc3REYXRhKHVpQ29udHJvbCwgZGF0YS50b3RhbENvdW50LCBjb252ZXJ0ZWRMaXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBjaGVja3MgaWYgdGhlIG9iamVjdCBjb250YWlucyBwcm9wZXJ0eVxuICAgICogQHBhcmFtIG9iaiBvYmplY3RcbiAgICAqIEBwYXJhbSBwcm9wIHByb3BlcnR5IG5hbWVcbiAgICAqIEByZXR1cm5zIHRydWUgaWYgY29udGFpbnMsIGZhbHNlIG90aGVyd2lzZVxuICAgICovXG4gICAgcHJpdmF0ZSBoYXNQcm9wZXJ0eShvYmo6IGFueSwgcHJvcDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsb2FkcyBjYWxsYmFjayBpbnB1dHMgaW4gY2FzZSB0aGV5IGFyZSBwcm92aWRlZCBhbmQgbWVyZ2Ugd2l0aCBzZWxlY3RvciBpbnB1dHNcbiAgICAgKiBAcmV0dXJucyBtZXJnZWQgcGVwLWxpc3QgaW5wdXRzXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkVGFibGVJbnB1dHMoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlSW5wdXRzOiBhbnkgPSB7IC4uLnRoaXMuX3RhYmxlSW5wdXRzIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UuaW5wdXRzKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dHM6IElQZXBHZW5lcmljTGlzdFRhYmxlSW5wdXRzID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5pbnB1dHMoKTtcbiAgICAgICAgICAgIGlmIChpbnB1dHMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNQcm9wZXJ0eSh0YWJsZUlucHV0cywgaXRlbVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlSW5wdXRzW2l0ZW1bMF1dID0gaXRlbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhYmxlSW5wdXRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VWlDb250cm9sKGRhdGE6IGFueSk6IFVJQ29udHJvbCB7XG4gICAgICAgIGNvbnN0IHVpQ29udHJvbCA9IG5ldyBVSUNvbnRyb2woKTtcbiAgICAgICAgdWlDb250cm9sLkNvbnRyb2xGaWVsZHMgPSBbXTtcblxuICAgICAgICBpZiAoZGF0YT8uQ29udHJvbEZpZWxkcykge1xuICAgICAgICAgICAgdWlDb250cm9sLkNvbnRyb2xGaWVsZHMgPSBkYXRhLkNvbnRyb2xGaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiB0aGlzLmNvbnZlcnRUb1VpQ29udHJvbEZpZWxkKGZpZWxkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdWlDb250cm9sO1xuICAgIH1cblxuICAgIHByaXZhdGUgbG9hZE1lbnVJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYmxlSW5wdXRzLnNlbGVjdGlvblR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgICAgdGhpcy5nZXRNZW51QWN0aW9ucygpLnRoZW4oXG4gICAgICAgICAgICAgICAgeCA9PiB0aGlzLm1lbnVBY3Rpb25zID0geFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29udmVydFRvUGVwUm93RGF0YShvYmplY3Q6IGFueSwgZGF0YVZpZXc6IEdyaWREYXRhVmlldykge1xuICAgICAgICBjb25zdCByb3cgPSBuZXcgUGVwUm93RGF0YSgpO1xuICAgICAgICByb3cuVVVJRCA9IG9iamVjdFt0aGlzLnV1aWRNYXBwaW5nXSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIHJvdy5GaWVsZHMgPSBbXTtcblxuICAgICAgICBpZiAoZGF0YVZpZXc/LkZpZWxkcyAmJiBkYXRhVmlldy5Db2x1bW5zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YVZpZXcuRmllbGRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZGF0YVZpZXcuRmllbGRzW2luZGV4XSBhcyBHcmlkRGF0YVZpZXdGaWVsZFxuICAgICAgICAgICAgICAgIHJvdy5GaWVsZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIEFwaU5hbWU6IGZpZWxkLkZpZWxkSUQsXG4gICAgICAgICAgICAgICAgICAgIFRpdGxlOiB0aGlzLl90cmFuc2xhdGUuaW5zdGFudChmaWVsZC5UaXRsZSksXG4gICAgICAgICAgICAgICAgICAgIFhBbGlnbm1lbnQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlOiAob2JqZWN0W2ZpZWxkLkZpZWxkSURdIHx8ICcnKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBWYWx1ZTogKG9iamVjdFtmaWVsZC5GaWVsZElEXSB8fCAnJykudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgQ29sdW1uV2lkdGg6IGRhdGFWaWV3LkNvbHVtbnNbaW5kZXhdLldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBPcHRpb25hbFZhbHVlczogW10sXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZTogRGF0YVZpZXdGaWVsZFR5cGVzW2ZpZWxkLlR5cGVdLFxuICAgICAgICAgICAgICAgICAgICBSZWFkT25seTogZmllbGQuUmVhZE9ubHksXG4gICAgICAgICAgICAgICAgICAgIEVuYWJsZWQ6ICFmaWVsZC5SZWFkT25seVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnZlcnRUb1VpQ29udHJvbEZpZWxkKGZpZWxkOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIEFwaU5hbWU6IGZpZWxkLkFwaU5hbWUsXG4gICAgICAgICAgICBGaWVsZFR5cGU6IGZpZWxkLkZpZWxkVHlwZSxcbiAgICAgICAgICAgIFRpdGxlOiBmaWVsZC5UaXRsZSxcbiAgICAgICAgICAgIFJlYWRPbmx5OiBmaWVsZC5SZWFkT25seUZpZWxkLFxuICAgICAgICAgICAgQ29sdW1uV2lkdGg6IGZpZWxkLkNvbHVtbldpZHRoLFxuICAgICAgICAgICAgQ29sdW1uV2lkdGhUeXBlOiAxLFxuICAgICAgICAgICAgTGF5b3V0OiB7XG4gICAgICAgICAgICAgICAgWDogZmllbGQuTGF5b3V0LlgsXG4gICAgICAgICAgICAgICAgWTogZmllbGQuTGF5b3V0LlksXG4gICAgICAgICAgICAgICAgV2lkdGg6IGZpZWxkLkxheW91dC5XaWR0aCxcbiAgICAgICAgICAgICAgICBIZWlnaHQ6IGZpZWxkLkxheW91dC5GaWVsZF9IZWlnaHQsXG4gICAgICAgICAgICAgICAgWEFsaWdubWVudDogZmllbGQuTGF5b3V0LnhBbGlnbm1lbnQsXG4gICAgICAgICAgICAgICAgWUFsaWdubWVudDogZmllbGQuTGF5b3V0LnlBbGlnbm1lbnQsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldE1lbnVBY3Rpb25zKCk6IFByb21pc2U8UGVwTWVudUl0ZW1bXT4ge1xuICAgICAgICBjb25zdCByZXM6IFBlcE1lbnVJdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRNZW51T2JqZWN0cygpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBhd2FpdCB0aGlzLmFjdGlvbnMuZ2V0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMubWVudUhhbmRsZXJzID0ge307XG4gICAgICAgICAgICBhY3Rpb25zPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBQZXBHdWlkLm5ld0d1aWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnVIYW5kbGVyc1t1dWlkXSA9IGl0ZW0uaGFuZGxlcjtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdXVpZCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaXRlbS50aXRsZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1lbnVPYmplY3RzKCkge1xuICAgICAgICBjb25zdCBtZW51T2JqZWN0czogYW55ID0ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBkYXRhOiBuZXcgUGVwU2VsZWN0aW9uRGF0YSgpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMucGVwTGlzdCkge1xuICAgICAgICAgICAgbWVudU9iamVjdHMuc3VjY2VzcyA9IHRydWU7XG4gICAgICAgICAgICBtZW51T2JqZWN0cy5kYXRhID0gdGhpcy5wZXBMaXN0LmdldFNlbGVjdGVkSXRlbXNEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVudU9iamVjdHM7XG4gICAgfVxuXG4gICAgb25BY3Rpb25JdGVtQ2xpY2tlZChhY3Rpb246IElQZXBNZW51SXRlbUNsaWNrRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRNZW51T2JqZWN0cygpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubWVudUhhbmRsZXJzW2FjdGlvbi5zb3VyY2Uua2V5XShyZXN1bHQuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlYXJjaENoYW5nZWQoZXZlbnQ6IElQZXBTZWFyY2hDbGlja0V2ZW50KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3RyaW5nID0gZXZlbnQudmFsdWU7XG4gICAgICAgIHRoaXMuaW5pdFRhYmxlKCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZFJvd3NDb3VudDogbnVtYmVyKSB7XG4gICAgICAgIC8vbG9hZGluZyBtZW51IGl0ZW1zIGFmdGVyIHBlcC1saXN0IHNlbGVjdGVkIGl0ZW1zIGFyZSB1cGRhdGVkXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkTWVudUl0ZW1zKCk7XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIG9uQ3VzdG9taXplRmllbGRDbGljayhmaWVsZENsaWNrRXZlbnQ6IElQZXBGb3JtRmllbGRDbGlja0V2ZW50KSB7XG4gICAgICAgIHRoaXMuZmllbGRDbGljay5lbWl0KGZpZWxkQ2xpY2tFdmVudCk7XG4gICAgfVxuXG4gICAgb25CcmVhZENydW1iSXRlbUNsaWNrKGV2ZW50OiBJUGVwQnJlYWRDcnVtYkl0ZW1DbGlja0V2ZW50KSB7XG4gICAgICAgIHRoaXMuYnJlYWRDcnVtYkl0ZW1DbGljay5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblZhbHVlQ2hhbmdlZChldmVudDogSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblNvcnRpbmdDaGFuZ2UoZXZlbnQ6IElQZXBMaXN0U29ydGluZ0NoYW5nZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmcgPSBldmVudDtcbiAgICAgICAgdGhpcy5pbml0VGFibGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWREYXRhKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZXBHZW5lcmljTGlzdEluaXREYXRhPiB7XG4gICAgICAgIGNvbnN0IGRhdGE6IElQZXBHZW5lcmljTGlzdEluaXREYXRhID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5pbml0KHtcbiAgICAgICAgICAgIHNlYXJjaFN0cmluZzogdGhpcy5zZWFyY2hTdHJpbmcgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgc29ydGluZzogdGhpcy5fc29ydGluZyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICBmcm9tSW5kZXg6IGZyb21JbmRleCxcbiAgICAgICAgICAgIHRvSW5kZXg6IHRvSW5kZXhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gZGF0YS5kYXRhVmlldztcblxuICAgICAgICAgICAgaWYgKGRhdGEuaXRlbXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW1zID0gZGF0YS5pdGVtcy5tYXAoaXRlbSA9PiB0aGlzLmNvbnZlcnRUb1BlcFJvd0RhdGEoaXRlbSwgZGF0YS5kYXRhVmlldykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFzeW5jIHVwZGF0ZURhdGFMaXN0KGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIHBhZ2VJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhU291cmNlLnVwZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUxpc3QgPSBhd2FpdCB0aGlzLl9kYXRhU291cmNlLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgc2VhcmNoU3RyaW5nOiB0aGlzLnNlYXJjaFN0cmluZyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc29ydGluZzogdGhpcy5fc29ydGluZyB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZnJvbUluZGV4OiBmcm9tSW5kZXgsXG4gICAgICAgICAgICAgICAgdG9JbmRleDogdG9JbmRleCxcbiAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhTGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhTGlzdC5tYXAoaXRlbSA9PiB0aGlzLmNvbnZlcnRUb1BlcFJvd0RhdGEoaXRlbSwgdGhpcy5fZGF0YVZpZXcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9hZHMgdmlydHVhbCBzY3JvbGwgaXRlbXMgZnJvbSBhcGlcbiAgICAgKi9cbiAgICBhc3luYyBvbkxvYWRJdGVtcyhldmVudDogSVBlcExpc3RMb2FkSXRlbXNFdmVudCkge1xuICAgICAgICBjb25zdCBsaXN0ID0gYXdhaXQgdGhpcy51cGRhdGVEYXRhTGlzdChldmVudC5mcm9tSW5kZXgsIGV2ZW50LnRvSW5kZXgpO1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRMaXN0ID0gdGhpcy5fZGF0YUNvbnZlcnRvclNlcnZpY2UuY29udmVydExpc3REYXRhKGxpc3QpO1xuICAgICAgICB0aGlzLnBlcExpc3QudXBkYXRlSXRlbXMoY29udmVydGVkTGlzdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxvYWRzIHBhZ2luZyBidWxrIGZyb20gYXBpXG4gICAgICovXG4gICAgYXN5bmMgb25Mb2FkUGFnZShldmVudDogSVBlcExpc3RMb2FkUGFnZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleCA9IGV2ZW50LnBhZ2VJbmRleCAqIGV2ZW50LnBhZ2VTaXplO1xuICAgICAgICBjb25zdCB0b0luZGV4ID0gTWF0aC5taW4oZnJvbUluZGV4ICsgZXZlbnQucGFnZVNpemUgLSAxLCB0aGlzLnRvdGFsUm93Q291bnQgLSAxKTtcbiAgICAgICAgY29uc3QgbGlzdCA9IGF3YWl0IHRoaXMudXBkYXRlRGF0YUxpc3QoZnJvbUluZGV4LCB0b0luZGV4LCBldmVudC5wYWdlSW5kZXgpO1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRMaXN0ID0gdGhpcy5fZGF0YUNvbnZlcnRvclNlcnZpY2UuY29udmVydExpc3REYXRhKGxpc3QpO1xuICAgICAgICB0aGlzLnBlcExpc3QudXBkYXRlUGFnZShjb252ZXJ0ZWRMaXN0LCBldmVudCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXNpemUkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemUkLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiIsIjxkaXYgKm5nSWY9XCJpbmxpbmVcIiBjbGFzcz1cImlubGluZS1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ICdhZGQtcGFkZGluZyc6IGFkZFBhZGRpbmcgfVwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93VG9wQmFyXCIgY2xhc3M9XCJpbmxpbmUtdG9wLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b3BCYXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJyZWFkQ3J1bWJzSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJyZWFkQ3J1bWJzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG5cbjxwZXAtcGFnZS1sYXlvdXQgKm5nSWY9XCIhaW5saW5lXCIgW2FkZFBhZGRpbmddPVwiYWRkUGFkZGluZ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VG9wQmFyXCIgcGVwLXRvcC1hcmVhPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9wQmFyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnJlYWRDcnVtYnNJdGVtcy5sZW5ndGggPiAwXCIgcGVwLXRvcC1hcmVhPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnJlYWRDcnVtYnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgcGVwLW1haW4tYXJlYSBjbGFzcz1cIm1haW4tYXJlYS1jb250YWluZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3RUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9wZXAtcGFnZS1sYXlvdXQ+XG5cbjxuZy10ZW1wbGF0ZSAjdG9wQmFyVGVtcGxhdGU+XG4gICAgPHBlcC10b3AtYmFyIFt0aXRsZV09XCJ0aXRsZVwiIFtpbmxpbmVdPVwiaW5saW5lXCI+XG4gICAgICAgIDxkaXYgaGVhZGVyLXN0YXJ0LWNvbnRlbnQ+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbGVmdC1idXR0b25zXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaGVhZGVyLWVuZC1jb250ZW50PlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3JpZ2h0LWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cGVwLWxpc3QtYWN0aW9ucyAqbmdJZj1cIm1lbnVBY3Rpb25zLmxlbmd0aCA+IDBcIiBbc2l6ZVR5cGVdPVwiaW5saW5lID8gJ3NtJyA6ICdtZCdcIiBbYWN0aW9uc109XCJtZW51QWN0aW9uc1wiXG4gICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwib25BY3Rpb25JdGVtQ2xpY2tlZCgkZXZlbnQpXCI+PC9wZXAtbGlzdC1hY3Rpb25zPlxuICAgICAgICA8cGVwLWxpc3QtdG90YWwgW3NpemVUeXBlXT1cImlubGluZSA/ICdzbScgOiAnbWQnXCIgW3RvdGFsUm93c109XCJ0b3RhbFJvd0NvdW50XCI+XG4gICAgICAgIDwvcGVwLWxpc3QtdG90YWw+XG5cbiAgICAgICAgPHBlcC1zZWFyY2ggKm5nSWY9XCJzaG93U2VhcmNoXCIgW3ZhbHVlXT1cInNlYXJjaFN0cmluZ1wiIFtzaXplVHlwZV09XCJpbmxpbmUgPyAnc20nIDogJ21kJ1wiXG4gICAgICAgICAgICAoc2VhcmNoKT1cIm9uU2VhcmNoQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgICAgIDwvcGVwLXNlYXJjaD5cbiAgICA8L3BlcC10b3AtYmFyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNicmVhZENydW1ic1RlbXBsYXRlPlxuICAgIDxwZXAtYnJlYWQtY3J1bWJzIGNsYXNzPVwiYnJlYWQtY3J1bWJzXCIgW2l0ZW1zXT1cImJyZWFkQ3J1bWJzSXRlbXNcIiBbYWRkU3BhY2luZ109XCJ0cnVlXCIgW2Rpc3BsYXlUeXBlXT1cIidpdGVtcydcIlxuICAgICAgICAoaXRlbUNsaWNrKT1cIm9uQnJlYWRDcnVtYkl0ZW1DbGljaygkZXZlbnQpXCI+PC9wZXAtYnJlYWQtY3J1bWJzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0VGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgI3BlcExpc3RDb250YWluZXI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==