@myrtex-org/form 1.1.86 → 1.1.87

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.
@@ -69,23 +69,34 @@ export class InputTableComponent {
69
69
  this._subscriptions$.push(this._store.select(objectFormSelectors.selectValueModel(this.settings))
70
70
  .subscribe((result) => {
71
71
  const cloneResult = structuredClone(result);
72
- // КРИТИЧЕСКИЙ ФИЛЬТР: Реагируем только на СВОЙ sysName
72
+ // Наша проверка по sysName, которую мы добавили ранее
73
73
  if (cloneResult && !Array.isArray(cloneResult) && cloneResult.sysName === this.settings.sysName) {
74
- // Сравниваем именно строковые JSON-представления данных, чтобы избежать ложных срабатываний deep-check
74
+ // --- ВОТ ЭТОТ НОВЫЙ БЛОК ДЛЯ ВОССТАНОВЛЕНИЯ ДАТ ---
75
+ // Проверяем, есть ли вообще данные внутри пришедшей модели
76
+ if (cloneResult.data && Array.isArray(cloneResult.data)) {
77
+ cloneResult.data.forEach((row) => {
78
+ if (row.data && Array.isArray(row.data)) {
79
+ row.data.forEach((cell) => {
80
+ // Если тип компонента — дата, значение — строка и в ней есть наш разделитель '/'
81
+ if (cell.type === 'inputDate' && typeof cell.value === 'string' && cell.value.includes('/')) {
82
+ console.log(`[Table <- Store Parsing] Восстанавливаем range-дату из строки для ${cell.sysName}:`, cell.value);
83
+ // Разрезаем строку "2026-05-05/2026-05-07" обратно в массив ['2026-05-05', '2026-05-07']
84
+ cell.value = cell.value.split('/');
85
+ }
86
+ });
87
+ }
88
+ });
89
+ }
90
+ // -------------------------------------------------
91
+ // Проверяем, изменились ли данные по сравнению с текущими
75
92
  const isDataChanged = JSON.stringify(this.model?.data) !== JSON.stringify(cloneResult.data);
76
93
  if (isDataChanged) {
77
- console.log(`[Table -> Store Apply] [${this.settings.sysName}] Наша таблица обновилась. Синхронизируем строки.`);
94
+ console.log(`[Table -> Store Apply] [${this.settings.sysName}] Синхронизируем строки.`);
78
95
  this.model = structuredClone(cloneResult);
96
+ // Извлекаем строки (теперь внутри cell.value уже лежит правильный массив, и они не занулятся!)
79
97
  this._rows = this._extractRows(this.model.data);
80
98
  this._initDataSource(this._rows);
81
99
  }
82
- else {
83
- console.log(`[Table -> Store Skip] [${this.settings.sysName}] Данные нашей таблицы идентичны. Пропускаем.`);
84
- }
85
- }
86
- else if (cloneResult && !Array.isArray(cloneResult)) {
87
- // Логируем игнорирование чужих таблиц (itb4, itb5)
88
- console.log(`[Table -> Store Ignore] Игнорируем Стор. Текущая таблица: ${this.settings.sysName}, Пришло для: ${cloneResult.sysName}`);
89
100
  }
90
101
  }));
91
102
  }
@@ -336,17 +347,41 @@ export class InputTableComponent {
336
347
  });
337
348
  });
338
349
  }
350
+ // private _buildTableValueModel(): TableValueModel {
351
+ // console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
352
+ // const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
353
+ // const totals = this._calculateTotals(this._rows);
354
+ // this.model = {
355
+ // sysName: this.settings.sysName,
356
+ // type: this.settings.type,
357
+ // data: groupedData,
358
+ // totals
359
+ // };
360
+ // console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
361
+ // return structuredClone(this.model);
362
+ // }
339
363
  _buildTableValueModel() {
340
- console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
341
- const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
342
- const totals = this._calculateTotals(this._rows);
364
+ // Глубокое клонирование строк, чтобы не испортить UI до отправки
365
+ const rowsClone = structuredClone(this._rows);
366
+ // Пробегаемся по ячейкам и если видим массив дат (range) — склеиваем в строку
367
+ rowsClone.forEach(row => {
368
+ if (row.data) {
369
+ row.data.forEach(cell => {
370
+ if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
371
+ // Склеиваем массив ['2026-05-05...', '2026-05-07...'] в строку "2026-05-05.../2026-05-07..."
372
+ cell.value = cell.value.join('/');
373
+ }
374
+ });
375
+ }
376
+ });
377
+ const groupedData = this._buildGroupedItems(rowsClone, this.settings.options.groups || [], 0);
378
+ const totals = this._calculateTotals(rowsClone);
343
379
  this.model = {
344
380
  sysName: this.settings.sysName,
345
381
  type: this.settings.type,
346
382
  data: groupedData,
347
383
  totals
348
384
  };
349
- console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
350
385
  return structuredClone(this.model);
351
386
  }
352
387
  _buildGroupedItems(rows, groupFields, level) {
@@ -472,4 +507,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
472
507
  }], changed: [{
473
508
  type: Output
474
509
  }] } });
475
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsR0FBRyxJQUFJO29CQUNQLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRztpQkFDNUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLElBQXVCLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFlO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQXFCLENBQUM7UUFDdkMsT0FBTyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7K0dBbGlCVSxtQkFBbUI7bUdBQW5CLG1CQUFtQix5VUN6Q2hDLDh3SkF5SEE7OzRGRGhGYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBeUJ0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFXa0MsUUFBUTtzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNNLFlBQVk7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFFekIsT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlciwgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBEYXRlVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9lbnVtcyc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEeERhdGFHcmlkQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRWYWx1ZU1vZGVsLFxyXG4gIFNlY3Rpb25WYWx1ZU1vZGVsLFxyXG4gIFRhYmxlR3JvdXBNb2RlbCxcclxuICBUYWJsZUl0ZW0sXHJcbiAgVGFibGVJdGVtVHlwZSxcclxuICBUYWJsZVJvd01vZGVsLFxyXG4gIFRhYmxlVmFsdWVNb2RlbFxyXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IElucHV0RGF0ZU1vZGVsLCBJbnB1dE51bWJlck1vZGVsLCBJbnB1dFNlbGVjdE1vZGVsLCBJbnB1dFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZWxlbWV0cy9pbnB1dHMnO1xyXG5pbXBvcnQgeyBvYmplY3RGb3JtQWN0aW9ucywgb2JqZWN0Rm9ybVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0b3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnQG15cnRleC1vcmcvdWknO1xyXG5pbXBvcnQgeyBJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBnZXRSb3dNb2RlbCB9IGZyb20gJy4vaGVscGVycy9nZXQtcm93LW1vZGVsLmhlbHBlcic7XHJcbmltcG9ydCB7IENvbHVtbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3JlZmVyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtaW5wdXQtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtdGFibGUuY29tcG9uZW50Lmxlc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICB0eXBlID0gQ29tcG9uZW50VHlwZS5JbnB1dFRhYmxlO1xyXG5cclxuICBwcml2YXRlIF9yZWZlcmVuY2VTZXJ2aWNlOiBSZWZlcmVuY2VTZXJ2aWNlID0gaW5qZWN0KFJlZmVyZW5jZVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9sb29rdXBzQ2FjaGU6IE1hcDxzdHJpbmcsIGFueVtdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlID0gaW5qZWN0KFN0b3JlKTtcclxuICBwcml2YXRlIF9kZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlID0gaW5qZWN0KE1vZGFsU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5nZVN1YmplY3QkOiBTdWJqZWN0PFRhYmxlVmFsdWVNb2RlbD4gPSBuZXcgU3ViamVjdDxUYWJsZVZhbHVlTW9kZWw+KCk7XHJcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2lzQ2hlY2tSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NhbkVkaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgcHVibGljIG1vZGVsITogVGFibGVWYWx1ZU1vZGVsO1xyXG4gIHB1YmxpYyBzZXR0aW5ncyE6IElucHV0VGFibGVNb2RlbDtcclxuICBwdWJsaWMgZGF0YVNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XHJcbiAgcHVibGljIGNvbHVtbnM6IENvbHVtbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgdmFsdWVzOiBTZWN0aW9uVmFsdWVNb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRhKHNldHRpbmdzOiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncyBhcyBJbnB1dFRhYmxlTW9kZWw7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtzeXNOYW1lOiBzZXR0aW5ncy5zeXNOYW1lLCB0eXBlOiBzZXR0aW5ncy50eXBlLCBkYXRhOiBbXSwgdG90YWxzOiBbXX07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcblxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIHRoaXMuX2luaXRDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdkYXRhR3JpZCcsIHtzdGF0aWM6IGZhbHNlfSkgZGF0YUdyaWQhOiBEeERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRUZW1wbGF0ZScsIHtzdGF0aWM6IGZhbHNlfSkgZWRpdFRlbXBsYXRlITogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDb21wb25lbnRWYWx1ZU1vZGVsIHwgQ29tcG9uZW50VmFsdWVNb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50VmFsdWVNb2RlbCB8IENvbXBvbmVudFZhbHVlTW9kZWxbXT4oKTtcclxuXHJcbiAgcHVibGljIGdldCByb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FueVRvdGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cy5zb21lKGMgPT5cclxuICAgICAgdGhpcy5zaG93VG90YWwoYykgfHwgYy5jb21wb25lbnRzPy5zb21lKGlubmVyID0+IHRoaXMuc2hvd1RvdGFsKGlubmVyKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWROb0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNDaGVja1JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbml0TW9kZWwoKTtcclxuXHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoNzAwKSxcclxuICAgICkuc3Vic2NyaWJlKG1vZGVsID0+IHtcclxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gob2JqZWN0Rm9ybUFjdGlvbnMudXBkYXRlVmFsdWVzKHt2YWx1ZTogbW9kZWx9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdElzQ2hlY2tSZXF1aXJlZCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMuX2lzQ2hlY2tSZXF1aXJlZCA9IHJlc3VsdDtcclxuICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0Q2FuRWRpdE9iamVjdClcclxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbkVkaXRPYmplY3QgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzPy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbml0Q29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaChcclxuICAgICAgdGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0VmFsdWVNb2RlbCh0aGlzLnNldHRpbmdzKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsIHwgKENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsKVtdKSA9PiB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGNsb25lUmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlc3VsdCBhcyBUYWJsZVZhbHVlTW9kZWwgfCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvLyDQmtCg0JjQotCY0KfQldCh0JrQmNCZINCk0JjQm9Cs0KLQoDog0KDQtdCw0LPQuNGA0YPQtdC8INGC0L7Qu9GM0LrQviDQvdCwINCh0JLQntCZIHN5c05hbWVcclxuICAgICAgICAgIGlmIChjbG9uZVJlc3VsdCAmJiAhQXJyYXkuaXNBcnJheShjbG9uZVJlc3VsdCkgJiYgY2xvbmVSZXN1bHQuc3lzTmFtZSA9PT0gdGhpcy5zZXR0aW5ncy5zeXNOYW1lKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyDQodGA0LDQstC90LjQstCw0LXQvCDQuNC80LXQvdC90L4g0YHRgtGA0L7QutC+0LLRi9C1IEpTT04t0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Y8g0LTQsNC90L3Ri9GFLCDRh9GC0L7QsdGLINC40LfQsdC10LbQsNGC0Ywg0LvQvtC20L3Ri9GFINGB0YDQsNCx0LDRgtGL0LLQsNC90LjQuSBkZWVwLWNoZWNrXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YUNoYW5nZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsPy5kYXRhKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2xvbmVSZXN1bHQuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNEYXRhQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbVGFibGUgLT4gU3RvcmUgQXBwbHldIFske3RoaXMuc2V0dGluZ3Muc3lzTmFtZX1dINCd0LDRiNCwINGC0LDQsdC70LjRhtCwINC+0LHQvdC+0LLQuNC70LDRgdGMLiDQodC40L3RhdGA0L7QvdC40LfQuNGA0YPQtdC8INGB0YLRgNC+0LrQuC5gKTtcclxuICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gc3RydWN0dXJlZENsb25lKGNsb25lUmVzdWx0KTtcclxuICAgICAgICAgICAgICB0aGlzLl9yb3dzID0gdGhpcy5fZXh0cmFjdFJvd3ModGhpcy5tb2RlbC5kYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIFNraXBdIFske3RoaXMuc2V0dGluZ3Muc3lzTmFtZX1dINCU0LDQvdC90YvQtSDQvdCw0YjQtdC5INGC0LDQsdC70LjRhtGLINC40LTQtdC90YLQuNGH0L3Riy4g0J/RgNC+0L/Rg9GB0LrQsNC10LwuYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNsb25lUmVzdWx0ICYmICFBcnJheS5pc0FycmF5KGNsb25lUmVzdWx0KSkge1xyXG4gICAgICAgICAgICAvLyDQm9C+0LPQuNGA0YPQtdC8INC40LPQvdC+0YDQuNGA0L7QstCw0L3QuNC1INGH0YPQttC40YUg0YLQsNCx0LvQuNGGIChpdGI0LCBpdGI1KVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIElnbm9yZV0g0JjQs9C90L7RgNC40YDRg9C10Lwg0KHRgtC+0YAuINCi0LXQutGD0YnQsNGPINGC0LDQsdC70LjRhtCwOiAke3RoaXMuc2V0dGluZ3Muc3lzTmFtZX0sINCf0YDQuNGI0LvQviDQtNC70Y86ICR7Y2xvbmVSZXN1bHQuc3lzTmFtZX1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2hhbmdlU3ViamVjdCQudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVJvdygpIHtcclxuICAgIGNvbnN0IGluaXRpYWxSb3dNb2RlbCA9IGdldFJvd01vZGVsKHRoaXMuc2V0dGluZ3MpO1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBDcmVhdGUgUm93XSDQmNGB0YXQvtC00L3QsNGPINC80L7QtNC10LvRjCDQtNC70Y8g0L3QvtCy0L7QuSDRgdGC0YDQvtC60Lg6Jywgc3RydWN0dXJlZENsb25lKGluaXRpYWxSb3dNb2RlbCkpO1xyXG5cclxuICAgIHRoaXMuX21vZGFsU2VydmljZS5vcGVuKElucHV0VGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICB0aXRsZTogJ9Ch0L7Qt9C00LDQvdC40LUg0YHRgtGA0L7QutC4JyxcclxuICAgICAgb2tUZXh0OiAn0KHQvtC30LTQsNGC0YwnLFxyXG4gICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcclxuICAgICAgcm93TW9kZWw6IGdldFJvd01vZGVsKHRoaXMuc2V0dGluZ3MpLFxyXG4gICAgICBpc0NoZWNrUmVxdWlyZWQ6IHRoaXMuX2lzQ2hlY2tSZXF1aXJlZFxyXG4gICAgfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzb2x2ZSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbVGFibGUgPC0gTW9kYWwgQ2xvc2VkIChDcmVhdGUpXSDQoNC10LfRg9C70YzRgtCw0YIg0LjQtyDQvNC+0LTQsNC70LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUocmVzb2x2ZSkpO1xyXG5cclxuICAgICAgaWYgKHJlc29sdmUucmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5fcm93cyA9IFsuLi5zdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fcm93cyksIHJlc29sdmUucm93TW9kZWxdO1xyXG5cclxuICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlUm93KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbmRSb3cgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgaWYgKGZpbmRSb3cpIHtcclxuICAgICAgdGhpcy5fcm93cyA9IHRoaXMuX3Jvd3MuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcblxyXG4gICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLl9jYW5FZGl0T2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRSb3coZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmluZFJvdyA9IHRoaXMuX3Jvd3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gRWRpdCBSb3ddINCU0LDQvdC90YvQtSDRgdGC0YDQvtC60Lgg0LjQtyDQutC70LjQutCwIChldmVudC5yb3cuZGF0YSk6JywgZXZlbnQucm93LmRhdGEpO1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBFZGl0IFJvd10g0J3QsNC50LTQtdC90L4g0LIg0LvQvtC60LDQu9GM0L3QvtC8IHJvd3M6Jywgc3RydWN0dXJlZENsb25lKGZpbmRSb3cpKTtcclxuICAgIC8vIGNvbnN0IGZpbmRSb3c6IFRhYmxlUm93TW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgaWYgKGZpbmRSb3cpIHtcclxuICAgICAgY29uc3Qgcm93TW9kZWxDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShmaW5kUm93KTtcclxuXHJcbiAgICAgIHRoaXMuX21vZGFsU2VydmljZS5vcGVuKElucHV0VGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgIHRpdGxlOiAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtSDRgdGC0YDQvtC60LgnLFxyXG4gICAgICAgIG9rVGV4dDogJ9Ch0L7RhdGA0LDQvdC40YLRjCcsXHJcbiAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXHJcbiAgICAgICAgcm93TW9kZWw6IHJvd01vZGVsQ2xvbmVcclxuICAgICAgfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tUYWJsZSA8LSBNb2RhbCBDbG9zZWQgKEVkaXQpXSDQoNC10LfRg9C70YzRgtCw0YIg0LjQtyDQvNC+0LTQsNC70LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUocmVzb2x2ZSkpO1xyXG5cclxuICAgICAgICBpZiAocmVzb2x2ZS5yZXN1bHQpIHtcclxuICAgICAgICAgIGNvbnN0IGNsb25lUm93cyA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUm93ID0gY2xvbmVSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PT0gcmVzb2x2ZS5yb3dNb2RlbC5pZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGVkaXRhYmxlUm93KSB7XHJcbiAgICAgICAgICAgIGVkaXRhYmxlUm93LmRhdGEgPSByZXNvbHZlLnJvd01vZGVsLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvd3MgPSBjbG9uZVJvd3M7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dERhdGU6XHJcbiAgICAgICAgc3dpdGNoICgoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnZpZXdUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIERhdGVUeXBlRW51bS5EYXRlVGltZTpcclxuICAgICAgICAgICAgcmV0dXJuICdkZC5NTS55eXl5IGhoOm1tJztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiAnZGQuTU0ueXl5eSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhVHlwZShjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXREYXRlOlxyXG4gICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dFN3aXRjaDpcclxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb3RhbChjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0TnVtYmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IElucHV0TnVtYmVyTW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbDtcclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50Lm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVG90YWxDb2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpLm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TW9kZWwoKSB7XHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogW10sXHJcbiAgICAgIHRvdGFsczogW11cclxuICAgIH07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RGF0YVNvdXJjZShkYXRhOiBUYWJsZVJvd01vZGVsW10pIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gX2luaXREYXRhU291cmNlXSDQodCx0L7RgNC60LAgZGF0YVNvdXJjZSDQuNC3IHJvd3M6Jywgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcclxuICAgIFxyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YS5tYXAoKGl0ZW06IFRhYmxlUm93TW9kZWwpID0+IHtcclxuICAgICAgY29uc3QgbmV3RGF0YUl0ZW06IGFueSA9IHt9O1xyXG4gICAgICBcclxuICAgICAgZm9yIChsZXQgaSBpbiBpdGVtLmRhdGEpIHtcclxuICAgICAgICBjb25zdCBjZWxsID0gaXRlbS5kYXRhW2ldO1xyXG4gICAgICAgIC8vINCd0LDQv9GA0Y/QvNGD0Y4g0LHQtdGA0LXQvCDQt9C90LDRh9C10L3QuNC1INGP0YfQtdC50LrQuCAo0LHRg9C00Ywg0YLQviDRgdGC0YDQvtC60LAg0LjQu9C4INC80LDRgdGB0LjQsiDQtNCw0YIpXHJcbiAgICAgICAgbmV3RGF0YUl0ZW1bY2VsbC5zeXNOYW1lXSA9IGNlbGwudmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIG5ld0RhdGFJdGVtLmlkID0gaXRlbS5pZDtcclxuICAgICAgcmV0dXJuIG5ld0RhdGFJdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBfaW5pdERhdGFTb3VyY2VdINCY0YLQvtCz0L7QstGL0LkgZGF0YVNvdXJjZSwg0L/QtdGA0LXQtNCw0L3QvdGL0Lkg0LIgRGF0YUdyaWQ6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuZGF0YVNvdXJjZSkpO1xyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRDb2x1bW5zKGNvbXBvbmVudHM6IENvbXBvbmVudE1vZGVsQmFzZVtdKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xyXG4gICAgICAgIGNhcHRpb246ICcnLFxyXG4gICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgY3NzQ2xhc3M6ICdjdXN0b20tY2VsbC1jb250cm9scycsXHJcbiAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2VkaXRCdXR0b25UZW1wbGF0ZScsXHJcbiAgICAgICAgICAgIGhpbnQ6ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2RlbGV0ZUJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cj0LTQsNC70LjRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJhbnNmb3JtQ29sdW1uKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKTogQ29sdW1uTW9kZWwge1xyXG4gICAgY29uc3QgZGF0YVR5cGUgPSB0aGlzLmdldERhdGFUeXBlKGNvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW5Nb2RlbCA9IHtcclxuICAgICAgY2FwdGlvbjogY29tcG9uZW50Lm9wdGlvbnMubGFiZWwgfHwgJycsXHJcbiAgICAgIGNvbHVtbnM6IGNvbXBvbmVudC5jb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKSxcclxuICAgICAgZGF0YUZpZWxkOiBjb21wb25lbnQuc3lzTmFtZSxcclxuICAgICAgZGF0YVR5cGU6IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KSxcclxuICAgICAgZm9ybWF0OiB0aGlzLmdldEZvcm1hdChjb21wb25lbnQpLFxyXG4gICAgICBtaW5XaWR0aDogMTYwXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0RGF0ZSAmJiAoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnJhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5jYWxjdWxhdGVDZWxsVmFsdWUgPSAocm93RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSAmJiBkYXRlUmFuZ2UubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKGRhdGVTdHI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGVTdHIpIHJldHVybiAnJztcclxuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGVTdHIpO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2RheX0uJHttb250aH0uJHt5ZWFyfWA7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN0YXJ0Rm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMF0pO1xyXG4gICAgICAgICAgY29uc3QgZW5kRm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMV0pO1xyXG5cclxuICAgICAgICAgIGlmIChzdGFydEZvcm1hdHRlZCAmJiBlbmRGb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3N0YXJ0Rm9ybWF0dGVkfSDigJQgJHtlbmRGb3JtYXR0ZWR9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBzdGFydEZvcm1hdHRlZCB8fCBlbmRGb3JtYXR0ZWQgfHwgJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBkYXRlUmFuZ2UgfHwgJyc7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29sdW1uLmNhbGN1bGF0ZUNlbGxWYWx1ZSA9IChyb3dEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd0RhdGFbY29tcG9uZW50LnN5c05hbWVdO1xyXG4gICAgICAgIC8vINCV0YHQu9C4IHRydWUg4oCUINCU0LAsINC10YHQu9C4IGZhbHNlLCBcIlwiINC40LvQuCBudWxsIOKAlCDQndC10YJcclxuICAgICAgICByZXR1cm4gISF2YWx1ZTsgXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IFtcclxuICAgICAgICAgIHsgdmFsdWU6IHRydWUsIGRpc3BsYXlWYWx1ZTogJ9CU0LAnIH0sXHJcbiAgICAgICAgICB7IHZhbHVlOiBmYWxzZSwgZGlzcGxheVZhbHVlOiAn0J3QtdGCJyB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICdkaXNwbGF5VmFsdWUnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0U2VsZWN0KSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdE1vZGVsID0gY29tcG9uZW50IGFzIElucHV0U2VsZWN0TW9kZWw7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5tYW51YWwpIHtcclxuICAgICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2VsZWN0TW9kZWwub3B0aW9ucy5pdGVtcyxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE1vZGVsLm9wdGlvbnMuZGlyZWN0b3J5Py5bMF0pIHtcclxuICAgICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3RvcnlbMF07XHJcblxyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICAvLyDQntCx0L7RgNCw0YfQuNCy0LDQtdC8INCyIEN1c3RvbVN0b3JlINC00LvRjyDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g0YLQuNC/0LDQvCBEZXZFeHRyZW1lXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgQ3VzdG9tU3RvcmUoe1xyXG4gICAgICAgICAgICBrZXk6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGxvYWQ6ICgpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKSxcclxuICAgICAgICAgICAgYnlLZXk6IChrZXkpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKS50aGVuKGl0ZW1zID0+IGl0ZW1zLmZpbmQoaSA9PiBpLnZhbHVlID09PSBrZXkpKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaW5kSWR4ID0gdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3Vwcy5maW5kSW5kZXgoeCA9PiB4ID09PSBjb21wb25lbnQuc3lzTmFtZSk7XHJcblxyXG4gICAgICBpZiAoZmluZElkeCAhPT0gLTEpIHtcclxuICAgICAgICBjb2x1bW4uZ3JvdXBJbmRleCA9IGZpbmRJZHhcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0LrRjdGIXHJcbiAgICBpZiAodGhpcy5fbG9va3Vwc0NhY2hlLmhhcyhkaXJlY3RvcnlOYW1lKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2xvb2t1cHNDYWNoZS5nZXQoZGlyZWN0b3J5TmFtZSkhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDQl9Cw0L/RgNCw0YjQuNCy0LDQtdC8INC00LDQvdC90YvQtSAo0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YLQvtGCINC20LUgb2JqZWN0SWQsINGH0YLQviDQuCDQsiDQvNC+0LTQsNC70LrQtSlcclxuICAgIC8vINCj0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IG9iamVjdElkINC00L7RgdGC0YPQv9C10L0g0LIg0Y3RgtC+0Lwg0LrQvtC80L/QvtC90LXQvdGC0LVcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLl9yZWZlcmVuY2VTZXJ2aWNlLmdldFJlZmVyZW5jZXMoZGlyZWN0b3J5TmFtZSwgKHRoaXMgYXMgYW55KS5vYmplY3RJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IChyZXN1bHQ/LnJvd3MgfHwgW10pLm1hcCgocm93OiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgIHZhbHVlOiByb3cuYSxcclxuICAgICAgICAgICAgdGV4dDogcm93LmJcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIHRoaXMuX2xvb2t1cHNDYWNoZS5zZXQoZGlyZWN0b3J5TmFtZSwgaXRlbXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZShpdGVtcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4gcmVzb2x2ZShbXSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCk6IFRhYmxlVmFsdWVNb2RlbCB7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRgtCw0YDRgiDRgdCx0L7RgNC60Lgg0LzQvtC00LXQu9C4INC00LvRjyDQodGC0L7RgNCwLiDQotC10LrRg9GJ0LjQtSDQu9C+0LrQsNC70YzQvdGL0LUgX3Jvd3M6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpKTtcclxuICAgIFxyXG4gICAgY29uc3QgZ3JvdXBlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyh0aGlzLl9yb3dzLCB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzIHx8IFtdLCAwKTtcclxuICAgIGNvbnN0IHRvdGFscyA9IHRoaXMuX2NhbGN1bGF0ZVRvdGFscyh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogZ3JvdXBlZERhdGEsXHJcbiAgICAgIHRvdGFsc1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRhNC+0YDQvNC40YDQvtCy0LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0LTQu9GPINC+0YLQv9GA0LDQstC60Lgg0LIg0KHRgtC+0YA6Jywgc3RydWN0dXJlZENsb25lKHRoaXMubW9kZWwpKTtcclxuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5tb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9idWlsZEdyb3VwZWRJdGVtcyhyb3dzOiBUYWJsZVJvd01vZGVsW10sIGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgbGV2ZWw6IG51bWJlcik6IFRhYmxlSXRlbVtdIHtcclxuICAgIGlmICghZ3JvdXBGaWVsZHMubGVuZ3RoIHx8IGxldmVsID49IGdyb3VwRmllbGRzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcm93cy5tYXAocm93ID0+ICh7IC4uLnJvdywgaXRlbVR5cGU6IHJvdy5pdGVtVHlwZSA/PyBUYWJsZUl0ZW1UeXBlLlJvdyB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXBGaWVsZCA9IGdyb3VwRmllbGRzW2xldmVsXTtcclxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBWYWx1ZVN5c05hbWU6IHN0cmluZyB9PigpO1xyXG5cclxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJvdy5kYXRhLmZpbmQoeCA9PiB4LnN5c05hbWUgPT09IGdyb3VwRmllbGQpPy52YWx1ZSA/PyBudWxsO1xyXG4gICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKTtcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGtleSkgPz8ge1xyXG4gICAgICAgIHJvd3M6IFtdLFxyXG4gICAgICAgIGdyb3VwVmFsdWVTeXNOYW1lOiB0aGlzLl9nZXRHcm91cFZhbHVlU3lzTmFtZShmaWVsZFZhbHVlLCBncm91cEZpZWxkKVxyXG4gICAgICB9O1xyXG4gICAgICBleGlzdGluZy5yb3dzLnB1c2gocm93KTtcclxuICAgICAgZ3JvdXBzLnNldChrZXksIGV4aXN0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXN1bHQ6IFRhYmxlSXRlbVtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBncm91cEl0ZW0gb2YgZ3JvdXBzLnZhbHVlcygpKSB7XHJcbiAgICAgIGNvbnN0IG5lc3RlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyhncm91cEl0ZW0ucm93cywgZ3JvdXBGaWVsZHMsIGxldmVsICsgMSk7XHJcbiAgICAgIGNvbnN0IGdyb3VwTW9kZWw6IFRhYmxlR3JvdXBNb2RlbCA9IHtcclxuICAgICAgICBpdGVtVHlwZTogVGFibGVJdGVtVHlwZS5Hcm91cCxcclxuICAgICAgICBkYXRhOiBuZXN0ZWREYXRhLFxyXG4gICAgICAgIHRvdGFsczogdGhpcy5fY2FsY3VsYXRlVG90YWxzKGdyb3VwSXRlbS5yb3dzLCBncm91cEl0ZW0uZ3JvdXBWYWx1ZVN5c05hbWUpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXN1bHQucHVzaChncm91cE1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FsY3VsYXRlVG90YWxzKHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBGaWVsZFN5c05hbWU/OiBzdHJpbmcpOiBDb21wb25lbnRWYWx1ZU1vZGVsW10ge1xyXG4gICAgY29uc3QgdG90YWxDb2x1bW5zID0gdGhpcy5fZ2V0VG90YWxDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcblxyXG4gICAgcmV0dXJuIHRvdGFsQ29sdW1ucy5tYXAoY29tcG9uZW50ID0+IHtcclxuICAgICAgY29uc3Qgc3VtID0gcm93cy5yZWR1Y2UoKGFjYywgcm93KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3cuZGF0YS5maW5kKHggPT4geC5zeXNOYW1lID09PSBjb21wb25lbnQuc3lzTmFtZSk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtZXJpY1ZhbHVlKSA/IGFjYyArIG51bWVyaWNWYWx1ZSA6IGFjYztcclxuICAgICAgfSwgMCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN5c05hbWU6IHRoaXMuX2dldFRvdGFsU3lzTmFtZShjb21wb25lbnQuc3lzTmFtZSwgZ3JvdXBGaWVsZFN5c05hbWUpLFxyXG4gICAgICAgIHR5cGU6IGNvbXBvbmVudC50eXBlLFxyXG4gICAgICAgIHZhbHVlVHlwZTogY29tcG9uZW50LnZhbHVlVHlwZSxcclxuICAgICAgICB2YWx1ZTogc3VtXHJcbiAgICAgIH0gYXMgQ29tcG9uZW50VmFsdWVNb2RlbDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VG90YWxTeXNOYW1lKGNvbHVtblN5c05hbWU6IHN0cmluZywgZ3JvdXBGaWVsZFN5c05hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGdyb3VwRmllbGRTeXNOYW1lKSB7XHJcbiAgICAgIHJldHVybiBgJHtjb2x1bW5TeXNOYW1lfV8ke2dyb3VwRmllbGRTeXNOYW1lfV90b3RhbGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke2NvbHVtblN5c05hbWV9X3RvdGFsYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEdyb3VwVmFsdWVTeXNOYW1lKGZpZWxkVmFsdWU6IGFueSwgZmFsbGJhY2tTeXNOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSkgJiYgZmllbGRWYWx1ZS5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGZpZWxkVmFsdWVbMF07XHJcbiAgICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpcnN0VmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaXJzdFZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKGZpcnN0VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKGZpZWxkVmFsdWUudmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUuc3lzTmFtZSA9PT0gJ3N0cmluZycgJiYgZmllbGRWYWx1ZS5zeXNOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUuc3lzTmFtZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaWVsZFZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIFN0cmluZyhmaWVsZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsbGJhY2tTeXNOYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VG90YWxDb2x1bW5zKGNvbXBvbmVudHM6IENvbXBvbmVudE1vZGVsQmFzZVtdKTogSW5wdXROdW1iZXJNb2RlbFtdIHtcclxuICAgIGNvbnN0IHJlc3VsdDogSW5wdXROdW1iZXJNb2RlbFtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG4gICAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXROdW1iZXIgJiYgdGhpcy5zaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbXBvbmVudCBhcyBJbnB1dE51bWJlck1vZGVsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLl9nZXRUb3RhbENvbHVtbnMoY29tcG9uZW50LmNvbXBvbmVudHMpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0Um93cyhpdGVtczogVGFibGVJdGVtW10gPSBbXSk6IFRhYmxlUm93TW9kZWxbXSB7XHJcbiAgICBjb25zdCByb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKHRoaXMuX2lzUm93KGl0ZW0pKSB7XHJcbiAgICAgICAgcm93cy5wdXNoKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBpdGVtVHlwZTogVGFibGVJdGVtVHlwZS5Sb3dcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBncm91cCA9IGl0ZW0gYXMgVGFibGVHcm91cE1vZGVsO1xyXG4gICAgICAgIGlmIChncm91cC5kYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MucHVzaCguLi50aGlzLl9leHRyYWN0Um93cyhncm91cC5kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1JvdyhpdGVtOiBUYWJsZUl0ZW0pOiBpdGVtIGlzIFRhYmxlUm93TW9kZWwge1xyXG4gICAgY29uc3QgbWF5YmVSb3cgPSBpdGVtIGFzIFRhYmxlUm93TW9kZWw7XHJcbiAgICByZXR1cm4gdHlwZW9mIG1heWJlUm93LmlkID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KG1heWJlUm93LmRhdGEpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKHNldHRpbmdzKSB7XHJcbiAgPGRpdiBjbGFzcz1cImlucHV0LXRhYmxlLWNvbnRlbnQgdy0xMDBcIj5cclxuICAgIEBpZiAoc2V0dGluZ3Mub3B0aW9ucy5sYWJlbCkge1xyXG4gICAgICA8bXJ4LWxhYmVsXHJcbiAgICAgICAgW3JlcXVpcmVkXT1cInNldHRpbmdzLm9wdGlvbnMucmVxdWlyZWRcIlxyXG4gICAgICAgIFt0b29sdGlwXT1cInNldHRpbmdzLm9wdGlvbnMudG9vbHRpcCB8fCAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBzZXR0aW5ncy5vcHRpb25zLmxhYmVsIH19XHJcbiAgICAgIDwvbXJ4LWxhYmVsPlxyXG4gICAgfVxyXG5cclxuICAgIDxkeC1kYXRhLWdyaWRcclxuICAgICAgI2RhdGFHcmlkXHJcbiAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgbm9EYXRhVGV4dD1cItCd0LXRgiDQtNCw0L3QvdGL0YVcIlxyXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgW3dvcmRXcmFwRW5hYmxlZF09XCJ0cnVlXCJcclxuICAgICAgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCJcclxuICAgICAgW2NsYXNzLm5vRGF0YV09XCJpc1JlZE5vRGF0YVwiXHJcbiAgICA+XHJcbiAgICAgIEBpZighZGlzYWJsZWQpIHtcclxuICAgICAgICA8ZHhvLXRvb2xiYXI+XHJcbiAgICAgICAgICA8ZHhpLWl0ZW0gbG9jYXRpb249XCJhZnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlIGNsYXNzPVwiYWRkLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDxtcngtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCInbWVkaXVtJ1wiXHJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCInc2Vjb25kYXJ5J1wiXHJcbiAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3Nlc109XCInbWItMydcIlxyXG4gICAgICAgICAgICAgICAgKG1yeENsaWNrKT1cImNyZWF0ZVJvdygpXCJcclxuICAgICAgICAgICAgICA+e3tzZXR0aW5ncy5vcHRpb25zLmFkZEJ0blRpdGxlfX1cclxuICAgICAgICAgICAgICA8L21yeC1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9keGktaXRlbT5cclxuICAgICAgICA8L2R4by10b29sYmFyPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGJ1dHRvbkRhdGEgb2YgJ2VkaXRCdXR0b25UZW1wbGF0ZSdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZWRpdCBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZWRpdFJvdyhidXR0b25EYXRhKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGJ1dHRvbkRhdGEgb2YgJ2RlbGV0ZUJ1dHRvblRlbXBsYXRlJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1kZWxldGUgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhidXR0b25EYXRhKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAaWYgKGRhdGFTb3VyY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgPGR4by1zdW1tYXJ5PlxyXG4gICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIHNldHRpbmdzLmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZDsgbGV0IGZpcnN0ID0gJGZpcnN0KSB7XHJcbiAgICAgICAgICAgIEBpZiAoIWZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtIFxyXG4gICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCIgXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCJ7MH1cIlxyXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBjb21wb25lbnQuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBjb21wb25lbnQuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgQGlmIChoYXNBbnlUb3RhbCkgeyBcclxuICAgICAgICAgICAgICAgIDxkeGktdG90YWwtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjc3NDbGFzc109XCIndGV4dC1ib2xkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2hvd1RvdGFsKGNvbXBvbmVudCkgPyAnezB9JyA6ICfQmNCi0J7Qk9CeJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N1bW1hcnlUeXBlXT1cInNob3dUb3RhbChjb21wb25lbnQpID8gJ3N1bScgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgPjwvZHhpLXRvdGFsLWl0ZW0+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9keG8tc3VtbWFyeT5cclxuICAgICAgfVxyXG4gICAgPC9keC1kYXRhLWdyaWQ+XHJcblxyXG4gICAgQGlmKCEhc2V0dGluZ3Mub3B0aW9ucy5tYXhSb3dzKSB7XHJcbiAgICAgIDxtcngtaGludC1lcnJvci1tZXNzYWdlXHJcbiAgICAgICAgbWVzc2FnZT1cItCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQvtC6OiB7eyBzZXR0aW5ncy5vcHRpb25zLm1heFJvd3MgfX1cIlxyXG4gICAgICAgIFttYXhWYWx1ZV09XCJzZXR0aW5ncy5vcHRpb25zLm1heFJvd3NcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJyb3dzQ291bnRcIlxyXG4gICAgICA+PC9tcngtaGludC1lcnJvci1tZXNzYWdlPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWRpdFRlbXBsYXRlIGxldC1jZWxsSW5mbz1cImNlbGxJbmZvXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBzdHlsZT1cImdhcDogNHB4XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWVkaXQgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImVkaXRSb3coY2VsbEluZm8pXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1kZWxldGUgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhjZWxsSW5mbylcIj48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxufVxyXG5cclxuXHJcbiJdfQ==
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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Q1IsR0FBRyxJQUFJO29CQUNQLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRztpQkFDNUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLElBQXVCLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFlO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQXFCLENBQUM7UUFDdkMsT0FBTyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7K0dBOWtCVSxtQkFBbUI7bUdBQW5CLG1CQUFtQix5VUN6Q2hDLDh3SkF5SEE7OzRGRGhGYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBeUJ0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFXa0MsUUFBUTtzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNNLFlBQVk7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFFekIsT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlciwgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBEYXRlVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9lbnVtcyc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEeERhdGFHcmlkQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRWYWx1ZU1vZGVsLFxyXG4gIFNlY3Rpb25WYWx1ZU1vZGVsLFxyXG4gIFRhYmxlR3JvdXBNb2RlbCxcclxuICBUYWJsZUl0ZW0sXHJcbiAgVGFibGVJdGVtVHlwZSxcclxuICBUYWJsZVJvd01vZGVsLFxyXG4gIFRhYmxlVmFsdWVNb2RlbFxyXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IElucHV0RGF0ZU1vZGVsLCBJbnB1dE51bWJlck1vZGVsLCBJbnB1dFNlbGVjdE1vZGVsLCBJbnB1dFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZWxlbWV0cy9pbnB1dHMnO1xyXG5pbXBvcnQgeyBvYmplY3RGb3JtQWN0aW9ucywgb2JqZWN0Rm9ybVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0b3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnQG15cnRleC1vcmcvdWknO1xyXG5pbXBvcnQgeyBJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBnZXRSb3dNb2RlbCB9IGZyb20gJy4vaGVscGVycy9nZXQtcm93LW1vZGVsLmhlbHBlcic7XHJcbmltcG9ydCB7IENvbHVtbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3JlZmVyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtaW5wdXQtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtdGFibGUuY29tcG9uZW50Lmxlc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICB0eXBlID0gQ29tcG9uZW50VHlwZS5JbnB1dFRhYmxlO1xyXG5cclxuICBwcml2YXRlIF9yZWZlcmVuY2VTZXJ2aWNlOiBSZWZlcmVuY2VTZXJ2aWNlID0gaW5qZWN0KFJlZmVyZW5jZVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9sb29rdXBzQ2FjaGU6IE1hcDxzdHJpbmcsIGFueVtdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlID0gaW5qZWN0KFN0b3JlKTtcclxuICBwcml2YXRlIF9kZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlID0gaW5qZWN0KE1vZGFsU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5nZVN1YmplY3QkOiBTdWJqZWN0PFRhYmxlVmFsdWVNb2RlbD4gPSBuZXcgU3ViamVjdDxUYWJsZVZhbHVlTW9kZWw+KCk7XHJcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2lzQ2hlY2tSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NhbkVkaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgcHVibGljIG1vZGVsITogVGFibGVWYWx1ZU1vZGVsO1xyXG4gIHB1YmxpYyBzZXR0aW5ncyE6IElucHV0VGFibGVNb2RlbDtcclxuICBwdWJsaWMgZGF0YVNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XHJcbiAgcHVibGljIGNvbHVtbnM6IENvbHVtbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgdmFsdWVzOiBTZWN0aW9uVmFsdWVNb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRhKHNldHRpbmdzOiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncyBhcyBJbnB1dFRhYmxlTW9kZWw7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtzeXNOYW1lOiBzZXR0aW5ncy5zeXNOYW1lLCB0eXBlOiBzZXR0aW5ncy50eXBlLCBkYXRhOiBbXSwgdG90YWxzOiBbXX07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcblxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIHRoaXMuX2luaXRDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdkYXRhR3JpZCcsIHtzdGF0aWM6IGZhbHNlfSkgZGF0YUdyaWQhOiBEeERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRUZW1wbGF0ZScsIHtzdGF0aWM6IGZhbHNlfSkgZWRpdFRlbXBsYXRlITogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDb21wb25lbnRWYWx1ZU1vZGVsIHwgQ29tcG9uZW50VmFsdWVNb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50VmFsdWVNb2RlbCB8IENvbXBvbmVudFZhbHVlTW9kZWxbXT4oKTtcclxuXHJcbiAgcHVibGljIGdldCByb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FueVRvdGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cy5zb21lKGMgPT5cclxuICAgICAgdGhpcy5zaG93VG90YWwoYykgfHwgYy5jb21wb25lbnRzPy5zb21lKGlubmVyID0+IHRoaXMuc2hvd1RvdGFsKGlubmVyKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWROb0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNDaGVja1JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbml0TW9kZWwoKTtcclxuXHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoNzAwKSxcclxuICAgICkuc3Vic2NyaWJlKG1vZGVsID0+IHtcclxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gob2JqZWN0Rm9ybUFjdGlvbnMudXBkYXRlVmFsdWVzKHt2YWx1ZTogbW9kZWx9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdElzQ2hlY2tSZXF1aXJlZCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMuX2lzQ2hlY2tSZXF1aXJlZCA9IHJlc3VsdDtcclxuICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0Q2FuRWRpdE9iamVjdClcclxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbkVkaXRPYmplY3QgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzPy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbml0Q29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaChcclxuICAgICAgdGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0VmFsdWVNb2RlbCh0aGlzLnNldHRpbmdzKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsIHwgKENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsKVtdKSA9PiB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGNsb25lUmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlc3VsdCBhcyBUYWJsZVZhbHVlTW9kZWwgfCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvLyDQndCw0YjQsCDQv9GA0L7QstC10YDQutCwINC/0L4gc3lzTmFtZSwg0LrQvtGC0L7RgNGD0Y4g0LzRiyDQtNC+0LHQsNCy0LjQu9C4INGA0LDQvdC10LVcclxuICAgICAgICAgIGlmIChjbG9uZVJlc3VsdCAmJiAhQXJyYXkuaXNBcnJheShjbG9uZVJlc3VsdCkgJiYgY2xvbmVSZXN1bHQuc3lzTmFtZSA9PT0gdGhpcy5zZXR0aW5ncy5zeXNOYW1lKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyAtLS0g0JLQntCiINCt0KLQntCiINCd0J7QktCr0Jkg0JHQm9Ce0Jog0JTQm9CvINCS0J7QodCh0KLQkNCd0J7QktCb0JXQndCY0K8g0JTQkNCiIC0tLVxyXG4gICAgICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70Lgg0LLQvtC+0LHRidC1INC00LDQvdC90YvQtSDQstC90YPRgtGA0Lgg0L/RgNC40YjQtdC00YjQtdC5INC80L7QtNC10LvQuFxyXG4gICAgICAgICAgICBpZiAoY2xvbmVSZXN1bHQuZGF0YSAmJiBBcnJheS5pc0FycmF5KGNsb25lUmVzdWx0LmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgY2xvbmVSZXN1bHQuZGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvdy5kYXRhICYmIEFycmF5LmlzQXJyYXkocm93LmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJvdy5kYXRhLmZvckVhY2goKGNlbGw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vINCV0YHQu9C4INGC0LjQvyDQutC+0LzQv9C+0L3QtdC90YLQsCDigJQg0LTQsNGC0LAsINC30L3QsNGH0LXQvdC40LUg4oCUINGB0YLRgNC+0LrQsCDQuCDQsiDQvdC10Lkg0LXRgdGC0Ywg0L3QsNGIINGA0LDQt9C00LXQu9C40YLQtdC70YwgJy8nXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwudHlwZSA9PT0gJ2lucHV0RGF0ZScgJiYgdHlwZW9mIGNlbGwudmFsdWUgPT09ICdzdHJpbmcnICYmIGNlbGwudmFsdWUuaW5jbHVkZXMoJy8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtUYWJsZSA8LSBTdG9yZSBQYXJzaW5nXSDQktC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNC10LwgcmFuZ2Ut0LTQsNGC0YMg0LjQtyDRgdGC0YDQvtC60Lgg0LTQu9GPICR7Y2VsbC5zeXNOYW1lfTpgLCBjZWxsLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vINCg0LDQt9GA0LXQt9Cw0LXQvCDRgdGC0YDQvtC60YMgXCIyMDI2LTA1LTA1LzIwMjYtMDUtMDdcIiDQvtCx0YDQsNGC0L3QviDQsiDQvNCw0YHRgdC40LIgWycyMDI2LTA1LTA1JywgJzIwMjYtMDUtMDcnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGNlbGwudmFsdWUuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0LjQt9C80LXQvdC40LvQuNGB0Ywg0LvQuCDQtNCw0L3QvdGL0LUg0L/QviDRgdGA0LDQstC90LXQvdC40Y4g0YEg0YLQtdC60YPRidC40LzQuFxyXG4gICAgICAgICAgICBjb25zdCBpc0RhdGFDaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbD8uZGF0YSkgIT09IEpTT04uc3RyaW5naWZ5KGNsb25lUmVzdWx0LmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzRGF0YUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIEFwcGx5XSBbJHt0aGlzLnNldHRpbmdzLnN5c05hbWV9XSDQodC40L3RhdGA0L7QvdC40LfQuNGA0YPQtdC8INGB0YLRgNC+0LrQuC5gKTtcclxuICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gc3RydWN0dXJlZENsb25lKGNsb25lUmVzdWx0KTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAvLyDQmNC30LLQu9C10LrQsNC10Lwg0YHRgtGA0L7QutC4ICjRgtC10L/QtdGA0Ywg0LLQvdGD0YLRgNC4IGNlbGwudmFsdWUg0YPQttC1INC70LXQttC40YIg0L/RgNCw0LLQuNC70YzQvdGL0Lkg0LzQsNGB0YHQuNCyLCDQuCDQvtC90Lgg0L3QtSDQt9Cw0L3Rg9C70Y/RgtGB0Y8hKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9leHRyYWN0Um93cyh0aGlzLm1vZGVsLmRhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlUm93KCkge1xyXG4gICAgY29uc3QgaW5pdGlhbFJvd01vZGVsID0gZ2V0Um93TW9kZWwodGhpcy5zZXR0aW5ncyk7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IENyZWF0ZSBSb3ddINCY0YHRhdC+0LTQvdCw0Y8g0LzQvtC00LXQu9GMINC00LvRjyDQvdC+0LLQvtC5INGB0YLRgNC+0LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUoaW5pdGlhbFJvd01vZGVsKSk7XHJcblxyXG4gICAgdGhpcy5fbW9kYWxTZXJ2aWNlLm9wZW4oSW5wdXRUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgIHRpdGxlOiAn0KHQvtC30LTQsNC90LjQtSDRgdGC0YDQvtC60LgnLFxyXG4gICAgICBva1RleHQ6ICfQodC+0LfQtNCw0YLRjCcsXHJcbiAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxyXG4gICAgICByb3dNb2RlbDogZ2V0Um93TW9kZWwodGhpcy5zZXR0aW5ncyksXHJcbiAgICAgIGlzQ2hlY2tSZXF1aXJlZDogdGhpcy5faXNDaGVja1JlcXVpcmVkXHJcbiAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXNvbHZlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1tUYWJsZSA8LSBNb2RhbCBDbG9zZWQgKENyZWF0ZSldINCg0LXQt9GD0LvRjNGC0LDRgiDQuNC3INC80L7QtNCw0LvQutC4OicsIHN0cnVjdHVyZWRDbG9uZShyZXNvbHZlKSk7XHJcblxyXG4gICAgICBpZiAocmVzb2x2ZS5yZXN1bHQpIHtcclxuICAgICAgICB0aGlzLl9yb3dzID0gWy4uLnN0cnVjdHVyZWRDbG9uZSh0aGlzLl9yb3dzKSwgcmVzb2x2ZS5yb3dNb2RlbF07XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVSb3coZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmluZFJvdyA9IHRoaXMuX3Jvd3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuXHJcbiAgICBpZiAoZmluZFJvdykge1xyXG4gICAgICB0aGlzLl9yb3dzID0gdGhpcy5fcm93cy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkICE9PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLm5leHQodGhpcy5fYnVpbGRUYWJsZVZhbHVlTW9kZWwoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuX2NhbkVkaXRPYmplY3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdFJvdyhldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmaW5kUm93ID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBFZGl0IFJvd10g0JTQsNC90L3Ri9C1INGB0YLRgNC+0LrQuCDQuNC3INC60LvQuNC60LAgKGV2ZW50LnJvdy5kYXRhKTonLCBldmVudC5yb3cuZGF0YSk7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IEVkaXQgUm93XSDQndCw0LnQtNC10L3QviDQsiDQu9C+0LrQsNC70YzQvdC+0Lwgcm93czonLCBzdHJ1Y3R1cmVkQ2xvbmUoZmluZFJvdykpO1xyXG4gICAgLy8gY29uc3QgZmluZFJvdzogVGFibGVSb3dNb2RlbCB8IHVuZGVmaW5lZCA9IHRoaXMuX3Jvd3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuXHJcbiAgICBpZiAoZmluZFJvdykge1xyXG4gICAgICBjb25zdCByb3dNb2RlbENsb25lID0gc3RydWN0dXJlZENsb25lKGZpbmRSb3cpO1xyXG5cclxuICAgICAgdGhpcy5fbW9kYWxTZXJ2aWNlLm9wZW4oSW5wdXRUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgICAgdGl0bGU6ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1INGB0YLRgNC+0LrQuCcsXHJcbiAgICAgICAgb2tUZXh0OiAn0KHQvtGF0YDQsNC90LjRgtGMJyxcclxuICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcclxuICAgICAgICByb3dNb2RlbDogcm93TW9kZWxDbG9uZVxyXG4gICAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXNvbHZlID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW1RhYmxlIDwtIE1vZGFsIENsb3NlZCAoRWRpdCldINCg0LXQt9GD0LvRjNGC0LDRgiDQuNC3INC80L7QtNCw0LvQutC4OicsIHN0cnVjdHVyZWRDbG9uZShyZXNvbHZlKSk7XHJcblxyXG4gICAgICAgIGlmIChyZXNvbHZlLnJlc3VsdCkge1xyXG4gICAgICAgICAgY29uc3QgY2xvbmVSb3dzID0gc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgY29uc3QgZWRpdGFibGVSb3cgPSBjbG9uZVJvd3MuZmluZChyb3cgPT4gcm93LmlkID09PSByZXNvbHZlLnJvd01vZGVsLmlkKTtcclxuXHJcbiAgICAgICAgICBpZiAoZWRpdGFibGVSb3cpIHtcclxuICAgICAgICAgICAgZWRpdGFibGVSb3cuZGF0YSA9IHJlc29sdmUucm93TW9kZWwuZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fcm93cyA9IGNsb25lUm93cztcclxuICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLm5leHQodGhpcy5fYnVpbGRUYWJsZVZhbHVlTW9kZWwoKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JtYXQoY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLklucHV0RGF0ZTpcclxuICAgICAgICBzd2l0Y2ggKChjb21wb25lbnQgYXMgSW5wdXREYXRlTW9kZWwpLm9wdGlvbnMudmlld1R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgRGF0ZVR5cGVFbnVtLkRhdGVUaW1lOlxyXG4gICAgICAgICAgICByZXR1cm4gJ2RkLk1NLnl5eXkgaGg6bW0nO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuICdkZC5NTS55eXl5JztcclxuICAgICAgICB9XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGFUeXBlKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dERhdGU6XHJcbiAgICAgICAgcmV0dXJuICdkYXRlJztcclxuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLklucHV0U3dpdGNoOlxyXG4gICAgICAgIHJldHVybiAnYm9vbGVhbidcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1RvdGFsKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXROdW1iZXIpIHtcclxuICAgICAgY29uc3QgZWxlbWVudDogSW5wdXROdW1iZXJNb2RlbCA9IGNvbXBvbmVudCBhcyBJbnB1dE51bWJlck1vZGVsO1xyXG5cclxuICAgICAgcmV0dXJuIGVsZW1lbnQub3B0aW9ucy5pblRvdGFscztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNUb3RhbENvbHVtbihjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbCkub3B0aW9ucy5pblRvdGFscztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRNb2RlbCgpIHtcclxuICAgIHRoaXMubW9kZWwgPSB7XHJcbiAgICAgIHN5c05hbWU6IHRoaXMuc2V0dGluZ3Muc3lzTmFtZSxcclxuICAgICAgdHlwZTogdGhpcy5zZXR0aW5ncy50eXBlLFxyXG4gICAgICBkYXRhOiBbXSxcclxuICAgICAgdG90YWxzOiBbXVxyXG4gICAgfTtcclxuICAgIHRoaXMuX3Jvd3MgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXREYXRhU291cmNlKGRhdGE6IFRhYmxlUm93TW9kZWxbXSkge1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBfaW5pdERhdGFTb3VyY2VdINCh0LHQvtGA0LrQsCBkYXRhU291cmNlINC40Lcgcm93czonLCBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSkpO1xyXG4gICAgXHJcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhLm1hcCgoaXRlbTogVGFibGVSb3dNb2RlbCkgPT4ge1xyXG4gICAgICBjb25zdCBuZXdEYXRhSXRlbTogYW55ID0ge307XHJcbiAgICAgIFxyXG4gICAgICBmb3IgKGxldCBpIGluIGl0ZW0uZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSBpdGVtLmRhdGFbaV07XHJcbiAgICAgICAgLy8g0J3QsNC/0YDRj9C80YPRjiDQsdC10YDQtdC8INC30L3QsNGH0LXQvdC40LUg0Y/Rh9C10LnQutC4ICjQsdGD0LTRjCDRgtC+INGB0YLRgNC+0LrQsCDQuNC70Lgg0LzQsNGB0YHQuNCyINC00LDRgilcclxuICAgICAgICBuZXdEYXRhSXRlbVtjZWxsLnN5c05hbWVdID0gY2VsbC52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgbmV3RGF0YUl0ZW0uaWQgPSBpdGVtLmlkO1xyXG4gICAgICByZXR1cm4gbmV3RGF0YUl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9pbml0RGF0YVNvdXJjZV0g0JjRgtC+0LPQvtCy0YvQuSBkYXRhU291cmNlLCDQv9C10YDQtdC00LDQvdC90YvQuSDQsiBEYXRhR3JpZDonLCBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5kYXRhU291cmNlKSk7XHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pIHtcclxuICAgIHRoaXMuY29sdW1ucyA9IGNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpO1xyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgY2FwdGlvbjogJycsXHJcbiAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICBjc3NDbGFzczogJ2N1c3RvbS1jZWxsLWNvbnRyb2xzJyxcclxuICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZWRpdEJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnLFxyXG4gICAgICAgICAgICBoaW50OiAn0KPQtNCw0LvQuNGC0YwnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5yZXBhaW50KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cmFuc2Zvcm1Db2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBDb2x1bW5Nb2RlbCB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW46IENvbHVtbk1vZGVsID0ge1xyXG4gICAgICBjYXB0aW9uOiBjb21wb25lbnQub3B0aW9ucy5sYWJlbCB8fCAnJyxcclxuICAgICAgY29sdW1uczogY29tcG9uZW50LmNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpLFxyXG4gICAgICBkYXRhRmllbGQ6IGNvbXBvbmVudC5zeXNOYW1lLFxyXG4gICAgICBkYXRhVHlwZTogdGhpcy5nZXREYXRhVHlwZShjb21wb25lbnQpLFxyXG4gICAgICBmb3JtYXQ6IHRoaXMuZ2V0Rm9ybWF0KGNvbXBvbmVudCksXHJcbiAgICAgIG1pbldpZHRoOiAxNjBcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXREYXRlICYmIChjb21wb25lbnQgYXMgSW5wdXREYXRlTW9kZWwpLm9wdGlvbnMucmFuZ2UpIHtcclxuICAgICAgY29sdW1uLmNhbGN1bGF0ZUNlbGxWYWx1ZSA9IChyb3dEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSByb3dEYXRhW2NvbXBvbmVudC5zeXNOYW1lXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRlUmFuZ2UpICYmIGRhdGVSYW5nZS5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZVN0cjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuICAgICAgICAgICAgY29uc3QgZGF5ID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF5fS4ke21vbnRofS4ke3llYXJ9YDtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3RhcnRGb3JtYXR0ZWQgPSBmb3JtYXREYXRlKGRhdGVSYW5nZVswXSk7XHJcbiAgICAgICAgICBjb25zdCBlbmRGb3JtYXR0ZWQgPSBmb3JtYXREYXRlKGRhdGVSYW5nZVsxXSk7XHJcblxyXG4gICAgICAgICAgaWYgKHN0YXJ0Rm9ybWF0dGVkICYmIGVuZEZvcm1hdHRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7c3RhcnRGb3JtYXR0ZWR9IOKAlCAke2VuZEZvcm1hdHRlZH1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHN0YXJ0Rm9ybWF0dGVkIHx8IGVuZEZvcm1hdHRlZCB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGRhdGVSYW5nZSB8fCAnJztcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb2x1bW4uY2FsY3VsYXRlQ2VsbFZhbHVlID0gKHJvd0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgLy8g0JXRgdC70LggdHJ1ZSDigJQg0JTQsCwg0LXRgdC70LggZmFsc2UsIFwiXCIg0LjQu9C4IG51bGwg4oCUINCd0LXRglxyXG4gICAgICAgIHJldHVybiAhIXZhbHVlOyBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogW1xyXG4gICAgICAgICAgeyB2YWx1ZTogdHJ1ZSwgZGlzcGxheVZhbHVlOiAn0JTQsCcgfSxcclxuICAgICAgICAgIHsgdmFsdWU6IGZhbHNlLCBkaXNwbGF5VmFsdWU6ICfQndC10YInIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ2Rpc3BsYXlWYWx1ZSdcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXRTZWxlY3QpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0TW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXRTZWxlY3RNb2RlbDtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RNb2RlbC5vcHRpb25zLm1hbnVhbCkge1xyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZWxlY3RNb2RlbC5vcHRpb25zLml0ZW1zLFxyXG4gICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0J1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3Rvcnk/LlswXSkge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeU5hbWUgPSBzZWxlY3RNb2RlbC5vcHRpb25zLmRpcmVjdG9yeVswXTtcclxuXHJcbiAgICAgICAgY29sdW1uLmxvb2t1cCA9IHtcclxuICAgICAgICAgIC8vINCe0LHQvtGA0LDRh9C40LLQsNC10Lwg0LIgQ3VzdG9tU3RvcmUg0LTQu9GPINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDRgtC40L/QsNC8IERldkV4dHJlbWVcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBDdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgbG9hZDogKCkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLFxyXG4gICAgICAgICAgICBieUtleTogKGtleSkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLnRoZW4oaXRlbXMgPT4gaXRlbXMuZmluZChpID0+IGkudmFsdWUgPT09IGtleSkpXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5ncm91cHMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbmRJZHggPSB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmZpbmRJbmRleCh4ID0+IHggPT09IGNvbXBvbmVudC5zeXNOYW1lKTtcclxuXHJcbiAgICAgIGlmIChmaW5kSWR4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbHVtbi5ncm91cEluZGV4ID0gZmluZElkeFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQutGN0YhcclxuICAgIGlmICh0aGlzLl9sb29rdXBzQ2FjaGUuaGFzKGRpcmVjdG9yeU5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbG9va3Vwc0NhY2hlLmdldChkaXJlY3RvcnlOYW1lKSEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vINCX0LDQv9GA0LDRiNC40LLQsNC10Lwg0LTQsNC90L3Ri9C1ICjQuNGB0L/QvtC70YzQt9GD0LXQvCDRgtC+0YIg0LbQtSBvYmplY3RJZCwg0YfRgtC+INC4INCyINC80L7QtNCw0LvQutC1KVxyXG4gICAgLy8g0KPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4gb2JqZWN0SWQg0LTQvtGB0YLRg9C/0LXQvSDQsiDRjdGC0L7QvCDQutC+0LzQv9C+0L3QtdC90YLQtVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlZmVyZW5jZVNlcnZpY2UuZ2V0UmVmZXJlbmNlcyhkaXJlY3RvcnlOYW1lLCAodGhpcyBhcyBhbnkpLm9iamVjdElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gKHJlc3VsdD8ucm93cyB8fCBbXSkubWFwKChyb3c6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IHJvdy5hLFxyXG4gICAgICAgICAgICB0ZXh0OiByb3cuYlxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5fbG9va3Vwc0NhY2hlLnNldChkaXJlY3RvcnlOYW1lLCBpdGVtcyk7XHJcbiAgICAgICAgICByZXNvbHZlKGl0ZW1zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiByZXNvbHZlKFtdKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBfYnVpbGRUYWJsZVZhbHVlTW9kZWwoKTogVGFibGVWYWx1ZU1vZGVsIHtcclxuICAvLyAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gX2J1aWxkVGFibGVWYWx1ZU1vZGVsXSDQodGC0LDRgNGCINGB0LHQvtGA0LrQuCDQvNC+0LTQtdC70Lgg0LTQu9GPINCh0YLQvtGA0LAuINCi0LXQutGD0YnQuNC1INC70L7QutCw0LvRjNC90YvQtSBfcm93czonLCBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fcm93cykpO1xyXG4gICAgXHJcbiAgLy8gICBjb25zdCBncm91cGVkRGF0YSA9IHRoaXMuX2J1aWxkR3JvdXBlZEl0ZW1zKHRoaXMuX3Jvd3MsIHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5ncm91cHMgfHwgW10sIDApO1xyXG4gIC8vICAgY29uc3QgdG90YWxzID0gdGhpcy5fY2FsY3VsYXRlVG90YWxzKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAvLyAgIHRoaXMubW9kZWwgPSB7XHJcbiAgLy8gICAgIHN5c05hbWU6IHRoaXMuc2V0dGluZ3Muc3lzTmFtZSxcclxuICAvLyAgICAgdHlwZTogdGhpcy5zZXR0aW5ncy50eXBlLFxyXG4gIC8vICAgICBkYXRhOiBncm91cGVkRGF0YSxcclxuICAvLyAgICAgdG90YWxzXHJcbiAgLy8gICB9O1xyXG5cclxuICAvLyAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gX2J1aWxkVGFibGVWYWx1ZU1vZGVsXSDQodGE0L7RgNC80LjRgNC+0LLQsNC90L3QsNGPINC80L7QtNC10LvRjCDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuCDQsiDQodGC0L7RgDonLCBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5tb2RlbCkpO1xyXG4gIC8vICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLm1vZGVsKTtcclxuICAvLyB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCk6IFRhYmxlVmFsdWVNb2RlbCB7XHJcbiAgICAvLyDQk9C70YPQsdC+0LrQvtC1INC60LvQvtC90LjRgNC+0LLQsNC90LjQtSDRgdGC0YDQvtC6LCDRh9GC0L7QsdGLINC90LUg0LjRgdC/0L7RgNGC0LjRgtGMIFVJINC00L4g0L7RgtC/0YDQsNCy0LrQuFxyXG4gICAgY29uc3Qgcm93c0Nsb25lID0gc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAgIC8vINCf0YDQvtCx0LXQs9Cw0LXQvNGB0Y8g0L/QviDRj9GH0LXQudC60LDQvCDQuCDQtdGB0LvQuCDQstC40LTQuNC8INC80LDRgdGB0LjQsiDQtNCw0YIgKHJhbmdlKSDigJQg0YHQutC70LXQuNCy0LDQtdC8INCyINGB0YLRgNC+0LrRg1xyXG4gICAgcm93c0Nsb25lLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgaWYgKHJvdy5kYXRhKSB7XHJcbiAgICAgICAgcm93LmRhdGEuZm9yRWFjaChjZWxsID0+IHtcclxuICAgICAgICAgIGlmIChjZWxsLnR5cGUgPT09ICdpbnB1dERhdGUnICYmIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgLy8g0KHQutC70LXQuNCy0LDQtdC8INC80LDRgdGB0LjQsiBbJzIwMjYtMDUtMDUuLi4nLCAnMjAyNi0wNS0wNy4uLiddINCyINGB0YLRgNC+0LrRgyBcIjIwMjYtMDUtMDUuLi4vMjAyNi0wNS0wNy4uLlwiXHJcbiAgICAgICAgICAgIGNlbGwudmFsdWUgPSBjZWxsLnZhbHVlLmpvaW4oJy8nKTsgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICBjb25zdCBncm91cGVkRGF0YSA9IHRoaXMuX2J1aWxkR3JvdXBlZEl0ZW1zKHJvd3NDbG9uZSwgdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3VwcyB8fCBbXSwgMCk7XHJcbiAgICBjb25zdCB0b3RhbHMgPSB0aGlzLl9jYWxjdWxhdGVUb3RhbHMocm93c0Nsb25lKTtcclxuXHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogZ3JvdXBlZERhdGEsXHJcbiAgICAgIHRvdGFsc1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMubW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYnVpbGRHcm91cGVkSXRlbXMocm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cEZpZWxkczogc3RyaW5nW10sIGxldmVsOiBudW1iZXIpOiBUYWJsZUl0ZW1bXSB7XHJcbiAgICBpZiAoIWdyb3VwRmllbGRzLmxlbmd0aCB8fCBsZXZlbCA+PSBncm91cEZpZWxkcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHJvd3MubWFwKHJvdyA9PiAoeyAuLi5yb3csIGl0ZW1UeXBlOiByb3cuaXRlbVR5cGUgPz8gVGFibGVJdGVtVHlwZS5Sb3cgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdyb3VwRmllbGQgPSBncm91cEZpZWxkc1tsZXZlbF07XHJcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgeyByb3dzOiBUYWJsZVJvd01vZGVsW10sIGdyb3VwVmFsdWVTeXNOYW1lOiBzdHJpbmcgfT4oKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSByb3cuZGF0YS5maW5kKHggPT4geC5zeXNOYW1lID09PSBncm91cEZpZWxkKT8udmFsdWUgPz8gbnVsbDtcclxuICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoZmllbGRWYWx1ZSk7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gZ3JvdXBzLmdldChrZXkpID8/IHtcclxuICAgICAgICByb3dzOiBbXSxcclxuICAgICAgICBncm91cFZhbHVlU3lzTmFtZTogdGhpcy5fZ2V0R3JvdXBWYWx1ZVN5c05hbWUoZmllbGRWYWx1ZSwgZ3JvdXBGaWVsZClcclxuICAgICAgfTtcclxuICAgICAgZXhpc3Rpbmcucm93cy5wdXNoKHJvdyk7XHJcbiAgICAgIGdyb3Vwcy5zZXQoa2V5LCBleGlzdGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBUYWJsZUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgZ3JvdXBJdGVtIG9mIGdyb3Vwcy52YWx1ZXMoKSkge1xyXG4gICAgICBjb25zdCBuZXN0ZWREYXRhID0gdGhpcy5fYnVpbGRHcm91cGVkSXRlbXMoZ3JvdXBJdGVtLnJvd3MsIGdyb3VwRmllbGRzLCBsZXZlbCArIDEpO1xyXG4gICAgICBjb25zdCBncm91cE1vZGVsOiBUYWJsZUdyb3VwTW9kZWwgPSB7XHJcbiAgICAgICAgaXRlbVR5cGU6IFRhYmxlSXRlbVR5cGUuR3JvdXAsXHJcbiAgICAgICAgZGF0YTogbmVzdGVkRGF0YSxcclxuICAgICAgICB0b3RhbHM6IHRoaXMuX2NhbGN1bGF0ZVRvdGFscyhncm91cEl0ZW0ucm93cywgZ3JvdXBJdGVtLmdyb3VwVmFsdWVTeXNOYW1lKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmVzdWx0LnB1c2goZ3JvdXBNb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVRvdGFscyhyb3dzOiBUYWJsZVJvd01vZGVsW10sIGdyb3VwRmllbGRTeXNOYW1lPzogc3RyaW5nKTogQ29tcG9uZW50VmFsdWVNb2RlbFtdIHtcclxuICAgIGNvbnN0IHRvdGFsQ29sdW1ucyA9IHRoaXMuX2dldFRvdGFsQ29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG5cclxuICAgIHJldHVybiB0b3RhbENvbHVtbnMubWFwKGNvbXBvbmVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHN1bSA9IHJvd3MucmVkdWNlKChhY2MsIHJvdykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93LmRhdGEuZmluZCh4ID0+IHguc3lzTmFtZSA9PT0gY29tcG9uZW50LnN5c05hbWUpPy52YWx1ZTtcclxuICAgICAgICBjb25zdCBudW1lcmljVmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWVyaWNWYWx1ZSkgPyBhY2MgKyBudW1lcmljVmFsdWUgOiBhY2M7XHJcbiAgICAgIH0sIDApO1xyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzeXNOYW1lOiB0aGlzLl9nZXRUb3RhbFN5c05hbWUoY29tcG9uZW50LnN5c05hbWUsIGdyb3VwRmllbGRTeXNOYW1lKSxcclxuICAgICAgICB0eXBlOiBjb21wb25lbnQudHlwZSxcclxuICAgICAgICB2YWx1ZVR5cGU6IGNvbXBvbmVudC52YWx1ZVR5cGUsXHJcbiAgICAgICAgdmFsdWU6IHN1bVxyXG4gICAgICB9IGFzIENvbXBvbmVudFZhbHVlTW9kZWw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFRvdGFsU3lzTmFtZShjb2x1bW5TeXNOYW1lOiBzdHJpbmcsIGdyb3VwRmllbGRTeXNOYW1lPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChncm91cEZpZWxkU3lzTmFtZSkge1xyXG4gICAgICByZXR1cm4gYCR7Y29sdW1uU3lzTmFtZX1fJHtncm91cEZpZWxkU3lzTmFtZX1fdG90YWxgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgJHtjb2x1bW5TeXNOYW1lfV90b3RhbGA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRHcm91cFZhbHVlU3lzTmFtZShmaWVsZFZhbHVlOiBhbnksIGZhbGxiYWNrU3lzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpICYmIGZpZWxkVmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBmaWVsZFZhbHVlWzBdO1xyXG4gICAgICBpZiAodHlwZW9mIGZpcnN0VmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBmaXJzdFZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZyhmaXJzdFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWVsZFZhbHVlICYmIHR5cGVvZiBmaWVsZFZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZyhmaWVsZFZhbHVlLnZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnN5c05hbWUgPT09ICdzdHJpbmcnICYmIGZpZWxkVmFsdWUuc3lzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlLnN5c05hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBmaWVsZFZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHJldHVybiBTdHJpbmcoZmllbGRWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbGxiYWNrU3lzTmFtZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFRvdGFsQ29sdW1ucyhjb21wb25lbnRzOiBDb21wb25lbnRNb2RlbEJhc2VbXSk6IElucHV0TnVtYmVyTW9kZWxbXSB7XHJcbiAgICBjb25zdCByZXN1bHQ6IElucHV0TnVtYmVyTW9kZWxbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuICAgICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0TnVtYmVyICYmIHRoaXMuc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICByZXN1bHQucHVzaChjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb21wb25lbnQuY29tcG9uZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5fZ2V0VG90YWxDb2x1bW5zKGNvbXBvbmVudC5jb21wb25lbnRzKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFJvd3MoaXRlbXM6IFRhYmxlSXRlbVtdID0gW10pOiBUYWJsZVJvd01vZGVsW10ge1xyXG4gICAgY29uc3Qgcm93czogVGFibGVSb3dNb2RlbFtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pc1JvdyhpdGVtKSkge1xyXG4gICAgICAgIHJvd3MucHVzaCh7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgaXRlbVR5cGU6IFRhYmxlSXRlbVR5cGUuUm93XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBpdGVtIGFzIFRhYmxlR3JvdXBNb2RlbDtcclxuICAgICAgICBpZiAoZ3JvdXAuZGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByb3dzLnB1c2goLi4udGhpcy5fZXh0cmFjdFJvd3MoZ3JvdXAuZGF0YSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByb3dzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNSb3coaXRlbTogVGFibGVJdGVtKTogaXRlbSBpcyBUYWJsZVJvd01vZGVsIHtcclxuICAgIGNvbnN0IG1heWJlUm93ID0gaXRlbSBhcyBUYWJsZVJvd01vZGVsO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBtYXliZVJvdy5pZCA9PT0gJ3N0cmluZycgJiYgQXJyYXkuaXNBcnJheShtYXliZVJvdy5kYXRhKTtcclxuICB9XHJcbn1cclxuIiwiQGlmIChzZXR0aW5ncykge1xyXG4gIDxkaXYgY2xhc3M9XCJpbnB1dC10YWJsZS1jb250ZW50IHctMTAwXCI+XHJcbiAgICBAaWYgKHNldHRpbmdzLm9wdGlvbnMubGFiZWwpIHtcclxuICAgICAgPG1yeC1sYWJlbFxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJzZXR0aW5ncy5vcHRpb25zLnJlcXVpcmVkXCJcclxuICAgICAgICBbdG9vbHRpcF09XCJzZXR0aW5ncy5vcHRpb25zLnRvb2x0aXAgfHwgJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgc2V0dGluZ3Mub3B0aW9ucy5sYWJlbCB9fVxyXG4gICAgICA8L21yeC1sYWJlbD5cclxuICAgIH1cclxuXHJcbiAgICA8ZHgtZGF0YS1ncmlkXHJcbiAgICAgICNkYXRhR3JpZFxyXG4gICAgICBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCJcclxuICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXHJcbiAgICAgIG5vRGF0YVRleHQ9XCLQndC10YIg0LTQsNC90L3Ri9GFXCJcclxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXHJcbiAgICAgIFt3b3JkV3JhcEVuYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgIFtjb2x1bW5BdXRvV2lkdGhdPVwidHJ1ZVwiXHJcbiAgICAgIFtjbGFzcy5ub0RhdGFdPVwiaXNSZWROb0RhdGFcIlxyXG4gICAgPlxyXG4gICAgICBAaWYoIWRpc2FibGVkKSB7XHJcbiAgICAgICAgPGR4by10b29sYmFyPlxyXG4gICAgICAgICAgPGR4aS1pdGVtIGxvY2F0aW9uPVwiYWZ0ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiAqZHhUZW1wbGF0ZSBjbGFzcz1cImFkZC1yb3dcIj5cclxuICAgICAgICAgICAgICA8bXJ4LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiJ21lZGl1bSdcIlxyXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3NlY29uZGFyeSdcIlxyXG4gICAgICAgICAgICAgICAgW2N1c3RvbUNsYXNzZXNdPVwiJ21iLTMnXCJcclxuICAgICAgICAgICAgICAgIChtcnhDbGljayk9XCJjcmVhdGVSb3coKVwiXHJcbiAgICAgICAgICAgICAgPnt7c2V0dGluZ3Mub3B0aW9ucy5hZGRCdG5UaXRsZX19XHJcbiAgICAgICAgICAgICAgPC9tcngtYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZHhpLWl0ZW0+XHJcbiAgICAgICAgPC9keG8tdG9vbGJhcj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBidXR0b25EYXRhIG9mICdlZGl0QnV0dG9uVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWVkaXQgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImVkaXRSb3coYnV0dG9uRGF0YSlcIj48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBidXR0b25EYXRhIG9mICdkZWxldGVCdXR0b25UZW1wbGF0ZSdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZGVsZXRlIGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkZWxldGVSb3coYnV0dG9uRGF0YSlcIj48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGlmIChkYXRhU291cmNlLmxlbmd0aCkge1xyXG4gICAgICAgIDxkeG8tc3VtbWFyeT5cclxuICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBzZXR0aW5ncy5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQ7IGxldCBmaXJzdCA9ICRmaXJzdCkge1xyXG4gICAgICAgICAgICBAaWYgKCFmaXJzdCkge1xyXG4gICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dJbkdyb3VwRm9vdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkeGktdG90YWwtaXRlbSBcclxuICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiIFxyXG4gICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwiezB9XCJcclxuICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgPjwvZHhpLXRvdGFsLWl0ZW0+XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgY29tcG9uZW50LmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xyXG4gICAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dJbkdyb3VwRm9vdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2YgY29tcG9uZW50LmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZCkge1xyXG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dJbkdyb3VwRm9vdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIEBpZiAoaGFzQW55VG90YWwpIHsgXHJcbiAgICAgICAgICAgICAgICA8ZHhpLXRvdGFsLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3NzQ2xhc3NdPVwiJ3RleHQtYm9sZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cInNob3dUb3RhbChjb21wb25lbnQpID8gJ3swfScgOiAn0JjQotCe0JPQnidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdW1tYXJ5VHlwZV09XCJzaG93VG90YWwoY29tcG9uZW50KSA/ICdzdW0nIDogdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgID48L2R4aS10b3RhbC1pdGVtPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZHhvLXN1bW1hcnk+XHJcbiAgICAgIH1cclxuICAgIDwvZHgtZGF0YS1ncmlkPlxyXG5cclxuICAgIEBpZighIXNldHRpbmdzLm9wdGlvbnMubWF4Um93cykge1xyXG4gICAgICA8bXJ4LWhpbnQtZXJyb3ItbWVzc2FnZVxyXG4gICAgICAgIG1lc3NhZ2U9XCLQnNCw0LrRgdC40LzQsNC70YzQvdC+0LUg0LrQvtC70LjRh9C10YHRgtCy0L4g0YHRgtGA0L7Qujoge3sgc2V0dGluZ3Mub3B0aW9ucy5tYXhSb3dzIH19XCJcclxuICAgICAgICBbbWF4VmFsdWVdPVwic2V0dGluZ3Mub3B0aW9ucy5tYXhSb3dzXCJcclxuICAgICAgICBbdmFsdWVdPVwicm93c0NvdW50XCJcclxuICAgICAgPjwvbXJ4LWhpbnQtZXJyb3ItbWVzc2FnZT5cclxuICAgIH1cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2VkaXRUZW1wbGF0ZSBsZXQtY2VsbEluZm89XCJjZWxsSW5mb1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgc3R5bGU9XCJnYXA6IDRweFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1lZGl0IGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJlZGl0Um93KGNlbGxJbmZvKVwiPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZGVsZXRlIGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJkZWxldGVSb3coY2VsbEluZm8pXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9kaXY+XHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -2431,23 +2431,34 @@ class InputTableComponent {
2431
2431
  this._subscriptions$.push(this._store.select(selectValueModel(this.settings))
2432
2432
  .subscribe((result) => {
2433
2433
  const cloneResult = structuredClone(result);
2434
- // КРИТИЧЕСКИЙ ФИЛЬТР: Реагируем только на СВОЙ sysName
2434
+ // Наша проверка по sysName, которую мы добавили ранее
2435
2435
  if (cloneResult && !Array.isArray(cloneResult) && cloneResult.sysName === this.settings.sysName) {
2436
- // Сравниваем именно строковые JSON-представления данных, чтобы избежать ложных срабатываний deep-check
2436
+ // --- ВОТ ЭТОТ НОВЫЙ БЛОК ДЛЯ ВОССТАНОВЛЕНИЯ ДАТ ---
2437
+ // Проверяем, есть ли вообще данные внутри пришедшей модели
2438
+ if (cloneResult.data && Array.isArray(cloneResult.data)) {
2439
+ cloneResult.data.forEach((row) => {
2440
+ if (row.data && Array.isArray(row.data)) {
2441
+ row.data.forEach((cell) => {
2442
+ // Если тип компонента — дата, значение — строка и в ней есть наш разделитель '/'
2443
+ if (cell.type === 'inputDate' && typeof cell.value === 'string' && cell.value.includes('/')) {
2444
+ console.log(`[Table <- Store Parsing] Восстанавливаем range-дату из строки для ${cell.sysName}:`, cell.value);
2445
+ // Разрезаем строку "2026-05-05/2026-05-07" обратно в массив ['2026-05-05', '2026-05-07']
2446
+ cell.value = cell.value.split('/');
2447
+ }
2448
+ });
2449
+ }
2450
+ });
2451
+ }
2452
+ // -------------------------------------------------
2453
+ // Проверяем, изменились ли данные по сравнению с текущими
2437
2454
  const isDataChanged = JSON.stringify(this.model?.data) !== JSON.stringify(cloneResult.data);
2438
2455
  if (isDataChanged) {
2439
- console.log(`[Table -> Store Apply] [${this.settings.sysName}] Наша таблица обновилась. Синхронизируем строки.`);
2456
+ console.log(`[Table -> Store Apply] [${this.settings.sysName}] Синхронизируем строки.`);
2440
2457
  this.model = structuredClone(cloneResult);
2458
+ // Извлекаем строки (теперь внутри cell.value уже лежит правильный массив, и они не занулятся!)
2441
2459
  this._rows = this._extractRows(this.model.data);
2442
2460
  this._initDataSource(this._rows);
2443
2461
  }
2444
- else {
2445
- console.log(`[Table -> Store Skip] [${this.settings.sysName}] Данные нашей таблицы идентичны. Пропускаем.`);
2446
- }
2447
- }
2448
- else if (cloneResult && !Array.isArray(cloneResult)) {
2449
- // Логируем игнорирование чужих таблиц (itb4, itb5)
2450
- console.log(`[Table -> Store Ignore] Игнорируем Стор. Текущая таблица: ${this.settings.sysName}, Пришло для: ${cloneResult.sysName}`);
2451
2462
  }
2452
2463
  }));
2453
2464
  }
@@ -2698,17 +2709,41 @@ class InputTableComponent {
2698
2709
  });
2699
2710
  });
2700
2711
  }
2712
+ // private _buildTableValueModel(): TableValueModel {
2713
+ // console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
2714
+ // const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
2715
+ // const totals = this._calculateTotals(this._rows);
2716
+ // this.model = {
2717
+ // sysName: this.settings.sysName,
2718
+ // type: this.settings.type,
2719
+ // data: groupedData,
2720
+ // totals
2721
+ // };
2722
+ // console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
2723
+ // return structuredClone(this.model);
2724
+ // }
2701
2725
  _buildTableValueModel() {
2702
- console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
2703
- const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
2704
- const totals = this._calculateTotals(this._rows);
2726
+ // Глубокое клонирование строк, чтобы не испортить UI до отправки
2727
+ const rowsClone = structuredClone(this._rows);
2728
+ // Пробегаемся по ячейкам и если видим массив дат (range) — склеиваем в строку
2729
+ rowsClone.forEach(row => {
2730
+ if (row.data) {
2731
+ row.data.forEach(cell => {
2732
+ if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
2733
+ // Склеиваем массив ['2026-05-05...', '2026-05-07...'] в строку "2026-05-05.../2026-05-07..."
2734
+ cell.value = cell.value.join('/');
2735
+ }
2736
+ });
2737
+ }
2738
+ });
2739
+ const groupedData = this._buildGroupedItems(rowsClone, this.settings.options.groups || [], 0);
2740
+ const totals = this._calculateTotals(rowsClone);
2705
2741
  this.model = {
2706
2742
  sysName: this.settings.sysName,
2707
2743
  type: this.settings.type,
2708
2744
  data: groupedData,
2709
2745
  totals
2710
2746
  };
2711
- console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
2712
2747
  return structuredClone(this.model);
2713
2748
  }
2714
2749
  _buildGroupedItems(rows, groupFields, level) {