@colijnit/corecomponents_v12 12.1.6 → 12.1.8

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.
@@ -1,23 +1,29 @@
1
1
  import { __awaiter } from "tslib";
2
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
3
3
  import { CoreComponentsIcon } from '../../core/enum/core-components-icon.enum';
4
4
  import { IconCacheService } from '../icon/icon-cache.service';
5
+ import { FilterItemMode } from '../../core/enum/filterItem-mode.enum';
5
6
  export class FilterItemComponent {
6
- constructor(iconService) {
7
+ constructor(iconService, _changeDetector) {
7
8
  this.iconService = iconService;
9
+ this._changeDetector = _changeDetector;
8
10
  this.icons = CoreComponentsIcon;
11
+ this.modes = FilterItemMode;
12
+ this.mode = this.modes.Filterlist;
9
13
  this.initialLimit = 10;
10
14
  this.expanded = false;
11
15
  // Set to false to use filter item with a multi selectable collection. Set to true to specify custom content
12
16
  this.customContent = false;
13
17
  // Set to true to show all results. Set to false to get 'show more' and 'show less' buttons to expand and contract.
14
18
  this.showAllResults = false;
15
- this.singleSelect = false;
16
19
  this.filterButtonLabel = "Search";
17
20
  this.searchPlaceholder = 'Search...';
18
21
  this.showMoreLabel = 'Show more';
19
22
  this.showLessLabel = 'Show less';
20
23
  this.noResultsLabel = "No results";
24
+ this.sliderDefaultMin = 0;
25
+ this.sliderDefaultMax = 100000;
26
+ this.modelChange = new EventEmitter();
21
27
  this.collectionChange = new EventEmitter();
22
28
  this.filterButtonClicked = new EventEmitter();
23
29
  this.filteredCollection = [];
@@ -30,16 +36,51 @@ export class FilterItemComponent {
30
36
  var _a;
31
37
  this._collection = value;
32
38
  this.filteredCollection = (_a = this._collection) === null || _a === void 0 ? void 0 : _a.slice();
39
+ //reset the model in case there was no collection to set its values on when it was set.
40
+ this.model = this._model;
33
41
  }
34
42
  get collection() {
35
43
  return this._collection;
36
44
  }
37
- showClass() {
38
- return true;
45
+ set model(filterString) {
46
+ switch (this.mode) {
47
+ case this.modes.Filterlist:
48
+ this._readModelForFilterList(filterString);
49
+ break;
50
+ case this.modes.SingleSelectList:
51
+ this._readModelForSingleSelectList(filterString);
52
+ break;
53
+ case this.modes.SelectListWithStringCollectionOutput:
54
+ this._readModelForStringCollectionList(filterString);
55
+ break;
56
+ case this.modes.SelectListWithNumberOutput:
57
+ this._readModelForSelectListWithNumberOutput(filterString);
58
+ break;
59
+ case this.modes.Slider:
60
+ this._readModelForSliderMode(filterString);
61
+ break;
62
+ case this.modes.CheckboxToText:
63
+ case this.modes.CheckboxToSimpleText:
64
+ this._readModelForCheckboxToText(filterString);
65
+ break;
66
+ case this.modes.CheckboxToBinary:
67
+ this._readModelForCheckboxToBinary(filterString);
68
+ break;
69
+ case this.modes.DateField:
70
+ this._readModelForDateField(filterString);
71
+ break;
72
+ case this.modes.DateRangeField:
73
+ this._readModelForDateRangeField(filterString);
74
+ break;
75
+ }
76
+ }
77
+ get model() {
78
+ return this._model;
39
79
  }
40
80
  ngOnInit() {
41
81
  this.setToInitialLimit();
42
82
  this.showButton = this.valueSelected();
83
+ this.checkBoxToTextModel = false;
43
84
  }
44
85
  setToInitialLimit() {
45
86
  this.limitTo = this.initialLimit;
@@ -62,17 +103,57 @@ export class FilterItemComponent {
62
103
  return ((_a = this.filteredCollection) === null || _a === void 0 ? void 0 : _a.length) <= this.limitTo && ((_b = this.filteredCollection) === null || _b === void 0 ? void 0 : _b.length) > this.initialLimit;
63
104
  }
64
105
  handleModelChange(model) {
65
- this.showButton = true;
66
- if (this.singleSelect) {
67
- this.collection.forEach(m => {
68
- if (m.code !== model.code && m.description !== model.description) {
69
- m.checked = false;
70
- }
71
- });
106
+ switch (this.mode) {
107
+ case this.modes.Filterlist:
108
+ this.showButton = true;
109
+ model.checked = !model.checked;
110
+ this._createModelForFilterList();
111
+ break;
112
+ case this.modes.SelectListWithStringCollectionOutput:
113
+ this.showButton = true;
114
+ model.checked = !model.checked;
115
+ this._createModelForStringCollectionList();
116
+ break;
117
+ case this.modes.SingleSelectList:
118
+ this.showButton = true;
119
+ this.uncheckForSingleSelect(model);
120
+ model.checked = !model.checked;
121
+ this._createModelForSingleSelectList();
122
+ break;
123
+ case this.modes.SelectListWithNumberOutput:
124
+ this.showButton = true;
125
+ model.checked = !model.checked;
126
+ this._createModelForSelectListWithNumberOutput();
127
+ break;
128
+ case this.modes.Slider:
129
+ this._createModelForSliderMode();
130
+ break;
131
+ case this.modes.CheckboxToText:
132
+ this._createModelForCheckboxToText();
133
+ break;
134
+ case this.modes.CheckboxToSimpleText:
135
+ this._createModelForCheckboxToSimpleText();
136
+ break;
137
+ case this.modes.CheckboxToBinary:
138
+ this._createModelForCheckboxToBinary();
139
+ break;
140
+ case this.modes.DateRangeField:
141
+ this._createModelForDateRange(model);
142
+ break;
143
+ case this.modes.TextField:
144
+ this._model = (typeof this._model === 'string' && this._model.length === 0) ? undefined : this._model;
145
+ break;
72
146
  }
73
- model.checked = !model.checked;
147
+ this.modelChange.emit(this._model);
74
148
  this.collectionChange.emit(this.collection);
75
149
  }
150
+ uncheckForSingleSelect(model) {
151
+ this.collection.forEach(m => {
152
+ if (m.code !== model.code && m.description !== model.description) {
153
+ m.checked = false;
154
+ }
155
+ });
156
+ }
76
157
  valueSelected() {
77
158
  if (this.collection) {
78
159
  return !!this.collection.find(c => c.checked);
@@ -114,6 +195,226 @@ export class FilterItemComponent {
114
195
  onButtonClicked() {
115
196
  this.filterButtonClicked.emit();
116
197
  }
198
+ /////////////////////////////////////////////////////////////
199
+ //Model creation for all of the different options available//
200
+ /////////////////////////////////////////////////////////////
201
+ _createModelForFilterList() {
202
+ let filterRange = [];
203
+ if (this.collection !== null && this.collection !== undefined) {
204
+ this.collection.forEach((viewModel) => {
205
+ if (viewModel.checked) {
206
+ filterRange.push(`?='${viewModel.code}'`);
207
+ }
208
+ });
209
+ if (filterRange.length > 0) {
210
+ this._model = filterRange.join(',');
211
+ }
212
+ else {
213
+ this._model = undefined;
214
+ }
215
+ }
216
+ }
217
+ _createModelForStringCollectionList() {
218
+ let filterRange = [];
219
+ this.collection.forEach((viewModel) => {
220
+ if (viewModel.checked) {
221
+ filterRange.push(viewModel.code.toString());
222
+ }
223
+ });
224
+ if (filterRange.length > 0) {
225
+ this._model = filterRange;
226
+ }
227
+ else {
228
+ this._model = undefined;
229
+ }
230
+ }
231
+ _createModelForSingleSelectList() {
232
+ let filterString = "";
233
+ this.collection.forEach((viewModel) => {
234
+ if (viewModel.checked) {
235
+ filterString = viewModel.code.toString();
236
+ }
237
+ });
238
+ if (filterString.length > 0) {
239
+ this._model = filterString;
240
+ }
241
+ else {
242
+ this._model = undefined;
243
+ }
244
+ }
245
+ _createModelForSelectListWithNumberOutput() {
246
+ let filterNumber = null;
247
+ this.collection.forEach((viewModel) => {
248
+ if (viewModel.checked) {
249
+ if (filterNumber == null) {
250
+ filterNumber = 0;
251
+ }
252
+ filterNumber += Number(viewModel.code);
253
+ }
254
+ });
255
+ this._model = filterNumber;
256
+ }
257
+ _createModelForSliderMode() {
258
+ this.sliderMin = !!this.sliderMin ? this.sliderMin : this.sliderDefaultMin;
259
+ this.sliderMax = !!this.sliderMax ? this.sliderMax : this.sliderDefaultMax;
260
+ let trueLowerBound = Math.min(this.sliderMin, this.sliderMax);
261
+ let trueUpperBound = Math.max(this.sliderMin, this.sliderMax);
262
+ this._model = `${trueLowerBound} - ${trueUpperBound}`;
263
+ }
264
+ _createModelForCheckboxToText() {
265
+ if (this.checkBoxToTextModel) {
266
+ this._model = "?='J'";
267
+ }
268
+ else {
269
+ this._model = "?='N'";
270
+ }
271
+ }
272
+ _createModelForCheckboxToSimpleText() {
273
+ if (this.checkBoxToTextModel) {
274
+ this._model = "J";
275
+ }
276
+ else {
277
+ this._model = "N";
278
+ }
279
+ }
280
+ _createModelForCheckboxToBinary() {
281
+ if (this.checkBoxToTextModel) {
282
+ this._model = 1;
283
+ }
284
+ else {
285
+ this._model = 0;
286
+ }
287
+ }
288
+ _createModelForDateRange(dates) {
289
+ if (dates) {
290
+ let startDate = dates[0];
291
+ let endDate = dates[1];
292
+ const startDateRequest = startDate ? this._formatDateToString(startDate) : '';
293
+ const endDateRequest = endDate ? this._formatDateToString(endDate) : '';
294
+ this._model = `?>=\'${startDateRequest}\'& ?<=\'${endDateRequest}\'`;
295
+ }
296
+ }
297
+ _formatDateToString(date) {
298
+ let day = date.getDate().toString().padStart(2, '0');
299
+ let month = (date.getMonth() + 1).toString().padStart(2, '0');
300
+ let year = date.getFullYear();
301
+ return `${day}-${month}-${year}`;
302
+ }
303
+ ////////////////////////////////////////////////////////////
304
+ //Model reading for all of the different options available//
305
+ ////////////////////////////////////////////////////////////
306
+ _readModelForFilterList(filterModel) {
307
+ let filterList = [];
308
+ let itemsToCheck = [];
309
+ this._uncheckAll();
310
+ this._model = filterModel;
311
+ if (filterModel !== null && filterModel !== undefined && typeof filterModel === 'string' && filterModel.length != 0 && this.collection !== null && this.collection !== undefined) {
312
+ filterList = filterModel.split(",");
313
+ filterList.forEach((filter) => {
314
+ itemsToCheck.push(filter.substr(3, filter.length - 4));
315
+ });
316
+ for (const item of itemsToCheck) {
317
+ let filter = this.collection.find(element => element.code.toString() === item);
318
+ if (filter !== null && filter !== undefined) {
319
+ filter.checked = true;
320
+ }
321
+ else {
322
+ filter.checked = false;
323
+ }
324
+ }
325
+ this._model = filterModel;
326
+ }
327
+ }
328
+ _readModelForSingleSelectList(singleSelectModel) {
329
+ this._uncheckAll();
330
+ this._model = singleSelectModel;
331
+ if (singleSelectModel !== null && singleSelectModel !== undefined && this.collection !== null && this.collection !== undefined) {
332
+ let filter = this.collection.find(element => element.code.toString() === singleSelectModel);
333
+ if (filter) {
334
+ filter.checked = true;
335
+ }
336
+ }
337
+ }
338
+ _readModelForStringCollectionList(collectionModel) {
339
+ this._uncheckAll();
340
+ this._model = collectionModel;
341
+ if (collectionModel !== null && collectionModel !== undefined && this.collection !== null && this.collection !== undefined) {
342
+ this.collection.forEach((viewModel) => {
343
+ if (collectionModel.indexOf(viewModel.code.toString()) > -1) {
344
+ viewModel.checked = true;
345
+ }
346
+ else {
347
+ viewModel.checked = false;
348
+ }
349
+ });
350
+ }
351
+ }
352
+ _readModelForSelectListWithNumberOutput(numberModel) {
353
+ this._uncheckAll();
354
+ this._model = numberModel;
355
+ if (numberModel !== null && numberModel !== undefined && this.collection !== null && this.collection !== undefined) {
356
+ for (const item of this.collection) {
357
+ const itemCode = item.code;
358
+ const modValue = (numberModel % (2 * itemCode));
359
+ item.checked = (modValue >= itemCode);
360
+ }
361
+ }
362
+ }
363
+ _uncheckAll() {
364
+ if (this.collection !== null && this.collection !== undefined) {
365
+ this.collection.forEach(m => {
366
+ m.checked = false;
367
+ });
368
+ }
369
+ }
370
+ _readModelForSliderMode(sliderModel) {
371
+ this._model = sliderModel;
372
+ if (sliderModel !== undefined && sliderModel !== null) {
373
+ let sliderInputCollection = sliderModel.split(' - ');
374
+ this.sliderMin = parseInt(sliderInputCollection[0]);
375
+ this.sliderMax = parseInt(sliderInputCollection[1]);
376
+ }
377
+ else {
378
+ this.sliderMin = this.sliderDefaultMin;
379
+ this.sliderMax = this.sliderDefaultMax;
380
+ }
381
+ }
382
+ _readModelForCheckboxToText(checkboxToTextModel) {
383
+ this._model = checkboxToTextModel;
384
+ if (checkboxToTextModel !== undefined && checkboxToTextModel !== null) {
385
+ this.checkBoxToTextModel = (checkboxToTextModel.indexOf('J') > -1);
386
+ }
387
+ else {
388
+ this.checkBoxToTextModel = false;
389
+ }
390
+ }
391
+ _readModelForCheckboxToBinary(checkboxToBinary) {
392
+ this._model = checkboxToBinary;
393
+ if (checkboxToBinary !== undefined && checkboxToBinary !== null) {
394
+ this.checkBoxToTextModel = (checkboxToBinary >= 1);
395
+ }
396
+ else {
397
+ this.checkBoxToTextModel = false;
398
+ }
399
+ }
400
+ _readModelForDateField(dateFieldModel) {
401
+ this._model = dateFieldModel;
402
+ if (dateFieldModel !== undefined && dateFieldModel !== null) {
403
+ this._model = new Date(dateFieldModel);
404
+ }
405
+ }
406
+ _readModelForDateRangeField(dateRangeFieldModel) {
407
+ this._model = dateRangeFieldModel;
408
+ if (dateRangeFieldModel !== undefined && dateRangeFieldModel !== null) {
409
+ let dateCollection = dateRangeFieldModel.split('&');
410
+ let startString = dateCollection[0].trim().substr(4, dateCollection[0].length - 5);
411
+ let endString = dateCollection[1].trim().substr(4, dateCollection[1].length - 5);
412
+ let startDateComponents = startString.split('-');
413
+ let endDateComponents = endString.split('-');
414
+ this.dateRangeStart = new Date(parseInt(startDateComponents[2]), parseInt(startDateComponents[1]) - 1, parseInt(startDateComponents[0]));
415
+ this.dateRangeEnd = new Date(parseInt(endDateComponents[2]), parseInt(endDateComponents[1]) - 1, parseInt(endDateComponents[0]));
416
+ }
417
+ }
117
418
  }
118
419
  FilterItemComponent.decorators = [
119
420
  { type: Component, args: [{
@@ -135,7 +436,8 @@ FilterItemComponent.decorators = [
135
436
  <ng-content></ng-content>
136
437
  </div>
137
438
  <ng-template #collectionContent>
138
- <div class="co-filter-item-collection-content">
439
+ <div class="co-filter-item-collection-content" *ngIf="mode === modes.Filterlist || mode === modes.SingleSelectList
440
+ || mode === modes.SelectListWithNumberOutput || mode === modes.SelectListWithStringCollectionOutput">
139
441
  <co-input-text
140
442
  *ngIf="collection?.length > 10 || minSearchCharsToLoadCollection"
141
443
  [placeholder]="searchPlaceholder"
@@ -150,13 +452,13 @@ FilterItemComponent.decorators = [
150
452
  <ng-container
151
453
  *ngFor="let option of filteredCollection; let index = index">
152
454
  <div class="co-filter-item-collection-result-item" *ngIf="index < limitTo || showAllResults">
153
- <co-input-checkbox *ngIf="!singleSelect"
455
+ <co-input-checkbox *ngIf="mode !== modes.SingleSelectList"
154
456
  [label]="option.description"
155
457
  [model]="option.checked"
156
458
  [clickableLabel]="false"
157
459
  (modelChange)="handleModelChange(option)"
158
460
  ></co-input-checkbox>
159
- <co-input-radio-button *ngIf="singleSelect"
461
+ <co-input-radio-button *ngIf="mode === modes.SingleSelectList"
160
462
  [label]="option.description"
161
463
  [model]="option.checked"
162
464
  (modelChange)="handleModelChange(option)"
@@ -185,6 +487,57 @@ FilterItemComponent.decorators = [
185
487
  </div>
186
488
  </div>
187
489
  </div>
490
+ <div class="co-filter-item-slider-content" *ngIf="mode === modes.Slider">
491
+ <co-input-text
492
+ class="slider-from"
493
+ [type]="'number'"
494
+ [digitsOnly]="true"
495
+ [hideArrowButtons]="true"
496
+ [excludePlusMinus]="true"
497
+ [label]="'FROM' | localize"
498
+ [(model)]="sliderMin"
499
+ (modelChange)="handleModelChange($event)"
500
+ ></co-input-text>
501
+ <co-input-text
502
+ class="slider-to"
503
+ [type]="'number'"
504
+ [digitsOnly]="true"
505
+ [hideArrowButtons]="true"
506
+ [excludePlusMinus]="true"
507
+ [label]="'TO' | localize"
508
+ [(model)]="sliderMax"
509
+ (modelChange)="handleModelChange($event)"
510
+ ></co-input-text>
511
+ </div>
512
+ <div class="co-filter-item-checkbox-content" *ngIf="mode === modes.Checkbox ">
513
+ <co-input-checkbox
514
+ [(model)]="model"
515
+ (modelChange)="handleModelChange($event)"></co-input-checkbox>
516
+ </div>
517
+ <div class="co-filter-item-checkbox-content"
518
+ *ngIf="mode === modes.CheckboxToText || mode === modes.CheckboxToSimpleText || mode === modes.CheckboxToBinary">
519
+ <co-input-checkbox
520
+ [(model)]="checkBoxToTextModel"
521
+ (modelChange)="handleModelChange($event)"></co-input-checkbox>
522
+ </div>
523
+ <div class="co-filter-item-textfield-content" *ngIf="mode === modes.TextField">
524
+ <co-input-text
525
+ [(model)]="model"
526
+ (modelChange)="handleModelChange($event)"></co-input-text>
527
+ </div>
528
+ <div class="co-filter-item-dateField-content" *ngIf="mode === modes.DateField">
529
+ <co-input-date
530
+ [(model)]="model"
531
+ (modelChange)="handleModelChange($event)"
532
+ ></co-input-date>
533
+ </div>
534
+ <div class="co-filter-item-dateField-content" *ngIf="mode === modes.DateRangeField">
535
+ <co-input-date-range
536
+ [model]="[dateRangeStart, dateRangeEnd]"
537
+ (modelChange)="handleModelChange($event)"
538
+ [placeholder]="'SELECT_DATE' | localize">
539
+ </co-input-date-range>
540
+ </div>
188
541
  </ng-template>
189
542
  </div>
190
543
  </co-collapsible>
@@ -196,9 +549,11 @@ FilterItemComponent.decorators = [
196
549
  },] }
197
550
  ];
198
551
  FilterItemComponent.ctorParameters = () => [
199
- { type: IconCacheService }
552
+ { type: IconCacheService },
553
+ { type: ChangeDetectorRef }
200
554
  ];
201
555
  FilterItemComponent.propDecorators = {
556
+ mode: [{ type: Input }],
202
557
  collection: [{ type: Input }],
203
558
  placeholder: [{ type: Input }],
204
559
  initialLimit: [{ type: Input }],
@@ -207,14 +562,17 @@ FilterItemComponent.propDecorators = {
207
562
  collectionLoadFn: [{ type: Input }],
208
563
  customContent: [{ type: Input }],
209
564
  showAllResults: [{ type: Input }],
210
- singleSelect: [{ type: Input }],
211
565
  filterButtonLabel: [{ type: Input }],
212
566
  searchPlaceholder: [{ type: Input }],
213
567
  showMoreLabel: [{ type: Input }],
214
568
  showLessLabel: [{ type: Input }],
215
569
  noResultsLabel: [{ type: Input }],
570
+ sliderDefaultMin: [{ type: Input }],
571
+ sliderDefaultMax: [{ type: Input }],
572
+ model: [{ type: Input }],
573
+ modelChange: [{ type: Output }],
216
574
  collectionChange: [{ type: Output }],
217
575
  filterButtonClicked: [{ type: Output }],
218
- showClass: [{ type: HostBinding, args: ["class.co-filter-item",] }]
576
+ filteredCollection: [{ type: HostBinding, args: ["class.co-filter-item",] }]
219
577
  };
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci1pdGVtL2ZpbHRlci1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEksT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFnRjVELE1BQU0sT0FBTyxtQkFBbUI7SUF3RTlCLFlBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQXZFekMsVUFBSyxHQUE4QixrQkFBa0IsQ0FBQztRQWdCdEQsaUJBQVksR0FBVyxFQUFFLENBQUM7UUFHMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQVFqQyw0R0FBNEc7UUFFckcsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFFdEMsbUhBQW1IO1FBRTVHLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBR2hDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzlCLHNCQUFpQixHQUFXLFFBQVEsQ0FBQztRQUdyQyxzQkFBaUIsR0FBVyxXQUFXLENBQUM7UUFHeEMsa0JBQWEsR0FBVyxXQUFXLENBQUM7UUFHcEMsa0JBQWEsR0FBVyxXQUFXLENBQUM7UUFHcEMsbUJBQWMsR0FBVyxZQUFZLENBQUM7UUFHdEMscUJBQWdCLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFHOUQsd0JBQW1CLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFPbkUsdUJBQWtCLEdBQTBCLEVBQUUsQ0FBQztR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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3RVQ7Z0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7Z0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7WUEvRU8sZ0JBQWdCOzs7eUJBbUZyQixLQUFLOzBCQVVMLEtBQUs7MkJBR0wsS0FBSzt1QkFHTCxLQUFLOzZDQUdMLEtBQUs7K0JBR0wsS0FBSzs0QkFJTCxLQUFLOzZCQUlMLEtBQUs7MkJBR0wsS0FBSztnQ0FHTCxLQUFLO2dDQUdMLEtBQUs7NEJBR0wsS0FBSzs0QkFHTCxLQUFLOzZCQUdMLEtBQUs7K0JBR0wsTUFBTTtrQ0FHTixNQUFNO3dCQUdOLFdBQVcsU0FBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0NvcmVDb21wb25lbnRzSWNvbn0gZnJvbSAnLi4vLi4vY29yZS9lbnVtL2NvcmUtY29tcG9uZW50cy1pY29uLmVudW0nO1xyXG5pbXBvcnQge0ZpbHRlckl0ZW1WaWV3bW9kZWx9IGZyb20gJy4vZmlsdGVyLWl0ZW0tdmlld21vZGVsJztcclxuaW1wb3J0IHtJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi9pY29uL2ljb24tY2FjaGUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJjby1maWx0ZXItaXRlbVwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0taGVhZGVyXCI+XHJcbiAgICAgIDxjby1jb2xsYXBzaWJsZVxyXG4gICAgICAgIFtoZWFkZXJUaXRsZV09XCJwbGFjZWhvbGRlclwiXHJcbiAgICAgICAgW2V4cGFuZEJ1dHRvbkxhc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgW2ljb25EYXRhXT1cImljb25TZXJ2aWNlLmdldEljb24oaWNvbnMuQXJyb3dQb2ludERvd24pXCJcclxuICAgICAgICBbZXhwYW5kZWRdPVwiZXhwYW5kZWRcIlxyXG4gICAgICAgIFtzaG93QnV0dG9uXT1cInNob3dCdXR0b25cIlxyXG4gICAgICAgIFtidXR0b25UZXh0XT1cImZpbHRlckJ1dHRvbkxhYmVsXCJcclxuICAgICAgICAoYnV0dG9uQ2xpY2tlZCk9XCJvbkJ1dHRvbkNsaWNrZWQoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY29sbGFwc2FibGUtY29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1pdGVtLWN1c3RvbS1jb250ZW50XCIgKm5nSWY9XCJjdXN0b21Db250ZW50OyBlbHNlIGNvbGxlY3Rpb25Db250ZW50XCJcclxuICAgICAgICAgICAgICAgKGtleWRvd24pPVwic2hvd0J1dHRvbj10cnVlXCIgKG1vdXNlZG93bik9XCJzaG93QnV0dG9uPXRydWVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NvbGxlY3Rpb25Db250ZW50PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY29sbGVjdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LXRleHRcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sbGVjdGlvbj8ubGVuZ3RoID4gMTAgfHwgbWluU2VhcmNoQ2hhcnNUb0xvYWRDb2xsZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICBbbW9kZWxdPVwiZmlsdGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiYXBwbHlGaWx0ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvY28taW5wdXQtdGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm8tcmVzdWx0c1wiICpuZ0lmPVwiZmlsdGVyZWRDb2xsZWN0aW9uPy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJub1Jlc3VsdHNMYWJlbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY29sbGVjdGlvbi1yZXN1bHRzXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRDb2xsZWN0aW9uOyBsZXQgaW5kZXggPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY29sbGVjdGlvbi1yZXN1bHQtaXRlbVwiICpuZ0lmPVwiaW5kZXggPCBsaW1pdFRvIHx8IHNob3dBbGxSZXN1bHRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNvLWlucHV0LWNoZWNrYm94ICpuZ0lmPVwiIXNpbmdsZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJvcHRpb24uZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwib3B0aW9uLmNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xpY2thYmxlTGFiZWxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlTW9kZWxDaGFuZ2Uob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvY28taW5wdXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNvLWlucHV0LXJhZGlvLWJ1dHRvbiAqbmdJZj1cInNpbmdsZVNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0aW9uLmRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlTW9kZWxDaGFuZ2Uob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvY28taW5wdXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1hbW91bnRcIiAqbmdJZj1cIm9wdGlvbi5jb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwib3B0aW9uLmNvdW50LnRvU3RyaW5nKCkgfCBhcHBlbmQ6ICcpJyB8IHByZXBlbmQ6ICcgICAgICAoJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLXNob3ctbW9yZS1vci1sZXNzXCIgKm5nSWY9XCIhc2hvd0FsbFJlc3VsdHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItc2hvdy1tb3JlIGNsaWNrYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibW9yZVRvU2hvdygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJpbmNyZWFzZUxpbWl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taWNvbiBbaWNvbkRhdGFdPVwiaWNvblNlcnZpY2UuZ2V0SWNvbihpY29ucy5BcnJvd1BvaW50RG93bilcIj48L2NvLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RleHRDb250ZW50XT1cInNob3dNb3JlTGFiZWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1zaG93LWxlc3MgY2xpY2thYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsZXNzVG9TaG93KClcIj5cclxuICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNldFRvSW5pdGlhbExpbWl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taWNvbiBbaWNvbkRhdGFdPVwiaWNvblNlcnZpY2UuZ2V0SWNvbihpY29ucy5BcnJvd1BvaW50VXApXCI+PC9jby1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzaG93TGVzc0xhYmVsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2NvLWNvbGxhcHNpYmxlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIGAsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVySXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHVibGljIGljb25zOiB0eXBlb2YgQ29yZUNvbXBvbmVudHNJY29uID0gQ29yZUNvbXBvbmVudHNJY29uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY29sbGVjdGlvbih2YWx1ZTogRmlsdGVySXRlbVZpZXdtb2RlbFtdKSB7XHJcbiAgICB0aGlzLl9jb2xsZWN0aW9uID0gdmFsdWU7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb24/LnNsaWNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbGxlY3Rpb24oKTogRmlsdGVySXRlbVZpZXdtb2RlbFtdIHtcclxuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaW5pdGlhbExpbWl0OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbWluU2VhcmNoQ2hhcnNUb0xvYWRDb2xsZWN0aW9uOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGNvbGxlY3Rpb25Mb2FkRm46IEZ1bmN0aW9uO1xyXG5cclxuICAvLyBTZXQgdG8gZmFsc2UgdG8gdXNlIGZpbHRlciBpdGVtIHdpdGggYSBtdWx0aSBzZWxlY3RhYmxlIGNvbGxlY3Rpb24uIFNldCB0byB0cnVlIHRvIHNwZWNpZnkgY3VzdG9tIGNvbnRlbnRcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21Db250ZW50OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIFNldCB0byB0cnVlIHRvIHNob3cgYWxsIHJlc3VsdHMuIFNldCB0byBmYWxzZSB0byBnZXQgJ3Nob3cgbW9yZScgYW5kICdzaG93IGxlc3MnIGJ1dHRvbnMgdG8gZXhwYW5kIGFuZCBjb250cmFjdC5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93QWxsUmVzdWx0czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaW5nbGVTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZmlsdGVyQnV0dG9uTGFiZWw6IHN0cmluZyA9IFwiU2VhcmNoXCI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoLi4uJztcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd01vcmVMYWJlbDogc3RyaW5nID0gJ1Nob3cgbW9yZSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dMZXNzTGFiZWw6IHN0cmluZyA9ICdTaG93IGxlc3MnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBub1Jlc3VsdHNMYWJlbDogc3RyaW5nID0gXCJObyByZXN1bHRzXCI7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBjb2xsZWN0aW9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgZmlsdGVyQnV0dG9uQ2xpY2tlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5jby1maWx0ZXItaXRlbVwiKVxyXG4gIHB1YmxpYyBzaG93Q2xhc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJlZENvbGxlY3Rpb246IEZpbHRlckl0ZW1WaWV3bW9kZWxbXSA9IFtdO1xyXG4gIHB1YmxpYyBsaW1pdFRvOiBudW1iZXIgPSAxMDtcclxuICBwdWJsaWMgZmlsdGVyVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgc2hvd0J1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9jb2xsZWN0aW9uOiBGaWx0ZXJJdGVtVmlld21vZGVsW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGljb25TZXJ2aWNlOiBJY29uQ2FjaGVTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFRvSW5pdGlhbExpbWl0KCk7XHJcbiAgICB0aGlzLnNob3dCdXR0b24gPSB0aGlzLnZhbHVlU2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRUb0luaXRpYWxMaW1pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubGltaXRUbyA9IHRoaXMuaW5pdGlhbExpbWl0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluY3JlYXNlTGltaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpbWl0VG8gKz0gMTA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW9yZVRvU2hvdygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLnNob3dBbGxSZXN1bHRzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbj8ubGVuZ3RoID4gdGhpcy5saW1pdFRvO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxlc3NUb1Nob3coKSB7XHJcbiAgICBpZiAodGhpcy5zaG93QWxsUmVzdWx0cykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENvbGxlY3Rpb24/Lmxlbmd0aCA8PSB0aGlzLmxpbWl0VG8gJiYgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb24/Lmxlbmd0aCA+IHRoaXMuaW5pdGlhbExpbWl0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZU1vZGVsQ2hhbmdlKG1vZGVsOiBGaWx0ZXJJdGVtVmlld21vZGVsKSB7XHJcbiAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2luZ2xlU2VsZWN0KSB7XHJcbiAgICAgIHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgIGlmIChtLmNvZGUgIT09IG1vZGVsLmNvZGUgJiYgbS5kZXNjcmlwdGlvbiAhPT0gbW9kZWwuZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgIG0uY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBtb2RlbC5jaGVja2VkID0gIW1vZGVsLmNoZWNrZWQ7XHJcbiAgICB0aGlzLmNvbGxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmNvbGxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHZhbHVlU2VsZWN0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiAhIXRoaXMuY29sbGVjdGlvbi5maW5kKGMgPT4gYy5jaGVja2VkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGxpZXMgZmlsdGVyIHRvIHRoZSBjb2xsZWN0aW9uLlxyXG4gIHB1YmxpYyBhc3luYyBhcHBseUZpbHRlcih0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPFtdPiB7XHJcbiAgICBpZiAoIWlzTmFOKHRoaXMubWluU2VhcmNoQ2hhcnNUb0xvYWRDb2xsZWN0aW9uKSAmJiB0aGlzLmNvbGxlY3Rpb25Mb2FkRm4pIHtcclxuICAgICAgaWYgKHRleHQubGVuZ3RoID09PSB0aGlzLm1pblNlYXJjaENoYXJzVG9Mb2FkQ29sbGVjdGlvbiAmJiB0ZXh0Lmxlbmd0aCA+IHRoaXMuZmlsdGVyVGV4dC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25Mb2FkRm4odGV4dCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPCB0aGlzLm1pblNlYXJjaENoYXJzVG9Mb2FkQ29sbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gdGV4dDtcclxuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJUZXh0OiBzdHJpbmcgPSB0aGlzLmZpbHRlclRleHQ/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGxldCBmaWx0ZXJlZEl0ZW1Db3VudDogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uPy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgbGFiZWxUZXh0OiBzdHJpbmcgPSBpdGVtLmRlc2NyaXB0aW9uPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGlzSGlkZGVuQnlGaWx0ZXI6IGJvb2xlYW4gPSAobGFiZWxUZXh0Py5pbmRleE9mKGZpbHRlclRleHQpID09PSAtMSk7XHJcbiAgICAgIGlmIChpc0hpZGRlbkJ5RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbHRlcmVkSXRlbUNvdW50Kys7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyQnV0dG9uQ2xpY2tlZC5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
578
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci1pdGVtL2ZpbHRlci1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLGlCQUFpQixFQUMxQyxTQUFTLEVBQ1QsWUFBWSxFQUFFLFdBQVcsRUFDekIsS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBb0lwRSxNQUFNLE9BQU8sbUJBQW1CO0lBbUk5QixZQUFtQixXQUE2QixFQUM1QixlQUFrQztRQURuQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBbkkvQyxVQUFLLEdBQThCLGtCQUFrQixDQUFDO1FBQ3RELFVBQUssR0FBMEIsY0FBYyxDQUFDO1FBRzlDLFNBQUksR0FBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFrQjdDLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBRzFCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFRakMsNEdBQTRHO1FBRXJHLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRXRDLG1IQUFtSDtRQUU1RyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUdoQyxzQkFBaUIsR0FBVyxRQUFRLENBQUM7UUFHckMsc0JBQWlCLEdBQVcsV0FBVyxDQUFDO1FBR3hDLGtCQUFhLEdBQVcsV0FBVyxDQUFDO1FBR3BDLGtCQUFhLEdBQVcs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VyxTQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDb3JlQ29tcG9uZW50c0ljb259IGZyb20gJy4uLy4uL2NvcmUvZW51bS9jb3JlLWNvbXBvbmVudHMtaWNvbi5lbnVtJztcclxuaW1wb3J0IHtGaWx0ZXJJdGVtVmlld21vZGVsfSBmcm9tICcuL2ZpbHRlci1pdGVtLXZpZXdtb2RlbCc7XHJcbmltcG9ydCB7SWNvbkNhY2hlU2VydmljZX0gZnJvbSAnLi4vaWNvbi9pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0ZpbHRlckl0ZW1Nb2RlfSBmcm9tICcuLi8uLi9jb3JlL2VudW0vZmlsdGVySXRlbS1tb2RlLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiY28tZmlsdGVyLWl0ZW1cIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1pdGVtLWhlYWRlclwiPlxyXG4gICAgICA8Y28tY29sbGFwc2libGVcclxuICAgICAgICBbaGVhZGVyVGl0bGVdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFtleHBhbmRCdXR0b25MYXN0XT1cInRydWVcIlxyXG4gICAgICAgIFtpY29uRGF0YV09XCJpY29uU2VydmljZS5nZXRJY29uKGljb25zLkFycm93UG9pbnREb3duKVwiXHJcbiAgICAgICAgW2V4cGFuZGVkXT1cImV4cGFuZGVkXCJcclxuICAgICAgICBbc2hvd0J1dHRvbl09XCJzaG93QnV0dG9uXCJcclxuICAgICAgICBbYnV0dG9uVGV4dF09XCJmaWx0ZXJCdXR0b25MYWJlbFwiXHJcbiAgICAgICAgKGJ1dHRvbkNsaWNrZWQpPVwib25CdXR0b25DbGlja2VkKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1pdGVtLWNvbGxhcHNhYmxlLWNvbnRlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1jdXN0b20tY29udGVudFwiICpuZ0lmPVwiY3VzdG9tQ29udGVudDsgZWxzZSBjb2xsZWN0aW9uQ29udGVudFwiXHJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cInNob3dCdXR0b249dHJ1ZVwiIChtb3VzZWRvd24pPVwic2hvd0J1dHRvbj10cnVlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjb2xsZWN0aW9uQ29udGVudD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1pdGVtLWNvbGxlY3Rpb24tY29udGVudFwiICpuZ0lmPVwibW9kZSA9PT0gbW9kZXMuRmlsdGVybGlzdCB8fCBtb2RlID09PSBtb2Rlcy5TaW5nbGVTZWxlY3RMaXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09PSBtb2Rlcy5TZWxlY3RMaXN0V2l0aE51bWJlck91dHB1dCB8fCBtb2RlID09PSBtb2Rlcy5TZWxlY3RMaXN0V2l0aFN0cmluZ0NvbGxlY3Rpb25PdXRwdXRcIj5cclxuICAgICAgICAgICAgICA8Y28taW5wdXQtdGV4dFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2xsZWN0aW9uPy5sZW5ndGggPiAxMCB8fCBtaW5TZWFyY2hDaGFyc1RvTG9hZENvbGxlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgIFttb2RlbF09XCJmaWx0ZXJUZXh0XCJcclxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJhcHBseUZpbHRlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9jby1pbnB1dC10ZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1yZXN1bHRzXCIgKm5nSWY9XCJmaWx0ZXJlZENvbGxlY3Rpb24/Lmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gW3RleHRDb250ZW50XT1cIm5vUmVzdWx0c0xhYmVsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1jb2xsZWN0aW9uLXJlc3VsdHNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZENvbGxlY3Rpb247IGxldCBpbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1jb2xsZWN0aW9uLXJlc3VsdC1pdGVtXCIgKm5nSWY9XCJpbmRleCA8IGxpbWl0VG8gfHwgc2hvd0FsbFJlc3VsdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taW5wdXQtY2hlY2tib3ggKm5nSWY9XCJtb2RlICE9PSBtb2Rlcy5TaW5nbGVTZWxlY3RMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVMYWJlbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJoYW5kbGVNb2RlbENoYW5nZShvcHRpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9jby1pbnB1dC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taW5wdXQtcmFkaW8tYnV0dG9uICpuZ0lmPVwibW9kZSA9PT0gbW9kZXMuU2luZ2xlU2VsZWN0TGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0aW9uLmRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvcHRpb24uY2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlTW9kZWxDaGFuZ2Uob3B0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvY28taW5wdXQtcmFkaW8tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1hbW91bnRcIiAqbmdJZj1cIm9wdGlvbi5jb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dENvbnRlbnRdPVwib3B0aW9uLmNvdW50LnRvU3RyaW5nKCkgfCBhcHBlbmQ6ICcpJyB8IHByZXBlbmQ6ICcgICAgICAoJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLXNob3ctbW9yZS1vci1sZXNzXCIgKm5nSWY9XCIhc2hvd0FsbFJlc3VsdHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItc2hvdy1tb3JlIGNsaWNrYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibW9yZVRvU2hvdygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxhIChjbGljayk9XCJpbmNyZWFzZUxpbWl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taWNvbiBbaWNvbkRhdGFdPVwiaWNvblNlcnZpY2UuZ2V0SWNvbihpY29ucy5BcnJvd1BvaW50RG93bilcIj48L2NvLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gW3RleHRDb250ZW50XT1cInNob3dNb3JlTGFiZWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1zaG93LWxlc3MgY2xpY2thYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsZXNzVG9TaG93KClcIj5cclxuICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNldFRvSW5pdGlhbExpbWl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y28taWNvbiBbaWNvbkRhdGFdPVwiaWNvblNlcnZpY2UuZ2V0SWNvbihpY29ucy5BcnJvd1BvaW50VXApXCI+PC9jby1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJzaG93TGVzc0xhYmVsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS1zbGlkZXItY29udGVudFwiICpuZ0lmPVwibW9kZSA9PT0gbW9kZXMuU2xpZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LXRleHRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2xpZGVyLWZyb21cIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxyXG4gICAgICAgICAgICAgICAgW2RpZ2l0c09ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZUFycm93QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtleGNsdWRlUGx1c01pbnVzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidGUk9NJyB8IGxvY2FsaXplXCJcclxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cInNsaWRlck1pblwiXHJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgPjwvY28taW5wdXQtdGV4dD5cclxuICAgICAgICAgICAgICA8Y28taW5wdXQtdGV4dFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbGlkZXItdG9cIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxyXG4gICAgICAgICAgICAgICAgW2RpZ2l0c09ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbaGlkZUFycm93QnV0dG9uc109XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtleGNsdWRlUGx1c01pbnVzXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidUTycgfCBsb2NhbGl6ZVwiXHJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJzbGlkZXJNYXhcIlxyXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImhhbmRsZU1vZGVsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgID48L2NvLWlucHV0LXRleHQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY2hlY2tib3gtY29udGVudFwiICpuZ0lmPVwibW9kZSA9PT0gbW9kZXMuQ2hlY2tib3ggXCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJtb2RlbFwiXHJcbiAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwiaGFuZGxlTW9kZWxDaGFuZ2UoJGV2ZW50KVwiPjwvY28taW5wdXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tY2hlY2tib3gtY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgKm5nSWY9XCJtb2RlID09PSBtb2Rlcy5DaGVja2JveFRvVGV4dCB8fCBtb2RlID09PSBtb2Rlcy5DaGVja2JveFRvU2ltcGxlVGV4dCB8fCBtb2RlID09PSBtb2Rlcy5DaGVja2JveFRvQmluYXJ5XCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBbKG1vZGVsKV09XCJjaGVja0JveFRvVGV4dE1vZGVsXCJcclxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJoYW5kbGVNb2RlbENoYW5nZSgkZXZlbnQpXCI+PC9jby1pbnB1dC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjby1maWx0ZXItaXRlbS10ZXh0ZmllbGQtY29udGVudFwiICpuZ0lmPVwibW9kZSA9PT0gbW9kZXMuVGV4dEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LXRleHRcclxuICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cIm1vZGVsXCJcclxuICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJoYW5kbGVNb2RlbENoYW5nZSgkZXZlbnQpXCI+PC9jby1pbnB1dC10ZXh0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvLWZpbHRlci1pdGVtLWRhdGVGaWVsZC1jb250ZW50XCIgKm5nSWY9XCJtb2RlID09PSBtb2Rlcy5EYXRlRmllbGRcIj5cclxuICAgICAgICAgICAgICA8Y28taW5wdXQtZGF0ZVxyXG4gICAgICAgICAgICAgICAgWyhtb2RlbCldPVwibW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImhhbmRsZU1vZGVsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgID48L2NvLWlucHV0LWRhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY28tZmlsdGVyLWl0ZW0tZGF0ZUZpZWxkLWNvbnRlbnRcIiAqbmdJZj1cIm1vZGUgPT09IG1vZGVzLkRhdGVSYW5nZUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPGNvLWlucHV0LWRhdGUtcmFuZ2VcclxuICAgICAgICAgICAgICAgIFttb2RlbF09XCJbZGF0ZVJhbmdlU3RhcnQsIGRhdGVSYW5nZUVuZF1cIlxyXG4gICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cImhhbmRsZU1vZGVsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTRUxFQ1RfREFURScgfCBsb2NhbGl6ZVwiPlxyXG4gICAgICAgICAgICAgIDwvY28taW5wdXQtZGF0ZS1yYW5nZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2NvLWNvbGxhcHNpYmxlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIGAsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVySXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHVibGljIGljb25zOiB0eXBlb2YgQ29yZUNvbXBvbmVudHNJY29uID0gQ29yZUNvbXBvbmVudHNJY29uO1xyXG4gIHB1YmxpYyBtb2RlczogdHlwZW9mIEZpbHRlckl0ZW1Nb2RlID0gRmlsdGVySXRlbU1vZGU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1vZGU6IEZpbHRlckl0ZW1Nb2RlID0gdGhpcy5tb2Rlcy5GaWx0ZXJsaXN0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY29sbGVjdGlvbih2YWx1ZTogRmlsdGVySXRlbVZpZXdtb2RlbFtdKSB7XHJcbiAgICB0aGlzLl9jb2xsZWN0aW9uID0gdmFsdWU7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbiA9IHRoaXMuX2NvbGxlY3Rpb24/LnNsaWNlKCk7XHJcbiAgICAvL3Jlc2V0IHRoZSBtb2RlbCBpbiBjYXNlIHRoZXJlIHdhcyBubyBjb2xsZWN0aW9uIHRvIHNldCBpdHMgdmFsdWVzIG9uIHdoZW4gaXQgd2FzIHNldC5cclxuICAgIHRoaXMubW9kZWwgPSB0aGlzLl9tb2RlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29sbGVjdGlvbigpOiBGaWx0ZXJJdGVtVmlld21vZGVsW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBpbml0aWFsTGltaXQ6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBleHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBtaW5TZWFyY2hDaGFyc1RvTG9hZENvbGxlY3Rpb246IG51bWJlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY29sbGVjdGlvbkxvYWRGbjogRnVuY3Rpb247XHJcblxyXG4gIC8vIFNldCB0byBmYWxzZSB0byB1c2UgZmlsdGVyIGl0ZW0gd2l0aCBhIG11bHRpIHNlbGVjdGFibGUgY29sbGVjdGlvbi4gU2V0IHRvIHRydWUgdG8gc3BlY2lmeSBjdXN0b20gY29udGVudFxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGN1c3RvbUNvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gU2V0IHRvIHRydWUgdG8gc2hvdyBhbGwgcmVzdWx0cy4gU2V0IHRvIGZhbHNlIHRvIGdldCAnc2hvdyBtb3JlJyBhbmQgJ3Nob3cgbGVzcycgYnV0dG9ucyB0byBleHBhbmQgYW5kIGNvbnRyYWN0LlxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dBbGxSZXN1bHRzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGZpbHRlckJ1dHRvbkxhYmVsOiBzdHJpbmcgPSBcIlNlYXJjaFwiO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaC4uLic7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNob3dNb3JlTGFiZWw6IHN0cmluZyA9ICdTaG93IG1vcmUnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzaG93TGVzc0xhYmVsOiBzdHJpbmcgPSAnU2hvdyBsZXNzJztcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbm9SZXN1bHRzTGFiZWw6IHN0cmluZyA9IFwiTm8gcmVzdWx0c1wiO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzbGlkZXJEZWZhdWx0TWluOiBudW1iZXIgPSAwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzbGlkZXJEZWZhdWx0TWF4OiBudW1iZXIgPSAxMDAwMDA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHNldCBtb2RlbChmaWx0ZXJTdHJpbmc6IGFueSkge1xyXG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcclxuICAgICAgY2FzZSB0aGlzLm1vZGVzLkZpbHRlcmxpc3Q6XHJcbiAgICAgICAgdGhpcy5fcmVhZE1vZGVsRm9yRmlsdGVyTGlzdChmaWx0ZXJTdHJpbmcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuU2luZ2xlU2VsZWN0TGlzdDpcclxuICAgICAgICB0aGlzLl9yZWFkTW9kZWxGb3JTaW5nbGVTZWxlY3RMaXN0KGZpbHRlclN0cmluZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5TZWxlY3RMaXN0V2l0aFN0cmluZ0NvbGxlY3Rpb25PdXRwdXQ6XHJcbiAgICAgICAgdGhpcy5fcmVhZE1vZGVsRm9yU3RyaW5nQ29sbGVjdGlvbkxpc3QoZmlsdGVyU3RyaW5nKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSB0aGlzLm1vZGVzLlNlbGVjdExpc3RXaXRoTnVtYmVyT3V0cHV0OlxyXG4gICAgICAgIHRoaXMuX3JlYWRNb2RlbEZvclNlbGVjdExpc3RXaXRoTnVtYmVyT3V0cHV0KGZpbHRlclN0cmluZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5TbGlkZXI6XHJcbiAgICAgICAgdGhpcy5fcmVhZE1vZGVsRm9yU2xpZGVyTW9kZShmaWx0ZXJTdHJpbmcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuQ2hlY2tib3hUb1RleHQ6XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5DaGVja2JveFRvU2ltcGxlVGV4dDpcclxuICAgICAgICB0aGlzLl9yZWFkTW9kZWxGb3JDaGVja2JveFRvVGV4dChmaWx0ZXJTdHJpbmcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuQ2hlY2tib3hUb0JpbmFyeTpcclxuICAgICAgICB0aGlzLl9yZWFkTW9kZWxGb3JDaGVja2JveFRvQmluYXJ5KGZpbHRlclN0cmluZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5EYXRlRmllbGQ6XHJcbiAgICAgICAgdGhpcy5fcmVhZE1vZGVsRm9yRGF0ZUZpZWxkKGZpbHRlclN0cmluZyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5EYXRlUmFuZ2VGaWVsZDpcclxuICAgICAgICB0aGlzLl9yZWFkTW9kZWxGb3JEYXRlUmFuZ2VGaWVsZChmaWx0ZXJTdHJpbmcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtb2RlbCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIG1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgY29sbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPEZpbHRlckl0ZW1WaWV3bW9kZWxbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckl0ZW1WaWV3bW9kZWxbXT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGZpbHRlckJ1dHRvbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuY28tZmlsdGVyLWl0ZW1cIilcclxuXHJcbiAgcHVibGljIGZpbHRlcmVkQ29sbGVjdGlvbjogRmlsdGVySXRlbVZpZXdtb2RlbFtdID0gW107XHJcbiAgcHVibGljIGxpbWl0VG86IG51bWJlciA9IDEwO1xyXG4gIHB1YmxpYyBmaWx0ZXJUZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gIHB1YmxpYyBzaG93QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vbW9kZWxzIGZvciB0aGUgc2xpZGVyIGZpZWxkIGlucHV0c1xyXG4gIHB1YmxpYyBzbGlkZXJNaW46IG51bWJlcjtcclxuICBwdWJsaWMgc2xpZGVyTWF4OiBudW1iZXI7XHJcblxyXG4gIC8vbW9kZWxzIGZvciB0aCBkYXRlcmFuZ2UgaW5wdXRcclxuICBwdWJsaWMgZGF0ZVJhbmdlU3RhcnQ6IERhdGU7XHJcbiAgcHVibGljIGRhdGVSYW5nZUVuZDogRGF0ZTtcclxuXHJcbiAgLy9tb2RlbCBmb3IgdGhlIHRleHRib3ggb3B0aW9ucyB0aGF0IG5lZWQgYSBjb252ZXJ0ZWQgb3V0cHV0XHJcbiAgcHVibGljIGNoZWNrQm94VG9UZXh0TW9kZWw6IGJvb2xlYW47XHJcblxyXG4gIHByaXZhdGUgX2NvbGxlY3Rpb246IEZpbHRlckl0ZW1WaWV3bW9kZWxbXSA9IFtdO1xyXG4gIHByaXZhdGUgX21vZGVsOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpY29uU2VydmljZTogSWNvbkNhY2hlU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0VG9Jbml0aWFsTGltaXQoKTtcclxuICAgIHRoaXMuc2hvd0J1dHRvbiA9IHRoaXMudmFsdWVTZWxlY3RlZCgpO1xyXG4gICAgdGhpcy5jaGVja0JveFRvVGV4dE1vZGVsID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VG9Jbml0aWFsTGltaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpbWl0VG8gPSB0aGlzLmluaXRpYWxMaW1pdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbmNyZWFzZUxpbWl0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5saW1pdFRvICs9IDEwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vcmVUb1Nob3coKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zaG93QWxsUmVzdWx0cykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZENvbGxlY3Rpb24/Lmxlbmd0aCA+IHRoaXMubGltaXRUbztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsZXNzVG9TaG93KCkge1xyXG4gICAgaWYgKHRoaXMuc2hvd0FsbFJlc3VsdHMpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uPy5sZW5ndGggPD0gdGhpcy5saW1pdFRvICYmIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uPy5sZW5ndGggPiB0aGlzLmluaXRpYWxMaW1pdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVNb2RlbENoYW5nZShtb2RlbDogYW55KSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuRmlsdGVybGlzdDpcclxuICAgICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgICAgIG1vZGVsLmNoZWNrZWQgPSAhbW9kZWwuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLl9jcmVhdGVNb2RlbEZvckZpbHRlckxpc3QoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSB0aGlzLm1vZGVzLlNlbGVjdExpc3RXaXRoU3RyaW5nQ29sbGVjdGlvbk91dHB1dDpcclxuICAgICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgICAgIG1vZGVsLmNoZWNrZWQgPSAhbW9kZWwuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLl9jcmVhdGVNb2RlbEZvclN0cmluZ0NvbGxlY3Rpb25MaXN0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5TaW5nbGVTZWxlY3RMaXN0OlxyXG4gICAgICAgIHRoaXMuc2hvd0J1dHRvbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51bmNoZWNrRm9yU2luZ2xlU2VsZWN0KG1vZGVsKTtcclxuICAgICAgICBtb2RlbC5jaGVja2VkID0gIW1vZGVsLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTW9kZWxGb3JTaW5nbGVTZWxlY3RMaXN0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5TZWxlY3RMaXN0V2l0aE51bWJlck91dHB1dDpcclxuICAgICAgICB0aGlzLnNob3dCdXR0b24gPSB0cnVlO1xyXG4gICAgICAgIG1vZGVsLmNoZWNrZWQgPSAhbW9kZWwuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLl9jcmVhdGVNb2RlbEZvclNlbGVjdExpc3RXaXRoTnVtYmVyT3V0cHV0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5TbGlkZXI6XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTW9kZWxGb3JTbGlkZXJNb2RlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5DaGVja2JveFRvVGV4dDpcclxuICAgICAgICB0aGlzLl9jcmVhdGVNb2RlbEZvckNoZWNrYm94VG9UZXh0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5DaGVja2JveFRvU2ltcGxlVGV4dDpcclxuICAgICAgICB0aGlzLl9jcmVhdGVNb2RlbEZvckNoZWNrYm94VG9TaW1wbGVUZXh0KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgdGhpcy5tb2Rlcy5DaGVja2JveFRvQmluYXJ5OlxyXG4gICAgICAgIHRoaXMuX2NyZWF0ZU1vZGVsRm9yQ2hlY2tib3hUb0JpbmFyeSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuRGF0ZVJhbmdlRmllbGQ6XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlTW9kZWxGb3JEYXRlUmFuZ2UobW9kZWwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIHRoaXMubW9kZXMuVGV4dEZpZWxkOlxyXG4gICAgICAgIHRoaXMuX21vZGVsID0gKHR5cGVvZiB0aGlzLl9tb2RlbCA9PT0gJ3N0cmluZycgJiYgdGhpcy5fbW9kZWwubGVuZ3RoID09PSAwKSA/IHVuZGVmaW5lZCA6IHRoaXMuX21vZGVsO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHRoaXMuX21vZGVsKTtcclxuICAgIHRoaXMuY29sbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuY29sbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVuY2hlY2tGb3JTaW5nbGVTZWxlY3QobW9kZWw6IEZpbHRlckl0ZW1WaWV3bW9kZWwpOiB2b2lkIHtcclxuICAgIHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICBpZiAobS5jb2RlICE9PSBtb2RlbC5jb2RlICYmIG0uZGVzY3JpcHRpb24gIT09IG1vZGVsLmRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgbS5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHZhbHVlU2VsZWN0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiAhIXRoaXMuY29sbGVjdGlvbi5maW5kKGMgPT4gYy5jaGVja2VkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGxpZXMgZmlsdGVyIHRvIHRoZSBjb2xsZWN0aW9uLlxyXG4gIHB1YmxpYyBhc3luYyBhcHBseUZpbHRlcih0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPFtdPiB7XHJcbiAgICBpZiAoIWlzTmFOKHRoaXMubWluU2VhcmNoQ2hhcnNUb0xvYWRDb2xsZWN0aW9uKSAmJiB0aGlzLmNvbGxlY3Rpb25Mb2FkRm4pIHtcclxuICAgICAgaWYgKHRleHQubGVuZ3RoID09PSB0aGlzLm1pblNlYXJjaENoYXJzVG9Mb2FkQ29sbGVjdGlvbiAmJiB0ZXh0Lmxlbmd0aCA+IHRoaXMuZmlsdGVyVGV4dC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25Mb2FkRm4odGV4dCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPCB0aGlzLm1pblNlYXJjaENoYXJzVG9Mb2FkQ29sbGVjdGlvbikge1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gdGV4dDtcclxuICAgIGlmICghdGhpcy5jb2xsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJUZXh0OiBzdHJpbmcgPSB0aGlzLmZpbHRlclRleHQ/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGxldCBmaWx0ZXJlZEl0ZW1Db3VudDogbnVtYmVyID0gMDtcclxuICAgIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uPy5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgY29uc3QgbGFiZWxUZXh0OiBzdHJpbmcgPSBpdGVtLmRlc2NyaXB0aW9uPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IGlzSGlkZGVuQnlGaWx0ZXI6IGJvb2xlYW4gPSAobGFiZWxUZXh0Py5pbmRleE9mKGZpbHRlclRleHQpID09PSAtMSk7XHJcbiAgICAgIGlmIChpc0hpZGRlbkJ5RmlsdGVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbHRlcmVkSXRlbUNvdW50Kys7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsdGVyQnV0dG9uQ2xpY2tlZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgLy9Nb2RlbCBjcmVhdGlvbiBmb3IgYWxsIG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyBhdmFpbGFibGUvL1xyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBwcml2YXRlIF9jcmVhdGVNb2RlbEZvckZpbHRlckxpc3QoKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsdGVyUmFuZ2U6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uICE9PSBudWxsICYmIHRoaXMuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKCh2aWV3TW9kZWw6IEZpbHRlckl0ZW1WaWV3bW9kZWwpID0+IHtcclxuICAgICAgICBpZiAodmlld01vZGVsLmNoZWNrZWQpIHtcclxuICAgICAgICAgIGZpbHRlclJhbmdlLnB1c2goYD89JyR7dmlld01vZGVsLmNvZGV9J2ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmaWx0ZXJSYW5nZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5fbW9kZWwgPSBmaWx0ZXJSYW5nZS5qb2luKCcsJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbW9kZWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU1vZGVsRm9yU3RyaW5nQ29sbGVjdGlvbkxpc3QoKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsdGVyUmFuZ2U6IHN0cmluZ1tdID0gW107XHJcbiAgICB0aGlzLmNvbGxlY3Rpb24uZm9yRWFjaCgodmlld01vZGVsOiBGaWx0ZXJJdGVtVmlld21vZGVsKSA9PiB7XHJcbiAgICAgIGlmICh2aWV3TW9kZWwuY2hlY2tlZCkge1xyXG4gICAgICAgIGZpbHRlclJhbmdlLnB1c2godmlld01vZGVsLmNvZGUudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKGZpbHRlclJhbmdlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSBmaWx0ZXJSYW5nZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX21vZGVsID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTW9kZWxGb3JTaW5nbGVTZWxlY3RMaXN0KCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbHRlclN0cmluZzogc3RyaW5nID0gXCJcIjtcclxuICAgIHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKCh2aWV3TW9kZWw6IEZpbHRlckl0ZW1WaWV3bW9kZWwpID0+IHtcclxuICAgICAgaWYgKHZpZXdNb2RlbC5jaGVja2VkKSB7XHJcbiAgICAgICAgZmlsdGVyU3RyaW5nID0gdmlld01vZGVsLmNvZGUudG9TdHJpbmcoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoZmlsdGVyU3RyaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSBmaWx0ZXJTdHJpbmc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9tb2RlbCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU1vZGVsRm9yU2VsZWN0TGlzdFdpdGhOdW1iZXJPdXRwdXQoKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsdGVyTnVtYmVyOiBudW1iZXIgPSBudWxsO1xyXG4gICAgdGhpcy5jb2xsZWN0aW9uLmZvckVhY2goKHZpZXdNb2RlbDogRmlsdGVySXRlbVZpZXdtb2RlbCkgPT4ge1xyXG4gICAgICBpZiAodmlld01vZGVsLmNoZWNrZWQpIHtcclxuICAgICAgICBpZiAoZmlsdGVyTnVtYmVyID09IG51bGwpIHtcclxuICAgICAgICAgIGZpbHRlck51bWJlciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbHRlck51bWJlciArPSBOdW1iZXIodmlld01vZGVsLmNvZGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21vZGVsID0gZmlsdGVyTnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTW9kZWxGb3JTbGlkZXJNb2RlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGlkZXJNaW4gPSAhIXRoaXMuc2xpZGVyTWluID8gdGhpcy5zbGlkZXJNaW4gOiB0aGlzLnNsaWRlckRlZmF1bHRNaW47XHJcbiAgICB0aGlzLnNsaWRlck1heCA9ICEhdGhpcy5zbGlkZXJNYXggPyB0aGlzLnNsaWRlck1heCA6IHRoaXMuc2xpZGVyRGVmYXVsdE1heDtcclxuXHJcbiAgICBsZXQgdHJ1ZUxvd2VyQm91bmQgPSBNYXRoLm1pbih0aGlzLnNsaWRlck1pbiwgdGhpcy5zbGlkZXJNYXgpO1xyXG4gICAgbGV0IHRydWVVcHBlckJvdW5kID0gTWF0aC5tYXgodGhpcy5zbGlkZXJNaW4sIHRoaXMuc2xpZGVyTWF4KTtcclxuXHJcbiAgICB0aGlzLl9tb2RlbCA9IGAke3RydWVMb3dlckJvdW5kfSAtICR7dHJ1ZVVwcGVyQm91bmR9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU1vZGVsRm9yQ2hlY2tib3hUb1RleHQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jaGVja0JveFRvVGV4dE1vZGVsKSB7XHJcbiAgICAgIHRoaXMuX21vZGVsID0gXCI/PSdKJ1wiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSBcIj89J04nXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVNb2RlbEZvckNoZWNrYm94VG9TaW1wbGVUZXh0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tCb3hUb1RleHRNb2RlbCkge1xyXG4gICAgICB0aGlzLl9tb2RlbCA9IFwiSlwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSBcIk5cIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU1vZGVsRm9yQ2hlY2tib3hUb0JpbmFyeSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrQm94VG9UZXh0TW9kZWwpIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbW9kZWwgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlTW9kZWxGb3JEYXRlUmFuZ2UoZGF0ZXM6IERhdGVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGRhdGVzKSB7XHJcbiAgICAgIGxldCBzdGFydERhdGUgPSBkYXRlc1swXTtcclxuICAgICAgbGV0IGVuZERhdGUgPSBkYXRlc1sxXTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZVJlcXVlc3QgPSBzdGFydERhdGUgPyB0aGlzLl9mb3JtYXREYXRlVG9TdHJpbmcoc3RhcnREYXRlKSA6ICcnO1xyXG4gICAgICBjb25zdCBlbmREYXRlUmVxdWVzdCA9IGVuZERhdGUgPyB0aGlzLl9mb3JtYXREYXRlVG9TdHJpbmcoZW5kRGF0ZSkgOiAnJztcclxuXHJcbiAgICAgIHRoaXMuX21vZGVsID0gYD8+PVxcJyR7c3RhcnREYXRlUmVxdWVzdH1cXCcmID88PVxcJyR7ZW5kRGF0ZVJlcXVlc3R9XFwnYDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Zvcm1hdERhdGVUb1N0cmluZyhkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBsZXQgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgbGV0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgcmV0dXJuIGAke2RheX0tJHttb250aH0tJHt5ZWFyfWA7XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAvL01vZGVsIHJlYWRpbmcgZm9yIGFsbCBvZiB0aGUgZGlmZmVyZW50IG9wdGlvbnMgYXZhaWxhYmxlLy9cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBwcml2YXRlIF9yZWFkTW9kZWxGb3JGaWx0ZXJMaXN0KGZpbHRlck1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBmaWx0ZXJMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGl0ZW1zVG9DaGVjazogc3RyaW5nW10gPSBbXTtcclxuICAgIHRoaXMuX3VuY2hlY2tBbGwoKTtcclxuICAgIHRoaXMuX21vZGVsID0gZmlsdGVyTW9kZWw7XHJcblxyXG4gICAgaWYgKGZpbHRlck1vZGVsICE9PSBudWxsICYmIGZpbHRlck1vZGVsICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGZpbHRlck1vZGVsID09PSAnc3RyaW5nJyAmJiBmaWx0ZXJNb2RlbC5sZW5ndGggIT0gMCAmJiB0aGlzLmNvbGxlY3Rpb24gIT09IG51bGwgJiYgdGhpcy5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlsdGVyTGlzdCA9IGZpbHRlck1vZGVsLnNwbGl0KFwiLFwiKVxyXG4gICAgICBmaWx0ZXJMaXN0LmZvckVhY2goKGZpbHRlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaXRlbXNUb0NoZWNrLnB1c2goZmlsdGVyLnN1YnN0cigzLCBmaWx0ZXIubGVuZ3RoIC0gNCkpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtc1RvQ2hlY2spIHtcclxuICAgICAgICBsZXQgZmlsdGVyID0gdGhpcy5jb2xsZWN0aW9uLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUudG9TdHJpbmcoKSA9PT0gaXRlbSk7XHJcbiAgICAgICAgaWYgKGZpbHRlciAhPT0gbnVsbCAmJiBmaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgZmlsdGVyLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaWx0ZXIuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tb2RlbCA9IGZpbHRlck1vZGVsO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlYWRNb2RlbEZvclNpbmdsZVNlbGVjdExpc3Qoc2luZ2xlU2VsZWN0TW9kZWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdW5jaGVja0FsbCgpO1xyXG4gICAgdGhpcy5fbW9kZWwgPSBzaW5nbGVTZWxlY3RNb2RlbDtcclxuXHJcbiAgICBpZiAoc2luZ2xlU2VsZWN0TW9kZWwgIT09IG51bGwgJiYgc2luZ2xlU2VsZWN0TW9kZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbGxlY3Rpb24gIT09IG51bGwgJiYgdGhpcy5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGZpbHRlciA9IHRoaXMuY29sbGVjdGlvbi5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlLnRvU3RyaW5nKCkgPT09IHNpbmdsZVNlbGVjdE1vZGVsKTtcclxuICAgICAgaWYgKGZpbHRlcikge1xyXG4gICAgICAgIGZpbHRlci5jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVhZE1vZGVsRm9yU3RyaW5nQ29sbGVjdGlvbkxpc3QoY29sbGVjdGlvbk1vZGVsOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5fdW5jaGVja0FsbCgpO1xyXG4gICAgdGhpcy5fbW9kZWwgPSBjb2xsZWN0aW9uTW9kZWw7XHJcblxyXG4gICAgaWYgKGNvbGxlY3Rpb25Nb2RlbCAhPT0gbnVsbCAmJiBjb2xsZWN0aW9uTW9kZWwgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbGxlY3Rpb24gIT09IG51bGwgJiYgdGhpcy5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2xsZWN0aW9uLmZvckVhY2goKHZpZXdNb2RlbDogRmlsdGVySXRlbVZpZXdtb2RlbCkgPT4ge1xyXG4gICAgICAgIGlmIChjb2xsZWN0aW9uTW9kZWwuaW5kZXhPZih2aWV3TW9kZWwuY29kZS50b1N0cmluZygpKSA+IC0xKSB7XHJcbiAgICAgICAgICB2aWV3TW9kZWwuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZpZXdNb2RlbC5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlYWRNb2RlbEZvclNlbGVjdExpc3RXaXRoTnVtYmVyT3V0cHV0KG51bWJlck1vZGVsOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3VuY2hlY2tBbGwoKTtcclxuICAgIHRoaXMuX21vZGVsID0gbnVtYmVyTW9kZWw7XHJcblxyXG4gICAgaWYgKG51bWJlck1vZGVsICE9PSBudWxsICYmIG51bWJlck1vZGVsICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jb2xsZWN0aW9uICE9PSBudWxsICYmIHRoaXMuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmNvbGxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29kZTogbnVtYmVyID0gaXRlbS5jb2RlIGFzIG51bWJlcjtcclxuICAgICAgICBjb25zdCBtb2RWYWx1ZSA9IChudW1iZXJNb2RlbCAlICgyICogaXRlbUNvZGUpKTtcclxuICAgICAgICBpdGVtLmNoZWNrZWQgPSAobW9kVmFsdWUgPj0gaXRlbUNvZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91bmNoZWNrQWxsKCkge1xyXG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbiAhPT0gbnVsbCAmJiB0aGlzLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbGxlY3Rpb24uZm9yRWFjaChtID0+IHtcclxuICAgICAgICBtLmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZWFkTW9kZWxGb3JTbGlkZXJNb2RlKHNsaWRlck1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGVsID0gc2xpZGVyTW9kZWw7XHJcbiAgICBpZiAoc2xpZGVyTW9kZWwgIT09IHVuZGVmaW5lZCAmJiBzbGlkZXJNb2RlbCAhPT0gbnVsbCkge1xyXG4gICAgICBsZXQgc2xpZGVySW5wdXRDb2xsZWN0aW9uID0gc2xpZGVyTW9kZWwuc3BsaXQoJyAtICcpO1xyXG4gICAgICB0aGlzLnNsaWRlck1pbiA9IHBhcnNlSW50KHNsaWRlcklucHV0Q29sbGVjdGlvblswXSk7XHJcbiAgICAgIHRoaXMuc2xpZGVyTWF4ID0gcGFyc2VJbnQoc2xpZGVySW5wdXRDb2xsZWN0aW9uWzFdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2xpZGVyTWluID0gdGhpcy5zbGlkZXJEZWZhdWx0TWluO1xyXG4gICAgICB0aGlzLnNsaWRlck1heCA9IHRoaXMuc2xpZGVyRGVmYXVsdE1heDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlYWRNb2RlbEZvckNoZWNrYm94VG9UZXh0KGNoZWNrYm94VG9UZXh0TW9kZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kZWwgPSBjaGVja2JveFRvVGV4dE1vZGVsO1xyXG4gICAgaWYgKGNoZWNrYm94VG9UZXh0TW9kZWwgIT09IHVuZGVmaW5lZCAmJiBjaGVja2JveFRvVGV4dE1vZGVsICE9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hUb1RleHRNb2RlbCA9IChjaGVja2JveFRvVGV4dE1vZGVsLmluZGV4T2YoJ0onKSA+IC0xKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hUb1RleHRNb2RlbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVhZE1vZGVsRm9yQ2hlY2tib3hUb0JpbmFyeShjaGVja2JveFRvQmluYXJ5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGVsID0gY2hlY2tib3hUb0JpbmFyeTtcclxuICAgIGlmIChjaGVja2JveFRvQmluYXJ5ICE9PSB1bmRlZmluZWQgJiYgY2hlY2tib3hUb0JpbmFyeSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmNoZWNrQm94VG9UZXh0TW9kZWwgPSAoY2hlY2tib3hUb0JpbmFyeSA+PSAxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hlY2tCb3hUb1RleHRNb2RlbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVhZE1vZGVsRm9yRGF0ZUZpZWxkKGRhdGVGaWVsZE1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGVsID0gZGF0ZUZpZWxkTW9kZWw7XHJcbiAgICBpZiAoZGF0ZUZpZWxkTW9kZWwgIT09IHVuZGVmaW5lZCAmJiBkYXRlRmllbGRNb2RlbCAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9tb2RlbCA9IG5ldyBEYXRlKGRhdGVGaWVsZE1vZGVsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlYWRNb2RlbEZvckRhdGVSYW5nZUZpZWxkKGRhdGVSYW5nZUZpZWxkTW9kZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fbW9kZWwgPSBkYXRlUmFuZ2VGaWVsZE1vZGVsO1xyXG4gICAgaWYgKGRhdGVSYW5nZUZpZWxkTW9kZWwgIT09IHVuZGVmaW5lZCAmJiBkYXRlUmFuZ2VGaWVsZE1vZGVsICE9PSBudWxsKSB7XHJcbiAgICAgIGxldCBkYXRlQ29sbGVjdGlvbiA9IGRhdGVSYW5nZUZpZWxkTW9kZWwuc3BsaXQoJyYnKTtcclxuXHJcbiAgICAgIGxldCBzdGFydFN0cmluZyA9IGRhdGVDb2xsZWN0aW9uWzBdLnRyaW0oKS5zdWJzdHIoNCwgZGF0ZUNvbGxlY3Rpb25bMF0ubGVuZ3RoIC0gNSk7XHJcbiAgICAgIGxldCBlbmRTdHJpbmcgPSBkYXRlQ29sbGVjdGlvblsxXS50cmltKCkuc3Vic3RyKDQsIGRhdGVDb2xsZWN0aW9uWzFdLmxlbmd0aCAtIDUpO1xyXG5cclxuICAgICAgbGV0IHN0YXJ0RGF0ZUNvbXBvbmVudHMgPSBzdGFydFN0cmluZy5zcGxpdCgnLScpO1xyXG4gICAgICBsZXQgZW5kRGF0ZUNvbXBvbmVudHMgPSBlbmRTdHJpbmcuc3BsaXQoJy0nKTtcclxuXHJcbiAgICAgIHRoaXMuZGF0ZVJhbmdlU3RhcnQgPSBuZXcgRGF0ZShwYXJzZUludChzdGFydERhdGVDb21wb25lbnRzWzJdKSwgcGFyc2VJbnQoc3RhcnREYXRlQ29tcG9uZW50c1sxXSkgLSAxLCBwYXJzZUludChzdGFydERhdGVDb21wb25lbnRzWzBdKSk7XHJcbiAgICAgIHRoaXMuZGF0ZVJhbmdlRW5kID0gbmV3IERhdGUocGFyc2VJbnQoZW5kRGF0ZUNvbXBvbmVudHNbMl0pLCBwYXJzZUludChlbmREYXRlQ29tcG9uZW50c1sxXSkgLSAxLCBwYXJzZUludChlbmREYXRlQ29tcG9uZW50c1swXSkpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=