@datorama/core 21.3.1-rc.5 → 21.4.0-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/bundle.scss +87 -2
  2. package/bundles/datorama-core.umd.js +223 -22
  3. package/bundles/datorama-core.umd.js.map +1 -1
  4. package/bundles/datorama-core.umd.min.js +54 -54
  5. package/bundles/datorama-core.umd.min.js.map +1 -1
  6. package/datorama-core.metadata.json +1 -1
  7. package/esm2015/lib/grid-v2/grid/grid-v2.component.js +5 -2
  8. package/esm2015/lib/grid-v2/grid/grid-v2.types.js +1 -1
  9. package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.component.js +8 -7
  10. package/esm2015/lib/grid-v2/grid-controller/grid-controller.component.js +11 -1
  11. package/esm2015/lib/grid-v2/grid-filter/filter-validator.js +27 -2
  12. package/esm2015/lib/grid-v2/grid-filter/grid-filter.component.js +31 -6
  13. package/esm2015/lib/grid-v2/grid-filter/grid-filter.types.js +1 -1
  14. package/esm2015/lib/grid-v2/grid-pagination/grid-pagination.component.js +16 -3
  15. package/esm2015/lib/grid-v2/grid-store/grid.query.js +34 -4
  16. package/esm2015/lib/grid-v2/grid-store/grid.service.js +58 -4
  17. package/esm2015/lib/grid-v2/grid-store/util.js +10 -1
  18. package/esm2015/lib/icon/icon.types.js +1 -1
  19. package/esm2015/lib/utils/array.js +10 -1
  20. package/esm5/lib/grid-v2/grid/grid-v2.component.js +9 -2
  21. package/esm5/lib/grid-v2/grid/grid-v2.types.js +1 -1
  22. package/esm5/lib/grid-v2/grid-column-header/grid-column-header.component.js +8 -11
  23. package/esm5/lib/grid-v2/grid-controller/grid-controller.component.js +11 -1
  24. package/esm5/lib/grid-v2/grid-filter/filter-validator.js +29 -3
  25. package/esm5/lib/grid-v2/grid-filter/grid-filter.component.js +36 -6
  26. package/esm5/lib/grid-v2/grid-filter/grid-filter.types.js +1 -1
  27. package/esm5/lib/grid-v2/grid-pagination/grid-pagination.component.js +16 -3
  28. package/esm5/lib/grid-v2/grid-store/grid.query.js +34 -4
  29. package/esm5/lib/grid-v2/grid-store/grid.service.js +76 -4
  30. package/esm5/lib/grid-v2/grid-store/util.js +10 -1
  31. package/esm5/lib/icon/icon.types.js +1 -1
  32. package/esm5/lib/utils/array.js +12 -1
  33. package/fesm2015/datorama-core.js +193 -19
  34. package/fesm2015/datorama-core.js.map +1 -1
  35. package/fesm5/datorama-core.js +223 -23
  36. package/fesm5/datorama-core.js.map +1 -1
  37. package/lib/grid-v2/grid/grid-v2.component.d.ts +1 -0
  38. package/lib/grid-v2/grid/grid-v2.types.d.ts +2 -0
  39. package/lib/grid-v2/grid-column-header/grid-column-header.component.d.ts +0 -2
  40. package/lib/grid-v2/grid-controller/grid-controller.component.d.ts +5 -1
  41. package/lib/grid-v2/grid-filter/grid-filter.component.d.ts +6 -0
  42. package/lib/grid-v2/grid-filter/grid-filter.types.d.ts +2 -0
  43. package/lib/grid-v2/grid-pagination/grid-pagination.component.d.ts +4 -0
  44. package/lib/grid-v2/grid-store/grid.query.d.ts +5 -1
  45. package/lib/grid-v2/grid-store/grid.service.d.ts +9 -1
  46. package/lib/grid-v2/grid-store/util.d.ts +7 -1
  47. package/lib/utils/array.d.ts +5 -0
  48. package/package.json +2 -2
@@ -23,7 +23,7 @@ import { OperatorTypes } from '../../operator-toggler/operator-toggler.types';
23
23
  import { deepmerge } from '../../internal/deep-merge';
24
24
  import { combineLatest } from 'rxjs';
25
25
  import { triggerWindowResize } from '../../utils/user-agent';
26
- import { getColumnsSizes } from './util';
26
+ import { getColField, getColumnsSizes } from './util';
27
27
  import { DatoGridMultiSelectColumnHeaderComponent } from '../grid-column-header/grid-multi-select-header/grid-multi-select-header.component';
28
28
  var GridService = /** @class */ (function () {
29
29
  function GridService(store, gridQuery, translate, iconRegistry, svgRegistry, storageAPI, logger) {
@@ -34,8 +34,8 @@ var GridService = /** @class */ (function () {
34
34
  this.svgRegistry = svgRegistry;
35
35
  this.storageAPI = storageAPI;
36
36
  this.logger = logger;
37
- this.pageNumberToReturnAfterRefresh = -1;
38
37
  this.treeConfig = defaultGridTreeLabel;
38
+ this.pageNumberToReturnAfterRefresh = -1;
39
39
  this.CHECKBOX_SELECTION_COL_ID = 'grid-checkbox-selection';
40
40
  }
41
41
  Object.defineProperty(GridService.prototype, "treeData", {
@@ -101,6 +101,9 @@ var GridService = /** @class */ (function () {
101
101
  var treeDate = convertToTreeData(data, _this.treeConfig);
102
102
  _this.api.grid.setRowData(treeDate);
103
103
  }
104
+ else if (_this.isPivotMode) {
105
+ _this.setPivotModeRows(data);
106
+ }
104
107
  else {
105
108
  _this.api.grid.setRowData(data);
106
109
  }
@@ -221,6 +224,12 @@ var GridService = /** @class */ (function () {
221
224
  params.gridOptions.saveSettings = saveSettings !== false && !isNil(gridName);
222
225
  /** Server Side Pagination for select all option */
223
226
  this.initOnRowSelectedForServerSidePagination(params);
227
+ /** Add pivot specific required settings */
228
+ if (params.gridOptions.pivotMode) {
229
+ this.initPivotSecondaryColsProcess(params);
230
+ params.gridOptions.enableV2_1 = true;
231
+ params.gridOptions.saveSettings = false;
232
+ }
224
233
  return params.gridOptions;
225
234
  };
226
235
  GridService.prototype.normalizeColumns = function (colDefs, gridOptions) {
@@ -412,10 +421,11 @@ var GridService = /** @class */ (function () {
412
421
  numOfConditions: (filter.conditional && filter.conditional.conditions.length) || 0,
413
422
  byValue: !!filter.byValue ? 'Yes' : 'No'
414
423
  });
424
+ var colField = getColField(column.getColDef());
415
425
  this.store.update(function (state) {
416
426
  var _a;
417
427
  return {
418
- settings: __assign(__assign({}, state.settings), { filter: __assign(__assign({}, state.settings.filter), (_a = {}, _a[column.getColDef().field] = filter, _a)) })
428
+ settings: __assign(__assign({}, state.settings), { filter: __assign(__assign({}, state.settings.filter), (_a = {}, _a[colField] = filter, _a)) })
419
429
  };
420
430
  });
421
431
  this.notifyFilterUpdate();
@@ -925,6 +935,68 @@ var GridService = /** @class */ (function () {
925
935
  this.setServerSidePagination({ selectAllRowsEnabled: false, excludedFromSelectAll: [] });
926
936
  }
927
937
  };
938
+ /**
939
+ * When pivoting,
940
+ * we add the field name to the column header class in order to access it through the auto generated pivot column.
941
+ * @private
942
+ */
943
+ GridService.prototype.initPivotSecondaryColsProcess = function (_a) {
944
+ var gridOptions = _a.gridOptions;
945
+ gridOptions.processSecondaryColDef = function (colDef) {
946
+ var api = colDef.headerComponentParams.gridQuery.api;
947
+ if (api) {
948
+ var valueColumns = colDef.headerComponentParams.gridQuery.api.columns.getValueColumns();
949
+ var originalColDef = valueColumns
950
+ .map(function (_a) {
951
+ var userProvidedColDef = _a.userProvidedColDef;
952
+ return userProvidedColDef;
953
+ })
954
+ .find(function (_a) {
955
+ var colId = _a.colId;
956
+ return colId === colDef.pivotValueColumn.getColId();
957
+ });
958
+ if (originalColDef) {
959
+ colDef.filter = originalColDef.filter;
960
+ }
961
+ }
962
+ if (colDef.pivotKeys) {
963
+ colDef.pivotKeys = colDef.pivotKeys.map(function (key) { return JSON.parse(key).value; });
964
+ }
965
+ };
966
+ gridOptions.processSecondaryColGroupDef = function (colGroupDef) {
967
+ if (colGroupDef.headerName) {
968
+ var _a = JSON.parse(colGroupDef.headerName), field = _a.field, value = _a.value;
969
+ colGroupDef.headerClass = field;
970
+ colGroupDef.headerName = value;
971
+ }
972
+ if (colGroupDef.pivotKeys) {
973
+ colGroupDef.pivotKeys = colGroupDef.pivotKeys.map(function (key) { return JSON.parse(key).value; });
974
+ }
975
+ };
976
+ };
977
+ GridService.prototype.setPivotModeRows = function (data) {
978
+ var pivotColumns = this.gridQuery.getAllPivotColumns();
979
+ var convertedData = data.map(function (currentValue, index) {
980
+ var e_4, _a;
981
+ var mappedValues = __assign({}, currentValue);
982
+ try {
983
+ for (var pivotColumns_1 = __values(pivotColumns), pivotColumns_1_1 = pivotColumns_1.next(); !pivotColumns_1_1.done; pivotColumns_1_1 = pivotColumns_1.next()) {
984
+ var col = pivotColumns_1_1.value;
985
+ var field = col.getColDef().field;
986
+ mappedValues[field] = JSON.stringify({ field: field, value: currentValue[field] });
987
+ }
988
+ }
989
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
990
+ finally {
991
+ try {
992
+ if (pivotColumns_1_1 && !pivotColumns_1_1.done && (_a = pivotColumns_1.return)) _a.call(pivotColumns_1);
993
+ }
994
+ finally { if (e_4) throw e_4.error; }
995
+ }
996
+ return mappedValues;
997
+ });
998
+ this.api.grid.setRowData(convertedData);
999
+ };
928
1000
  GridService.ctorParameters = function () { return [
929
1001
  { type: GridStore },
930
1002
  { type: GridQuery },
@@ -947,4 +1019,4 @@ var GridService = /** @class */ (function () {
947
1019
  return GridService;
948
1020
  }());
949
1021
  export { GridService };
950
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBY3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUlwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUWxGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUM1QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQztBQUc3STtJQXVCRSxxQkFDVSxLQUFnQixFQUNoQixTQUFvQixFQUNwQixTQUErQixFQUMvQixZQUEwQixFQUMxQixXQUF3QixFQUNPLFVBQTBCLEVBQy9CLE1BQXVCO1FBTmpELFVBQUssR0FBTCxLQUFLLENBQVc7UUFDaEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNPLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBckJuRCxtQ0FBOEIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1QyxlQUFVLEdBQXVCLG9CQUFvQixDQUFDO1FBRXJDLDhCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBa0JwRSxDQUFDO0lBaEJKLHNCQUFJLGlDQUFRO2FBSVo7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzthQU5ELFVBQWEsVUFBbUI7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDL0IsQ0FBQzs7O09BQUE7SUFnQkQsaUNBQVcsR0FBWCxjQUFlLENBQUM7SUFFaEIsMkNBQTJDO0lBQzNDLDZCQUFPLEdBQVAsVUFBUSxHQUFnQixFQUFFLE9BQWtCO1FBQzFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBSSxPQUFPLENBQUMsV0FBK0IsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUMxRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sNENBQXNCLEdBQTlCLFVBQStCLFdBQXdCO1FBQ3JELE9BQU8sV0FBVyxDQUFDLFlBQVksS0FBSyxVQUFVLENBQUM7SUFDakQsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixPQUFZLEVBQUUsT0FBZTtRQUE3Qix3QkFBQSxFQUFBLFlBQVk7UUFBRSx3QkFBQSxFQUFBLGVBQWU7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLEdBQUcsT0FBTztZQUMvQyxDQUFDLENBQUMsT0FBTztZQUNULENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUNBQWUsR0FBZixVQUFtQixHQUFzQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQWMsR0FBc0M7UUFDbEQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFyQixDQUFxQixDQUFDLENBQUM7UUFDM0UsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQXRDLENBQXNDLENBQUMsQ0FBQztRQUNwRSxJQUFJLFFBQVEsRUFBRTtZQUNaLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsa0NBQVksR0FBWixVQUFnQixHQUFzQztRQUNwRCxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFwQixDQUFvQixDQUFDLENBQUM7UUFDMUUsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQXZDLENBQXVDLENBQUMsQ0FBQztRQUNyRSxJQUFJLFFBQVEsRUFBRTtZQUNaLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFXLElBQVMsRUFBRSxZQUFvQixFQUFFLFVBQTRDO1FBQXhGLGlCQWtCQztRQWxCcUIsNkJBQUEsRUFBQSxvQkFBb0I7UUFBRSwyQkFBQSxFQUFBLGVBQTRDO1FBQ3RGLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEQsSUFBSSxLQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixLQUFJLENBQUMsVUFBVSx5QkFDVixvQkFBb0IsR0FDcEIsVUFBVSxDQUNkLENBQUM7Z0JBQ0YsSUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDMUQsS0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQztZQUNELElBQUksWUFBWSxFQUFFO2dCQUNoQixLQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNCO2lCQUFNO2dCQUNMLG1CQUFtQixFQUFFLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQ0FBYSxHQUFiLFVBQWMsT0FBZ0QsRUFBRSxtQkFBMkIsRUFBRSxXQUFtQjtRQUFoRCxvQ0FBQSxFQUFBLDJCQUEyQjtRQUFFLDRCQUFBLEVBQUEsbUJBQW1CO1FBQzlHLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBQ2xFLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixlQUF1QixFQUFFLFdBQW1CO1FBQTVDLGdDQUFBLEVBQUEsdUJBQXVCO1FBQUUsNEJBQUEsRUFBQSxtQkFBbUI7UUFDNUQsZUFBZSxJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBQzlELFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFTyx5REFBbUMsR0FBM0M7UUFDRSxnSEFBZ0g7UUFDaEgsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFBRTtZQUMxRCxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNoRjtJQUNILENBQUM7SUFFRCw2QkFBTyxHQUFQLFVBQVcsR0FBTSxFQUFFLEtBQWM7UUFDL0IsSUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLElBQU0sSUFBSSxHQUF1QixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBYyxHQUFRO1FBQ3BCLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFJRCxvQ0FBYyxHQUFkLFVBQWtCLEdBQXFCLEVBQUUsR0FBVyxFQUFFLFFBQVc7UUFDL0QsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNwRSxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFXLEdBQXdCO1FBQ2pDLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxFQUFRO2dCQUFOLGNBQUk7WUFBTyxPQUFBLElBQUk7UUFBSixDQUFJLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCx3Q0FBa0IsR0FBbEI7UUFDRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQ0FBVSxHQUFWO1FBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRUQsbUNBQWEsR0FBYixVQUFjLE9BQWdELEVBQUUsY0FBc0I7UUFBdEIsK0JBQUEsRUFBQSxzQkFBc0I7UUFDcEYsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE1BQU0sSUFBSSxhQUFhLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFNLGFBQWEsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsc0NBQWdCLEdBQWhCLFVBQWlCLE1BQThCO1FBQS9DLGlCQThEQztRQTdEQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQzVELElBQU0scUJBQXFCLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0UsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IseUJBQ2hDLHFCQUFxQixHQUNyQixNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUN6QyxDQUFDO1FBRUYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLHlCQUMzQixNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FDbkMscUJBQXFCLHVCQUFBLEdBQ3RCLENBQUM7UUFDRixJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO1lBQzFELE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQ2pFO1FBQ0QsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEtBQUssV0FBVyxFQUFFO1lBQzlELE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7U0FDckU7UUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsS0FBSyxXQUFXLEVBQUU7WUFDMUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEI7Z0JBQzdDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztTQUNwRztRQUNELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLHFCQUFxQixLQUFLLFdBQVcsRUFBRTtZQUNuRSxNQUFNLENBQUMsV0FBVyxDQUFDLHFCQUFxQjtnQkFDdEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksa0JBQWtCLENBQUMscUJBQXFCLENBQUM7U0FDL0U7UUFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpHLHVCQUF1QjtRQUN2QixNQUFNLENBQUMsV0FBVyxDQUFDLHVCQUF1QixHQUFHLGNBQU0sT0FBQSxJQUFJLEVBQUosQ0FBSSxDQUFDO1FBQ3hELE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEdBQUcsVUFBQyxHQUFZO1lBQ3ZELE9BQU8sQ0FDTCxjQUFjLENBQUMsRUFBRSxHQUFHLEtBQUEsRUFBRSxHQUFHLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FDaEgsQ0FBQztRQUNKLENBQUMsQ0FBQztRQUVGLHdEQUF3RDtRQUN4RCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDbkQsTUFBTSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsR0FBRyxHQUFHLENBQUM7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsNERBQTREO1lBQzVELElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUM7WUFDeEQsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2FBQy9DO1NBQ0Y7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3RSx5QkFBeUI7UUFDbkIsSUFBQSx1QkFBK0MsRUFBN0MsOEJBQVksRUFBRSxzQkFBK0IsQ0FBQztRQUN0RCxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxZQUFZLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdFLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsd0NBQXdDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFTyxzQ0FBZ0IsR0FBeEIsVUFBeUIsT0FBNEIsRUFBRSxXQUFtQztRQUExRixpQkF3QkM7UUF4QnNELDRCQUFBLEVBQUEsa0JBQW1DO1FBQ3hGLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDL0M7UUFDRCxJQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBc0I7WUFDeEQsSUFBTSxVQUFVLHlCQUNYLEdBQUcsS0FDTixVQUFVLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUNyRCxDQUFDO1lBQ0YsbURBQW1EO1lBQ25ELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDWixVQUFVLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQzthQUMvRDtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO2dCQUNkLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzthQUM5QjtZQUNELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO2dCQUM5RSxVQUFVLENBQUMsYUFBYSxHQUFHLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdFO1lBQ0QsS0FBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDL0QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVPLGlEQUEyQixHQUFuQyxVQUNFLFdBQTRCLEVBQzVCLEdBQXNCLEVBQ3RCLFVBQTZCO1FBSC9CLGlCQStCQztRQTFCQyxzREFBc0Q7UUFDdEQsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxlQUFlLEtBQUssV0FBVyxFQUFFO1lBQzlDLElBQUksa0JBQWtCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7Z0JBQy9ELFVBQVUsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxlQUFlO29CQUN4QixPQUFPLFdBQVcsQ0FBQyxnQ0FBZ0MsS0FBSyxXQUFXO3dCQUNqRSxDQUFDLENBQUMsV0FBVyxDQUFDLGdDQUFnQzt3QkFDOUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxJQUNFLFVBQVUsQ0FBQyxlQUFlO1lBQzFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxxQkFBcUIsRUFDakM7WUFDQSxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQUMsTUFBMkI7Z0JBQ3BELElBQU0sVUFBVSxHQUNkLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNoRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVELE9BQU8sVUFBVTtvQkFDZixDQUFDLENBQUMsdUNBQXVDLENBQUMsTUFBTSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2pGLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLHFDQUFlLEdBQXZCLFVBQXdCLE1BQXlCLEVBQUUsV0FBNEI7UUFDN0UsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBYyxDQUFDO1FBQ25DLElBQU0seUJBQXlCLEdBQUcsVUFBQyxPQUFpQztZQUNsRSxPQUFBLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWTtRQUE5RixDQUE4RixDQUFDO1FBRWpHLE9BQU8seUJBQXlCLENBQUMsV0FBVyxDQUFDLElBQUkseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU8sMERBQW9DLEdBQTVDLFVBQ0UsVUFBK0IsRUFDL0IsV0FBNEI7UUFFNUIsSUFBTSw0QkFBNEIsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLDRCQUE0QixDQUFDO1FBQzdGLElBQU0sWUFBWSxHQUNoQixXQUFXLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBRXZHLElBQUksNEJBQTRCLElBQUksWUFBWSxLQUFLLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtZQUNsRixJQUFNLGdCQUFnQixHQUFzQjtnQkFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyx5QkFBeUI7Z0JBQ3JDLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLHdCQUF3QixFQUFFLHdDQUF3QztnQkFDbEUsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsU0FBUyxFQUFFLHlCQUF5QjtnQkFDcEMsV0FBVyxFQUFFLGdDQUFnQztnQkFDN0MsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixlQUFlLEVBQUUsS0FBSzthQUN2QixDQUFDO1lBQ0YsaUJBQVEsZ0JBQWdCLEdBQUssVUFBVSxFQUFFO1NBQzFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLDhEQUF3QyxHQUFoRCxVQUFpRCxFQUF1QztRQUF4RixpQkF1QkM7WUF2QmtELDRCQUFXO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsT0FBTztTQUNSO1FBQ0QsSUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3hELFdBQVcsQ0FBQyxhQUFhLEdBQUcsVUFBQyxHQUFxQjtZQUNoRCxJQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEVBQUU7Z0JBQy9DLElBQU0sTUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLElBQU0sVUFBVSxHQUFHLE1BQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsSUFBQSw4RUFBcUIsQ0FBcUM7Z0JBQ2xFLElBQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxNQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVSxJQUFJLFVBQVUsRUFBRTtvQkFDNUIsS0FBSSxDQUFDLHVCQUF1QixDQUFDO3dCQUMzQixxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBQyxNQUFjLElBQUssT0FBQSxNQUFNLEtBQUssTUFBSSxDQUFDLEVBQUUsRUFBbEIsQ0FBa0IsQ0FBQztxQkFDNUYsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLHFCQUFxQixXQUFNLHFCQUFxQixHQUFFLE1BQUksQ0FBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzlGO2FBQ0Y7WUFDRCxJQUFJLHFCQUFxQixFQUFFO2dCQUN6QixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxzQ0FBZ0IsR0FBeEIsVUFBeUIsR0FBWTs7UUFDbkMsSUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9FLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLDRCQUE0QjtZQUMxRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7WUFDNUMsS0FBa0IsSUFBQSxZQUFBLFNBQUEsT0FBTyxDQUFBLGdDQUFBLHFEQUFFO2dCQUF0QixJQUFNLEdBQUcsb0JBQUE7Z0JBQ1osSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBc0IsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7b0JBQzNCLFNBQVM7aUJBQ1Y7Z0JBQ0QsSUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM5RixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ2pDLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7Ozs7Ozs7OztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0NBQWMsR0FBZDtRQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELHFDQUFlLEdBQWYsVUFBZ0IsS0FBYTtRQUMzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQUMsRUFBVTtvQkFBUixrQkFBTTtnQkFBTyxPQUFBLE1BQU0sS0FBSyxLQUFLO1lBQWhCLENBQWdCLENBQUMsQ0FBQztZQUNwRixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQUMsRUFBVTtvQkFBUixrQkFBTTtnQkFBTyxPQUFBLENBQUMsTUFBTTtZQUFQLENBQU8sQ0FBQyxDQUFDO1lBQ3pFLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRTtnQkFDaEIsSUFBQTs7O2lCQUdMLEVBSE8sc0JBQVEsRUFBRSw4QkFHakIsQ0FBQztnQkFDRixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQy9GO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxxQ0FBZSxHQUFmO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixNQUFNLEVBQUUsRUFBRSxFQUNWLFVBQVUsRUFBRSxJQUFJLEdBQ2pCO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixXQUFtQjtRQUNuQyxJQUE4QywrQkFBMEIsRUFBaEUsZ0JBQWEsRUFBYixnQkFBc0IsRUFBRSw0REFBd0MsQ0FBQztRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUs7WUFDckIsT0FBTztnQkFDTCxRQUFRLHdCQUNILEtBQUssQ0FBQyxRQUFRLEtBQ2pCLE1BQU0sUUFBQSxHQUNQO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHFDQUFlLEdBQWYsVUFBZ0IsTUFBYyxFQUFFLE1BQXNCO1FBQ3BELElBQUksQ0FBQyxTQUFTLHFEQUFxQztZQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QixlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbEYsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLOztZQUNyQixPQUFPO2dCQUNMLFFBQVEsd0JBQ0gsS0FBSyxDQUFDLFFBQVEsS0FDakIsTUFBTSx3QkFDRCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sZ0JBQ3ZCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLElBQUcsTUFBTSxTQUVyQzthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtQ0FBYSxHQUFiLFVBQWMsVUFBa0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixVQUFVLFlBQUEsR0FDWDthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCw2Q0FBdUIsR0FBdkIsVUFBd0IsTUFBMkM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsb0JBQW9CLHdCQUNmLEtBQUssQ0FBQyxvQkFBb0IsR0FDMUIsTUFBTSxDQUNWO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBVyxJQUFhO1FBQ3RCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLElBQWE7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFXLElBQWE7UUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsb0NBQWMsR0FBZCxVQUFlLFFBQW1DO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSztZQUNyQixPQUFPO2dCQUNMLFFBQVEsd0JBQ0gsS0FBSyxDQUFDLFFBQVEsR0FDZCxRQUFRLENBQ1o7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFRLEVBQTJCO1FBQ2pDLEVBQUUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUYsSUFBTSxhQUFhLEdBQUcsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLDBCQUFvQyxDQUFDLHVCQUFpQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxhQUFhLGVBQUEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQW9CLEdBQXBCLFVBQXFCLFFBQW1DO1FBQ3RELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7UUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLFNBQXlCLEVBQUUsZUFBOEI7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxhQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFLLGVBQWUsRUFBRyxDQUFDO0lBQ2hGLENBQUM7SUFFTyx5Q0FBbUIsR0FBM0IsVUFBNEIsRUFBc0U7UUFBbEcsaUJBaUJDO1lBakI2Qix3QkFBUyxFQUFFLDBCQUFVLEVBQUUsZ0RBQXFCO1FBQ3hFLE9BQU8sVUFBQyxhQUFvQixFQUFFLFNBQWlCO1lBQzdDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFNBQVMsV0FBQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdELFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLEdBQUcsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLElBQUk7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLGNBQWMsRUFBRSxVQUFVO2FBQzNCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDMUIsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsK0NBQStDO2dCQUMvQyxtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsS0FBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFXLEdBQW5CLFVBQW9CLE9BQXdCLEVBQUUsT0FBaUQ7UUFBL0YsaUJBMkNDO1FBMUNDLElBQU0sU0FBUyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN4RCxPQUFPLFVBQUMsYUFBNkI7WUFDM0IsSUFBQSxpQ0FBUSxFQUFFLDZCQUFNLEVBQUUsbUNBQVMsRUFBRSwrQ0FBZSxDQUFtQjtZQUN2RSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDO1lBQ25ELElBQU0sNkJBQTZCLEdBQUcsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUMsQ0FBQztZQUM5RSxJQUFNLHFCQUFxQixHQUFHLDZCQUE2QixJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBTSxVQUFVLEdBQUcsNkJBQTZCO2dCQUM5QyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztZQUVqQyxLQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFekMsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxJQUFNLFNBQVMseUJBQ1YsYUFBYSxLQUNoQixZQUFZLEVBQUU7b0JBQ1osS0FBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsRUFDRCxlQUFlLEVBQUUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxZQUFBLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsdUJBQUEsRUFBRSxDQUFDLEVBQzVHLFlBQVksRUFBRTtvQkFDWixRQUFRLFVBQUE7b0JBQ1IsVUFBVSxZQUFBO29CQUNWLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDO29CQUNwRyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDM0YsSUFBSSxFQUFFLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7aUJBQzdDLEdBQ0YsQ0FBQztZQUNGLElBQUkscUJBQXFCLEVBQUU7Z0JBQ3pCLG1HQUFtRztnQkFDbkcsMEhBQTBIO2dCQUMxSCxpRkFBaUY7Z0JBQ2pGLHlGQUF5RjtnQkFDekYsSUFBTSxXQUFXLEdBQUcsVUFBQyxFQUEwQzt3QkFBeEMsb0NBQWU7b0JBQ3BDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLENBQUM7Z0JBQ0YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxrREFBNEIsR0FBcEMsVUFBcUMsTUFBOEI7UUFBbkUsaUJBa0JDO1FBakJDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07WUFDMUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNuQixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQy9CLElBQU0sa0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFDLGVBQWdDO3dCQUNsRCxJQUFNLFVBQVUsR0FBSSxNQUFNLENBQUMsUUFBcUIsQ0FBQyxlQUFzQixDQUFDLENBQUM7d0JBQ3pFLElBQUksVUFBVSxFQUFFOzRCQUNkLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBZ0IsQ0FBQyxDQUFDOzRCQUNuRSxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7eUJBQ3RGO3dCQUNELE9BQU8sVUFBVSxDQUFDLGtCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQztvQkFDN0YsQ0FBQyxDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixNQUE4QjtRQUE3RCxpQkFvREM7UUFuRFMsSUFBQSx3REFBaUIsQ0FBd0I7UUFDakQsSUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUM1RyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsSUFBTSxVQUFVLEdBQWM7WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ2pELElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxFQUFFLFdBQVc7U0FDakIsQ0FBQztRQUNGLE9BQU8sVUFBQyxFQUFvRDtnQkFBbEQsY0FBSSxFQUFFLGtCQUFNLEVBQUUsb0JBQU87WUFDN0IsSUFBTSxpQkFBaUIsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUM1RixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixLQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBQyxFQUFLO3dCQUFMLGtCQUFLLEVBQUosV0FBRztvQkFDeEIsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDaEUsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDcEQsSUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDekQsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLFFBQVEsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2hELFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7WUFDRCxJQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FDdEMsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FDNUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxFQUFXO29CQUFULG9CQUFPO2dCQUFPLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQyxDQUFDO1lBQ25DLElBQUksY0FBYyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsY0FBYyxHQUFHLGNBQWMsQ0FBQzthQUNqQztpQkFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxjQUFjLG1DQUFTLFVBQVUsS0FBRSxTQUFTLEVBQUUsSUFBSSxNQUFPLGNBQWMsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsSUFBTSxlQUFlLEdBQTBCO2dCQUM3QyxjQUFjLGdCQUFBO2dCQUNkLFlBQVksRUFBRSxRQUFRO2dCQUN0QixZQUFZLEVBQUUsS0FBSSxDQUFDLFdBQVc7Z0JBQzlCLElBQUksTUFBQTtnQkFDSixNQUFNLEVBQUU7b0JBQ04sR0FBRyxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQztvQkFDOUIsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWM7aUJBQzdEO2FBQ0YsQ0FBQztZQUNGLE9BQU8sNEJBQTRCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLDJDQUFxQixHQUE3QixVQUE4QixVQUF1QjtRQUFyRCxpQkFPQztRQU5DLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO1lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixRQUFtQztRQUFyRCxpQkFrRUM7UUFoRUcsSUFBQSxvQkFBSSxFQUNKLHNDQUFhLEVBQ2Isd0JBQU0sRUFDTix3Q0FBYyxFQUNkLG9DQUFZLEVBQ1osc0NBQWEsRUFDYixvQ0FBWSxFQUNaLHNDQUFhLENBQ0Y7UUFDUCxJQUFBLGFBQTRCLEVBQTFCLGNBQUksRUFBRSxvQkFBb0IsQ0FBQztRQUNuQyxrQkFBa0I7UUFDbEIsc0VBQXNFO1FBQ3RFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxJQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUNoRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLG1CQUFtQjtRQUNuQixJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUVELG1CQUFtQjtRQUNuQixJQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksY0FBYyxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQXhDLENBQXdDLENBQUMsQ0FBQztZQUMxRixPQUFPLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9DLGdCQUFnQjtRQUNoQixJQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELGdCQUFnQjtRQUNoQixJQUFJLGFBQWEsbUJBQTZCLEVBQUU7WUFDOUMsc0JBQXNCO1lBQ3RCLFlBQVk7Z0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO29CQUNyQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsMkJBQXFDLEVBQUU7d0JBQzVELE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUNwRDtnQkFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxhQUFhLDJCQUFxQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDN0c7UUFFRCxzQkFBc0I7UUFDdEIsSUFBTSxxQkFBcUIsR0FBRyxhQUFhO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBVyxJQUFLLE9BQUEsR0FBRyxLQUFLLEtBQUksQ0FBQyx5QkFBeUIsRUFBdEMsQ0FBc0MsQ0FBQztZQUMvRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsSUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQVcsSUFBSyxPQUFBLEdBQUcsS0FBSyxLQUFJLENBQUMseUJBQXlCLEVBQXRDLENBQXNDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7WUFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUM7WUFDekQsQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZFLG1CQUFtQjtRQUNuQixZQUFZLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHFDQUFlLEdBQWY7UUFDRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0NBQWtCLEdBQWxCO1FBQ0UsSUFBTSx5QkFBMEMsRUFBeEMsa0JBQU0sRUFBRSw2QkFBZ0MsQ0FBQztRQUN6QyxJQUFBLDBCQUFPLENBQWM7UUFDN0IsSUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxlQUF5QixDQUFDO1FBQ2hHLElBQU0sV0FBVyx5QkFBUSxJQUFJLEtBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsZUFBQSxHQUFFLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxRQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxrQ0FBWSxHQUFaLFVBQWEsYUFBd0M7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHdDQUFrQixHQUFsQjtRQUFBLGlCQWdCQztRQWZDLElBQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxhQUFhLENBQUMsS0FBSyxDQUFDO2FBQ2pCLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNyQjthQUNBLFNBQVMsQ0FBQztZQUNULElBQU0sZUFBZSxHQUFHLEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0QsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sK0NBQXlCLEdBQWpDLFVBQWtDLE1BQTBCOztRQUMxRCxJQUFNLGNBQWMsR0FBZ0MsRUFBRSxDQUFDOztZQUN2RCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ2YsSUFBQSx1QkFBTyxFQUFFLCtCQUFXLENBQVc7Z0JBQ3ZDLElBQUksT0FBTyxFQUFFO29CQUNYLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRzt3QkFDdkIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ25CLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBRzt3QkFDeEIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUM5QixPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJOzRCQUM5QixJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTs0QkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO2dDQUMvQyxPQUFPO29DQUNMLFNBQVMsV0FBQTtvQ0FDVCxLQUFLLEVBQUUsS0FBSztvQ0FDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO2lDQUNyRCxDQUFDOzZCQUNIOzRCQUNELE9BQU8sSUFBK0IsQ0FBQzt3QkFDekMsQ0FBQyxDQUFDO3FCQUNILENBQUM7b0JBQ0YsSUFBSSxPQUFPLEVBQUU7d0JBQ1gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDeEQ7eUJBQU07d0JBQ0wsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDO3FCQUM1QztpQkFDRjthQUNGOzs7Ozs7Ozs7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsb0RBQThCLEdBQTlCLFVBQStCLFdBQWdDO1FBQS9ELGlCQTBDQztRQXpDQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxVQUFDLEVBQXdDO2dCQUF0QyxzQkFBUTtZQUFtQyxPQUFBLFFBQVEsS0FBSyxhQUFhLENBQUMsR0FBRztRQUE5QixDQUE4QixDQUFDLEVBQUU7WUFDckcsSUFBTSxnQkFBZ0IsR0FBRyxhQUFhO2lCQUNuQyxHQUFHLENBQUMsVUFBQyxFQUF1QztvQkFBckMsb0JBQU87Z0JBQW1DLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQztpQkFDekQsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQWYsQ0FBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLGFBQWEsR0FBRztnQkFDZDtvQkFDRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUc7b0JBQzNCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztTQUNIO1FBQ0QsSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUU7WUFDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUMzQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNPLElBQUEsMkZBQTRCLENBQXFDO1FBQ3pFLElBQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQXlCO1lBQ3JFLE9BQU8sQ0FDTCxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsNEJBQTRCLElBQUksS0FBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUNqSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFNLGFBQWEsR0FBb0MsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBNEI7Z0JBQTFCLGdCQUFLO1lBQTBCLE9BQUEsQ0FBQztnQkFDOUcsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFFBQVE7Z0JBQ3hDLEtBQUssRUFBRSxVQUFVO2dCQUNqQixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7UUFKNkcsQ0FJN0csQ0FBQyxDQUFDO1FBQ0osSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRU8sbURBQTZCLEdBQXJDLFVBQXNDLE1BQTBCOztRQUM5RCxJQUFJLGFBQWEsR0FBaUMsRUFBRSxDQUFDOztZQUVyRCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ3ZCLElBQUksWUFBWSxHQUErQixJQUFJLENBQUM7Z0JBQzVDLElBQUEsdUJBQU8sRUFBRSwrQkFBVyxDQUFXO2dCQUN2QyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxZQUFZLEdBQUc7d0JBQ2IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsWUFBRyxNQUFNLFFBQUEsSUFBSyxPQUFPLEVBQUc7cUJBQ2xDLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBK0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0csSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7cUJBQzlDO3lCQUFNO3dCQUNMLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztxQkFDbEM7aUJBQ0Y7Z0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQzs7Ozs7Ozs7O1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELHlEQUFtQyxHQUFuQztRQUNVLElBQUEsNkVBQXFCLENBQXFDO1FBQzVELElBQUEsb0NBQTZELEVBQTNELDBCQUFVLEVBQUUsNEJBQStDLENBQUM7UUFDcEUsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDbEMsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxJQUFNLGtCQUFrQixHQUFzQztZQUM1RCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsV0FBVztZQUMzQyxNQUFNLEVBQUUscUJBQXFCO1lBQzdCLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUM7UUFDRixJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZ0RBQTBCLEdBQWxDLFVBQ0UsaUJBQTRDLEVBQzVDLE1BQWM7UUFFZCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7WUFDcEMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO2dCQUNwQyxJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTtnQkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO29CQUMvQyxPQUFPO3dCQUNMLFNBQVMsV0FBQTt3QkFDVCxLQUFLLEVBQUUsS0FBSzt3QkFDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO3dCQUNwRCxNQUFNLFFBQUE7cUJBQytCLENBQUM7aUJBQ3pDO2dCQUNELElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsU0FBUyxFQUFFO29CQUMvRixPQUFPO3dCQUNMLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRO3dCQUN4QyxLQUFLLEVBQUUsU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUNyRSxNQUFNLFFBQUE7cUJBQ1AsQ0FBQztpQkFDSDtnQkFDRCxPQUFPLHNCQUFLLElBQUksS0FBRSxNQUFNLFFBQUEsR0FBbUMsQ0FBQztZQUM5RCxDQUFDLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixTQUF5QjtRQUN0RCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBQyxFQUFlO2dCQUFiLGdCQUFLLEVBQUUsY0FBSTtZQUFPLE9BQUEsQ0FBQztnQkFDekMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQWlDO2FBQzdELENBQUM7UUFId0MsQ0FHeEMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLDBDQUFvQixHQUE1QixVQUNFLGNBQTZGO1FBRC9GLGlCQVdDO1FBUkMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDekIsT0FBTyxvQkFBb0IsQ0FBQztTQUM3QjthQUFNLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sVUFBQSxlQUFlO2dCQUNwQixPQUFPLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTywyQ0FBcUIsR0FBN0IsVUFBOEIsWUFBK0I7UUFDM0QsSUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsOENBQXdCLEdBQXhCLFVBQXlCLFVBQWlCLEVBQUUsZ0JBQXdCO1FBQTNDLDJCQUFBLEVBQUEsaUJBQWlCO1FBQUUsaUNBQUEsRUFBQSx3QkFBd0I7UUFDbEUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNaLElBQUEsK0VBQXFCLENBQXFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXFCLENBQUMsRUFBRTtnQkFDbkMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUMsRUFBZTt3QkFBYixVQUFFO29CQUFnQixPQUFBLENBQUMsdUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFBbkMsQ0FBbUMsQ0FBQyxDQUFDO2FBQ3RHO1NBQ0Y7UUFDRCxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxxQ0FBZSxHQUFmO1FBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixFQUFFO1lBQy9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFGO0lBQ0gsQ0FBQzs7Z0JBMzZCZ0IsU0FBUztnQkFDTCxTQUFTO2dCQUNULG9CQUFvQjtnQkFDakIsWUFBWTtnQkFDYixXQUFXO2dEQUMvQixNQUFNLFNBQUMscUJBQXFCO2dEQUM1QixNQUFNLFNBQUMsZ0JBQWdCOztJQTlCZixXQUFXO1FBRHZCLFVBQVUsRUFBRTtRQThCUixXQUFBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQzdCLFdBQUEsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7eUNBTlYsU0FBUztZQUNMLFNBQVM7WUFDVCxvQkFBb0I7WUFDakIsWUFBWTtZQUNiLFdBQVc7T0E1QnZCLFdBQVcsQ0FvOEJ2QjtJQUFELGtCQUFDO0NBQUEsQUFwOEJELElBbzhCQztTQXA4QlksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBRdWVyeUxpc3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdG9HcmlkQXBpIH0gZnJvbSAnLi4vZ3JpZC1jb250cm9sbGVyL2dyaWQtY29udHJvbGxlci50eXBlcyc7XG5pbXBvcnQge1xuICBDZWxsQ2xhc3NQYXJhbXMsXG4gIENvbHVtbixcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dOb2RlLFxuICBSb3dOb2RlVHJhbnNhY3Rpb24sXG4gIFJvd1NlbGVjdGVkRXZlbnRcbn0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgUm93RGF0YVRyYW5zYWN0aW9uIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHkvZGlzdC9saWIvcm93TW9kZWxzL2NsaWVudFNpZGUvY2xpZW50U2lkZVJvd01vZGVsJztcbmltcG9ydCB7IEdyaWRRdWVyeSB9IGZyb20gJy4vZ3JpZC5xdWVyeSc7XG5pbXBvcnQgeyBEYXRvQ29yZUVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IERhdG9UcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jdXN0b20taGVhZGVyL2N1c3RvbS1oZWFkZXItdGVtcGxhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEYXRvRmlsdGVyQ29uZGl0aW9ucyxcbiAgRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uLFxuICBEYXRvR3JpZEZpbHRlclNlY3Rpb25zLFxuICBEYXRvR3JpZEZpbHRlcnNNYXAsXG4gIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkxpc3RDb25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb25cbn0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZ3JpZC1maWx0ZXIudHlwZXMnO1xuaW1wb3J0IHsgY29lcmNlQXJyYXkgfSBmcm9tICcuLi8uLi91dGlscy9jb2VyY2lvbic7XG5pbXBvcnQgeyBpc0VtcHR5LCBpc0Z1bmN0aW9uLCBpc05pbCwgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsdGVyIH0gZnJvbSAnLi4vZ3JpZC1maWx0ZXIvZmlsdGVyLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBBZ0dyaWROZzIgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHsgSWNvblJlZ2lzdHJ5LCBTdmdSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ljb24tcmVnaXN0cnknO1xuaW1wb3J0IHsgZ2V0VmlzaWJsZUFjdGlvbnMsIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXYyLnV0aWwnO1xuaW1wb3J0IHtcbiAgRGF0b0dyaWRTZXR0aW5ncyxcbiAgTm9ybWFsaXplT3B0aW9uc1BhcmFtcyxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25maWcsXG4gIFN1Y2Nlc3NXcmFwcGVyUGFyYW1zXG59IGZyb20gJy4vZ3JpZC5zdG9yZS50eXBlcyc7XG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXRvb2xiYXIvZ3JpZC10b29sYmFyLnR5cGVzJztcbmltcG9ydCB7IGNvcHlUb0NsaXBib2FyZCB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY2xpcGJvYXJkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkU3RvcmUgfSBmcm9tICcuL2dyaWQuc3RvcmUnO1xuaW1wb3J0IHsgREFUT19HUklEX1NUT1JBR0VfQVBJLCBHcmlkU3RvcmFnZUFQSSB9IGZyb20gJy4uL2dyaWQtc2V0dGluZ3MnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udmVydGVyUGFyYW1zLFxuICBEYXRvR3JpZEFsaWdubWVudCxcbiAgRGF0b0dyaWRDb2x1bW5EZWYsXG4gIERhdG9HcmlkQ29sdW1uVHlwZXMsXG4gIERhdG9HcmlkR2V0Um93c1BhcmFtcyxcbiAgRGF0b0dyaWRPcHRpb25zLFxuICBEYXRvR3JpZFNlcnZlclNvcnQsXG4gIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvbixcbiAgRGF0b0dyaWRTb3J0LFxuICBEYXRvR3JpZFRyZWVDb25maWcsXG4gIGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodCxcbiAgR3JpZE1pbldpZHRocyxcbiAgR3JpZFJvd1NlbGVjdGlvblR5cGUsXG4gIHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlclxufSBmcm9tICcuLi9ncmlkL2dyaWQtdjIudHlwZXMnO1xuXG5pbXBvcnQgeyBjb252ZXJ0VG9UcmVlRGF0YSwgZGVmYXVsdEdyaWRPcHRpb25zLCBkZWZhdWx0R3JpZFRyZWVMYWJlbCB9IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi5jb25maWcnO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdCc7XG5pbXBvcnQgeyB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ25neC10YWtlLXVudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgQ29yZUV2ZW50TG9nZ2VyLCBDb3JlRXZlbnRUeXBlcywgREFUT19DT1JFX0xPR0dFUiB9IGZyb20gJy4uLy4uL2V2ZW50LWxvZ2dlcic7XG5pbXBvcnQgeyBIYXNoTWFwIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXMnO1xuaW1wb3J0IHsgc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT3BlcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uL29wZXJhdG9yLXRvZ2dsZXIvb3BlcmF0b3ItdG9nZ2xlci50eXBlcyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9kZWVwLW1lcmdlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRyaWdnZXJXaW5kb3dSZXNpemUgfSBmcm9tICcuLi8uLi91dGlscy91c2VyLWFnZW50JztcbmltcG9ydCB7IGdldENvbHVtbnNTaXplcyB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jb2x1bW4taGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYXBpOiBEYXRvR3JpZEFwaTtcbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgZm9yIHNlcnZlciBzaWRlIGJ5IHZhbHVlIGZpbHRlciAqL1xuICBfb3JpZ2luYWxHZXRSb3dzOiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQ7XG4gIHByaXZhdGUgaW5pdGlhbFNldHRpbmdzOiBEYXRvR3JpZFNldHRpbmdzO1xuICBwcml2YXRlIGdyaWROYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgZ3JpZFJlZjogQWdHcmlkTmcyO1xuICBwcml2YXRlIGN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQ+O1xuICBwcml2YXRlIGlzVHJlZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG4gIHByaXZhdGUgbGFzdFRvdGFsUm93czogbnVtYmVyO1xuICB0cmVlQ29uZmlnOiBEYXRvR3JpZFRyZWVDb25maWcgPSBkZWZhdWx0R3JpZFRyZWVMYWJlbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZE5nMikge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuICAgIHRoaXMuZ3JpZFJlZiA9IGdyaWRSZWY7XG4gICAgdGhpcy5ncmlkTmFtZSA9IChncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykuZ3JpZE5hbWU7XG4gICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICBlbmFibGVkOiB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZFJlZi5ncmlkT3B0aW9ucylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9uczogR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ3JpZE9wdGlvbnMucm93TW9kZWxUeXBlID09PSAnaW5maW5pdGUnO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbnRleHQoY29udGV4dCA9IHt9LCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmNvbnRleHQgPSByZXBsYWNlXG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogZGVlcG1lcmdlKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucy5jb250ZXh0IHx8IHt9LCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHNldFNlbGVjdGVkUm93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIHRoaXMuc2VsZWN0Um93cyhyb3cpO1xuICB9XG5cbiAgc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiAhcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiByb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb3dzPFQ+KGRhdGE6IFRbXSwgZml0Q29udGFpbmVyID0gZmFsc2UsIHRyZWVDb25maWc6IFBhcnRpYWw8RGF0b0dyaWRUcmVlQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ3JpZFJlYWR5JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyZWVEYXRhKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0R3JpZFRyZWVMYWJlbCxcbiAgICAgICAgICAuLi50cmVlQ29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRyZWVEYXRlID0gY29udmVydFRvVHJlZURhdGEoZGF0YSwgdGhpcy50cmVlQ29uZmlnKTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKHRyZWVEYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaXRDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5maXRHcmlkKCdjb250YWluZXInKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldERhdGFzb3VyY2UoZ2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkLCByZXR1cm5Ub0N1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICByZXR1cm5Ub0N1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gZ2V0Um93cztcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLndyYXBHZXRSb3dzKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCksIGdldFJvd3MpIH0pO1xuICB9XG5cbiAgcmVmcmVzaFNlcnZlckRhdGEoa2VlcEN1cnJlbnRQYWdlID0gZmFsc2UsIHNob3dMb2FkaW5nID0gZmFsc2UpIHtcbiAgICBrZWVwQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldERhdGFzb3VyY2UoeyBnZXRSb3dzOiB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmRhdGFzb3VyY2UuZ2V0Um93cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKSB7XG4gICAgLy8gS2VlcGluZyB0aGUgY3VycmVudCBwYWdlIG9uIHNlcnZlciByZWZyZXNoIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSB3aGVuIG5vIHBhZ2UgY2xpZW50IGNhY2hpbmcgaXMgZW5hYmxlZFxuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLm1heEJsb2Nrc0luQ2FjaGUgPT09IDEpIHtcbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gdGhpcy5hcGkuZ3JpZC5wYWdpbmF0aW9uR2V0Q3VycmVudFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICBhZGRSb3dzPFQ+KHJvdzogVCwgaW5kZXg/OiBudW1iZXIpOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIGNvbnN0IGRhdGE6IFJvd0RhdGFUcmFuc2FjdGlvbiA9IHsgYWRkOiByb3dzIH07XG4gICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAgIGRhdGEuYWRkSW5kZXggPSBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YShkYXRhKTtcbiAgfVxuXG4gIHVwZGF0ZVJvd3M8VD4ocm93OiBUW10pOiBhbnkge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyB1cGRhdGU6IHJvd3MgfSk7XG4gIH1cblxuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KGlkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCk7XG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogc3RyaW5nIHwgUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKSB7XG4gICAgY29uc3Qgcm93Tm9kZSA9IGlzU3RyaW5nKHJvdykgPyB0aGlzLmFwaS5ncmlkLmdldFJvd05vZGUocm93KSA6IHJvdztcbiAgICByb3dOb2RlLnNldERhdGFWYWx1ZShrZXksIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZVJvd3Mocm93OiBSb3dOb2RlIHwgUm93Tm9kZVtdKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KS5tYXAoKHsgZGF0YSB9KSA9PiBkYXRhKTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgcmVtb3ZlOiByb3dzIH0pO1xuICB9XG5cbiAgcmVtb3ZlU2VsZWN0ZWRSb3dzKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldFNlbGVjdGVkUm93Tm9kZXMoKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVSb3dzKHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBjbGVhclRhYmxlKCkge1xuICAgIHRoaXMuc2V0Um93cyhbXSk7XG4gIH1cblxuICB1cGRhdGVDb2x1bW5zKGNvbERlZnM6IERhdG9HcmlkQ29sdW1uRGVmIHwgRGF0b0dyaWRDb2x1bW5EZWZbXSwgcmVsb2FkU2V0dGluZ3MgPSBmYWxzZSkge1xuICAgIGlmICghY29sRGVmcykge1xuICAgICAgdGhyb3cgbmV3IERhdG9Db3JlRXJyb3IoJ05vIGNvbHVtbkRlZnMgd2VyZSBwcm92aWRlZC4g8J+VtfCfj7vigI3imYDvuI8nKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhjb2VyY2VBcnJheShjb2xEZWZzKSk7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5ncyA9IHJlbG9hZFNldHRpbmdzICYmIHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICB0aGlzLmFwaS5ncmlkLnNldENvbHVtbkRlZnMobm9ybWFsaXplZCk7XG4gICAgaWYgKHNhdmVkU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgfVxuICB9XG5cbiAgbm9ybWFsaXplT3B0aW9ucyhwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICB0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMgPSBwYXJhbXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcztcbiAgICBjb25zdCBoZWFkZXJDb21wb25lbnRQYXJhbXMgPSB7IGdyaWRTZXJ2aWNlOiB0aGlzLCBncmlkUXVlcnk6IHRoaXMuZ3JpZFF1ZXJ5IH07XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgIC4uLmhlYWRlckNvbXBvbmVudFBhcmFtcyxcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWZcbiAgICB9O1xuXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYgPSB7XG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgIGhlYWRlckNvbXBvbmVudFBhcmFtc1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9IHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVCYWNrZ3JvdW5kID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID1cbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzEgJiYgcGFyYW1zLmdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiAhPT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuU0lOR0xFO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID1cbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCAmJiBkZWZhdWx0R3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0O1xuICAgIH1cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcyA9IHRoaXMubm9ybWFsaXplQ29sdW1ucyhwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcywgcGFyYW1zLmdyaWRPcHRpb25zKTtcblxuICAgIC8qKiBBZGQgY29yZSBmaWx0ZXJzICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmlzRXh0ZXJuYWxGaWx0ZXJQcmVzZW50ID0gKCkgPT4gdHJ1ZTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZG9lc0V4dGVybmFsRmlsdGVyUGFzcyA9IChyb3c6IFJvd05vZGUpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHZhbGlkYXRlRmlsdGVyKHsgcm93LCBhcGk6IHRoaXMuZ3JpZFF1ZXJ5LmFwaS5ncmlkIH0sIHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpKSAmJiB0aGlzLnJvd01hdGNoZXNTZWFyY2gocm93KVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqIFdyYXAgdGhlIHNlcnZlciBzaWRlIHBhZ2luYXRpb24gZ2V0IHJvd3MgZnVuY3Rpb24gKi9cbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcy5ncmlkT3B0aW9ucykpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5ibG9ja0xvYWREZWJvdW5jZU1pbGxpcyA9IDMwMDtcbiAgICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzID0gdGhpcy53cmFwR2V0Um93cyhwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuICAgICAgLyogVGhlIGNhY2hlIHNpemUgaXMgc3luY2VkIHdpdGggdGhlIHBhZ2luYXRpb24gcGFnZSBzaXplICovXG4gICAgICBjb25zdCBjYWNoZVNpemUgPSBwYXJhbXMuZ3JpZE9wdGlvbnMucGFnaW5hdGlvblBhZ2VTaXplO1xuICAgICAgaWYgKGNhY2hlU2l6ZSkge1xuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY2FjaGVCbG9ja1NpemUgPSBjYWNoZVNpemU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEVkaXRhYmxlIGNlbGwgKi9cbiAgICB0aGlzLmluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zKTtcblxuICAgIC8qKiBXcmFwIGNvbnRleHQgbWVudSAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5nZXRDb250ZXh0TWVudUl0ZW1zID0gdGhpcy53cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtcyk7XG5cbiAgICAvKiogU2F2ZSBncmlkIHNldHRpbmdzICovXG4gICAgY29uc3QgeyBzYXZlU2V0dGluZ3MsIGdyaWROYW1lIH0gPSBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IHNhdmVTZXR0aW5ncyAhPT0gZmFsc2UgJiYgIWlzTmlsKGdyaWROYW1lKTtcblxuICAgIC8qKiBTZXJ2ZXIgU2lkZSBQYWdpbmF0aW9uIGZvciBzZWxlY3QgYWxsIG9wdGlvbiAqL1xuICAgIHRoaXMuaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zID0gbnVsbCk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGlmICghZ3JpZE9wdGlvbnMpIHtcbiAgICAgIGdyaWRPcHRpb25zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbERlZnMgPSBjb2xEZWZzLm1hcCgoY29sOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBoZWFkZXJOYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oY29sLmhlYWRlck5hbWUpXG4gICAgICB9O1xuICAgICAgLyoqIEFkanVzdCB0aGUgd2lkdGggaW4gY2FzZSB0aGUgY29sdW1uIGhhcyBpbmZvICovXG4gICAgICBpZiAoY29sLmluZm8pIHtcbiAgICAgICAgbm9ybWFsaXplZC5taW5XaWR0aCA9IGNvbC5taW5XaWR0aCB8fCBHcmlkTWluV2lkdGhzLldpdGhfSW5mbztcbiAgICAgIH1cbiAgICAgIGlmICghY29sLmNvbElkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuY29sSWQgPSBjb2wuZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplZC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkl0ZW1zICYmICFub3JtYWxpemVkLmZpbHRlcnNDb25maWcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnID0geyBzZWN0aW9uczogRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucy5Db25kaXRpb25hbCB9O1xuICAgICAgfVxuICAgICAgdGhpcy5ub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoZ3JpZE9wdGlvbnMsIGNvbCwgbm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZCh1cGRhdGVkQ29sRGVmcywgZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyxcbiAgICBjb2w6IERhdG9HcmlkQ29sdW1uRGVmLFxuICAgIG5vcm1hbGl6ZWQ6IERhdG9HcmlkQ29sdW1uRGVmXG4gICkge1xuICAgIC8qKiBDaGVjayBpZiBjb2x1bW4gc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VhcmNoICoqL1xuICAgIGNvbnN0IGlzU2VydmVyUGFnaW5hdGlvbiA9IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBjb2wuaW5jbHVkZUluU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGlzU2VydmVyUGFnaW5hdGlvbiAmJiBjb2wudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5EYXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdFxuICAgICAgICAgICAgOiBkZWZhdWx0R3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoICYmXG4gICAgICAhdGhpcy5oYXNDZWxsUmVuZGVyZXIobm9ybWFsaXplZCwgZ3JpZE9wdGlvbnMpICYmXG4gICAgICBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHRcbiAgICApIHtcbiAgICAgIG5vcm1hbGl6ZWQuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBpc0VkaXRhYmxlID1cbiAgICAgICAgICAoaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKHBhcmFtcykpIHx8XG4gICAgICAgICAgKCFpc0Z1bmN0aW9uKG5vcm1hbGl6ZWQuZWRpdGFibGUpICYmIG5vcm1hbGl6ZWQuZWRpdGFibGUpO1xuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVxuICAgICAgICAgID8gZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0KHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpKVxuICAgICAgICAgIDogc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyKHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYXNDZWxsUmVuZGVyZXIoY29sdW1uOiBEYXRvR3JpZENvbHVtbkRlZiwgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbi50eXBlIGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5UeXBlSGFzQ2VsbFJlbmRlcmVyID0gKG9wdGlvbnM6IFBhcnRpYWw8RGF0b0dyaWRPcHRpb25zPik6IGJvb2xlYW4gPT5cbiAgICAgIG9wdGlvbnMuY29sdW1uVHlwZXMgJiYgISFvcHRpb25zLmNvbHVtblR5cGVzW3R5cGVdICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXS5jZWxsUmVuZGVyZXI7XG5cbiAgICByZXR1cm4gY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihncmlkT3B0aW9ucykgfHwgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlcihkZWZhdWx0R3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNdWx0aVNlbGVjdEhlYWRlckNvbHVtbklmUmVxdWlyZWQoXG4gICAgY29sdW1uRGVmczogRGF0b0dyaWRDb2x1bW5EZWZbXSxcbiAgICBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zXG4gICk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGNvbnN0IHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPSBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzO1xuICAgIGNvbnN0IHJvd1NlbGVjdGlvbiA9XG4gICAgICBncmlkT3B0aW9ucyAmJiBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gPyBncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gOiBkZWZhdWx0R3JpZE9wdGlvbnMucm93U2VsZWN0aW9uO1xuXG4gICAgaWYgKHNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgJiYgcm93U2VsZWN0aW9uID09PSBHcmlkUm93U2VsZWN0aW9uVHlwZS5NVUxUSVBMRSkge1xuICAgICAgY29uc3QgY2hlY2tib3hlc0NvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYgPSB7XG4gICAgICAgIGNvbElkOiB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQsXG4gICAgICAgIGNoZWNrYm94U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICBoZWFkZXJDb21wb25lbnRGcmFtZXdvcms6IERhdG9HcmlkTXVsdGlTZWxlY3RDb2x1bW5IZWFkZXJDb21wb25lbnQsXG4gICAgICAgIHdpZHRoOiAzMCxcbiAgICAgICAgbWF4V2lkdGg6IDMwLFxuICAgICAgICBzdXBwcmVzc1NpemVUb0ZpdDogdHJ1ZSxcbiAgICAgICAgY2VsbENsYXNzOiAnY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICBoZWFkZXJDbGFzczogJ2hlYWRlci1jaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgICAgICBsb2NrUG9zaXRpb246IHRydWUsXG4gICAgICAgIGluY2x1ZGVJblNlYXJjaDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gW2NoZWNrYm94ZXNDb2x1bW4sIC4uLmNvbHVtbkRlZnNdO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRGVmcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ZXJuYWxPblJvd1NlbGVjdGVkID0gZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZDtcbiAgICBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkID0gKGV2dDogUm93U2VsZWN0ZWRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGV2dC5ub2RlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gbm9kZS5pc1NlbGVjdGVkKCk7XG4gICAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkID0gZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKG5vZGUuaWQpO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICAgICAgICBleGNsdWRlZEZyb21TZWxlY3RBbGw6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5maWx0ZXIoKG5vZGVJZDogc3RyaW5nKSA9PiBub2RlSWQgIT09IG5vZGUuaWQpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQgJiYgIWlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbLi4uZXhjbHVkZWRGcm9tU2VsZWN0QWxsLCBub2RlLmlkXSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV4dGVybmFsT25Sb3dTZWxlY3RlZCkge1xuICAgICAgICBleHRlcm5hbE9uUm93U2VsZWN0ZWQoZXZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByb3dNYXRjaGVzU2VhcmNoKHJvdzogUm93Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSAodGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoaXNFbXB0eShzZWFyY2hUZXJtKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2hcbiAgICAgID8gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsQ29sdW1ucygpXG4gICAgICA6IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmFwaS5ncmlkLmdldENvbHVtbkRlZihjb2wuZ2V0Q29sSWQoKSkgYXMgRGF0b0dyaWRDb2x1bW5EZWY7XG4gICAgICBpZiAoIWNvbERlZi5pbmNsdWRlSW5TZWFyY2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByb3dWYWx1ZSA9ICh0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbC5nZXRDb2xJZCgpLCByb3cpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocm93VmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZml0R3JpZCgnY29udGFpbmVyJykgaW5zdGVhZFxuICAgKi9cbiAgZml0VG9Db250YWluZXIoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gIH1cblxuICBnZXRDdXN0b21IZWFkZXIoZmllbGQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmljID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+IGNvbHVtbiA9PT0gZmllbGQpO1xuICAgICAgY29uc3QgY29tbW9uID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+ICFjb2x1bW4pO1xuICAgICAgaWYgKHNwZWNpZmljIHx8IGNvbW1vbikge1xuICAgICAgICBjb25zdCB7IG1vcmVNZW51LCBjdXN0b21IZWFkZXIgfSA9IHtcbiAgICAgICAgICBtb3JlTWVudTogKHNwZWNpZmljICYmIHNwZWNpZmljLm1vcmVNZW51KSB8fCAoY29tbW9uICYmIGNvbW1vbi5tb3JlTWVudSksXG4gICAgICAgICAgY3VzdG9tSGVhZGVyOiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMuY3VzdG9tSGVhZGVyKSB8fCAoY29tbW9uICYmIGNvbW1vbi5jdXN0b21IZWFkZXIpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IG1vcmVNZW51OiBtb3JlTWVudSAmJiBtb3JlTWVudS50cGwsIGN1c3RvbUhlYWRlcjogY3VzdG9tSGVhZGVyICYmIGN1c3RvbUhlYWRlci50cGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjbGVhckFsbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHt9LFxuICAgICAgICAgIHNlYXJjaFRlcm06IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoY29sdW1uRmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgW2NvbHVtbkZpZWxkXTogZGVsZXRlZCwgLi4uZmlsdGVyIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5GaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIpIHtcbiAgICB0aGlzLl9sb2dFdmVudChDb3JlRXZlbnRUeXBlcy5HUklEX0ZJTFRFUl9BUFBMSUVELCB7XG4gICAgICBjb2x1bW46IGNvbHVtbi5nZXRDb2xJZCgpLFxuICAgICAgbnVtT2ZDb25kaXRpb25zOiAoZmlsdGVyLmNvbmRpdGlvbmFsICYmIGZpbHRlci5jb25kaXRpb25hbC5jb25kaXRpb25zLmxlbmd0aCkgfHwgMCxcbiAgICAgIGJ5VmFsdWU6ICEhZmlsdGVyLmJ5VmFsdWUgPyAnWWVzJyA6ICdObydcbiAgICB9KTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MuZmlsdGVyLFxuICAgICAgICAgICAgW2NvbHVtbi5nZXRDb2xEZWYoKS5maWVsZF06IGZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0U2VhcmNoVGVybShzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIHNlYXJjaFRlcm1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oY29uZmlnOiBQYXJ0aWFsPFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZmlnPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlclNpZGVQYWdpbmF0aW9uOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2VydmVyU2lkZVBhZ2luYXRpb24sXG4gICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRMb2FkaW5nKHNob3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5zaG93TG9hZGluZ092ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID09PSAwID8gdGhpcy5zZXRPdmVybGF5KHRydWUpIDogdGhpcy5zZXRPdmVybGF5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNldE92ZXJsYXkgaW5zdGVhZFxuICAgKiBAcGFyYW0gc2hvd1xuICAgKi9cbiAgc2V0Tm9EYXRhKHNob3c6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldE92ZXJsYXkoc2hvdyk7XG4gIH1cblxuICBzZXRPdmVybGF5KHNob3c6IGJvb2xlYW4pIHtcbiAgICBzaG93ID8gdGhpcy5hcGkuZ3JpZC5zaG93Tm9Sb3dzT3ZlcmxheSgpIDogdGhpcy5hcGkuZ3JpZC5oaWRlT3ZlcmxheSgpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIC4uLnNldHRpbmdzXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmaXRHcmlkKHRvOiAnY29udGFpbmVyJyB8ICdjb250ZW50Jykge1xuICAgIHRvID09PSAnY29udGFpbmVyJyA/IHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpIDogdGhpcy5hcGkuY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gdG8gPT09ICdjb250YWluZXInID8gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRBSU5FUiA6IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBncmlkQWxpZ25tZW50LCBjb2x1bW5zU2l6ZXM6IG51bGwgfSk7XG4gIH1cblxuICBzYXZlU2V0dGluZ3NUb1NlcnZlcihzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pc0dsb2JhbFNldHRpbmdzO1xuICAgIHRoaXMuc3RvcmFnZUFQSS5zZXQodGhpcy5ncmlkTmFtZSwgc2V0dGluZ3MsIGlzR2xvYmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgdXNlZCB0byBsb2cgZ3JpZCBldmVudHMgdG8gdGhlIHBsYXRmb3JtJ3MgbG9nZ2luZyBzZXJ2aWNlXG4gICAqL1xuICBfbG9nRXZlbnQoZXZlbnRUeXBlOiBDb3JlRXZlbnRUeXBlcywgZXZlbnRQcm9wZXJ0aWVzPzogSGFzaE1hcDxhbnk+KSB7XG4gICAgdGhpcy5sb2dnZXIubG9nRXZlbnQoZXZlbnRUeXBlLCB7IHRhYmxlOiB0aGlzLmdyaWROYW1lLCAuLi5ldmVudFByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBTdWNjZXNzQ2FsbGJhY2soeyBzdWNjZXNzQ2IsIHBhZ2VOdW1iZXIsIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9OiBTdWNjZXNzV3JhcHBlclBhcmFtcykge1xuICAgIHJldHVybiAocm93c1RoaXNCbG9jazogYW55W10sIHRvdGFsUm93czogbnVtYmVyKSA9PiB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgdG90YWxSb3dzLCBoYXNFcnJvcjogZmFsc2UgfSk7XG4gICAgICBzdWNjZXNzQ2Iocm93c1RoaXNCbG9jaywgdG90YWxSb3dzKTtcbiAgICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9zZXJ2ZXJEYXRhTG9hZGVkLm5leHQoe1xuICAgICAgICBhcGk6IHRoaXMuYXBpLmdyaWQsXG4gICAgICAgIGNvbHVtbkFwaTogdGhpcy5hcGkuY29sdW1ucyxcbiAgICAgICAgdHlwZTogJ1NlcnZlckRhdGFMb2FkZWQnLFxuICAgICAgICBwYWdpbmF0aW9uUGFnZTogcGFnZU51bWJlclxuICAgICAgfSk7XG4gICAgICBpZiAoIWlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAvKiogc28gdGhlIGdyaWQgZml0cyBpbiBldmVyeSBuZXcgZGF0YSBpbnB1dCAqL1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RUb3RhbFJvd3MgPSB0b3RhbFJvd3M7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcEdldFJvd3Mob3B0aW9uczogRGF0b0dyaWRPcHRpb25zLCBnZXRSb3dzPzogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkKSB7XG4gICAgY29uc3QgZ2V0Um93c0NiID0gZ2V0Um93cyB8fCBvcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICByZXR1cm4gKGdldFJvd3NQYXJhbXM6IElHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCB7IHN0YXJ0Um93LCBlbmRSb3csIHNvcnRNb2RlbCwgc3VjY2Vzc0NhbGxiYWNrIH0gPSBnZXRSb3dzUGFyYW1zO1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBvcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZSB8fCAxMDA7XG4gICAgICBjb25zdCBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCA9IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID4gMDtcbiAgICAgIGNvbnN0IGlzUGVuZGluZ1JldHVyblRvUGFnZSA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkICYmIHN0YXJ0Um93ID09PSAwO1xuXG4gICAgICBjb25zdCBwYWdlTnVtYmVyID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWRcbiAgICAgICAgPyB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCArIDFcbiAgICAgICAgOiBNYXRoLmNlaWwoZW5kUm93IC8gcGFnZVNpemUpO1xuXG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IC0xO1xuXG4gICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICAgIGNvbnN0IG5ld1BhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zID0ge1xuICAgICAgICAuLi5nZXRSb3dzUGFyYW1zLFxuICAgICAgICBmYWlsQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgaGFzRXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgdGhpcy5zZXRPdmVybGF5KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzQ2FsbGJhY2s6IHRoaXMud3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHBhZ2VOdW1iZXIsIHN1Y2Nlc3NDYjogc3VjY2Vzc0NhbGxiYWNrLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfSksXG4gICAgICAgIHNlcnZlckNvbmZpZzoge1xuICAgICAgICAgIHBhZ2VTaXplLFxuICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgY29sdW1uRmlsdGVyczogaXNFbXB0eShmaWx0ZXIpIHx8IG9wdGlvbnMuZW5hYmxlVjJfMSA/IG51bGwgOiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnMoZmlsdGVyKSxcbiAgICAgICAgICBmaWx0ZXI6IG9wdGlvbnMuZW5hYmxlVjJfMSA/IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKG9wdGlvbnMuY29sdW1uRGVmcykgOiBudWxsLFxuICAgICAgICAgIHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWwpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIC8vIFNjZW5hcmlvIHRoZSBmb2xsb3dpbmcgaGFuZGxlcyAtIHNlcnZlciByZWZyZXNoIHdoZXJlIGl0IHdhcyByZXF1ZXN0ZWQgdG8ga2VlcCB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgICAvLyBUaGUgcHJvYmxlbSAtIGdldFJvd3Mgd2lsbCBpbml0aWFsbHkgYmUgY2FsbGVkIGZvciBwYWdlIDEgKGF1dG9tYXRpY2FsbHkgaGFwcGVucyB3aGVuIGNhbGxpbmcgYWctZ3JpZCdzIHNldERhdGFTb3VyY2UpLlxuICAgICAgICAvLyBJbiBvcmRlciB0byB0cmlnZ2VyIGl0IGFnYWluLCBzdWNjZXNzQ2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggdGhlIGRlc2lyZWQgcGFnZS5cbiAgICAgICAgLy8gZmFrZUdldFJvd3MgaXMgdXNlZCBpbiBvcmRlciB0byBhdm9pZCByZXRyaWV2aW5nIHRoZSB1bm5lY2Vzc2FyeSByZWFsIGRhdGEgZm9yIHBhZ2UgMS5cbiAgICAgICAgY29uc3QgZmFrZUdldFJvd3MgPSAoeyBzdWNjZXNzQ2FsbGJhY2sgfTogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKFtdLCB0aGlzLmxhc3RUb3RhbFJvd3MpO1xuICAgICAgICB9O1xuICAgICAgICBmYWtlR2V0Um93cyhuZXdQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0Um93c0NiKG5ld1BhcmFtcyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcy5mb3JFYWNoKGNvbERlZiA9PiB7XG4gICAgICBpZiAoY29sRGVmLmVkaXRhYmxlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbERlZi5lZGl0YWJsZSkpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsQ2VsbENsYXNzID0gY29sRGVmLmNlbGxDbGFzcztcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0VkaXRhYmxlID0gKGNvbERlZi5lZGl0YWJsZSBhcyBGdW5jdGlvbikoY2VsbENsYXNzUGFyYW1zIGFzIGFueSk7XG4gICAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBlZGl0YWJsZVJlc3VsdCA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoaW5pdGlhbENlbGxDbGFzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGVkaXRhYmxlUmVzdWx0KSA/IGVkaXRhYmxlUmVzdWx0KGNlbGxDbGFzc1BhcmFtcykgOiBlZGl0YWJsZVJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKGluaXRpYWxDZWxsQ2xhc3MpID8gaW5pdGlhbENlbGxDbGFzcyhjZWxsQ2xhc3NQYXJhbXMpIDogaW5pdGlhbENlbGxDbGFzcztcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGNvbERlZi5jZWxsQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgY29uc3QgeyBjdXN0b21Db250ZXh0TWVudSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIGNvbnN0IGFsbEFjdGlvbnMgPSBpc0Z1bmN0aW9uKGN1c3RvbUNvbnRleHRNZW51KSA/IGN1c3RvbUNvbnRleHRNZW51KHBhcmFtcy5yb3dBY3Rpb25zKSA6IHBhcmFtcy5yb3dBY3Rpb25zO1xuICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnMpO1xuICAgIGNvbnN0IGNvcHlBY3Rpb246IFJvd0FjdGlvbiA9IHtcbiAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUuY29weS1jZWxsJyksXG4gICAgICBpY29uOiAnY29weScsXG4gICAgICBrZXk6ICdDb3B5IENlbGwnXG4gICAgfTtcbiAgICByZXR1cm4gKHsgbm9kZSwgY29sdW1uLCBjb250ZXh0IH06IEdldENvbnRleHRNZW51SXRlbXNQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IG9uSG92ZXJBY3Rpb25NZW51ID0gY29udGV4dCAmJiBjb250ZXh0LmNvbnRleHRNZW51ICYmIGNvbnRleHQuY29udGV4dE1lbnUuZnJvbU9uSG92ZXI7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiBbXTtcbiAgICAgIGxldCBzZWxlY3RlZCA9IFtub2RlXTtcbiAgICAgIGxldCByb3dzQ291bnQgPSAxO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbnRleHQoeyBjb250ZXh0TWVudTogeyBmcm9tT25Ib3ZlcjogZmFsc2UgfSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlBY3Rpb24ub25DbGljayA9IChbcm93XSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gdGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2x1bW4uZ2V0Q29sSWQoKSwgcm93KTtcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBjb2x1bW4uZ2V0Q29sRGVmKCkudmFsdWVGb3JtYXR0ZXI7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXR0ZXIgPyBmb3JtYXR0ZXIocmF3VmFsdWUpIDogcmF3VmFsdWU7XG4gICAgICAgICAgY29weVRvQ2xpcGJvYXJkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgICAgICAgcm93c0NvdW50ID0gc2l6ZShzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVBY3Rpb25zID0gZ2V0VmlzaWJsZUFjdGlvbnMoXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIHJvd3NDb3VudCxcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWRcbiAgICAgICkuZmlsdGVyKCh7IHZpc2libGUgfSkgPT4gdmlzaWJsZSk7XG4gICAgICBsZXQgdG9vbGJhckFjdGlvbnMgPSBbY29weUFjdGlvbl07XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSB2aXNpYmxlQWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodmlzaWJsZUFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IFt7IC4uLmNvcHlBY3Rpb24sIHNlcGFyYXRvcjogdHJ1ZSB9LCAuLi52aXNpYmxlQWN0aW9uc107XG4gICAgICB9XG4gICAgICBjb25zdCBjb252ZXJ0ZXJQYXJhbXM6IEFjdGlvbkNvbnZlcnRlclBhcmFtcyA9IHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWQsXG4gICAgICAgIGljb25SZWdpc3RyeTogdGhpcy5zdmdSZWdpc3RyeSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbG9nZ2VyOiB7XG4gICAgICAgICAgbG9nOiB0aGlzLl9sb2dFdmVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgIGV2ZW50T3JpZ2luOiBvbkhvdmVyQWN0aW9uTWVudSA/ICdPbiBIb3ZlcicgOiAnQ29udGV4dCBNZW51J1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24oY29udmVydGVyUGFyYW1zKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9uczogUm93QWN0aW9uW10pIHtcbiAgICBhbGxBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGFjdGlvbi5sYWJlbCA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShhY3Rpb24ubGFiZWwpO1xuICAgICAgaWYgKGFjdGlvbi5zdWJNZW51KSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFjdGlvbi5zdWJNZW51KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTYXZlZFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgY29uc3Qge1xuICAgICAgc29ydCxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICBmaWx0ZXIsXG4gICAgICBncm91cGVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNTaXplcyxcbiAgICAgIHBpbm5lZENvbHVtbnMsXG4gICAgICBjb2x1bW5zT3JkZXIsXG4gICAgICBncmlkQWxpZ25tZW50XG4gICAgfSA9IHNldHRpbmdzO1xuICAgIGNvbnN0IHsgZ3JpZCwgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgLyogSGlkZSBjb2x1bW5zICovXG4gICAgLyogTk9URTogY29sdW1ucyBvcmRlciBhcmUgdHJlYXRlZCBhcyB0aGUgY3VycmVudGx5IHZpc2libGUgY29sdW1ucyAqL1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUodGhpcy5pbml0aWFsU2V0dGluZ3MuY29sdW1uc09yZGVyLCB0cnVlKTtcbiAgICBjb25zdCBjb2x1bW5Ub0hpZGUgPSAhaXNOaWwoaGlkZGVuQ29sdW1ucykgPyBoaWRkZW5Db2x1bW5zIDogdGhpcy5pbml0aWFsU2V0dGluZ3MuaGlkZGVuQ29sdW1ucztcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGNvbHVtblRvSGlkZSwgZmFsc2UpO1xuXG4gICAgLyogQXBwbHkgZmlsdGVycyAqL1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgLyogR3JvdXAgY29sdW1ucyAqL1xuICAgIGNvbnN0IGFsbEdyb3VwZWRDb2x1bW5zID0gY29sdW1ucy5nZXRSb3dHcm91cENvbHVtbnMoKTtcbiAgICBsZXQgcmVtb3ZlR3JvdXBlZDtcbiAgICBpZiAoZ3JvdXBlZENvbHVtbnMpIHtcbiAgICAgIHJlbW92ZUdyb3VwZWQgPSBhbGxHcm91cGVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFncm91cGVkQ29sdW1ucy5pbmNsdWRlcyhjb2wuZ2V0Q29sSWQoKSkpO1xuICAgICAgY29sdW1ucy5hZGRSb3dHcm91cENvbHVtbnMoZ3JvdXBlZENvbHVtbnMpO1xuICAgICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShncm91cGVkQ29sdW1ucywgZmFsc2UpO1xuICAgIH1cbiAgICBjb2x1bW5zLnJlbW92ZVJvd0dyb3VwQ29sdW1ucyhyZW1vdmVHcm91cGVkKTtcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHJlbW92ZUdyb3VwZWQsIHRydWUpO1xuXG4gICAgLyogQXBwbHkgc29ydCAqL1xuICAgIGNvbnN0IGdyaWRTb3J0ID0gc29ydCB8fCB0aGlzLmluaXRpYWxTZXR0aW5ncy5zb3J0O1xuICAgIGdyaWQuc2V0U29ydE1vZGVsKGdyaWRTb3J0ID8gW2dyaWRTb3J0XSA6IG51bGwpO1xuXG4gICAgLyogQWxpZ24gZ3JpZCAqL1xuICAgIGlmIChncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5DVVNUT00pIHtcbiAgICAgIC8qIFNldCBjb2x1bW4gc2l6ZXMgKi9cbiAgICAgIGNvbHVtbnNTaXplcyAmJlxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zU2l6ZXMpLmZvckVhY2goY29sSWQgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW5zU2l6ZXNbY29sSWRdID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCkge1xuICAgICAgICAgICAgY29sdW1ucy5hdXRvU2l6ZUNvbHVtbihjb2xJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbnMuc2V0Q29sdW1uV2lkdGgoY29sSWQsIGNvbHVtbnNTaXplc1tjb2xJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UID8gY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKSA6IGdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICAgIH1cblxuICAgIC8qIFBpbiBjb2x1bW5zIGxlZnQgKi9cbiAgICBjb25zdCBmaWx0ZXJlZFBpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zXG4gICAgICA/IHBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gY29sdW1uc09yZGVyXG4gICAgICA/IGNvbHVtbnNPcmRlci5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBzaXplKGZpbHRlcmVkUGlubmVkQ29sdW1ucykgPiAwXG4gICAgICA/IGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZFBpbm5lZENvbHVtbnMsICdsZWZ0JylcbiAgICAgIDogZmlsdGVyZWRDb2x1bW5zICYmIGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZENvbHVtbnMsIG51bGwpO1xuXG4gICAgLyogT3JkZXIgY29sdW1ucyAqL1xuICAgIGNvbHVtbnNPcmRlciAmJiBjb2x1bW5zLm1vdmVDb2x1bW5zKGNvbHVtbnNPcmRlciwgMCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0RpZmYoKTogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHJldHVybiBkaWZmKGN1cnJlbnRTdGF0ZSwgdGhpcy5pbml0aWFsU2V0dGluZ3MpO1xuICB9XG5cbiAgcmVzZXRUYWJsZVNldHRpbmdzKCkge1xuICAgIGNvbnN0IHsgZmlsdGVyLCAuLi5yZXN0IH0gPSB0aGlzLmluaXRpYWxTZXR0aW5ncztcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29sU2l6ZXMgPSBnZXRDb2x1bW5zU2l6ZXMoY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpLCB0cnVlKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gaXNFbXB0eShvcmlnaW5hbENvbFNpemVzKSA/IHJlc3QuZ3JpZEFsaWdubWVudCA6IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTTtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHsgLi4ucmVzdCwgY29sdW1uc1NpemVzOiBvcmlnaW5hbENvbFNpemVzLCBncmlkQWxpZ25tZW50IH07XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NUb1NlcnZlcih7IGZpbHRlciB9KTtcbiAgfVxuXG4gIGluaXRTZXR0aW5ncyhzYXZlZFNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5pbml0aWFsU2V0dGluZ3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICB9XG5cbiAgbm90aWZ5RmlsdGVyVXBkYXRlKCkge1xuICAgIGNvbnN0IHdhdGNoID0gW3RoaXMuZ3JpZFJlZi5maWx0ZXJDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpXTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTaWRlKSB7XG4gICAgICB3YXRjaC5wdXNoKHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlckRhdGFMb2FkZWQkKTtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdCh3YXRjaClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3NBZnRlckZpbHRlciA9IHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRPdmVybGF5KHJvd3NBZnRlckZpbHRlciA9PT0gMCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFwaS5ncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzIHtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzID0ge307XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbYnlWYWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWwub3BlcmF0b3IsXG4gICAgICAgICAgZmlsdGVyczogY29uZGl0aW9uYWwuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb247XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnNGaWx0ZXJzO1xuICB9XG5cbiAgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGdyaWRDb2x1bW5zOiBEYXRvR3JpZENvbHVtbkRlZltdKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCk7XG5cbiAgICBsZXQgY29sdW1uRmlsdGVycyA9IHRoaXMuYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5ldmVyeSgoeyBvcGVyYXRvciB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gb3BlcmF0b3IgPT09IE9wZXJhdG9yVHlwZXMuQU5EKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkRmlsdGVycyA9IGNvbHVtbkZpbHRlcnNcbiAgICAgICAgLm1hcCgoeyBmaWx0ZXJzIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBmaWx0ZXJzKVxuICAgICAgICAucmVkdWNlKChhcnIsIHJlcykgPT4gcmVzLmNvbmNhdChhcnIpLCBbXSk7XG4gICAgICBjb2x1bW5GaWx0ZXJzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IGZsYXR0ZW5lZEZpbHRlcnNcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKGNvbHVtbkZpbHRlcnMpID4gMVxuICAgICAgICA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBjb2x1bW5GaWx0ZXJzIH1cbiAgICAgICAgOiBzaXplKGNvbHVtbkZpbHRlcnMpID09PSAxXG4gICAgICAgID8gY29sdW1uRmlsdGVyc1swXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICByZXR1cm4gY29sdW1uRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCB7IGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucy5maWx0ZXIoKGNvbERlZjogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbERlZi5pbmNsdWRlSW5TZWFyY2ggJiYgKGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfHwgdGhpcy5hcGkuY29sdW1ucy5nZXRDb2x1bW4oY29sRGVmLmNvbElkKS5pc1Zpc2libGUoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb25bXSA9IHNlYXJjaGFibGVDb2x1bW5zLm1hcCgoeyBmaWVsZCB9OiBEYXRvR3JpZENvbHVtbkRlZikgPT4gKHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGNvbHVtbjogZmllbGRcbiAgICB9KSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKHNlYXJjaEZpbHRlcnMpID4gMCA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuT1IsIGZpbHRlcnM6IHNlYXJjaEZpbHRlcnMgfSA6IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWx0ZXI7XG4gICAgfVxuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogW2NvbHVtbkZpbHRlciwgc2VhcmNoRmlsdGVyXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10ge1xuICAgIGxldCBjb2x1bW5GaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBsZXQgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IG51bGw7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbkZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW3sgY29sdW1uLCAuLi5ieVZhbHVlIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gdGhpcy5nZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihjb25kaXRpb25hbCwgY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcikge1xuICAgICAgICAgIGNvbHVtbkZpbHRlci5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbkZpbHRlciA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2x1bW5GaWx0ZXJzLnB1c2goY29sdW1uRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkZpbHRlcnM7XG4gIH1cblxuICBnZXRGaWx0ZXJGb3JTZXJ2ZXJBY3Rpb25PblNlbGVjdEFsbCgpOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgY29uc3QgeyBjb2x1bW5EZWZzLCBpZENvbHVtbktleSB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBtYWluRmlsdGVyID0gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoY29sdW1uRGVmcyk7XG4gICAgaWYgKGlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgcmV0dXJuIG1haW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGVkUm93c0ZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uID0ge1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfSU5fTElTVCxcbiAgICAgIHZhbHVlczogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLFxuICAgICAgY29sdW1uOiBpZENvbHVtbktleVxuICAgIH07XG4gICAgY29uc3QgZmlsdGVycyA9IG1haW5GaWx0ZXIgPyBbbWFpbkZpbHRlciwgZXhjbHVkZWRSb3dzRmlsdGVyXSA6IFtleGNsdWRlZFJvd3NGaWx0ZXJdO1xuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihcbiAgICBjb25kaXRpb25hbEZpbHRlcjogRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgICBjb2x1bW46IHN0cmluZ1xuICApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbEZpbHRlci5vcGVyYXRvcixcbiAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsRmlsdGVyLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmQsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfRU1QVFkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgY29sdW1uIH0gYXMgU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb247XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsOiBEYXRvR3JpZFNvcnRbXSk6IERhdG9HcmlkU2VydmVyU29ydFtdIHtcbiAgICByZXR1cm4gc29ydE1vZGVsLm1hcCgoeyBjb2xJZCwgc29ydCB9KSA9PiAoe1xuICAgICAgY29sdW1uOiBjb2xJZCxcbiAgICAgIHNvcnRPcmRlcjogc29ydC50b1VwcGVyQ2FzZSgpIGFzIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvblxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRWRpdGFibGVDZWxsQ2xhc3MoXG4gICAgY2VsbENsYXNzVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgKChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4gc3RyaW5nIHwgc3RyaW5nW10pXG4gICkge1xuICAgIGlmIChpc05pbChjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnZGF0by1lZGl0YWJsZS1jZWxsJztcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2VsbENsYXNzUGFyYW1zID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKGNlbGxDbGFzc1BhcmFtcykpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWRpdGFibGVDbGFzc0FycmF5KGN1cnJlbnRDbGFzczogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2VsbENsYXNzID0gY29lcmNlQXJyYXkoY3VycmVudENsYXNzKTtcbiAgICBjZWxsQ2xhc3MucHVzaCgnZGF0by1lZGl0YWJsZS1jZWxsJyk7XG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHNlbGVjdEFsbEN1cnJlbnRQYWdlUm93cyhpc1NlbGVjdGVkID0gdHJ1ZSwgY29uc2lkZXJFeGNsdWRlZCA9IGZhbHNlKSB7XG4gICAgbGV0IHJvd3NGb3JTZWxlY3Rpb24gPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50UGFnZVJvd3MoKTtcbiAgICBpZiAoY29uc2lkZXJFeGNsdWRlZCkge1xuICAgICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgICBpZiAoIWlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgICByb3dzRm9yU2VsZWN0aW9uID0gcm93c0ZvclNlbGVjdGlvbi5maWx0ZXIoKHsgaWQgfTogUm93Tm9kZSkgPT4gIWV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpc1NlbGVjdGVkID8gdGhpcy5zZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pIDogdGhpcy5kZXNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbik7XG4gIH1cblxuICBkZXNlbGVjdEFsbFJvd3MoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5kZXNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgc2VsZWN0QWxsUm93c0VuYWJsZWQ6IGZhbHNlLCBleGNsdWRlZEZyb21TZWxlY3RBbGw6IFtdIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
1022
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUlwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBUWxGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUM1QixNQUFNLHVCQUF1QixDQUFDO0FBRS9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEQsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sbUZBQW1GLENBQUM7QUFHN0k7SUF5QkUscUJBQ1UsS0FBZ0IsRUFDaEIsU0FBb0IsRUFDcEIsU0FBK0IsRUFDL0IsWUFBMEIsRUFDMUIsV0FBd0IsRUFDTyxVQUEwQixFQUMvQixNQUF1QjtRQU5qRCxVQUFLLEdBQUwsS0FBSyxDQUFXO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDTyxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUMvQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQTlCM0QsZUFBVSxHQUF1QixvQkFBb0IsQ0FBQztRQVU5QyxtQ0FBOEIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUczQiw4QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztJQWtCcEUsQ0FBQztJQWhCSixzQkFBSSxpQ0FBUTthQUlaO1lBQ0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7YUFORCxVQUFhLFVBQW1CO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBZ0JELGlDQUFXLEdBQVgsY0FBZSxDQUFDO0lBRWhCLDJDQUEyQztJQUMzQyw2QkFBTyxHQUFQLFVBQVEsR0FBZ0IsRUFBRSxPQUFrQjtRQUMxQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUksT0FBTyxDQUFDLFdBQStCLENBQUMsUUFBUSxDQUFDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDMUQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixXQUF3QjtRQUNyRCxPQUFPLFdBQVcsQ0FBQyxZQUFZLEtBQUssVUFBVSxDQUFDO0lBQ2pELENBQUM7SUFFRCx1Q0FBaUIsR0FBakIsVUFBa0IsT0FBWSxFQUFFLE9BQWU7UUFBN0Isd0JBQUEsRUFBQSxZQUFZO1FBQUUsd0JBQUEsRUFBQSxlQUFlO1FBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxHQUFHLE9BQU87WUFDL0MsQ0FBQyxDQUFDLE9BQU87WUFDVCxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7T0FHRztJQUNILHFDQUFlLEdBQWYsVUFBbUIsR0FBc0M7UUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFjLEdBQXNDO1FBQ2xELElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxPQUFPLElBQUksT0FBQSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO1FBQzNFLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUF0QyxDQUFzQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGtDQUFZLEdBQVosVUFBZ0IsR0FBc0M7UUFDcEQsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFBLE9BQU8sSUFBSSxPQUFBLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO1FBQzFFLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTyxJQUFJLE9BQUEsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUF2QyxDQUF1QyxDQUFDLENBQUM7UUFDckUsSUFBSSxRQUFRLEVBQUU7WUFDWixRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELDZCQUFPLEdBQVAsVUFBVyxJQUFTLEVBQUUsWUFBb0IsRUFBRSxVQUE0QztRQUF4RixpQkFvQkM7UUFwQnFCLDZCQUFBLEVBQUEsb0JBQW9CO1FBQUUsMkJBQUEsRUFBQSxlQUE0QztRQUN0RixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2hELElBQUksS0FBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsS0FBSSxDQUFDLFVBQVUseUJBQ1Ysb0JBQW9CLEdBQ3BCLFVBQVUsQ0FDZCxDQUFDO2dCQUNGLElBQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzFELEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwQztpQkFBTSxJQUFJLEtBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzNCLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBSSxJQUFJLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDTCxLQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7WUFDRCxJQUFJLFlBQVksRUFBRTtnQkFDaEIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMzQjtpQkFBTTtnQkFDTCxtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUNBQWEsR0FBYixVQUFjLE9BQWdELEVBQUUsbUJBQTJCLEVBQUUsV0FBbUI7UUFBaEQsb0NBQUEsRUFBQSwyQkFBMkI7UUFBRSw0QkFBQSxFQUFBLG1CQUFtQjtRQUM5RyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUNsRSxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRCx1Q0FBaUIsR0FBakIsVUFBa0IsZUFBdUIsRUFBRSxXQUFtQjtRQUE1QyxnQ0FBQSxFQUFBLHVCQUF1QjtRQUFFLDRCQUFBLEVBQUEsbUJBQW1CO1FBQzVELGVBQWUsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUM5RCxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRU8seURBQW1DLEdBQTNDO1FBQ0UsZ0hBQWdIO1FBQ2hILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDMUQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDaEY7SUFDSCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFXLEdBQU0sRUFBRSxLQUFjO1FBQy9CLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFNLElBQUksR0FBdUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxnQ0FBVSxHQUFWLFVBQWMsR0FBUTtRQUNwQixJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBSUQsb0NBQWMsR0FBZCxVQUFrQixHQUFxQixFQUFFLEdBQVcsRUFBRSxRQUFXO1FBQy9ELElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDcEUsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBVyxHQUF3QjtRQUNqQyxJQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBUTtnQkFBTixjQUFJO1lBQU8sT0FBQSxJQUFJO1FBQUosQ0FBSSxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsd0NBQWtCLEdBQWxCO1FBQ0UsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0NBQVUsR0FBVjtRQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1DQUFhLEdBQWIsVUFBYyxPQUFnRCxFQUFFLGNBQXNCO1FBQXRCLCtCQUFBLEVBQUEsc0JBQXNCO1FBQ3BGLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixNQUFNLElBQUksYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBTSxhQUFhLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxhQUFhLEVBQUU7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELHNDQUFnQixHQUFoQixVQUFpQixNQUE4QjtRQUEvQyxpQkFxRUM7UUFwRUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUM1RCxJQUFNLHFCQUFxQixHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQy9FLE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLHlCQUNoQyxxQkFBcUIsR0FDckIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDekMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSx5QkFDM0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEtBQ25DLHFCQUFxQix1QkFBQSxHQUN0QixDQUFDO1FBQ0YsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRTtZQUMxRCxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztTQUNqRTtRQUNELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixLQUFLLFdBQVcsRUFBRTtZQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsNEJBQTRCLEtBQUssV0FBVyxFQUFFO1lBQzFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsNEJBQTRCO2dCQUM3QyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksS0FBSyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7U0FDcEc7UUFDRCxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsS0FBSyxXQUFXLEVBQUU7WUFDbkUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUI7Z0JBQ3RDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDO1NBQy9FO1FBQ0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6Ryx1QkFBdUI7UUFDdkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsR0FBRyxjQUFNLE9BQUEsSUFBSSxFQUFKLENBQUksQ0FBQztRQUN4RCxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUFzQixHQUFHLFVBQUMsR0FBWTtZQUN2RCxPQUFPLENBQ0wsY0FBYyxDQUFDLEVBQUUsR0FBRyxLQUFBLEVBQUUsR0FBRyxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxLQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQ2hILENBQUM7UUFDSixDQUFDLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDOUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdFLDREQUE0RDtZQUM1RCxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQzthQUMvQztTQUNGO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQyx3QkFBd0I7UUFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0UseUJBQXlCO1FBQ25CLElBQUEsdUJBQStDLEVBQTdDLDhCQUFZLEVBQUUsc0JBQStCLENBQUM7UUFDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3RSxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXRELDJDQUEyQztRQUMzQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFO1lBQ2hDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDckMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQ3pDO1FBRUQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFTyxzQ0FBZ0IsR0FBeEIsVUFBeUIsT0FBNEIsRUFBRSxXQUFtQztRQUExRixpQkF3QkM7UUF4QnNELDRCQUFBLEVBQUEsa0JBQW1DO1FBQ3hGLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDL0M7UUFDRCxJQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBc0I7WUFDeEQsSUFBTSxVQUFVLHlCQUNYLEdBQUcsS0FDTixVQUFVLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUNyRCxDQUFDO1lBQ0YsbURBQW1EO1lBQ25ELElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtnQkFDWixVQUFVLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQzthQUMvRDtZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFO2dCQUNkLFVBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzthQUM5QjtZQUNELElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFO2dCQUM5RSxVQUFVLENBQUMsYUFBYSxHQUFHLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQzdFO1lBQ0QsS0FBSSxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDL0QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVPLGlEQUEyQixHQUFuQyxVQUNFLFdBQTRCLEVBQzVCLEdBQXNCLEVBQ3RCLFVBQTZCO1FBSC9CLGlCQStCQztRQTFCQyxzREFBc0Q7UUFDdEQsSUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxlQUFlLEtBQUssV0FBVyxFQUFFO1lBQzlDLElBQUksa0JBQWtCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7Z0JBQy9ELFVBQVUsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxlQUFlO29CQUN4QixPQUFPLFdBQVcsQ0FBQyxnQ0FBZ0MsS0FBSyxXQUFXO3dCQUNqRSxDQUFDLENBQUMsV0FBVyxDQUFDLGdDQUFnQzt3QkFDOUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxJQUNFLFVBQVUsQ0FBQyxlQUFlO1lBQzFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxxQkFBcUIsRUFDakM7WUFDQSxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQUMsTUFBMkI7Z0JBQ3BELElBQU0sVUFBVSxHQUNkLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNoRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVELE9BQU8sVUFBVTtvQkFDZixDQUFDLENBQUMsdUNBQXVDLENBQUMsTUFBTSxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2pGLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLHFDQUFlLEdBQXZCLFVBQXdCLE1BQXlCLEVBQUUsV0FBNEI7UUFDN0UsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBYyxDQUFDO1FBQ25DLElBQU0seUJBQXlCLEdBQUcsVUFBQyxPQUFpQztZQUNsRSxPQUFBLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWTtRQUE5RixDQUE4RixDQUFDO1FBRWpHLE9BQU8seUJBQXlCLENBQUMsV0FBVyxDQUFDLElBQUkseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU8sMERBQW9DLEdBQTVDLFVBQ0UsVUFBK0IsRUFDL0IsV0FBNEI7UUFFNUIsSUFBTSw0QkFBNEIsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLDRCQUE0QixDQUFDO1FBQzdGLElBQU0sWUFBWSxHQUNoQixXQUFXLElBQUksV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBRXZHLElBQUksNEJBQTRCLElBQUksWUFBWSxLQUFLLG9CQUFvQixDQUFDLFFBQVEsRUFBRTtZQUNsRixJQUFNLGdCQUFnQixHQUFzQjtnQkFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyx5QkFBeUI7Z0JBQ3JDLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLHdCQUF3QixFQUFFLHdDQUF3QztnQkFDbEUsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsU0FBUyxFQUFFLHlCQUF5QjtnQkFDcEMsV0FBVyxFQUFFLGdDQUFnQztnQkFDN0MsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixlQUFlLEVBQUUsS0FBSzthQUN2QixDQUFDO1lBQ0YsaUJBQVEsZ0JBQWdCLEdBQUssVUFBVSxFQUFFO1NBQzFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLDhEQUF3QyxHQUFoRCxVQUFpRCxFQUF1QztRQUF4RixpQkF1QkM7WUF2QmtELDRCQUFXO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDN0MsT0FBTztTQUNSO1FBQ0QsSUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ3hELFdBQVcsQ0FBQyxhQUFhLEdBQUcsVUFBQyxHQUFxQjtZQUNoRCxJQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEVBQUU7Z0JBQy9DLElBQU0sTUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLElBQU0sVUFBVSxHQUFHLE1BQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsSUFBQSw4RUFBcUIsQ0FBcUM7Z0JBQ2xFLElBQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxNQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVSxJQUFJLFVBQVUsRUFBRTtvQkFDNUIsS0FBSSxDQUFDLHVCQUF1QixDQUFDO3dCQUMzQixxQkFBcUIsRUFBRSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBQyxNQUFjLElBQUssT0FBQSxNQUFNLEtBQUssTUFBSSxDQUFDLEVBQUUsRUFBbEIsQ0FBa0IsQ0FBQztxQkFDNUYsQ0FBQyxDQUFDO2lCQUNKO3FCQUFNLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLHFCQUFxQixXQUFNLHFCQUFxQixHQUFFLE1BQUksQ0FBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLENBQUM7aUJBQzlGO2FBQ0Y7WUFDRCxJQUFJLHFCQUFxQixFQUFFO2dCQUN6QixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM1QjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxzQ0FBZ0IsR0FBeEIsVUFBeUIsR0FBWTs7UUFDbkMsSUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9FLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDLDRCQUE0QjtZQUMxRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUU7WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7WUFDNUMsS0FBa0IsSUFBQSxZQUFBLFNBQUEsT0FBTyxDQUFBLGdDQUFBLHFEQUFFO2dCQUF0QixJQUFNLEdBQUcsb0JBQUE7Z0JBQ1osSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBc0IsQ0FBQztnQkFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7b0JBQzNCLFNBQVM7aUJBQ1Y7Z0JBQ0QsSUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM5RixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQ2pDLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7Ozs7Ozs7OztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0NBQWMsR0FBZDtRQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELHFDQUFlLEdBQWYsVUFBZ0IsS0FBYTtRQUMzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQUMsRUFBVTtvQkFBUixrQkFBTTtnQkFBTyxPQUFBLE1BQU0sS0FBSyxLQUFLO1lBQWhCLENBQWdCLENBQUMsQ0FBQztZQUNwRixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQUMsRUFBVTtvQkFBUixrQkFBTTtnQkFBTyxPQUFBLENBQUMsTUFBTTtZQUFQLENBQU8sQ0FBQyxDQUFDO1lBQ3pFLElBQUksUUFBUSxJQUFJLE1BQU0sRUFBRTtnQkFDaEIsSUFBQTs7O2lCQUdMLEVBSE8sc0JBQVEsRUFBRSw4QkFHakIsQ0FBQztnQkFDRixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQy9GO1NBQ0Y7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxxQ0FBZSxHQUFmO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixNQUFNLEVBQUUsRUFBRSxFQUNWLFVBQVUsRUFBRSxJQUFJLEdBQ2pCO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixXQUFtQjtRQUNuQyxJQUE4QywrQkFBMEIsRUFBaEUsZ0JBQWEsRUFBYixnQkFBc0IsRUFBRSw0REFBd0MsQ0FBQztRQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLEtBQUs7WUFDckIsT0FBTztnQkFDTCxRQUFRLHdCQUNILEtBQUssQ0FBQyxRQUFRLEtBQ2pCLE1BQU0sUUFBQSxHQUNQO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHFDQUFlLEdBQWYsVUFBZ0IsTUFBYyxFQUFFLE1BQXNCO1FBQ3BELElBQUksQ0FBQyxTQUFTLHFEQUFxQztZQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QixlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbEYsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSzs7WUFDckIsT0FBTztnQkFDTCxRQUFRLHdCQUNILEtBQUssQ0FBQyxRQUFRLEtBQ2pCLE1BQU0sd0JBQ0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLGdCQUN2QixRQUFRLElBQUcsTUFBTSxTQUVyQjthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtQ0FBYSxHQUFiLFVBQWMsVUFBa0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsUUFBUSx3QkFDSCxLQUFLLENBQUMsUUFBUSxLQUNqQixVQUFVLFlBQUEsR0FDWDthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCw2Q0FBdUIsR0FBdkIsVUFBd0IsTUFBMkM7UUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLO1lBQ3JCLE9BQU87Z0JBQ0wsb0JBQW9CLHdCQUNmLEtBQUssQ0FBQyxvQkFBb0IsR0FDMUIsTUFBTSxDQUNWO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdDQUFVLEdBQVYsVUFBVyxJQUFhO1FBQ3RCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUNwQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLElBQWE7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0NBQVUsR0FBVixVQUFXLElBQWE7UUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsb0NBQWMsR0FBZCxVQUFlLFFBQW1DO1FBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSztZQUNyQixPQUFPO2dCQUNMLFFBQVEsd0JBQ0gsS0FBSyxDQUFDLFFBQVEsR0FDZCxRQUFRLENBQ1o7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsNkJBQU8sR0FBUCxVQUFRLEVBQTJCO1FBQ2pDLEVBQUUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUYsSUFBTSxhQUFhLEdBQUcsRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDLDBCQUFvQyxDQUFDLHVCQUFpQyxDQUFDO1FBQ2pILElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxhQUFhLGVBQUEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsMENBQW9CLEdBQXBCLFVBQXFCLFFBQW1DO1FBQ3RELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7UUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsK0JBQVMsR0FBVCxVQUFVLFNBQXlCLEVBQUUsZUFBOEI7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxhQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFLLGVBQWUsRUFBRyxDQUFDO0lBQ2hGLENBQUM7SUFFTyx5Q0FBbUIsR0FBM0IsVUFBNEIsRUFBc0U7UUFBbEcsaUJBaUJDO1lBakI2Qix3QkFBUyxFQUFFLDBCQUFVLEVBQUUsZ0RBQXFCO1FBQ3hFLE9BQU8sVUFBQyxhQUFvQixFQUFFLFNBQWlCO1lBQzdDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFNBQVMsV0FBQSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdELFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDcEMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLEdBQUcsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLElBQUk7Z0JBQ2xCLFNBQVMsRUFBRSxLQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLGNBQWMsRUFBRSxVQUFVO2FBQzNCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDMUIsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsK0NBQStDO2dCQUMvQyxtQkFBbUIsRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsS0FBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDakMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFXLEdBQW5CLFVBQW9CLE9BQXdCLEVBQUUsT0FBaUQ7UUFBL0YsaUJBMkNDO1FBMUNDLElBQU0sU0FBUyxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN4RCxPQUFPLFVBQUMsYUFBNkI7WUFDM0IsSUFBQSxpQ0FBUSxFQUFFLDZCQUFNLEVBQUUsbUNBQVMsRUFBRSwrQ0FBZSxDQUFtQjtZQUN2RSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksR0FBRyxDQUFDO1lBQ25ELElBQU0sNkJBQTZCLEdBQUcsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUMsQ0FBQztZQUM5RSxJQUFNLHFCQUFxQixHQUFHLDZCQUE2QixJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBTSxVQUFVLEdBQUcsNkJBQTZCO2dCQUM5QyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixHQUFHLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQztZQUVqQyxLQUFJLENBQUMsOEJBQThCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFekMsSUFBTSxNQUFNLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxJQUFNLFNBQVMseUJBQ1YsYUFBYSxLQUNoQixZQUFZLEVBQUU7b0JBQ1osS0FBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2pELEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hCLENBQUMsRUFDRCxlQUFlLEVBQUUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxZQUFBLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsdUJBQUEsRUFBRSxDQUFDLEVBQzVHLFlBQVksRUFBRTtvQkFDWixRQUFRLFVBQUE7b0JBQ1IsVUFBVSxZQUFBO29CQUNWLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDO29CQUNwRyxNQUFNLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDM0YsSUFBSSxFQUFFLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7aUJBQzdDLEdBQ0YsQ0FBQztZQUNGLElBQUkscUJBQXFCLEVBQUU7Z0JBQ3pCLG1HQUFtRztnQkFDbkcsMEhBQTBIO2dCQUMxSCxpRkFBaUY7Z0JBQ2pGLHlGQUF5RjtnQkFDekYsSUFBTSxXQUFXLEdBQUcsVUFBQyxFQUEwQzt3QkFBeEMsb0NBQWU7b0JBQ3BDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLENBQUM7Z0JBQ0YsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxrREFBNEIsR0FBcEMsVUFBcUMsTUFBOEI7UUFBbkUsaUJBa0JDO1FBakJDLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFBLE1BQU07WUFDMUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNuQixJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7b0JBQy9CLElBQU0sa0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFDLGVBQWdDO3dCQUNsRCxJQUFNLFVBQVUsR0FBSSxNQUFNLENBQUMsUUFBcUIsQ0FBQyxlQUFzQixDQUFDLENBQUM7d0JBQ3pFLElBQUksVUFBVSxFQUFFOzRCQUNkLElBQU0sY0FBYyxHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBZ0IsQ0FBQyxDQUFDOzRCQUNuRSxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7eUJBQ3RGO3dCQUNELE9BQU8sVUFBVSxDQUFDLGtCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQztvQkFDN0YsQ0FBQyxDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixNQUE4QjtRQUE3RCxpQkFvREM7UUFuRFMsSUFBQSx3REFBaUIsQ0FBd0I7UUFDakQsSUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUM1RyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsSUFBTSxVQUFVLEdBQWM7WUFDNUIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO1lBQ2pELElBQUksRUFBRSxNQUFNO1lBQ1osR0FBRyxFQUFFLFdBQVc7U0FDakIsQ0FBQztRQUNGLE9BQU8sVUFBQyxFQUFvRDtnQkFBbEQsY0FBSSxFQUFFLGtCQUFNLEVBQUUsb0JBQU87WUFDN0IsSUFBTSxpQkFBaUIsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUM1RixJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLGlCQUFpQixFQUFFO2dCQUNyQixLQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ2pFO2lCQUFNO2dCQUNMLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBQyxFQUFLO3dCQUFMLGtCQUFLLEVBQUosV0FBRztvQkFDeEIsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDaEUsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztvQkFDcEQsSUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztvQkFDekQsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN6QixDQUFDLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLFFBQVEsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2hELFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzVCO2FBQ0Y7WUFDRCxJQUFNLGNBQWMsR0FBRyxpQkFBaUIsQ0FDdEMsVUFBVSxFQUNWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FDNUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxFQUFXO29CQUFULG9CQUFPO2dCQUFPLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQyxDQUFDO1lBQ25DLElBQUksY0FBYyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEMsSUFBSSxpQkFBaUIsRUFBRTtnQkFDckIsY0FBYyxHQUFHLGNBQWMsQ0FBQzthQUNqQztpQkFBTSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxjQUFjLG1DQUFTLFVBQVUsS0FBRSxTQUFTLEVBQUUsSUFBSSxNQUFPLGNBQWMsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsSUFBTSxlQUFlLEdBQTBCO2dCQUM3QyxjQUFjLGdCQUFBO2dCQUNkLFlBQVksRUFBRSxRQUFRO2dCQUN0QixZQUFZLEVBQUUsS0FBSSxDQUFDLFdBQVc7Z0JBQzlCLElBQUksTUFBQTtnQkFDSixNQUFNLEVBQUU7b0JBQ04sR0FBRyxFQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQztvQkFDOUIsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWM7aUJBQzdEO2FBQ0YsQ0FBQztZQUNGLE9BQU8sNEJBQTRCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLDJDQUFxQixHQUE3QixVQUE4QixVQUF1QjtRQUFyRCxpQkFPQztRQU5DLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBQSxNQUFNO1lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsS0FBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVDQUFpQixHQUFqQixVQUFrQixRQUFtQztRQUFyRCxpQkFrRUM7UUFoRUcsSUFBQSxvQkFBSSxFQUNKLHNDQUFhLEVBQ2Isd0JBQU0sRUFDTix3Q0FBYyxFQUNkLG9DQUFZLEVBQ1osc0NBQWEsRUFDYixvQ0FBWSxFQUNaLHNDQUFhLENBQ0Y7UUFDUCxJQUFBLGFBQTRCLEVBQTFCLGNBQUksRUFBRSxvQkFBb0IsQ0FBQztRQUNuQyxrQkFBa0I7UUFDbEIsc0VBQXNFO1FBQ3RFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxJQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUNoRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLG1CQUFtQjtRQUNuQixJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUVELG1CQUFtQjtRQUNuQixJQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksYUFBYSxDQUFDO1FBQ2xCLElBQUksY0FBYyxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsVUFBQSxHQUFHLElBQUksT0FBQSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQXhDLENBQXdDLENBQUMsQ0FBQztZQUMxRixPQUFPLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRDtRQUNELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9DLGdCQUFnQjtRQUNoQixJQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhELGdCQUFnQjtRQUNoQixJQUFJLGFBQWEsbUJBQTZCLEVBQUU7WUFDOUMsc0JBQXNCO1lBQ3RCLFlBQVk7Z0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO29CQUNyQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsMkJBQXFDLEVBQUU7d0JBQzVELE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQy9CO3lCQUFNO3dCQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUNwRDtnQkFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxhQUFhLDJCQUFxQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDN0c7UUFFRCxzQkFBc0I7UUFDdEIsSUFBTSxxQkFBcUIsR0FBRyxhQUFhO1lBQ3pDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBVyxJQUFLLE9BQUEsR0FBRyxLQUFLLEtBQUksQ0FBQyx5QkFBeUIsRUFBdEMsQ0FBc0MsQ0FBQztZQUMvRSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsSUFBTSxlQUFlLEdBQUcsWUFBWTtZQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQVcsSUFBSyxPQUFBLEdBQUcsS0FBSyxLQUFJLENBQUMseUJBQXlCLEVBQXRDLENBQXNDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7WUFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUM7WUFDekQsQ0FBQyxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZFLG1CQUFtQjtRQUNuQixZQUFZLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHFDQUFlLEdBQWY7UUFDRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0NBQWtCLEdBQWxCO1FBQ0UsSUFBTSx5QkFBMEMsRUFBeEMsa0JBQU0sRUFBRSw2QkFBZ0MsQ0FBQztRQUN6QyxJQUFBLDBCQUFPLENBQWM7UUFDN0IsSUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxlQUF5QixDQUFDO1FBQ2hHLElBQU0sV0FBVyx5QkFBUSxJQUFJLEtBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsZUFBQSxHQUFFLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxRQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxrQ0FBWSxHQUFaLFVBQWEsYUFBd0M7UUFDbkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELHdDQUFrQixHQUFsQjtRQUFBLGlCQWdCQztRQWZDLElBQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO1lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxhQUFhLENBQUMsS0FBSyxDQUFDO2FBQ2pCLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNyQjthQUNBLFNBQVMsQ0FBQztZQUNULElBQU0sZUFBZSxHQUFHLEtBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0QsS0FBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sK0NBQXlCLEdBQWpDLFVBQWtDLE1BQTBCOztRQUMxRCxJQUFNLGNBQWMsR0FBZ0MsRUFBRSxDQUFDOztZQUN2RCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ2YsSUFBQSx1QkFBTyxFQUFFLCtCQUFXLENBQVc7Z0JBQ3ZDLElBQUksT0FBTyxFQUFFO29CQUNYLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRzt3QkFDdkIsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7cUJBQ25CLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBRzt3QkFDeEIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUM5QixPQUFPLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJOzRCQUM5QixJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTs0QkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO2dDQUMvQyxPQUFPO29DQUNMLFNBQVMsV0FBQTtvQ0FDVCxLQUFLLEVBQUUsS0FBSztvQ0FDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO2lDQUNyRCxDQUFDOzZCQUNIOzRCQUNELE9BQU8sSUFBK0IsQ0FBQzt3QkFDekMsQ0FBQyxDQUFDO3FCQUNILENBQUM7b0JBQ0YsSUFBSSxPQUFPLEVBQUU7d0JBQ1gsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDeEQ7eUJBQU07d0JBQ0wsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGlCQUFpQixDQUFDO3FCQUM1QztpQkFDRjthQUNGOzs7Ozs7Ozs7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsb0RBQThCLEdBQTlCLFVBQStCLFdBQWdDO1FBQS9ELGlCQTBDQztRQXpDQyxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxVQUFDLEVBQXdDO2dCQUF0QyxzQkFBUTtZQUFtQyxPQUFBLFFBQVEsS0FBSyxhQUFhLENBQUMsR0FBRztRQUE5QixDQUE4QixDQUFDLEVBQUU7WUFDckcsSUFBTSxnQkFBZ0IsR0FBRyxhQUFhO2lCQUNuQyxHQUFHLENBQUMsVUFBQyxFQUF1QztvQkFBckMsb0JBQU87Z0JBQW1DLE9BQUEsT0FBTztZQUFQLENBQU8sQ0FBQztpQkFDekQsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQWYsQ0FBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLGFBQWEsR0FBRztnQkFDZDtvQkFDRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUc7b0JBQzNCLE9BQU8sRUFBRSxnQkFBZ0I7aUJBQzFCO2FBQ0YsQ0FBQztTQUNIO1FBQ0QsSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUU7WUFDekQsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUMzQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNPLElBQUEsMkZBQTRCLENBQXFDO1FBQ3pFLElBQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQXlCO1lBQ3JFLE9BQU8sQ0FDTCxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsNEJBQTRCLElBQUksS0FBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUNqSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFNLGFBQWEsR0FBb0MsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBNEI7Z0JBQTFCLGdCQUFLO1lBQTBCLE9BQUEsQ0FBQztnQkFDOUcsU0FBUyxFQUFFLG9CQUFvQixDQUFDLFFBQVE7Z0JBQ3hDLEtBQUssRUFBRSxVQUFVO2dCQUNqQixNQUFNLEVBQUUsS0FBSzthQUNkLENBQUM7UUFKNkcsQ0FJN0csQ0FBQyxDQUFDO1FBQ0osSUFBTSxZQUFZLEdBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBRU8sbURBQTZCLEdBQXJDLFVBQXNDLE1BQTBCOztRQUM5RCxJQUFJLGFBQWEsR0FBaUMsRUFBRSxDQUFDOztZQUVyRCxLQUE4QixJQUFBLEtBQUEsU0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzQyxJQUFBLHdCQUFlLEVBQWQsY0FBTSxFQUFFLGFBQUs7Z0JBQ3ZCLElBQUksWUFBWSxHQUErQixJQUFJLENBQUM7Z0JBQzVDLElBQUEsdUJBQU8sRUFBRSwrQkFBVyxDQUFXO2dCQUN2QyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxZQUFZLEdBQUc7d0JBQ2IsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHO3dCQUMzQixPQUFPLEVBQUUsWUFBRyxNQUFNLFFBQUEsSUFBSyxPQUFPLEVBQUc7cUJBQ2xDLENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFXLEVBQUU7b0JBQ2YsSUFBTSxpQkFBaUIsR0FBK0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0csSUFBSSxZQUFZLEVBQUU7d0JBQ2hCLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7cUJBQzlDO3lCQUFNO3dCQUNMLFlBQVksR0FBRyxpQkFBaUIsQ0FBQztxQkFDbEM7aUJBQ0Y7Z0JBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNsQzs7Ozs7Ozs7O1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELHlEQUFtQyxHQUFuQztRQUNVLElBQUEsNkVBQXFCLENBQXFDO1FBQzVELElBQUEsb0NBQTZELEVBQTNELDBCQUFVLEVBQUUsNEJBQStDLENBQUM7UUFDcEUsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDbEMsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxJQUFNLGtCQUFrQixHQUFzQztZQUM1RCxTQUFTLEVBQUUsb0JBQW9CLENBQUMsV0FBVztZQUMzQyxNQUFNLEVBQUUscUJBQXFCO1lBQzdCLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUM7UUFDRixJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZ0RBQTBCLEdBQWxDLFVBQ0UsaUJBQTRDLEVBQzVDLE1BQWM7UUFFZCxPQUFPO1lBQ0wsUUFBUSxFQUFFLGlCQUFpQixDQUFDLFFBQVE7WUFDcEMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxJQUFJO2dCQUNwQyxJQUFBLDBCQUFTLEVBQUUsa0JBQUssQ0FBVTtnQkFDbEMsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsUUFBUSxFQUFFO29CQUMvQyxPQUFPO3dCQUNMLFNBQVMsV0FBQTt3QkFDVCxLQUFLLEVBQUUsS0FBSzt3QkFDWixHQUFHLEVBQUcsSUFBcUMsQ0FBQyxRQUFRO3dCQUNwRCxNQUFNLFFBQUE7cUJBQytCLENBQUM7aUJBQ3pDO2dCQUNELElBQUksU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsSUFBSSxTQUFTLEtBQUssb0JBQW9CLENBQUMsU0FBUyxFQUFFO29CQUMvRixPQUFPO3dCQUNMLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRO3dCQUN4QyxLQUFLLEVBQUUsU0FBUyxLQUFLLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUNyRSxNQUFNLFFBQUE7cUJBQ1AsQ0FBQztpQkFDSDtnQkFDRCxPQUFPLHNCQUFLLElBQUksS0FBRSxNQUFNLFFBQUEsR0FBbUMsQ0FBQztZQUM5RCxDQUFDLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLDRDQUFzQixHQUE5QixVQUErQixTQUF5QjtRQUN0RCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBQyxFQUFlO2dCQUFiLGdCQUFLLEVBQUUsY0FBSTtZQUFPLE9BQUEsQ0FBQztnQkFDekMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQWlDO2FBQzdELENBQUM7UUFId0MsQ0FHeEMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLDBDQUFvQixHQUE1QixVQUNFLGNBQTZGO1FBRC9GLGlCQVdDO1FBUkMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDekIsT0FBTyxvQkFBb0IsQ0FBQztTQUM3QjthQUFNLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sVUFBQSxlQUFlO2dCQUNwQixPQUFPLEtBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTywyQ0FBcUIsR0FBN0IsVUFBOEIsWUFBK0I7UUFDM0QsSUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLFNBQVMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsOENBQXdCLEdBQXhCLFVBQXlCLFVBQWlCLEVBQUUsZ0JBQXdCO1FBQTNDLDJCQUFBLEVBQUEsaUJBQWlCO1FBQUUsaUNBQUEsRUFBQSx3QkFBd0I7UUFDbEUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNaLElBQUEsK0VBQXFCLENBQXFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXFCLENBQUMsRUFBRTtnQkFDbkMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQUMsRUFBZTt3QkFBYixVQUFFO29CQUFnQixPQUFBLENBQUMsdUJBQXFCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFBbkMsQ0FBbUMsQ0FBQyxDQUFDO2FBQ3RHO1NBQ0Y7UUFDRCxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxxQ0FBZSxHQUFmO1FBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixFQUFFO1lBQy9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQzFGO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtREFBNkIsR0FBckMsVUFBc0MsRUFBdUM7WUFBckMsNEJBQVc7UUFDakQsV0FBVyxDQUFDLHNCQUFzQixHQUFHLFVBQUEsTUFBTTtZQUN6QyxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUV2RCxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFGLElBQU0sY0FBYyxHQUFHLFlBQVk7cUJBQ2hDLEdBQUcsQ0FBQyxVQUFDLEVBQXNCO3dCQUFwQiwwQ0FBa0I7b0JBQU8sT0FBQSxrQkFBa0I7Z0JBQWxCLENBQWtCLENBQUM7cUJBQ25ELElBQUksQ0FBQyxVQUFDLEVBQVM7d0JBQVAsZ0JBQUs7b0JBQU8sT0FBQSxLQUFLLEtBQUssTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtnQkFBNUMsQ0FBNEMsQ0FBQyxDQUFDO2dCQUVyRSxJQUFJLGNBQWMsRUFBRTtvQkFDbEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO2lCQUN2QzthQUNGO1lBRUQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO2dCQUNwQixNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQXJCLENBQXFCLENBQUMsQ0FBQzthQUN2RTtRQUNILENBQUMsQ0FBQztRQUVGLFdBQVcsQ0FBQywyQkFBMkIsR0FBRyxVQUFDLFdBQXdCO1lBQ2pFLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRTtnQkFDcEIsSUFBQSx1Q0FBcUQsRUFBbkQsZ0JBQUssRUFBRSxnQkFBNEMsQ0FBQztnQkFFNUQsV0FBVyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2FBQ2hDO1lBRUQsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO2dCQUN6QixXQUFXLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQXJCLENBQXFCLENBQUMsQ0FBQzthQUNqRjtRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxzQ0FBZ0IsR0FBeEIsVUFBNEIsSUFBUztRQUNuQyxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDekQsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLFlBQVksRUFBRSxLQUFLOztZQUNqRCxJQUFNLFlBQVksZ0JBQVEsWUFBWSxDQUFFLENBQUM7O2dCQUV6QyxLQUFrQixJQUFBLGlCQUFBLFNBQUEsWUFBWSxDQUFBLDBDQUFBLG9FQUFFO29CQUEzQixJQUFNLEdBQUcseUJBQUE7b0JBQ1osSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFFcEMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLE9BQUEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDN0U7Ozs7Ozs7OztZQUVELE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7O2dCQWgvQmdCLFNBQVM7Z0JBQ0wsU0FBUztnQkFDVCxvQkFBb0I7Z0JBQ2pCLFlBQVk7Z0JBQ2IsV0FBVztnREFDL0IsTUFBTSxTQUFDLHFCQUFxQjtnREFDNUIsTUFBTSxTQUFDLGdCQUFnQjs7SUFoQ2YsV0FBVztRQUR2QixVQUFVLEVBQUU7UUFnQ1IsV0FBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUM3QixXQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3lDQU5WLFNBQVM7WUFDTCxTQUFTO1lBQ1Qsb0JBQW9CO1lBQ2pCLFlBQVk7WUFDYixXQUFXO09BOUJ2QixXQUFXLENBMmdDdkI7SUFBRCxrQkFBQztDQUFBLEFBM2dDRCxJQTJnQ0M7U0EzZ0NZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRvR3JpZEFwaSB9IGZyb20gJy4uL2dyaWQtY29udHJvbGxlci9ncmlkLWNvbnRyb2xsZXIudHlwZXMnO1xuaW1wb3J0IHtcbiAgQ2VsbENsYXNzUGFyYW1zLFxuICBDb2xHcm91cERlZixcbiAgQ29sdW1uLFxuICBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zLFxuICBHcmlkT3B0aW9ucyxcbiAgSUNlbGxSZW5kZXJlclBhcmFtcyxcbiAgSUdldFJvd3NQYXJhbXMsXG4gIFJvd05vZGUsXG4gIFJvd05vZGVUcmFuc2FjdGlvbixcbiAgUm93U2VsZWN0ZWRFdmVudFxufSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5pbXBvcnQgeyBSb3dEYXRhVHJhbnNhY3Rpb24gfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eS9kaXN0L2xpYi9yb3dNb2RlbHMvY2xpZW50U2lkZS9jbGllbnRTaWRlUm93TW9kZWwnO1xuaW1wb3J0IHsgR3JpZFF1ZXJ5IH0gZnJvbSAnLi9ncmlkLnF1ZXJ5JztcbmltcG9ydCB7IERhdG9Db3JlRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGF0b1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLWN1c3RvbS1oZWFkZXIvY3VzdG9tLWhlYWRlci10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIERhdG9GaWx0ZXJDb25kaXRpb25zLFxuICBEYXRvR3JpZENvbmRpdGlvbmFsRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb24sXG4gIERhdG9HcmlkRmlsdGVyU2VjdGlvbnMsXG4gIERhdG9HcmlkRmlsdGVyc01hcCxcbiAgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uTGlzdENvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25SYW5nZUNvbmRpdGlvblxufSBmcm9tICcuLi9ncmlkLWZpbHRlci9ncmlkLWZpbHRlci50eXBlcyc7XG5pbXBvcnQgeyBjb2VyY2VBcnJheSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvZXJjaW9uJztcbmltcG9ydCB7IGlzRW1wdHksIGlzRnVuY3Rpb24sIGlzTmlsLCBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWx0ZXIgfSBmcm9tICcuLi9ncmlkLWZpbHRlci9maWx0ZXItdmFsaWRhdG9yJztcbmltcG9ydCB7IEFnR3JpZE5nMiB9IGZyb20gJ2FnLWdyaWQtYW5ndWxhcic7XG5pbXBvcnQgeyBJY29uUmVnaXN0cnksIFN2Z1JlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaWNvbi1yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZXRWaXNpYmxlQWN0aW9ucywgdG9vbGJhckFjdGlvblRvQ29udGV4dEFjdGlvbiB9IGZyb20gJy4uL2dyaWQtdjIudXRpbCc7XG5pbXBvcnQge1xuICBEYXRvR3JpZFNldHRpbmdzLFxuICBOb3JtYWxpemVPcHRpb25zUGFyYW1zLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZyxcbiAgU3VjY2Vzc1dyYXBwZXJQYXJhbXNcbn0gZnJvbSAnLi9ncmlkLnN0b3JlLnR5cGVzJztcbmltcG9ydCB7IFJvd0FjdGlvbiB9IGZyb20gJy4uL2dyaWQtdG9vbGJhci9ncmlkLXRvb2xiYXIudHlwZXMnO1xuaW1wb3J0IHsgY29weVRvQ2xpcGJvYXJkIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jbGlwYm9hcmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRTdG9yZSB9IGZyb20gJy4vZ3JpZC5zdG9yZSc7XG5pbXBvcnQgeyBEQVRPX0dSSURfU1RPUkFHRV9BUEksIEdyaWRTdG9yYWdlQVBJIH0gZnJvbSAnLi4vZ3JpZC1zZXR0aW5ncyc7XG5pbXBvcnQge1xuICBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMsXG4gIERhdG9HcmlkQWxpZ25tZW50LFxuICBEYXRvR3JpZENvbHVtbkRlZixcbiAgRGF0b0dyaWRDb2x1bW5UeXBlcyxcbiAgRGF0b0dyaWRHZXRSb3dzUGFyYW1zLFxuICBEYXRvR3JpZE9wdGlvbnMsXG4gIERhdG9HcmlkU2VydmVyU29ydCxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uLFxuICBEYXRvR3JpZFNvcnQsXG4gIERhdG9HcmlkVHJlZUNvbmZpZyxcbiAgZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0LFxuICBHcmlkTWluV2lkdGhzLFxuICBHcmlkUm93U2VsZWN0aW9uVHlwZSxcbiAgc2VhcmNoSGlnaGxpZ2h0Q2VsbFJlbmRlcmVyXG59IGZyb20gJy4uL2dyaWQvZ3JpZC12Mi50eXBlcyc7XG5cbmltcG9ydCB7IGNvbnZlcnRUb1RyZWVEYXRhLCBkZWZhdWx0R3JpZE9wdGlvbnMsIGRlZmF1bHRHcmlkVHJlZUxhYmVsIH0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLmNvbmZpZyc7XG5pbXBvcnQgeyBkaWZmIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0JztcbmltcG9ydCB7IHVudGlsRGVzdHJveWVkIH0gZnJvbSAnbmd4LXRha2UtdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBDb3JlRXZlbnRMb2dnZXIsIENvcmVFdmVudFR5cGVzLCBEQVRPX0NPUkVfTE9HR0VSIH0gZnJvbSAnLi4vLi4vZXZlbnQtbG9nZ2VyJztcbmltcG9ydCB7IEhhc2hNYXAgfSBmcm9tICcuLi8uLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPcGVyYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vb3BlcmF0b3ItdG9nZ2xlci9vcGVyYXRvci10b2dnbGVyLnR5cGVzJztcbmltcG9ydCB7IGRlZXBtZXJnZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2RlZXAtbWVyZ2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdHJpZ2dlcldpbmRvd1Jlc2l6ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3VzZXItYWdlbnQnO1xuaW1wb3J0IHsgZ2V0Q29sRmllbGQsIGdldENvbHVtbnNTaXplcyB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3JpZC1jb2x1bW4taGVhZGVyL2dyaWQtbXVsdGktc2VsZWN0LWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEdyaWRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgYXBpOiBEYXRvR3JpZEFwaTtcbiAgdHJlZUNvbmZpZzogRGF0b0dyaWRUcmVlQ29uZmlnID0gZGVmYXVsdEdyaWRUcmVlTGFiZWw7XG4gIGlzUGl2b3RNb2RlOiBib29sZWFuO1xuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIGZvciBzZXJ2ZXIgc2lkZSBieSB2YWx1ZSBmaWx0ZXIgKi9cbiAgX29yaWdpbmFsR2V0Um93czogKHBhcmFtczogRGF0b0dyaWRHZXRSb3dzUGFyYW1zKSA9PiB2b2lkO1xuICBwcml2YXRlIGluaXRpYWxTZXR0aW5nczogRGF0b0dyaWRTZXR0aW5ncztcbiAgcHJpdmF0ZSBncmlkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGdyaWRSZWY6IEFnR3JpZE5nMjtcbiAgcHJpdmF0ZSBjdXN0b21IZWFkZXJzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8RGF0b0N1c3RvbUhlYWRlclRlbXBsYXRlQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBpc1RyZWVEYXRhOiBib29sZWFuO1xuICBwcml2YXRlIHBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IC0xO1xuICBwcml2YXRlIGxhc3RUb3RhbFJvd3M6IG51bWJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZE5nMikge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuICAgIHRoaXMuZ3JpZFJlZiA9IGdyaWRSZWY7XG4gICAgdGhpcy5ncmlkTmFtZSA9IChncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykuZ3JpZE5hbWU7XG4gICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICBlbmFibGVkOiB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZFJlZi5ncmlkT3B0aW9ucylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9uczogR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ3JpZE9wdGlvbnMucm93TW9kZWxUeXBlID09PSAnaW5maW5pdGUnO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbnRleHQoY29udGV4dCA9IHt9LCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmNvbnRleHQgPSByZXBsYWNlXG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogZGVlcG1lcmdlKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucy5jb250ZXh0IHx8IHt9LCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHNldFNlbGVjdGVkUm93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIHRoaXMuc2VsZWN0Um93cyhyb3cpO1xuICB9XG5cbiAgc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiAhcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiByb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb3dzPFQ+KGRhdGE6IFRbXSwgZml0Q29udGFpbmVyID0gZmFsc2UsIHRyZWVDb25maWc6IFBhcnRpYWw8RGF0b0dyaWRUcmVlQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ3JpZFJlYWR5JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyZWVEYXRhKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0R3JpZFRyZWVMYWJlbCxcbiAgICAgICAgICAuLi50cmVlQ29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRyZWVEYXRlID0gY29udmVydFRvVHJlZURhdGEoZGF0YSwgdGhpcy50cmVlQ29uZmlnKTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKHRyZWVEYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgICB0aGlzLnNldFBpdm90TW9kZVJvd3M8VD4oZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZml0Q29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZml0R3JpZCgnY29udGFpbmVyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCwgcmV0dXJuVG9DdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuVG9DdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IGdldFJvd3M7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy53cmFwR2V0Um93cyh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLCBnZXRSb3dzKSB9KTtcbiAgfVxuXG4gIHJlZnJlc2hTZXJ2ZXJEYXRhKGtlZXBDdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAga2VlcEN1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5kYXRhc291cmNlLmdldFJvd3MgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCkge1xuICAgIC8vIEtlZXBpbmcgdGhlIGN1cnJlbnQgcGFnZSBvbiBzZXJ2ZXIgcmVmcmVzaCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9ubHkgd2hlbiBubyBwYWdlIGNsaWVudCBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5tYXhCbG9ja3NJbkNhY2hlID09PSAxKSB7XG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IHRoaXMuYXBpLmdyaWQucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkUm93czxUPihyb3c6IFQsIGluZGV4PzogbnVtYmVyKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICBjb25zdCBkYXRhOiBSb3dEYXRhVHJhbnNhY3Rpb24gPSB7IGFkZDogcm93cyB9O1xuICAgIGlmICghaXNOaWwoaW5kZXgpKSB7XG4gICAgICBkYXRhLmFkZEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoZGF0YSk7XG4gIH1cblxuICB1cGRhdGVSb3dzPFQ+KHJvdzogVFtdKTogYW55IHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgdXBkYXRlOiByb3dzIH0pO1xuICB9XG5cbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IHN0cmluZyB8IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCkge1xuICAgIGNvbnN0IHJvd05vZGUgPSBpc1N0cmluZyhyb3cpID8gdGhpcy5hcGkuZ3JpZC5nZXRSb3dOb2RlKHJvdykgOiByb3c7XG4gICAgcm93Tm9kZS5zZXREYXRhVmFsdWUoa2V5LCBuZXdWYWx1ZSk7XG4gIH1cblxuICByZW1vdmVSb3dzKHJvdzogUm93Tm9kZSB8IFJvd05vZGVbXSk6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdykubWFwKCh7IGRhdGEgfSkgPT4gZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHJlbW92ZTogcm93cyB9KTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkUm93cygpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlUm93cyhzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgY2xlYXJUYWJsZSgpIHtcbiAgICB0aGlzLnNldFJvd3MoW10pO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZiB8IERhdG9HcmlkQ29sdW1uRGVmW10sIHJlbG9hZFNldHRpbmdzID0gZmFsc2UpIHtcbiAgICBpZiAoIWNvbERlZnMpIHtcbiAgICAgIHRocm93IG5ldyBEYXRvQ29yZUVycm9yKCdObyBjb2x1bW5EZWZzIHdlcmUgcHJvdmlkZWQuIPCflbXwn4+74oCN4pmA77iPJyk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMoY29lcmNlQXJyYXkoY29sRGVmcykpO1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3MgPSByZWxvYWRTZXR0aW5ncyAmJiB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRDb2x1bW5EZWZzKG5vcm1hbGl6ZWQpO1xuICAgIGlmIChzYXZlZFNldHRpbmdzKSB7XG4gICAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIG5vcm1hbGl6ZU9wdGlvbnMocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzID0gcGFyYW1zLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM7XG4gICAgY29uc3QgaGVhZGVyQ29tcG9uZW50UGFyYW1zID0geyBncmlkU2VydmljZTogdGhpcywgZ3JpZFF1ZXJ5OiB0aGlzLmdyaWRRdWVyeSB9O1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAuLi5oZWFkZXJDb21wb25lbnRQYXJhbXMsXG4gICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmRlZmF1bHRDb2xEZWYsXG4gICAgICBoZWFkZXJDb21wb25lbnRQYXJhbXNcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVCYWNrZ3JvdW5kID0gcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xICYmIHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gIT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLlNJTkdMRTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggJiYgZGVmYXVsdEdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodDtcbiAgICB9XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMocGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMsIHBhcmFtcy5ncmlkT3B0aW9ucyk7XG5cbiAgICAvKiogQWRkIGNvcmUgZmlsdGVycyAqL1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5pc0V4dGVybmFsRmlsdGVyUHJlc2VudCA9ICgpID0+IHRydWU7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmRvZXNFeHRlcm5hbEZpbHRlclBhc3MgPSAocm93OiBSb3dOb2RlKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2YWxpZGF0ZUZpbHRlcih7IHJvdywgYXBpOiB0aGlzLmdyaWRRdWVyeS5hcGkuZ3JpZCB9LCB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKSkgJiYgdGhpcy5yb3dNYXRjaGVzU2VhcmNoKHJvdylcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKiBXcmFwIHRoZSBzZXJ2ZXIgc2lkZSBwYWdpbmF0aW9uIGdldCByb3dzIGZ1bmN0aW9uICovXG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihwYXJhbXMuZ3JpZE9wdGlvbnMpKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYmxvY2tMb2FkRGVib3VuY2VNaWxsaXMgPSAzMDA7XG4gICAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBwYXJhbXMuZ3JpZE9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cyA9IHRoaXMud3JhcEdldFJvd3MocGFyYW1zLmdyaWRPcHRpb25zKTtcbiAgICAgIC8qIFRoZSBjYWNoZSBzaXplIGlzIHN5bmNlZCB3aXRoIHRoZSBwYWdpbmF0aW9uIHBhZ2Ugc2l6ZSAqL1xuICAgICAgY29uc3QgY2FjaGVTaXplID0gcGFyYW1zLmdyaWRPcHRpb25zLnBhZ2luYXRpb25QYWdlU2l6ZTtcbiAgICAgIGlmIChjYWNoZVNpemUpIHtcbiAgICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmNhY2hlQmxvY2tTaXplID0gY2FjaGVTaXplO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBFZGl0YWJsZSBjZWxsICovXG4gICAgdGhpcy5pbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtcyk7XG5cbiAgICAvKiogV3JhcCBjb250ZXh0IG1lbnUgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZ2V0Q29udGV4dE1lbnVJdGVtcyA9IHRoaXMud3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXMpO1xuXG4gICAgLyoqIFNhdmUgZ3JpZCBzZXR0aW5ncyAqL1xuICAgIGNvbnN0IHsgc2F2ZVNldHRpbmdzLCBncmlkTmFtZSB9ID0gcGFyYW1zLmdyaWRPcHRpb25zO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBzYXZlU2V0dGluZ3MgIT09IGZhbHNlICYmICFpc05pbChncmlkTmFtZSk7XG5cbiAgICAvKiogU2VydmVyIFNpZGUgUGFnaW5hdGlvbiBmb3Igc2VsZWN0IGFsbCBvcHRpb24gKi9cbiAgICB0aGlzLmluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zKTtcblxuICAgIC8qKiBBZGQgcGl2b3Qgc3BlY2lmaWMgcmVxdWlyZWQgc2V0dGluZ3MgKi9cbiAgICBpZiAocGFyYW1zLmdyaWRPcHRpb25zLnBpdm90TW9kZSkge1xuICAgICAgdGhpcy5pbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2VzcyhwYXJhbXMpO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzEgPSB0cnVlO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUNvbHVtbnMoY29sRGVmczogRGF0b0dyaWRDb2x1bW5EZWZbXSwgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyA9IG51bGwpOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBpZiAoIWdyaWRPcHRpb25zKSB7XG4gICAgICBncmlkT3B0aW9ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZWRDb2xEZWZzID0gY29sRGVmcy5tYXAoKGNvbDogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgaGVhZGVyTmFtZTogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKGNvbC5oZWFkZXJOYW1lKVxuICAgICAgfTtcbiAgICAgIC8qKiBBZGp1c3QgdGhlIHdpZHRoIGluIGNhc2UgdGhlIGNvbHVtbiBoYXMgaW5mbyAqL1xuICAgICAgaWYgKGNvbC5pbmZvKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQubWluV2lkdGggPSBjb2wubWluV2lkdGggfHwgR3JpZE1pbldpZHRocy5XaXRoX0luZm87XG4gICAgICB9XG4gICAgICBpZiAoIWNvbC5jb2xJZCkge1xuICAgICAgICBub3JtYWxpemVkLmNvbElkID0gY29sLmZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZWQudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5JdGVtcyAmJiAhbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuZmlsdGVyc0NvbmZpZyA9IHsgc2VjdGlvbnM6IERhdG9HcmlkRmlsdGVyU2VjdGlvbnMuQ29uZGl0aW9uYWwgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9ybWFsaXplQ29sdW1uU2VhcmNoQ29uZmlnKGdyaWRPcHRpb25zLCBjb2wsIG5vcm1hbGl6ZWQpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5hZGRNdWx0aVNlbGVjdEhlYWRlckNvbHVtbklmUmVxdWlyZWQodXBkYXRlZENvbERlZnMsIGdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1uU2VhcmNoQ29uZmlnKFxuICAgIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMsXG4gICAgY29sOiBEYXRvR3JpZENvbHVtbkRlZixcbiAgICBub3JtYWxpemVkOiBEYXRvR3JpZENvbHVtbkRlZlxuICApIHtcbiAgICAvKiogQ2hlY2sgaWYgY29sdW1uIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHNlYXJjaCAqKi9cbiAgICBjb25zdCBpc1NlcnZlclBhZ2luYXRpb24gPSB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpO1xuICAgIGlmICh0eXBlb2YgY29sLmluY2x1ZGVJblNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChpc1NlcnZlclBhZ2luYXRpb24gJiYgY29sLnR5cGUgPT09IERhdG9HcmlkQ29sdW1uVHlwZXMuRGF0ZSkge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZC5pbmNsdWRlSW5TZWFyY2ggPVxuICAgICAgICAgIHR5cGVvZiBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgID8gZ3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHRcbiAgICAgICAgICAgIDogZGVmYXVsdEdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCAmJlxuICAgICAgIXRoaXMuaGFzQ2VsbFJlbmRlcmVyKG5vcm1hbGl6ZWQsIGdyaWRPcHRpb25zKSAmJlxuICAgICAgZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoSGlnaGxpZ2h0XG4gICAgKSB7XG4gICAgICBub3JtYWxpemVkLmNlbGxSZW5kZXJlciA9IChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9XG4gICAgICAgICAgKGlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShwYXJhbXMpKSB8fFxuICAgICAgICAgICghaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKTtcbiAgICAgICAgcmV0dXJuIGlzRWRpdGFibGVcbiAgICAgICAgICA/IGVkaXRhYmxlQ2VsbFJlbmRlcmVyV2l0aFNlYXJjaEhpZ2hsaWdodChwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSlcbiAgICAgICAgICA6IHNlYXJjaEhpZ2hsaWdodENlbGxSZW5kZXJlcihwYXJhbXMsIHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2VsbFJlbmRlcmVyKGNvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYsIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoY29sdW1uLmNlbGxSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlciA9IChvcHRpb25zOiBQYXJ0aWFsPERhdG9HcmlkT3B0aW9ucz4pOiBib29sZWFuID0+XG4gICAgICBvcHRpb25zLmNvbHVtblR5cGVzICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXSAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0uY2VsbFJlbmRlcmVyO1xuXG4gICAgcmV0dXJuIGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZ3JpZE9wdGlvbnMpIHx8IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZGVmYXVsdEdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKFxuICAgIGNvbHVtbkRlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9uc1xuICApOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBjb25zdCBzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcztcbiAgICBjb25zdCByb3dTZWxlY3Rpb24gPVxuICAgICAgZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID8gZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uIDogZGVmYXVsdEdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbjtcblxuICAgIGlmIChzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzICYmIHJvd1NlbGVjdGlvbiA9PT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuTVVMVElQTEUpIHtcbiAgICAgIGNvbnN0IGNoZWNrYm94ZXNDb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmID0ge1xuICAgICAgICBjb2xJZDogdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lELFxuICAgICAgICBjaGVja2JveFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50RnJhbWV3b3JrOiBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIG1heFdpZHRoOiAzMCxcbiAgICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IHRydWUsXG4gICAgICAgIGNlbGxDbGFzczogJ2NoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgaGVhZGVyQ2xhc3M6ICdoZWFkZXItY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgbG9ja1Bvc2l0aW9uOiB0cnVlLFxuICAgICAgICBpbmNsdWRlSW5TZWFyY2g6IGZhbHNlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFtjaGVja2JveGVzQ29sdW1uLCAuLi5jb2x1bW5EZWZzXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkRlZnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24oeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dGVybmFsT25Sb3dTZWxlY3RlZCA9IGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQ7XG4gICAgZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZCA9IChldnQ6IFJvd1NlbGVjdGVkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBldnQubm9kZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGUuaXNTZWxlY3RlZCgpO1xuICAgICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZCA9IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhub2RlLmlkKTtcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgICAgICAgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBleGNsdWRlZEZyb21TZWxlY3RBbGwuZmlsdGVyKChub2RlSWQ6IHN0cmluZykgPT4gbm9kZUlkICE9PSBub2RlLmlkKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmICFpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogWy4uLmV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCwgbm9kZS5pZF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHRlcm5hbE9uUm93U2VsZWN0ZWQpIHtcbiAgICAgICAgZXh0ZXJuYWxPblJvd1NlbGVjdGVkKGV2dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93TWF0Y2hlc1NlYXJjaChyb3c6IFJvd05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGlzRW1wdHkoc2VhcmNoVGVybSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoXG4gICAgICA/IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbENvbHVtbnMoKVxuICAgICAgOiB0aGlzLmdyaWRRdWVyeS5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgY29sRGVmID0gdGhpcy5hcGkuZ3JpZC5nZXRDb2x1bW5EZWYoY29sLmdldENvbElkKCkpIGFzIERhdG9HcmlkQ29sdW1uRGVmO1xuICAgICAgaWYgKCFjb2xEZWYuaW5jbHVkZUluU2VhcmNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93VmFsdWUgPSAodGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2wuZ2V0Q29sSWQoKSwgcm93KSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJvd1ZhbHVlLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGZpdEdyaWQoJ2NvbnRhaW5lcicpIGluc3RlYWRcbiAgICovXG4gIGZpdFRvQ29udGFpbmVyKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tSGVhZGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCBzcGVjaWZpYyA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiBjb2x1bW4gPT09IGZpZWxkKTtcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiAhY29sdW1uKTtcbiAgICAgIGlmIChzcGVjaWZpYyB8fCBjb21tb24pIHtcbiAgICAgICAgY29uc3QgeyBtb3JlTWVudSwgY3VzdG9tSGVhZGVyIH0gPSB7XG4gICAgICAgICAgbW9yZU1lbnU6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5tb3JlTWVudSkgfHwgKGNvbW1vbiAmJiBjb21tb24ubW9yZU1lbnUpLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcjogKHNwZWNpZmljICYmIHNwZWNpZmljLmN1c3RvbUhlYWRlcikgfHwgKGNvbW1vbiAmJiBjb21tb24uY3VzdG9tSGVhZGVyKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBtb3JlTWVudTogbW9yZU1lbnUgJiYgbW9yZU1lbnUudHBsLCBjdXN0b21IZWFkZXI6IGN1c3RvbUhlYWRlciAmJiBjdXN0b21IZWFkZXIudHBsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY2xlYXJBbGxGaWx0ZXJzKCkge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICBzZWFyY2hUZXJtOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGNvbHVtbkZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IFtjb2x1bW5GaWVsZF06IGRlbGV0ZWQsIC4uLmZpbHRlciB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0Q29sdW1uRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyKSB7XG4gICAgdGhpcy5fbG9nRXZlbnQoQ29yZUV2ZW50VHlwZXMuR1JJRF9GSUxURVJfQVBQTElFRCwge1xuICAgICAgY29sdW1uOiBjb2x1bW4uZ2V0Q29sSWQoKSxcbiAgICAgIG51bU9mQ29uZGl0aW9uczogKGZpbHRlci5jb25kaXRpb25hbCAmJiBmaWx0ZXIuY29uZGl0aW9uYWwuY29uZGl0aW9ucy5sZW5ndGgpIHx8IDAsXG4gICAgICBieVZhbHVlOiAhIWZpbHRlci5ieVZhbHVlID8gJ1llcycgOiAnTm8nXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2xGaWVsZCA9IGdldENvbEZpZWxkKGNvbHVtbi5nZXRDb2xEZWYoKSk7XG5cbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MuZmlsdGVyLFxuICAgICAgICAgICAgW2NvbEZpZWxkXTogZmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldFNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBzZWFyY2hUZXJtXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldFNlcnZlclNpZGVQYWdpbmF0aW9uKGNvbmZpZzogUGFydGlhbDxTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2ZXJTaWRlUGFnaW5hdGlvbjoge1xuICAgICAgICAgIC4uLnN0YXRlLnNlcnZlclNpZGVQYWdpbmF0aW9uLFxuICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TG9hZGluZyhzaG93OiBib29sZWFuKSB7XG4gICAgaWYgKHNob3cpIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuc2hvd0xvYWRpbmdPdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA9PT0gMCA/IHRoaXMuc2V0T3ZlcmxheSh0cnVlKSA6IHRoaXMuc2V0T3ZlcmxheShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdmVybGF5IGluc3RlYWRcbiAgICogQHBhcmFtIHNob3dcbiAgICovXG4gIHNldE5vRGF0YShzaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRPdmVybGF5KHNob3cpO1xuICB9XG5cbiAgc2V0T3ZlcmxheShzaG93OiBib29sZWFuKSB7XG4gICAgc2hvdyA/IHRoaXMuYXBpLmdyaWQuc2hvd05vUm93c092ZXJsYXkoKSA6IHRoaXMuYXBpLmdyaWQuaGlkZU92ZXJsYXkoKTtcbiAgfVxuXG4gIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5zZXR0aW5nc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZml0R3JpZCh0bzogJ2NvbnRhaW5lcicgfCAnY29udGVudCcpIHtcbiAgICB0byA9PT0gJ2NvbnRhaW5lcicgPyB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKSA6IHRoaXMuYXBpLmNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IHRvID09PSAnY29udGFpbmVyJyA/IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05UQUlORVIgOiBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVDtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZ3JpZEFsaWdubWVudCwgY29sdW1uc1NpemVzOiBudWxsIH0pO1xuICB9XG5cbiAgc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuaXNHbG9iYWxTZXR0aW5ncztcbiAgICB0aGlzLnN0b3JhZ2VBUEkuc2V0KHRoaXMuZ3JpZE5hbWUsIHNldHRpbmdzLCBpc0dsb2JhbCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHVzZWQgdG8gbG9nIGdyaWQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGxvZ2dpbmcgc2VydmljZVxuICAgKi9cbiAgX2xvZ0V2ZW50KGV2ZW50VHlwZTogQ29yZUV2ZW50VHlwZXMsIGV2ZW50UHJvcGVydGllcz86IEhhc2hNYXA8YW55Pikge1xuICAgIHRoaXMubG9nZ2VyLmxvZ0V2ZW50KGV2ZW50VHlwZSwgeyB0YWJsZTogdGhpcy5ncmlkTmFtZSwgLi4uZXZlbnRQcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VjY2Vzc0NhbGxiYWNrKHsgc3VjY2Vzc0NiLCBwYWdlTnVtYmVyLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfTogU3VjY2Vzc1dyYXBwZXJQYXJhbXMpIHtcbiAgICByZXR1cm4gKHJvd3NUaGlzQmxvY2s6IGFueVtdLCB0b3RhbFJvd3M6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHRvdGFsUm93cywgaGFzRXJyb3I6IGZhbHNlIH0pO1xuICAgICAgc3VjY2Vzc0NiKHJvd3NUaGlzQmxvY2ssIHRvdGFsUm93cyk7XG4gICAgICB0aGlzLmdyaWRRdWVyeS5fc2VydmVyRGF0YUxvYWRlZC5uZXh0KHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaS5ncmlkLFxuICAgICAgICBjb2x1bW5BcGk6IHRoaXMuYXBpLmNvbHVtbnMsXG4gICAgICAgIHR5cGU6ICdTZXJ2ZXJEYXRhTG9hZGVkJyxcbiAgICAgICAgcGFnaW5hdGlvblBhZ2U6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgLyoqIHNvIHRoZSBncmlkIGZpdHMgaW4gZXZlcnkgbmV3IGRhdGEgaW5wdXQgKi9cbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VG90YWxSb3dzID0gdG90YWxSb3dzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdyYXBHZXRSb3dzKG9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucywgZ2V0Um93cz86IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGdldFJvd3NDYiA9IGdldFJvd3MgfHwgb3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgcmV0dXJuIChnZXRSb3dzUGFyYW1zOiBJR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydFJvdywgZW5kUm93LCBzb3J0TW9kZWwsIHN1Y2Nlc3NDYWxsYmFjayB9ID0gZ2V0Um93c1BhcmFtcztcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gb3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemUgfHwgMTAwO1xuICAgICAgY29uc3QgaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgPSB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA+IDA7XG4gICAgICBjb25zdCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCAmJiBzdGFydFJvdyA9PT0gMDtcblxuICAgICAgY29uc3QgcGFnZU51bWJlciA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkXG4gICAgICAgID8gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggKyAxXG4gICAgICAgIDogTWF0aC5jZWlsKGVuZFJvdyAvIHBhZ2VTaXplKTtcblxuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcblxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgICBjb25zdCBuZXdQYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcyA9IHtcbiAgICAgICAgLi4uZ2V0Um93c1BhcmFtcyxcbiAgICAgICAgZmFpbENhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGhhc0Vycm9yOiB0cnVlIH0pO1xuICAgICAgICAgIHRoaXMuc2V0T3ZlcmxheSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrOiB0aGlzLndyYXBTdWNjZXNzQ2FsbGJhY2soeyBwYWdlTnVtYmVyLCBzdWNjZXNzQ2I6IHN1Y2Nlc3NDYWxsYmFjaywgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH0pLFxuICAgICAgICBzZXJ2ZXJDb25maWc6IHtcbiAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgIGNvbHVtbkZpbHRlcnM6IGlzRW1wdHkoZmlsdGVyKSB8fCBvcHRpb25zLmVuYWJsZVYyXzEgPyBudWxsIDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlciksXG4gICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmVuYWJsZVYyXzEgPyB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShvcHRpb25zLmNvbHVtbkRlZnMpIDogbnVsbCxcbiAgICAgICAgICBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICAvLyBTY2VuYXJpbyB0aGUgZm9sbG93aW5nIGhhbmRsZXMgLSBzZXJ2ZXIgcmVmcmVzaCB3aGVyZSBpdCB3YXMgcmVxdWVzdGVkIHRvIGtlZXAgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgICAgLy8gVGhlIHByb2JsZW0gLSBnZXRSb3dzIHdpbGwgaW5pdGlhbGx5IGJlIGNhbGxlZCBmb3IgcGFnZSAxIChhdXRvbWF0aWNhbGx5IGhhcHBlbnMgd2hlbiBjYWxsaW5nIGFnLWdyaWQncyBzZXREYXRhU291cmNlKS5cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gdHJpZ2dlciBpdCBhZ2Fpbiwgc3VjY2Vzc0NhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIHBhZ2UuXG4gICAgICAgIC8vIGZha2VHZXRSb3dzIGlzIHVzZWQgaW4gb3JkZXIgdG8gYXZvaWQgcmV0cmlldmluZyB0aGUgdW5uZWNlc3NhcnkgcmVhbCBkYXRhIGZvciBwYWdlIDEuXG4gICAgICAgIGNvbnN0IGZha2VHZXRSb3dzID0gKHsgc3VjY2Vzc0NhbGxiYWNrIH06IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhbXSwgdGhpcy5sYXN0VG90YWxSb3dzKTtcbiAgICAgICAgfTtcbiAgICAgICAgZmFrZUdldFJvd3MobmV3UGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFJvd3NDYihuZXdQYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMuZm9yRWFjaChjb2xEZWYgPT4ge1xuICAgICAgaWYgKGNvbERlZi5lZGl0YWJsZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb2xEZWYuZWRpdGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbENlbGxDbGFzcyA9IGNvbERlZi5jZWxsQ2xhc3M7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9IChjb2xEZWYuZWRpdGFibGUgYXMgRnVuY3Rpb24pKGNlbGxDbGFzc1BhcmFtcyBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVSZXN1bHQgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGluaXRpYWxDZWxsQ2xhc3MpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihlZGl0YWJsZVJlc3VsdCkgPyBlZGl0YWJsZVJlc3VsdChjZWxsQ2xhc3NQYXJhbXMpIDogZWRpdGFibGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihpbml0aWFsQ2VsbENsYXNzKSA/IGluaXRpYWxDZWxsQ2xhc3MoY2VsbENsYXNzUGFyYW1zKSA6IGluaXRpYWxDZWxsQ2xhc3M7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhjb2xEZWYuY2VsbENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGNvbnN0IHsgY3VzdG9tQ29udGV4dE1lbnUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gaXNGdW5jdGlvbihjdXN0b21Db250ZXh0TWVudSkgPyBjdXN0b21Db250ZXh0TWVudShwYXJhbXMucm93QWN0aW9ucykgOiBwYXJhbXMucm93QWN0aW9ucztcbiAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zKTtcbiAgICBjb25zdCBjb3B5QWN0aW9uOiBSb3dBY3Rpb24gPSB7XG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLmNvcHktY2VsbCcpLFxuICAgICAgaWNvbjogJ2NvcHknLFxuICAgICAga2V5OiAnQ29weSBDZWxsJ1xuICAgIH07XG4gICAgcmV0dXJuICh7IG5vZGUsIGNvbHVtbiwgY29udGV4dCB9OiBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBvbkhvdmVyQWN0aW9uTWVudSA9IGNvbnRleHQgJiYgY29udGV4dC5jb250ZXh0TWVudSAmJiBjb250ZXh0LmNvbnRleHRNZW51LmZyb21PbkhvdmVyO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICBsZXQgc2VsZWN0ZWQgPSBbbm9kZV07XG4gICAgICBsZXQgcm93c0NvdW50ID0gMTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb250ZXh0KHsgY29udGV4dE1lbnU6IHsgZnJvbU9uSG92ZXI6IGZhbHNlIH0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5QWN0aW9uLm9uQ2xpY2sgPSAoW3Jvd10pID0+IHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sdW1uLmdldENvbElkKCksIHJvdyk7XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gY29sdW1uLmdldENvbERlZigpLnZhbHVlRm9ybWF0dGVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0dGVyID8gZm9ybWF0dGVyKHJhd1ZhbHVlKSA6IHJhd1ZhbHVlO1xuICAgICAgICAgIGNvcHlUb0NsaXBib2FyZCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChub2RlLmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgIHNlbGVjdGVkID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgICAgICAgIHJvd3NDb3VudCA9IHNpemUoc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQWN0aW9ucyA9IGdldFZpc2libGVBY3Rpb25zKFxuICAgICAgICBhbGxBY3Rpb25zLFxuICAgICAgICByb3dzQ291bnQsXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICB0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkXG4gICAgICApLmZpbHRlcigoeyB2aXNpYmxlIH0pID0+IHZpc2libGUpO1xuICAgICAgbGV0IHRvb2xiYXJBY3Rpb25zID0gW2NvcHlBY3Rpb25dO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gdmlzaWJsZUFjdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHZpc2libGVBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSBbeyAuLi5jb3B5QWN0aW9uLCBzZXBhcmF0b3I6IHRydWUgfSwgLi4udmlzaWJsZUFjdGlvbnNdO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udmVydGVyUGFyYW1zOiBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMgPSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zLFxuICAgICAgICBzZWxlY3RlZFJvd3M6IHNlbGVjdGVkLFxuICAgICAgICBpY29uUmVnaXN0cnk6IHRoaXMuc3ZnUmVnaXN0cnksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGxvZ2dlcjoge1xuICAgICAgICAgIGxvZzogdGhpcy5fbG9nRXZlbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICBldmVudE9yaWdpbjogb25Ib3ZlckFjdGlvbk1lbnUgPyAnT24gSG92ZXInIDogJ0NvbnRleHQgTWVudSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uKGNvbnZlcnRlclBhcmFtcyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnM6IFJvd0FjdGlvbltdKSB7XG4gICAgYWxsQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBhY3Rpb24ubGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oYWN0aW9uLmxhYmVsKTtcbiAgICAgIGlmIChhY3Rpb24uc3ViTWVudSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhY3Rpb24uc3ViTWVudSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkU2F2ZWRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IHtcbiAgICAgIHNvcnQsXG4gICAgICBoaWRkZW5Db2x1bW5zLFxuICAgICAgZmlsdGVyLFxuICAgICAgZ3JvdXBlZENvbHVtbnMsXG4gICAgICBjb2x1bW5zU2l6ZXMsXG4gICAgICBwaW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc09yZGVyLFxuICAgICAgZ3JpZEFsaWdubWVudFxuICAgIH0gPSBzZXR0aW5ncztcbiAgICBjb25zdCB7IGdyaWQsIGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIC8qIEhpZGUgY29sdW1ucyAqL1xuICAgIC8qIE5PVEU6IGNvbHVtbnMgb3JkZXIgYXJlIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHRoaXMuaW5pdGlhbFNldHRpbmdzLmNvbHVtbnNPcmRlciwgdHJ1ZSk7XG4gICAgY29uc3QgY29sdW1uVG9IaWRlID0gIWlzTmlsKGhpZGRlbkNvbHVtbnMpID8gaGlkZGVuQ29sdW1ucyA6IHRoaXMuaW5pdGlhbFNldHRpbmdzLmhpZGRlbkNvbHVtbnM7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShjb2x1bW5Ub0hpZGUsIGZhbHNlKTtcblxuICAgIC8qIEFwcGx5IGZpbHRlcnMgKi9cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qIEdyb3VwIGNvbHVtbnMgKi9cbiAgICBjb25zdCBhbGxHcm91cGVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0Um93R3JvdXBDb2x1bW5zKCk7XG4gICAgbGV0IHJlbW92ZUdyb3VwZWQ7XG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zKSB7XG4gICAgICByZW1vdmVHcm91cGVkID0gYWxsR3JvdXBlZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhZ3JvdXBlZENvbHVtbnMuaW5jbHVkZXMoY29sLmdldENvbElkKCkpKTtcbiAgICAgIGNvbHVtbnMuYWRkUm93R3JvdXBDb2x1bW5zKGdyb3VwZWRDb2x1bW5zKTtcbiAgICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoZ3JvdXBlZENvbHVtbnMsIGZhbHNlKTtcbiAgICB9XG4gICAgY29sdW1ucy5yZW1vdmVSb3dHcm91cENvbHVtbnMocmVtb3ZlR3JvdXBlZCk7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShyZW1vdmVHcm91cGVkLCB0cnVlKTtcblxuICAgIC8qIEFwcGx5IHNvcnQgKi9cbiAgICBjb25zdCBncmlkU29ydCA9IHNvcnQgfHwgdGhpcy5pbml0aWFsU2V0dGluZ3Muc29ydDtcbiAgICBncmlkLnNldFNvcnRNb2RlbChncmlkU29ydCA/IFtncmlkU29ydF0gOiBudWxsKTtcblxuICAgIC8qIEFsaWduIGdyaWQgKi9cbiAgICBpZiAoZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NKSB7XG4gICAgICAvKiBTZXQgY29sdW1uIHNpemVzICovXG4gICAgICBjb2x1bW5zU2l6ZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uc1NpemVzKS5mb3JFYWNoKGNvbElkID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uc1NpemVzW2NvbElkXSA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQpIHtcbiAgICAgICAgICAgIGNvbHVtbnMuYXV0b1NpemVDb2x1bW4oY29sSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW5zLnNldENvbHVtbldpZHRoKGNvbElkLCBjb2x1bW5zU2l6ZXNbY29sSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCA/IGNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCkgOiBncmlkLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgICB9XG5cbiAgICAvKiBQaW4gY29sdW1ucyBsZWZ0ICovXG4gICAgY29uc3QgZmlsdGVyZWRQaW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1uc1xuICAgICAgPyBwaW5uZWRDb2x1bW5zLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IGNvbHVtbnNPcmRlclxuICAgICAgPyBjb2x1bW5zT3JkZXIuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgc2l6ZShmaWx0ZXJlZFBpbm5lZENvbHVtbnMpID4gMFxuICAgICAgPyBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRQaW5uZWRDb2x1bW5zLCAnbGVmdCcpXG4gICAgICA6IGZpbHRlcmVkQ29sdW1ucyAmJiBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRDb2x1bW5zLCBudWxsKTtcblxuICAgIC8qIE9yZGVyIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zT3JkZXIgJiYgY29sdW1ucy5tb3ZlQ29sdW1ucyhjb2x1bW5zT3JkZXIsIDApO1xuICB9XG5cbiAgZ2V0U2V0dGluZ3NEaWZmKCk6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICByZXR1cm4gZGlmZihjdXJyZW50U3RhdGUsIHRoaXMuaW5pdGlhbFNldHRpbmdzKTtcbiAgfVxuXG4gIHJlc2V0VGFibGVTZXR0aW5ncygpIHtcbiAgICBjb25zdCB7IGZpbHRlciwgLi4ucmVzdCB9ID0gdGhpcy5pbml0aWFsU2V0dGluZ3M7XG4gICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0aGlzLmFwaTtcbiAgICBjb25zdCBvcmlnaW5hbENvbFNpemVzID0gZ2V0Q29sdW1uc1NpemVzKGNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKSwgdHJ1ZSk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IGlzRW1wdHkob3JpZ2luYWxDb2xTaXplcykgPyByZXN0LmdyaWRBbGlnbm1lbnQgOiBEYXRvR3JpZEFsaWdubWVudC5DVVNUT007XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7IC4uLnJlc3QsIGNvbHVtbnNTaXplczogb3JpZ2luYWxDb2xTaXplcywgZ3JpZEFsaWdubWVudCB9O1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoeyBmaWx0ZXIgfSk7XG4gIH1cblxuICBpbml0U2V0dGluZ3Moc2F2ZWRTZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuaW5pdGlhbFNldHRpbmdzID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgfVxuXG4gIG5vdGlmeUZpbHRlclVwZGF0ZSgpIHtcbiAgICBjb25zdCB3YXRjaCA9IFt0aGlzLmdyaWRSZWYuZmlsdGVyQ2hhbmdlZC5hc09ic2VydmFibGUoKV07XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2lkZSkge1xuICAgICAgd2F0Y2gucHVzaCh0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJEYXRhTG9hZGVkJCk7XG4gICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgfVxuICAgIGNvbWJpbmVMYXRlc3Qod2F0Y2gpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCByb3dzQWZ0ZXJGaWx0ZXIgPSB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCk7XG4gICAgICAgIHRoaXMuc2V0T3ZlcmxheShyb3dzQWZ0ZXJGaWx0ZXIgPT09IDApO1xuICAgICAgfSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5vbkZpbHRlckNoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyB7XG4gICAgY29uc3QgY29sdW1uc0ZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcikpIHtcbiAgICAgIGNvbnN0IHsgYnlWYWx1ZSwgY29uZGl0aW9uYWwgfSA9IHZhbHVlO1xuICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW2J5VmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbmFsLm9wZXJhdG9yLFxuICAgICAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSU5fUkFOR0UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtIGFzIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXS5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0gPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zRmlsdGVycztcbiAgfVxuXG4gIGJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShncmlkQ29sdW1uczogRGF0b0dyaWRDb2x1bW5EZWZbXSk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpO1xuXG4gICAgbGV0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmJ1aWxkU2VydmVyQ29sdW1uRmlsdGVyc192Ml8xKGZpbHRlcik7XG4gICAgaWYgKGNvbHVtbkZpbHRlcnMuZXZlcnkoKHsgb3BlcmF0b3IgfTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIpID0+IG9wZXJhdG9yID09PSBPcGVyYXRvclR5cGVzLkFORCkpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEZpbHRlcnMgPSBjb2x1bW5GaWx0ZXJzXG4gICAgICAgIC5tYXAoKHsgZmlsdGVycyB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gZmlsdGVycylcbiAgICAgICAgLnJlZHVjZSgoYXJyLCByZXMpID0+IHJlcy5jb25jYXQoYXJyKSwgW10pO1xuICAgICAgY29sdW1uRmlsdGVycyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBmbGF0dGVuZWRGaWx0ZXJzXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShjb2x1bW5GaWx0ZXJzKSA+IDFcbiAgICAgICAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogY29sdW1uRmlsdGVycyB9XG4gICAgICAgIDogc2l6ZShjb2x1bW5GaWx0ZXJzKSA9PT0gMVxuICAgICAgICA/IGNvbHVtbkZpbHRlcnNbMF1cbiAgICAgICAgOiBudWxsO1xuICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgcmV0dXJuIGNvbHVtbkZpbHRlcjtcbiAgICB9XG4gICAgY29uc3QgeyBpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIGNvbnN0IHNlYXJjaGFibGVDb2x1bW5zID0gZ3JpZENvbHVtbnMuZmlsdGVyKChjb2xEZWY6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2xEZWYuaW5jbHVkZUluU2VhcmNoICYmIChpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIHx8IHRoaXMuYXBpLmNvbHVtbnMuZ2V0Q29sdW1uKGNvbERlZi5jb2xJZCkuaXNWaXNpYmxlKCkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uW10gPSBzZWFyY2hhYmxlQ29sdW1ucy5tYXAoKHsgZmllbGQgfTogRGF0b0dyaWRDb2x1bW5EZWYpID0+ICh7XG4gICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLkNPTlRBSU5TLFxuICAgICAgdmFsdWU6IHNlYXJjaFRlcm0sXG4gICAgICBjb2x1bW46IGZpZWxkXG4gICAgfSkpO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShzZWFyY2hGaWx0ZXJzKSA+IDAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLk9SLCBmaWx0ZXJzOiBzZWFyY2hGaWx0ZXJzIH0gOiBudWxsO1xuICAgIGlmICghY29sdW1uRmlsdGVyKSB7XG4gICAgICByZXR1cm4gc2VhcmNoRmlsdGVyO1xuICAgIH1cbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnM6IFtjb2x1bW5GaWx0ZXIsIHNlYXJjaEZpbHRlcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyOiBEYXRvR3JpZEZpbHRlcnNNYXApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdIHtcbiAgICBsZXQgY29sdW1uRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgbGV0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPSBudWxsO1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5GaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IFt7IGNvbHVtbiwgLi4uYnlWYWx1ZSB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IHRoaXMuZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoY29uZGl0aW9uYWwsIGNvbHVtbik7XG4gICAgICAgIGlmIChjb2x1bW5GaWx0ZXIpIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIuZmlsdGVycy5wdXNoKGNvbmRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIgPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sdW1uRmlsdGVycy5wdXNoKGNvbHVtbkZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5GaWx0ZXJzO1xuICB9XG5cbiAgZ2V0RmlsdGVyRm9yU2VydmVyQWN0aW9uT25TZWxlY3RBbGwoKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgIGNvbnN0IHsgY29sdW1uRGVmcywgaWRDb2x1bW5LZXkgfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3QgbWFpbkZpbHRlciA9IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGNvbHVtbkRlZnMpO1xuICAgIGlmIChpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgIHJldHVybiBtYWluRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFJvd3NGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uTGlzdENvbmRpdGlvbiA9IHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0lOX0xJU1QsXG4gICAgICB2YWx1ZXM6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCxcbiAgICAgIGNvbHVtbjogaWRDb2x1bW5LZXlcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlcnMgPSBtYWluRmlsdGVyID8gW21haW5GaWx0ZXIsIGV4Y2x1ZGVkUm93c0ZpbHRlcl0gOiBbZXhjbHVkZWRSb3dzRmlsdGVyXTtcbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoXG4gICAgY29uZGl0aW9uYWxGaWx0ZXI6IERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gICAgY29sdW1uOiBzdHJpbmdcbiAgKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWxGaWx0ZXIub3BlcmF0b3IsXG4gICAgICBmaWx0ZXJzOiBjb25kaXRpb25hbEZpbHRlci5jb25kaXRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICBlbmQ6IChpdGVtIGFzIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24pLnJhbmdlRW5kLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZIHx8IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0VNUFRZKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFksXG4gICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLml0ZW0sIGNvbHVtbiB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbDogRGF0b0dyaWRTb3J0W10pOiBEYXRvR3JpZFNlcnZlclNvcnRbXSB7XG4gICAgcmV0dXJuIHNvcnRNb2RlbC5tYXAoKHsgY29sSWQsIHNvcnQgfSkgPT4gKHtcbiAgICAgIGNvbHVtbjogY29sSWQsXG4gICAgICBzb3J0T3JkZXI6IHNvcnQudG9VcHBlckNhc2UoKSBhcyBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb25cbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEVkaXRhYmxlQ2VsbENsYXNzKFxuICAgIGNlbGxDbGFzc1ZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8ICgoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHN0cmluZyB8IHN0cmluZ1tdKVxuICApIHtcbiAgICBpZiAoaXNOaWwoY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2RhdG8tZWRpdGFibGUtY2VsbCc7XG4gICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuIGNlbGxDbGFzc1BhcmFtcyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZShjZWxsQ2xhc3NQYXJhbXMpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEVkaXRhYmxlQ2xhc3NBcnJheShjZWxsQ2xhc3NWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldEVkaXRhYmxlQ2xhc3NBcnJheShjdXJyZW50Q2xhc3M6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNlbGxDbGFzcyA9IGNvZXJjZUFycmF5KGN1cnJlbnRDbGFzcyk7XG4gICAgY2VsbENsYXNzLnB1c2goJ2RhdG8tZWRpdGFibGUtY2VsbCcpO1xuICAgIHJldHVybiBjZWxsQ2xhc3M7XG4gIH1cblxuICBzZWxlY3RBbGxDdXJyZW50UGFnZVJvd3MoaXNTZWxlY3RlZCA9IHRydWUsIGNvbnNpZGVyRXhjbHVkZWQgPSBmYWxzZSkge1xuICAgIGxldCByb3dzRm9yU2VsZWN0aW9uID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudFBhZ2VSb3dzKCk7XG4gICAgaWYgKGNvbnNpZGVyRXhjbHVkZWQpIHtcbiAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgaWYgKCFpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgICAgcm93c0ZvclNlbGVjdGlvbiA9IHJvd3NGb3JTZWxlY3Rpb24uZmlsdGVyKCh7IGlkIH06IFJvd05vZGUpID0+ICFleGNsdWRlZEZyb21TZWxlY3RBbGwuaW5jbHVkZXMoaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaXNTZWxlY3RlZCA/IHRoaXMuc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKSA6IHRoaXMuZGVzZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pO1xuICB9XG5cbiAgZGVzZWxlY3RBbGxSb3dzKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuZGVzZWxlY3RBbGwoKTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTZWxlY3RBbGxSb3dzRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHNlbGVjdEFsbFJvd3NFbmFibGVkOiBmYWxzZSwgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbXSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBwaXZvdGluZyxcbiAgICogd2UgYWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBjb2x1bW4gaGVhZGVyIGNsYXNzIGluIG9yZGVyIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBhdXRvIGdlbmVyYXRlZCBwaXZvdCBjb2x1bW4uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xEZWYgPSBjb2xEZWYgPT4ge1xuICAgICAgY29uc3QgYXBpID0gY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnkuYXBpO1xuXG4gICAgICBpZiAoYXBpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQ29sdW1ucyA9IGNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5LmFwaS5jb2x1bW5zLmdldFZhbHVlQ29sdW1ucygpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvbERlZiA9IHZhbHVlQ29sdW1uc1xuICAgICAgICAgIC5tYXAoKHsgdXNlclByb3ZpZGVkQ29sRGVmIH0pID0+IHVzZXJQcm92aWRlZENvbERlZilcbiAgICAgICAgICAuZmluZCgoeyBjb2xJZCB9KSA9PiBjb2xJZCA9PT0gY29sRGVmLnBpdm90VmFsdWVDb2x1bW4uZ2V0Q29sSWQoKSk7XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsQ29sRGVmKSB7XG4gICAgICAgICAgY29sRGVmLmZpbHRlciA9IG9yaWdpbmFsQ29sRGVmLmZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29sRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xEZWYucGl2b3RLZXlzID0gY29sRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IEpTT04ucGFyc2Uoa2V5KS52YWx1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xHcm91cERlZiA9IChjb2xHcm91cERlZjogQ29sR3JvdXBEZWYpID0+IHtcbiAgICAgIGlmIChjb2xHcm91cERlZi5oZWFkZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IHsgZmllbGQsIHZhbHVlIH0gPSBKU09OLnBhcnNlKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpO1xuXG4gICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gZmllbGQ7XG4gICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbEdyb3VwRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xHcm91cERlZi5waXZvdEtleXMgPSBjb2xHcm91cERlZi5waXZvdEtleXMubWFwKGtleSA9PiBKU09OLnBhcnNlKGtleSkudmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFBpdm90TW9kZVJvd3M8VD4oZGF0YTogVFtdKSB7XG4gICAgY29uc3QgcGl2b3RDb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsUGl2b3RDb2x1bW5zKCk7XG4gICAgY29uc3QgY29udmVydGVkRGF0YSA9IGRhdGEubWFwKChjdXJyZW50VmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB7IC4uLmN1cnJlbnRWYWx1ZSB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBwaXZvdENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wuZ2V0Q29sRGVmKCkuZmllbGQ7XG5cbiAgICAgICAgbWFwcGVkVmFsdWVzW2ZpZWxkXSA9IEpTT04uc3RyaW5naWZ5KHsgZmllbGQsIHZhbHVlOiBjdXJyZW50VmFsdWVbZmllbGRdIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGVkVmFsdWVzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGNvbnZlcnRlZERhdGEpO1xuICB9XG59XG4iXX0=
@@ -5,4 +5,13 @@ export function getColumnsSizes(columns, original) {
5
5
  return sizeMap;
6
6
  }, {});
7
7
  }
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9jb3JlLyIsInNvdXJjZXMiOlsibGliL2dyaWQtdjIvZ3JpZC1zdG9yZS91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBaUIsRUFBRSxRQUFrQjtJQUNuRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLEVBQUUsVUFBVTtRQUN4QyxJQUFJLE1BQU0sR0FBUSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbnNTaXplcyhjb2x1bW5zOiBDb2x1bW5bXSwgb3JpZ2luYWw/OiBib29sZWFuKTogSGFzaE1hcDxudW1iZXI+IHtcbiAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKChzaXplTWFwLCBjdXJyZW50Q29sKSA9PiB7XG4gICAgbGV0IGNvbERlZjogYW55ID0gY3VycmVudENvbC5nZXRDb2xEZWYoKTtcbiAgICBzaXplTWFwW2N1cnJlbnRDb2wuZ2V0Q29sSWQoKV0gPSAob3JpZ2luYWwgJiYgY29sRGVmLm9yaWdpbmFsV2lkdGgpIHx8IGNvbERlZi53aWR0aCB8fCBjdXJyZW50Q29sLmdldEFjdHVhbFdpZHRoKCk7XG4gICAgcmV0dXJuIHNpemVNYXA7XG4gIH0sIHt9KTtcbn1cbiJdfQ==
8
+ /**
9
+ * Take pivoted value field if pivot column,
10
+ * or field of the colDef,
11
+ * or group field form showRowGroup if its agg column
12
+ */
13
+ export function getColField(colDef) {
14
+ var field = colDef.field, showRowGroup = colDef.showRowGroup, pivotValueColumn = colDef.pivotValueColumn;
15
+ return pivotValueColumn ? pivotValueColumn.getColId() : field || showRowGroup;
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9jb3JlLyIsInNvdXJjZXMiOlsibGliL2dyaWQtdjIvZ3JpZC1zdG9yZS91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxlQUFlLENBQUMsT0FBaUIsRUFBRSxRQUFrQjtJQUNuRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLEVBQUUsVUFBVTtRQUN4QyxJQUFJLE1BQU0sR0FBUSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBYztJQUNoQyxJQUFBLG9CQUFLLEVBQUUsa0NBQVksRUFBRSwwQ0FBZ0IsQ0FBWTtJQUV6RCxPQUFPLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFLLFlBQXVCLENBQUM7QUFDNUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbERlZiwgQ29sdW1uIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbnNTaXplcyhjb2x1bW5zOiBDb2x1bW5bXSwgb3JpZ2luYWw/OiBib29sZWFuKTogSGFzaE1hcDxudW1iZXI+IHtcbiAgcmV0dXJuIGNvbHVtbnMucmVkdWNlKChzaXplTWFwLCBjdXJyZW50Q29sKSA9PiB7XG4gICAgbGV0IGNvbERlZjogYW55ID0gY3VycmVudENvbC5nZXRDb2xEZWYoKTtcbiAgICBzaXplTWFwW2N1cnJlbnRDb2wuZ2V0Q29sSWQoKV0gPSAob3JpZ2luYWwgJiYgY29sRGVmLm9yaWdpbmFsV2lkdGgpIHx8IGNvbERlZi53aWR0aCB8fCBjdXJyZW50Q29sLmdldEFjdHVhbFdpZHRoKCk7XG4gICAgcmV0dXJuIHNpemVNYXA7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBUYWtlIHBpdm90ZWQgdmFsdWUgZmllbGQgaWYgcGl2b3QgY29sdW1uLFxuICogb3IgZmllbGQgb2YgdGhlIGNvbERlZixcbiAqIG9yIGdyb3VwIGZpZWxkIGZvcm0gc2hvd1Jvd0dyb3VwIGlmIGl0cyBhZ2cgY29sdW1uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xGaWVsZChjb2xEZWY6IENvbERlZik6IHN0cmluZyB7XG4gIGNvbnN0IHsgZmllbGQsIHNob3dSb3dHcm91cCwgcGl2b3RWYWx1ZUNvbHVtbiB9ID0gY29sRGVmO1xuXG4gIHJldHVybiBwaXZvdFZhbHVlQ29sdW1uID8gcGl2b3RWYWx1ZUNvbHVtbi5nZXRDb2xJZCgpIDogZmllbGQgfHwgKHNob3dSb3dHcm91cCBhcyBzdHJpbmcpO1xufVxuIl19