@mediusinc/mng-commons 5.4.0-rc.5 → 5.4.0-rc.7

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 (45) hide show
  1. package/core/data-list/data-list-params-helpers.d.ts +12 -2
  2. package/esm2022/core/data-list/data-list-params-helpers.mjs +14 -8
  3. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +11 -1
  4. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +10 -5
  5. package/esm2022/form/components/dropdown/dropdown.component.mjs +67 -99
  6. package/esm2022/table/api/descriptors/table.descriptor.mjs +6 -2
  7. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +11 -11
  8. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +4 -3
  9. package/esm2022/table/components/table/table.component.mjs +45 -9
  10. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +4 -18
  11. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +9 -1
  12. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +10 -1
  13. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +14 -2
  14. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +24 -5
  15. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +3 -3
  16. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +3 -3
  17. package/esm2022/tableview/editor/helpers/editor-formly.mjs +7 -1
  18. package/fesm2022/mediusinc-mng-commons-core.mjs +13 -7
  19. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  20. package/fesm2022/mediusinc-mng-commons-filter.mjs +10 -0
  21. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  22. package/fesm2022/mediusinc-mng-commons-form.mjs +75 -103
  23. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  24. package/fesm2022/mediusinc-mng-commons-table-api.mjs +5 -1
  25. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  26. package/fesm2022/mediusinc-mng-commons-table.mjs +57 -20
  27. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  28. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +30 -1
  29. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  30. package/fesm2022/mediusinc-mng-commons-tableview.mjs +35 -24
  31. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  32. package/filter/descriptors/filter-generic.descriptor.d.ts +5 -2
  33. package/form/components/autocomplete/autocomplete.component.d.ts +1 -0
  34. package/form/components/dropdown/dropdown.component.d.ts +5 -10
  35. package/package.json +1 -1
  36. package/table/api/descriptors/table.descriptor.d.ts +1 -0
  37. package/table/components/filter/filter-form/filter-form.component.d.ts +11 -8
  38. package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +3 -2
  39. package/table/components/table/table.component.d.ts +6 -2
  40. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +0 -2
  41. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +3 -0
  42. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +5 -0
  43. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +8 -0
  44. package/tableview/editor/components/editor/form-editor.component.d.ts +5 -1
  45. package/version-info.json +6 -6
@@ -15,9 +15,13 @@ export declare function fromTableLoadToDataListParams(event: TableLazyLoadEvent)
15
15
  *
16
16
  * @param {DataListParams} params - The parameters to convert.
17
17
  * @param {DataListParams|null} defaults - The default parameters used if no matching property in params is available. Defaults to { limit: 25, offset: 0 } if not provided.
18
+ * @param opts - Options in converting to url query:
19
+ * - prependFilterName Prepends filter key with provided string
18
20
  * @returns {Params} - The URL query parameters object.
19
21
  */
20
- export declare function dataListParamsToUrlQuery(params: DataListParams<any, any>, defaults?: DataListParams<any, any> | null): Params;
22
+ export declare function dataListParamsToUrlQuery(params: DataListParams<any, any>, defaults?: DataListParams<any, any> | null, opts?: {
23
+ prependFilterName?: string;
24
+ }): Params;
21
25
  /**
22
26
  * Merges the provided parameters with default values and returns the merged object.
23
27
  *
@@ -60,9 +64,15 @@ export declare function dataListParamsFilterToUrlQuery(paramFilter?: DataListFil
60
64
  * Filter keys are all keys in Params object that are not matched elsewhere, values are formatted from Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
61
65
  *
62
66
  * @param {Params} urlParams - The URL query parameters.
67
+ * @param opts Additional options for conversion:
68
+ * - searchAsGlobal - The URL query parameters.
69
+ * - prependFilterName - Filter names are prepended with provided string.
63
70
  * @return {DataListParams} - The converted DataListParams object.
64
71
  */
65
- export declare function fromUrlQueryToDataListParams(urlParams: Params, searchAsGlobal?: boolean): DataListParams;
72
+ export declare function fromUrlQueryToDataListParams(urlParams: Params, opts?: {
73
+ searchAsGlobal?: boolean;
74
+ prependFilterName?: string;
75
+ }): DataListParams;
66
76
  /**
67
77
  * Makes a copy of the given DataListParams object.
68
78
  *
@@ -55,12 +55,14 @@ export function fromTableLoadToDataListParams(event) {
55
55
  *
56
56
  * @param {DataListParams} params - The parameters to convert.
57
57
  * @param {DataListParams|null} defaults - The default parameters used if no matching property in params is available. Defaults to { limit: 25, offset: 0 } if not provided.
58
+ * @param opts - Options in converting to url query:
59
+ * - prependFilterName Prepends filter key with provided string
58
60
  * @returns {Params} - The URL query parameters object.
59
61
  */
60
62
  export function dataListParamsToUrlQuery(params, defaults = {
61
63
  limit: 25,
62
64
  offset: 0
63
- }) {
65
+ }, opts) {
64
66
  const urlParams = {};
65
67
  if (params.limit && params.limit !== defaults?.limit) {
66
68
  urlParams['limit'] = params.limit;
@@ -110,7 +112,7 @@ export function dataListParamsToUrlQuery(params, defaults = {
110
112
  paramFilter.matchMode !== FilterMatchMode.DoesNotExist) {
111
113
  return;
112
114
  }
113
- urlParams[k] = dataListParamsFiltersToUrlQuery(params, k, true);
115
+ urlParams[`${opts?.prependFilterName ?? ''}${k}`] = dataListParamsFiltersToUrlQuery(params, k, true);
114
116
  });
115
117
  }
116
118
  if (defaults?.filters) {
@@ -119,7 +121,7 @@ export function dataListParamsToUrlQuery(params, defaults = {
119
121
  Object.keys(defaults.filters)
120
122
  .filter(k => paramFilterKeys.indexOf(k) < 0)
121
123
  .forEach(k => {
122
- urlParams[k] = dataListParamsFiltersToUrlQuery(defaults, k);
124
+ urlParams[`${opts?.prependFilterName ?? ''}${k}`] = dataListParamsFiltersToUrlQuery(defaults, k);
123
125
  });
124
126
  }
125
127
  return urlParams;
@@ -219,9 +221,12 @@ export function dataListParamsFilterToUrlQuery(paramFilter, allowNull = false) {
219
221
  * Filter keys are all keys in Params object that are not matched elsewhere, values are formatted from Medius data API filter query language: `cs:eq:asd`, `in:asd,qwe`, `ex`, ...
220
222
  *
221
223
  * @param {Params} urlParams - The URL query parameters.
224
+ * @param opts Additional options for conversion:
225
+ * - searchAsGlobal - The URL query parameters.
226
+ * - prependFilterName - Filter names are prepended with provided string.
222
227
  * @return {DataListParams} - The converted DataListParams object.
223
228
  */
224
- export function fromUrlQueryToDataListParams(urlParams, searchAsGlobal = false) {
229
+ export function fromUrlQueryToDataListParams(urlParams, opts) {
225
230
  const params = {};
226
231
  Object.entries(urlParams).forEach(([urlParamKey, urlParamValue]) => {
227
232
  if (urlParamKey === 'limit') {
@@ -242,7 +247,7 @@ export function fromUrlQueryToDataListParams(urlParams, searchAsGlobal = false)
242
247
  const caseSensitive = urlParamValue.startsWith('cs:');
243
248
  params.search = searchQuery;
244
249
  params.searchCaseSensitive = caseSensitive;
245
- if (searchAsGlobal) {
250
+ if (opts?.searchAsGlobal) {
246
251
  if (!params.filters) {
247
252
  params.filters = {};
248
253
  }
@@ -265,7 +270,7 @@ export function fromUrlQueryToDataListParams(urlParams, searchAsGlobal = false)
265
270
  throw new CommonsInternalError(`String is expected as value for '${urlParamKey}' when converting from urlParams`);
266
271
  }
267
272
  }
268
- else if (typeof urlParamValue === 'string') {
273
+ else if ((!opts?.prependFilterName || urlParamKey.startsWith(opts.prependFilterName)) && typeof urlParamValue === 'string') {
269
274
  if (urlParamValue.length === 0) {
270
275
  // empty string should be ignored
271
276
  return;
@@ -379,7 +384,8 @@ export function fromUrlQueryToDataListParams(urlParams, searchAsGlobal = false)
379
384
  if (!params.filters) {
380
385
  params.filters = {};
381
386
  }
382
- params.filters[urlParamKey] = { value: value, matchMode: matchMode, caseSensitive: caseSensitive };
387
+ const filterKey = opts?.prependFilterName ? urlParamKey.substring(opts.prependFilterName.length) : urlParamKey;
388
+ params.filters[filterKey] = { value: value, matchMode: matchMode, caseSensitive: caseSensitive };
383
389
  }
384
390
  });
385
391
  return params;
@@ -441,4 +447,4 @@ export function dataListParamsFilterValueToUrlString(value, allowNull = false) {
441
447
  }
442
448
  return String(value);
443
449
  }
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXBhcmFtcy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvZGF0YS1saXN0L2RhdGEtbGlzdC1wYXJhbXMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBR3JEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLEtBQXlCO0lBQ25FLE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7SUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ3ZDLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFh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QUMsb0NBQW9DLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzVELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxLQUFLLFlBQVksSUFBSTtZQUFFLE9BQU8sZUFBZSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQzthQUM3RSxDQUFDO1lBQ0YsTUFBTSxJQUFJLG9CQUFvQixDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7VGFibGVMYXp5TG9hZEV2ZW50fSBmcm9tICdwcmltZW5nL3RhYmxlJztcblxuaW1wb3J0IHtDb21tb25zSW50ZXJuYWxFcnJvcn0gZnJvbSAnLi4vZXJyb3IvZXJyb3IubW9kZWwnO1xuaW1wb3J0IHtkYXRlVG9Jc29TdHJpbmd9IGZyb20gJy4uL2hlbHBlcnMvZGF0ZSc7XG5pbXBvcnQge0RhdGFMaXN0RmlsdGVyLCBEYXRhTGlzdEZpbHRlclZhbHVlVHlwZSwgRGF0YUxpc3RGaWx0ZXJzVHlwZSwgRGF0YUxpc3RQYXJhbXN9IGZyb20gJy4vZGF0YS1saXN0Lm1vZGVsJztcbmltcG9ydCB7RmlsdGVyTWF0Y2hNb2RlfSBmcm9tICcuL2ZpbHRlci1tYXRjaC5tb2RlbCc7XG5pbXBvcnQge0NvbW1vbnNGaWx0ZXJNZXRhZGF0YX0gZnJvbSAnLi9maWx0ZXItbWV0YWRhdGEubW9kZWwnO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVGFibGVMYXp5TG9hZEV2ZW50IHRvIERhdGFMaXN0UGFyYW1zLlxuICpcbiAqIEBwYXJhbSB7VGFibGVMYXp5TG9hZEV2ZW50fSBldmVudCAtIFRoZSBldmVudCBjb250YWluaW5nIHRoZSBkYXRhIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJuIHtEYXRhTGlzdFBhcmFtc30gLSBUaGUgY29udmVydGVkIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21UYWJsZUxvYWRUb0RhdGFMaXN0UGFyYW1zKGV2ZW50OiBUYWJsZUxhenlMb2FkRXZlbnQpOiBEYXRhTGlzdFBhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zOiBEYXRhTGlzdFBhcmFtcyA9IHt9O1xuXG4gICAgaWYgKGV2ZW50LmZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgcGFyYW1zLm9mZnNldCA9IGV2ZW50LmZpcnN0O1xuICAgIH1cbiAgICBpZiAoZXZlbnQucm93cyAhPSBudWxsKSB7XG4gICAgICAgIHBhcmFtcy5saW1pdCA9IGV2ZW50LnJvd3M7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBldmVudC5nbG9iYWxGaWx0ZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcmFtcy5zZWFyY2ggPSBldmVudC5nbG9iYWxGaWx0ZXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGV2ZW50Lmdsb2JhbEZpbHRlcikgJiYgZXZlbnQuZ2xvYmFsRmlsdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGFyYW1zLnNlYXJjaCA9IGV2ZW50Lmdsb2JhbEZpbHRlclswXTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudC5tdWx0aVNvcnRNZXRhKSAmJiBldmVudC5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGFyYW1zLnNvcnQgPSBldmVudC5tdWx0aVNvcnRNZXRhLm1hcChtID0+ICh7cHJvcGVydHk6IG0uZmllbGQsIGFzY2VuZGluZzogbS5vcmRlciA+PSAwfSkpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5maWx0ZXJzKSB7XG4gICAgICAgIHBhcmFtcy5maWx0ZXJzID0gT2JqZWN0LmtleXMoZXZlbnQuZmlsdGVycykucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyOiBEYXRhTGlzdEZpbHRlciA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZXZlbnRGaWx0ZXI6IENvbW1vbnNGaWx0ZXJNZXRhZGF0YSB8IENvbW1vbnNGaWx0ZXJNZXRhZGF0YVtdIHwgdW5kZWZpbmVkID0gZXZlbnQuZmlsdGVycz8uW2tleSBhcyBrZXlvZiBvYmplY3RdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnRGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlID0gZXZlbnRGaWx0ZXJbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgZmlsdGVyLm1hdGNoTW9kZSA9IGV2ZW50RmlsdGVyWzBdLm1hdGNoTW9kZTtcbiAgICAgICAgICAgICAgICBmaWx0ZXIuY2FzZVNlbnNpdGl2ZSA9IGV2ZW50RmlsdGVyWzBdLmNhc2VTZW5zaXRpdmU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50RmlsdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBldmVudEZpbHRlci52YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlID0gZXZlbnRGaWx0ZXIubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIGZpbHRlci5jYXNlU2Vuc2l0aXZlID0gZXZlbnRGaWx0ZXIuY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSBzZWFyY2ggY2FzZSBzZW5zaXRpdml0eSB0byBiZSBhbHNvIHdyaXR0ZW4gb24gc2VhcmNoQ2FzZVNlbnNpdGl2ZVxuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ2dsb2JhbCcgJiYgdHlwZW9mIHBhcmFtcy5zZWFyY2ggPT09ICdzdHJpbmcnICYmIGZpbHRlci5jYXNlU2Vuc2l0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoQ2FzZVNlbnNpdGl2ZSA9IGZpbHRlci5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGZpbHRlcn07XG4gICAgICAgIH0sIHt9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIHRvIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICogU29ydHMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgc29ydCBxdWVyeSBsYW5ndWFnZTogYGFzYzpwcm9wMSxkZXNjOnByb3AyYCwgLi4uXG4gKiBGaWx0ZXIga2V5cyBhcmUgXCJmbGF0dGVuZWRcIiBpbiB0aGUgbmV3IG9iamVjdCwgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gY29udmVydC5cbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN8bnVsbH0gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHVzZWQgaWYgbm8gbWF0Y2hpbmcgcHJvcGVydHkgaW4gcGFyYW1zIGlzIGF2YWlsYWJsZS4gRGVmYXVsdHMgdG8geyBsaW1pdDogMjUsIG9mZnNldDogMCB9IGlmIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm5zIHtQYXJhbXN9IC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zVG9VcmxRdWVyeShcbiAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PixcbiAgICBkZWZhdWx0czogRGF0YUxpc3RQYXJhbXM8YW55LCBhbnk+IHwgbnVsbCA9IHtcbiAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICBvZmZzZXQ6IDBcbiAgICB9XG4pOiBQYXJhbXMge1xuICAgIGNvbnN0IHVybFBhcmFtczogUGFyYW1zID0ge307XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0ICYmIHBhcmFtcy5saW1pdCAhPT0gZGVmYXVsdHM/LmxpbWl0KSB7XG4gICAgICAgIHVybFBhcmFtc1snbGltaXQnXSA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5vZmZzZXQgJiYgcGFyYW1zLm9mZnNldCAhPT0gZGVmYXVsdHM/Lm9mZnNldCkge1xuICAgICAgICB1cmxQYXJhbXNbJ29mZnNldCddID0gcGFyYW1zLm9mZnNldDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLnNlYXJjaCAhPT0gZGVmYXVsdHM/LnNlYXJjaCkge1xuICAgICAgICB1cmxQYXJhbXNbJ3EnXSA9IGAke3BhcmFtcy5zZWFyY2hDYXNlU2Vuc2l0aXZlID8gYGNzOmAgOiAnJ30ke3BhcmFtcy5zZWFyY2h9YDtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5zb3J0ICYmIEFycmF5LmlzQXJyYXkocGFyYW1zLnNvcnQpICYmIHBhcmFtcy5zb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGVmYXVsdHM/LnNvcnQgPT0gbnVsbCB8fFxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoZGVmYXVsdHMuc29ydCkgfHxcbiAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBwYXJhbXMuc29ydC5sZW5ndGggIT09IGRlZmF1bHRzLnNvcnQubGVuZ3RoIHx8XG4gICAgICAgICAgICBkZWZhdWx0cy5zb3J0LnNvbWUoKGRzLCBpZHgpID0+IGRzLnByb3BlcnR5ICE9PSBwYXJhbXMuc29ydCFbaWR4XS5wcm9wZXJ0eSB8fCAoZHMuYXNjZW5kaW5nID8/IHRydWUpICE9PSAocGFyYW1zLnNvcnQhW2lkeF0uYXNjZW5kaW5nID8/IHRydWUpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHVybFBhcmFtc1snc29ydCddID0gZGF0YUxpc3RQYXJhbXNTb3J0VG9VcmxRdWVyeShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMuZmlsdGVycykuZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIC8vIGdsb2JhbCBzZWFyY2ggZmlsdGVyIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlICdxJyBwYXJhbWV0ZXIsIG5vIG5lZWQgdG8gaW5jbHVkZSBpdCBoZXJlXG4gICAgICAgICAgICBpZiAoayA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJhbUZpbHRlciA9IHBhcmFtcy5maWx0ZXJzIVtrIGFzIGtleW9mIG9iamVjdF0hO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IGRlZmF1bHRzPy5maWx0ZXJzPy5bayBhcyBrZXlvZiBvYmplY3RdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIgJiZcbiAgICAgICAgICAgICAgICAoKEFycmF5LmlzQXJyYXkoZGVmYXVsdEZpbHRlci52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShwYXJhbUZpbHRlci52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZS5sZW5ndGggPT09IHBhcmFtRmlsdGVyLnZhbHVlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyLnZhbHVlLmV2ZXJ5KCh2LCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHBhcmFtRmlsdGVyLnZhbHVlIGFzIEFycmF5PERhdGFMaXN0RmlsdGVyVmFsdWVUeXBlPilbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgdiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiB2YWx1ZS5nZXRUaW1lKCkgPT09IHYuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gdmFsdWUgPT09IHY7XG4gICAgICAgICAgICAgICAgICAgIH0pKSB8fCAvLyBoYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIudmFsdWUgPT09IHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIubWF0Y2hNb2RlID09PSBwYXJhbUZpbHRlci5tYXRjaE1vZGUgJiZcbiAgICAgICAgICAgICAgICAoZGVmYXVsdEZpbHRlci5jYXNlU2Vuc2l0aXZlID8/IGZhbHNlKSA9PT0gKHBhcmFtRmlsdGVyLmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwYXJhbUZpbHRlci52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcj8udmFsdWUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyAmJlxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cmxQYXJhbXNba10gPSBkYXRhTGlzdFBhcmFtc0ZpbHRlcnNUb1VybFF1ZXJ5KHBhcmFtcywgaywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgLy8gYWRkIG90aGVyIGRlZmF1bHRzXG4gICAgICAgIGNvbnN0IHBhcmFtRmlsdGVyS2V5cyA9IHBhcmFtcy5maWx0ZXJzID8gT2JqZWN0LmtleXMocGFyYW1zLmZpbHRlcnMpIDogW107XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmZpbHRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gcGFyYW1GaWx0ZXJLZXlzLmluZGV4T2YoaykgPCAwKVxuICAgICAgICAgICAgLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zW2tdID0gZGF0YUxpc3RQYXJhbXNGaWx0ZXJzVG9VcmxRdWVyeShkZWZhdWx0cywgayk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsUGFyYW1zO1xufVxuXG4vKipcbiAqIE1lcmdlcyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIG1lcmdlIHdpdGggZGVmYXVsdHMuXG4gKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBkZWZhdWx0cyAtIFRoZSBkZWZhdWx0IHZhbHVlcyB0byBtZXJnZSB3aXRoIHBhcmFtcyAob3B0aW9uYWwsIGRlZmF1bHQgaXMgeyBsaW1pdDogMjUsIG9mZnNldDogMCB9KS5cbiAqIEByZXR1cm5zIHtEYXRhTGlzdFBhcmFtc30gLSBUaGUgbWVyZ2VkIHBhcmFtZXRlcnMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEYXRhTGlzdFBhcmFtc1dpdGhEZWZhdWx0czxTb3J0cyA9IGFueSwgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IGFueT4oXG4gICAgcGFyYW1zOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4sXG4gICAgZGVmYXVsdHM6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICBvZmZzZXQ6IDBcbiAgICB9XG4pOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgIGNvbnN0IG1lcmdlZDogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+ID0ge1xuICAgICAgICBsaW1pdDogcGFyYW1zLmxpbWl0ID8/IGRlZmF1bHRzLmxpbWl0LFxuICAgICAgICBvZmZzZXQ6IHBhcmFtcy5vZmZzZXQgPz8gZGVmYXVsdHMub2Zmc2V0LFxuICAgICAgICBzZWFyY2g6IHBhcmFtcy5zZWFyY2ggPz8gZGVmYXVsdHMuc2VhcmNoLFxuICAgICAgICBzb3J0OiAocGFyYW1zLnNvcnQgPz8gZGVmYXVsdHMuc29ydCk/Lm1hcChzID0+ICh7Li4uc30pKVxuICAgIH07XG5cbiAgICBpZiAocGFyYW1zLmZpbHRlcnMpIHtcbiAgICAgICAgbWVyZ2VkLmZpbHRlcnMgPSB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+O1xuICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiAobWVyZ2VkLmZpbHRlcnMhW2tleSBhcyBGaWx0ZXJzXSA9IHsuLi4odmFsdWUgYXMgRGF0YUxpc3RGaWx0ZXIpfSkpO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdHMuZmlsdGVycykge1xuICAgICAgICBpZiAoIW1lcmdlZC5maWx0ZXJzKSBtZXJnZWQuZmlsdGVycyA9IHt9IGFzIERhdGFMaXN0RmlsdGVyc1R5cGU8RmlsdGVycz47XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzLmZpbHRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPSB7Li4uKHZhbHVlIGFzIERhdGFMaXN0RmlsdGVyKX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHBhcmFtZXRlcnMgdG8gYSBVUkwgcXVlcnkgc3RyaW5nIGZvciBzb3J0aW5nLlxuICogU29ydHMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgc29ydCBxdWVyeSBsYW5ndWFnZTogYGFzYzpwcm9wMSxkZXNjOnByb3AyYCwgLi4uXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gcGFyYW1zIC0gQW4gb3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgc29ydCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwgcXVlcnkgb3IgdW5kZWZpbmVkIGlmIG5vIHNvcnQgcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGlzdFBhcmFtc1NvcnRUb1VybFF1ZXJ5KHBhcmFtcz86IERhdGFMaXN0UGFyYW1zPGFueSwgYW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHBhcmFtcyAmJiBBcnJheS5pc0FycmF5KHBhcmFtcy5zb3J0KVxuICAgICAgICA/IHBhcmFtcy5zb3J0Lm1hcChzID0+IGAke3MuYXNjZW5kaW5nID09PSB0cnVlIHx8IHMuYXNjZW5kaW5nID09PSB1bmRlZmluZWQgPyAnYXNjJyA6ICdkZXNjJ306JHtTdHJpbmcocy5wcm9wZXJ0eSl9YCkuam9pbignLCcpXG4gICAgICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3BlY2lmaWMgZmlsdGVyIHBhcmFtZXRlciAoYnkga2V5KSBmcm9tIERhdGFMaXN0UGFyYW1zIG9iamVjdCB0byBhIFVSTCBxdWVyeSBzdHJpbmcuXG4gKiBGaWx0ZXIga2V5cyBhcmUgXCJmbGF0dGVuZWRcIiBpbiB0aGUgbmV3IG9iamVjdCwgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxhbnksIEZpbHRlcnM+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBUaGUgRGF0YUxpc3RQYXJhbXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbHRlcnMuXG4gKiBAcGFyYW0ge0ZpbHRlcnN9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGZpbHRlciB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dOdWxsPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIGFsbG93IG51bGwgdmFsdWVzIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIFVSTCBxdWVyeSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQgZmlsdGVyLCBvciB1bmRlZmluZWQgaWYgdGhlIGZpbHRlciBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGlzdFBhcmFtc0ZpbHRlcnNUb1VybFF1ZXJ5PEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBzdHJpbmc+KFxuICAgIHBhcmFtczogRGF0YUxpc3RQYXJhbXM8YW55LCBGaWx0ZXJzPiB8IHVuZGVmaW5lZCxcbiAgICBrZXk6IEZpbHRlcnMsXG4gICAgYWxsb3dOdWxsID0gZmFsc2Vcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyYW1GaWx0ZXIgPSBwYXJhbXM/LmZpbHRlcnM/LltrZXldO1xuICAgIHJldHVybiBkYXRhTGlzdFBhcmFtc0ZpbHRlclRvVXJsUXVlcnkocGFyYW1GaWx0ZXIsIGFsbG93TnVsbCk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBmaWx0ZXIgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLlxuICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RGaWx0ZXJ9IHBhcmFtRmlsdGVyIC0gVGhlIGZpbHRlciBvYmplY3QgdG8gYmUgY29udmVydGVkLlxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dOdWxsPWZhbHNlXSAtIEluZGljYXRlcyB3aGV0aGVyIHRvIGFsbG93IG51bGwgdmFsdWVzIGluIHRoZSBmaWx0ZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gLSBUaGUgZmlsdGVyIGNvbnZlcnRlZCB0byBhIFVSTCBxdWVyeSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBubyBmaWx0ZXIgaXMgcHJvdmlkZWQgb3IgdGhlIGZpbHRlciBoYXMgZW1wdHkgb3IgaW52YWxpZCB2YWx1ZXMuXG4gKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiB0aGUgZmlsdGVyIGhhcyBpbnZhbGlkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zRmlsdGVyVG9VcmxRdWVyeShwYXJhbUZpbHRlcj86IERhdGFMaXN0RmlsdGVyLCBhbGxvd051bGwgPSBmYWxzZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWVBc0FycmF5ID0gQXJyYXkuaXNBcnJheShwYXJhbUZpbHRlcj8udmFsdWUpID8gcGFyYW1GaWx0ZXIhLnZhbHVlLmZpbHRlcih2ID0+IHYgIT09IHVuZGVmaW5lZCAmJiAoYWxsb3dOdWxsIHx8IHYgIT09IG51bGwpKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXRjaE1vZGUgPSBwYXJhbUZpbHRlcj8ubWF0Y2hNb2RlID8/IEZpbHRlck1hdGNoTW9kZS5FcXVhbHM7XG4gICAgaWYgKFxuICAgICAgICBwYXJhbUZpbHRlciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICghYWxsb3dOdWxsICYmIG1hdGNoTW9kZSAhPT0gJ2V4aXN0cycgJiYgbWF0Y2hNb2RlICE9PSAnZG9lc05vdEV4aXN0JyAmJiBwYXJhbUZpbHRlci52YWx1ZSA9PSBudWxsKSB8fFxuICAgICAgICAodHlwZW9mIHBhcmFtRmlsdGVyLnZhbHVlID09PSAnc3RyaW5nJyAmJiBwYXJhbUZpbHRlci52YWx1ZS5sZW5ndGggPT09IDApIHx8XG4gICAgICAgIChBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkgJiYgZmlsdGVyVmFsdWVBc0FycmF5Lmxlbmd0aCA9PT0gMClcbiAgICApIHtcbiAgICAgICAgLy8gbm8gbmVlZCB0byBpbmNsdWRlIGZpbHRlcnMgZm9yIGVtcHR5IHZhbHVlc1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuICYmICEoQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZUFzQXJyYXkpICYmIGZpbHRlclZhbHVlQXNBcnJheS5sZW5ndGggPT09IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRmlsdGVyIG1hdGNoIG1vZGUgYmV0d2VlbiByZXF1aXJlcyBleGFjdGx5IDIgdmFsdWVzOiAke3BhcmFtRmlsdGVyLnZhbHVlfWApO1xuICAgIH1cblxuICAgIGlmICgobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuSW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuTm90SW4pICYmICghQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZUFzQXJyYXkpIHx8IGZpbHRlclZhbHVlQXNBcnJheS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRmlsdGVyIG1hdGNoIG1vZGUgJHttYXRjaE1vZGV9IHJlcXVpcmVzIG5vbi1lbXB0eSBhcnJheTogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoKFtGaWx0ZXJNYXRjaE1vZGUuSW4sIEZpbHRlck1hdGNoTW9kZS5Ob3RJbiwgRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW5dIGFzIHN0cmluZ1tdKS5pbmRleE9mKG1hdGNoTW9kZSkgPT09IC0xICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSBtdXN0IG5vdCBiZSBhcnJheTogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBub1ZhbCA9IHBhcmFtRmlsdGVyLm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fCBwYXJhbUZpbHRlci5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3Q7XG4gICAgY29uc3QgdXJsVmFsdWVQYXJ0ID0gbm9WYWwgPyAnJyA6IGA6JHtkYXRhTGlzdFBhcmFtc0ZpbHRlclZhbHVlVG9VcmxTdHJpbmcoZmlsdGVyVmFsdWVBc0FycmF5ID8/IHBhcmFtRmlsdGVyLnZhbHVlLCBhbGxvd051bGwpfWA7XG5cbiAgICByZXR1cm4gYCR7cGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA/ICdjczonIDogcGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA9PT0gZmFsc2UgPyAnY2k6JyA6ICcnfSR7RmlsdGVyTWF0Y2hNb2RlLmdldEFiYnJldmlhdGlvbihtYXRjaE1vZGUpID8/IG1hdGNoTW9kZX0ke3VybFZhbHVlUGFydH1gO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGEgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICogU29ydHMgYXJlIGZvcm1hdHRlZCBmcm9tIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAqIEZpbHRlciBrZXlzIGFyZSBhbGwga2V5cyBpbiBQYXJhbXMgb2JqZWN0IHRoYXQgYXJlIG5vdCBtYXRjaGVkIGVsc2V3aGVyZSwgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgZnJvbSBNZWRpdXMgZGF0YSBBUEkgZmlsdGVyIHF1ZXJ5IGxhbmd1YWdlOiBgY3M6ZXE6YXNkYCwgYGluOmFzZCxxd2VgLCBgZXhgLCAuLi5cbiAqXG4gKiBAcGFyYW0ge1BhcmFtc30gdXJsUGFyYW1zIC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICogQHJldHVybiB7RGF0YUxpc3RQYXJhbXN9IC0gVGhlIGNvbnZlcnRlZCBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVXJsUXVlcnlUb0RhdGFMaXN0UGFyYW1zKHVybFBhcmFtczogUGFyYW1zLCBzZWFyY2hBc0dsb2JhbCA9IGZhbHNlKTogRGF0YUxpc3RQYXJhbXMge1xuICAgIGNvbnN0IHBhcmFtczogRGF0YUxpc3RQYXJhbXMgPSB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKHVybFBhcmFtcykuZm9yRWFjaCgoW3VybFBhcmFtS2V5LCB1cmxQYXJhbVZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodXJsUGFyYW1LZXkgPT09ICdsaW1pdCcpIHtcbiAgICAgICAgICAgIHBhcmFtcy5saW1pdCA9ICt1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXMubGltaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdvZmZzZXQnKSB7XG4gICAgICAgICAgICBwYXJhbXMub2Zmc2V0ID0gK3VybFBhcmFtVmFsdWU7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocGFyYW1zLm9mZnNldCkgfHwgcGFyYW1zLm9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1zLm9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ3EnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybFBhcmFtVmFsdWUgPT09ICdzdHJpbmcnICYmIHVybFBhcmFtVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gdXJsUGFyYW1WYWx1ZS5zdGFydHNXaXRoKCdjczonKSB8fCB1cmxQYXJhbVZhbHVlLnN0YXJ0c1dpdGgoJ2NpOicpID8gdXJsUGFyYW1WYWx1ZS5zdWJzdHJpbmcoMykgOiB1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmUgPSB1cmxQYXJhbVZhbHVlLnN0YXJ0c1dpdGgoJ2NzOicpO1xuXG4gICAgICAgICAgICAgICAgcGFyYW1zLnNlYXJjaCA9IHNlYXJjaFF1ZXJ5O1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2hDYXNlU2Vuc2l0aXZlID0gY2FzZVNlbnNpdGl2ZTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hBc0dsb2JhbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVycyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzWydnbG9iYWwnXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWFyY2hRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogRmlsdGVyTWF0Y2hNb2RlLkNvbnRhaW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1cmxQYXJhbUtleSA9PT0gJ3NvcnQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybFBhcmFtVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnNvcnQgPSB1cmxQYXJhbVZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZGlyZWN0aW9uLCBwcm9wZXJ0eV0gPSBzLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7cHJvcGVydHk6IChwcm9wZXJ0eSA/PyBkaXJlY3Rpb24pIGFzIGtleW9mIG9iamVjdCwgYXNjZW5kaW5nOiBkaXJlY3Rpb24gIT09ICdkZXNjJ307XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgU3RyaW5nIGlzIGV4cGVjdGVkIGFzIHZhbHVlIGZvciAnJHt1cmxQYXJhbUtleX0nIHdoZW4gY29udmVydGluZyBmcm9tIHVybFBhcmFtc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHVybFBhcmFtVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJ0cyA9IHVybFBhcmFtVmFsdWUuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SWR4ID0gMDtcblxuICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgIGxldCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY3MnIHx8IGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY2knKSB7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHgrK10gPT09ICdjcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hdGNoIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdID8gRmlsdGVyTWF0Y2hNb2RlLmZyb21BYmJyZXZpYXRpb24oZmlsdGVyUGFydHNbcGFydElkeF0pID8/IGZpbHRlclBhcnRzW3BhcnRJZHhdIDogRmlsdGVyTWF0Y2hNb2RlLkVxdWFscztcbiAgICAgICAgICAgIHBhcnRJZHgrKztcblxuICAgICAgICAgICAgY29uc3Qgbm9WYWwgPSBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0O1xuXG4gICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIW5vVmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJ0SWR4ID09PSBmaWx0ZXJQYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsdGVyUGFydHNbcGFydElkeF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0SWR4IDwgZmlsdGVyUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHRoYXQgc2hvdWxkIG5vdCBiZSBhcnJheSwgc28gam9pbiBiYWNrIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsdGVyUGFydHMuc2xpY2UocGFydElkeCwgZmlsdGVyUGFydHMubGVuZ3RoKS5qb2luKCc6Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmIG1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSB1bmRlZmluZWQgYW5kIG1hdGNoIG1vZGUgZXhwZWN0cyB2YWx1ZSwgdGhlbiBza2lwXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKChtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5JbiB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Ob3RJbiB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJheVZhbDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgbWF0Y2ggbW9kZXMgZXhwZWN0IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdcIicpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBsaWNpdFF1b3RlcyA9IGZhbHNlOyAvL3Rva2VuIGlzIHF1b3RlZCwgZS5nLiBpbjoxLDIsXCIyMlwiXCJcIixcIiwxMjNcIlwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdW90ZXNPcGVuZWQgPSBmYWxzZTsgLy90b2tlbiBoYXMgc3RhcnRlZCBwcm9jZXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IGZhbHNlOyAvL3Rva2VuIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLCBhZnRlciBzaW5nbGUgXCIgaW4gcXVvdGVkIG1vZGUsIG9yIGJlZm9yZSAsIGluIG5vdCBxdW90ZWRcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSB2YWx1ZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0b2tlbml6ZXIgd2hlbiBzZWVpbmcgdGhlIHRva2VuIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgZWl0aGVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdW90ZXMgaGF2ZSBub3QgYmVlbiBvcGVuZWQgeWV0ICh3aGVuIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGJldHdlZW4gc2VwYXJhdG9ycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRva2VuIGhhcyBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkICh3aGVuIHdlIGFjdHVhbGx5IGhhdmUgZXhwbGljaXQgb3BlbmluZyBpLmUuLCBxdW90ZXMgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB3ZSBoYXZlIGltcGxpY2l0IHF1b3RlcyAoaS5lLiwgcXVvdGVzIGFyZSBub3QgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJywnICYmICghcXVvdGVzT3BlbmVkIHx8IHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgfHwgIWV4cGxpY2l0UXVvdGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRRdW90ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIGRvdWJsZS1xdW90ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGxpY2l0UXVvdGVzICYmIGkgKyAxIDwgdmFsdWUubGVuZ3RoICYmIHZhbHVlW2kgKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7IC8vIEFwcGVuZCBvbmUgZG91YmxlLXF1b3RlIHRvIHRoZSBjdXJyZW50IHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7IC8vIFNraXAgdGhlIG5leHQgZG91YmxlLXF1b3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHF1b3RlcyBhZ2FpbiBhZnRlciB0aGV5IHdlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciA9PiB3ZSBjbG9zZSB0aGUgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwbGljaXRRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IHF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChxdW90ZXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1b3RlcyBhcmUgdGhlIGZpcnN0IGNoYXJhY3RlciA9PiBleHBsaWNpdGx5IG9wZW4gdGhlIHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc09wZW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc09wZW5lZCAmJiAhcXVvdGVzRXhwbGljaXRseUNsb3NlZCAmJiBleHBsaWNpdFF1b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBsYXN0IHRva2VuIGFmdGVyIHRoZSBsb29wIGVuZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWwgPSB0b2tlbnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbCA9IHZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiBhcnJheVZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlWYWw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlIS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciB3aXRoIGVtcHR5IHZhbHVlIGlzIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzW3VybFBhcmFtS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSwgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogTWFrZXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz59IHBhcmFtcyAtIFRoZSBEYXRhTGlzdFBhcmFtcyBvYmplY3QgdG8gYmUgY29waWVkLlxuICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gLSBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlEYXRhTGlzdFBhcmFtczxTb3J0cyA9IHN0cmluZywgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IHN0cmluZz4ocGFyYW1zOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4pOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgIGNvbnN0IGNvcHk6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgICBsaW1pdDogcGFyYW1zLmxpbWl0LFxuICAgICAgICBzZWFyY2g6IHBhcmFtcy5zZWFyY2hcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICAgIGNvcHkuc29ydCA9IHBhcmFtcy5zb3J0Py5tYXAocyA9PiAoey4uLnN9KSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICBjb3B5LmZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZS52YWx1ZSkgPyBbLi4uZmlsdGVyVmFsdWUudmFsdWVdIDogZmlsdGVyVmFsdWUudmFsdWVcbiAgICAgICAgICAgICAgICB9IGFzIERhdGFMaXN0RmlsdGVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEgVVJMIHF1ZXJ5IHBhcmFtIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciBudWxsIHZhbHVlcyBhcmUgYWxsb3dlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBVUkwgcGFyYW1ldGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS5cbiAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcGFzc2VkIHdpdGhvdXQgYWxsb3dOdWxsIHNldCB0byB0cnVlLlxuICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBEYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2YWx1ZTogdW5rbm93biwgYWxsb3dOdWxsID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignVW5kZWZpbmVkIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdXJsIHBhcmFtLicpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGVhcmxpZXJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgLm1hcCh2ID0+IGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2LCBhbGxvd051bGwpKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh2LmluZGV4T2YoJywnKSA+PSAwIHx8IHYuaW5kZXhPZignXCInKSA+PSAwID8gYFwiJHt2LnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiB2KSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGRhdGVUb0lzb1N0cmluZyh2YWx1ZSwgJ2RhdGVUaW1lJywge3V0YzogdHJ1ZX0pO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignRmlsdGVyIHZhbHVlIGNhbm5vdCBiZSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbiJdfQ==
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LXBhcmFtcy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zcmMvZGF0YS1saXN0L2RhdGEtbGlzdC1wYXJhbXMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBR3JEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLEtBQXlCO0lBQ25FLE1BQU0sTUFBTSxHQUFtQixFQUFFLENBQUM7SUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ3ZDLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2RSxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBZ0UsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQW1CLENBQUMsQ0FBQztZQUN0SCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUN4RCxDQUFDO2lCQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztnQkFDekMsTUFBTSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1lBQ3JELENBQUM7WUFDRCwyRUFBMkU7WUFDM0UsSUFBSSxHQUFHLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUYsTUFBTSxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ2xELE9BQU8sR0FBRyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sRUFBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBQyxDQUFDO1FBQ25DLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsTUFBZ0MsRUFDaEMsV0FBNEM7SUFDeEMsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsQ0FBQztDQUNaLEVBQ0QsSUFFQztJQUVELE1BQU0sU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUU3QixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbkQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0RCxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3RELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEUsSUFDSSxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUk7WUFDdEIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQ2pKLENBQUM7WUFDQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsNEZBQTRGO1lBQzVGLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqQixPQUFPO1lBQ1gsQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFRLENBQUMsQ0FBaUIsQ0FBRSxDQUFDO1lBQ3hELE1BQU0sYUFBYSxHQUFHLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFpQixDQUFDLENBQUM7WUFDN0QsSUFDSSxhQUFhO2dCQUNiLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7b0JBQ2hDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztvQkFDaEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNO29CQUN2RCxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTt3QkFDakMsTUFBTSxLQUFLLEdBQUksV0FBVyxDQUFDLEtBQXdDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3pFLElBQUksS0FBSyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSTs0QkFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7OzRCQUNsRixPQUFPLEtBQUssS0FBSyxDQUFDLENBQUM7b0JBQzVCLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCO29CQUN2QixhQUFhLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0JBQzlDLGFBQWEsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLFNBQVM7Z0JBQ2pELENBQUMsYUFBYSxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLEVBQ2pGLENBQUM7Z0JBQ0MsT0FBTztZQUNYLENBQUM7WUFFRCxJQUNJLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSTtnQkFDekIsYUFBYSxFQUFFLEtBQUssSUFBSSxJQUFJO2dCQUM1QixXQUFXLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxNQUFNO2dCQUNoRCxXQUFXLENBQUMsU0FBUyxLQUFLLGVBQWUsQ0FBQyxZQUFZLEVBQ3hELENBQUM7Z0JBQ0MsT0FBTztZQUNYLENBQUM7WUFFRCxTQUFTLENBQUMsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsK0JBQStCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6RyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxJQUFJLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixxQkFBcUI7UUFDckIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7YUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1QsU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLGlCQUFpQixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLCtCQUErQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUMzQyxNQUFzQyxFQUN0QyxXQUEyQztJQUN2QyxLQUFLLEVBQUUsRUFBRTtJQUNULE1BQU0sRUFBRSxDQUFDO0NBQ1o7SUFFRCxNQUFNLE1BQU0sR0FBbUM7UUFDM0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUs7UUFDckMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU07UUFDeEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU07UUFDeEMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQztLQUMzRCxDQUFDO0lBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFrQyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsR0FBYyxDQUFDLEdBQUcsRUFBQyxHQUFJLEtBQXdCLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakksQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBa0MsQ0FBQztRQUN6RSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFjLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFjLENBQUMsR0FBRyxFQUFDLEdBQUksS0FBd0IsRUFBQyxDQUFDO1lBQ3JFLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUFDLE1BQWlDO0lBQzFFLE9BQU8sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN2QyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9ILENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUMzQyxNQUFnRCxFQUNoRCxHQUFZLEVBQ1osU0FBUyxHQUFHLEtBQUs7SUFFakIsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sOEJBQThCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxXQUE0QixFQUFFLFNBQVMsR0FBRyxLQUFLO0lBQzFGLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hKLE1BQU0sU0FBUyxHQUFHLFdBQVcsRUFBRSxTQUFTLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQztJQUNuRSxJQUNJLFdBQVcsS0FBSyxTQUFTO1FBQ3pCLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssY0FBYyxJQUFJLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ25HLENBQUMsT0FBTyxXQUFXLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFDekUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUN4RSxDQUFDO1FBQ0MsOENBQThDO1FBQzlDLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkgsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHdEQUF3RCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUMsRUFBRSxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2SixNQUFNLElBQUksb0JBQW9CLENBQUMscUJBQXFCLFNBQVMsOEJBQThCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFRCxJQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDcEosTUFBTSxJQUFJLG9CQUFvQixDQUFDLHFCQUFxQixTQUFTLHVCQUF1QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEtBQUssZUFBZSxDQUFDLFlBQVksQ0FBQztJQUN6SCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxvQ0FBb0MsQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7SUFFakksT0FBTyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO0FBQzlLLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUN4QyxTQUFpQixFQUNqQixJQUdDO0lBRUQsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztJQUVsQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUU7UUFDL0QsSUFBSSxXQUFXLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3hCLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUMvQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3pCLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3BJLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXRELE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO2dCQUM1QixNQUFNLENBQUMsbUJBQW1CLEdBQUcsYUFBYSxDQUFDO2dCQUUzQyxJQUFJLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDbEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ3hCLENBQUM7b0JBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRzt3QkFDdkIsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLFNBQVMsRUFBRSxlQUFlLENBQUMsUUFBUTt3QkFDbkMsYUFBYSxFQUFFLGFBQWE7cUJBQy9CLENBQUM7Z0JBQ04sQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDM0MsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMzQyxPQUFPLEVBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBaUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxLQUFLLE1BQU0sRUFBQyxDQUFDO2dCQUNoRyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLElBQUksb0JBQW9CLENBQUMsb0NBQW9DLFdBQVcsa0NBQWtDLENBQUMsQ0FBQztZQUN0SCxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxpQkFBaUIsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0gsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM3QixpQ0FBaUM7Z0JBQ2pDLE9BQU87WUFDWCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFFaEIsaUJBQWlCO1lBQ2pCLElBQUksYUFBYSxHQUF3QixTQUFTLENBQUM7WUFDbkQsSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDakUsYUFBYSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQztZQUNwRCxDQUFDO1lBRUQsYUFBYTtZQUNiLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUNqSixPQUFPLEVBQUUsQ0FBQztZQUVWLE1BQU0sS0FBSyxHQUFHLFNBQVMsS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsWUFBWSxDQUFDO1lBRWpHLFFBQVE7WUFDUixJQUFJLEtBQUssR0FBeUMsU0FBUyxDQUFDO1lBQzVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDVCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3pCLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLE9BQU8sS0FBSyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNyQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO3FCQUFNLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdEMsd0RBQXdEO29CQUN4RCxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckUsQ0FBQztnQkFFRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLGVBQWUsQ0FBQyxNQUFNLElBQUksU0FBUyxLQUFLLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDNUcsNkRBQTZEO29CQUM3RCxPQUFPO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ25CLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUMsRUFBRSxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsS0FBSyxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2xKLElBQUksUUFBUSxHQUFhLEVBQUUsQ0FBQztvQkFDNUIsaUNBQWlDO29CQUNqQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzFCLE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyw4Q0FBOEM7d0JBQzFFLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLDhCQUE4Qjt3QkFDeEQsSUFBSSxzQkFBc0IsR0FBRyxLQUFLLENBQUMsQ0FBQyx5RkFBeUY7d0JBRTdILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFFbkIsc0RBQXNEOzRCQUN0RCxrQkFBa0I7NEJBQ2xCLHlGQUF5Rjs0QkFDekYsb0hBQW9IOzRCQUNwSCx3RUFBd0U7NEJBQ3hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLHNCQUFzQixJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQ0FDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQ0FDMUIsWUFBWSxHQUFHLEVBQUUsQ0FBQztnQ0FDbEIsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDckIsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2dDQUMvQixjQUFjLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixDQUFDO2lDQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dDQUNsQix3QkFBd0I7Z0NBQ3hCLElBQUksY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO29DQUNqRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsK0NBQStDO29DQUNsRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDZCQUE2QjtnQ0FDdEMsQ0FBQztnQ0FDRCxzRkFBc0Y7cUNBQ2pGLElBQUksY0FBYyxFQUFFLENBQUM7b0NBQ3RCLHNCQUFzQixHQUFHLElBQUksQ0FBQztnQ0FDbEMsQ0FBQztnQ0FDRCxrQkFBa0I7cUNBQ2IsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQ0FDcEIsWUFBWSxJQUFJLENBQUMsQ0FBQztnQ0FDdEIsQ0FBQztnQ0FDRCw4REFBOEQ7cUNBQ3pELENBQUM7b0NBQ0YsWUFBWSxHQUFHLEVBQUUsQ0FBQztvQ0FDbEIsWUFBWSxHQUFHLElBQUksQ0FBQztvQ0FDcEIsY0FBYyxHQUFHLElBQUksQ0FBQztnQ0FDMUIsQ0FBQzs0QkFDTCxDQUFDO2lDQUFNLENBQUM7Z0NBQ0osSUFBSSxzQkFBc0IsRUFBRSxDQUFDO29DQUN6QixPQUFPO2dDQUNYLENBQUM7Z0NBRUQsWUFBWSxHQUFHLElBQUksQ0FBQztnQ0FDcEIsWUFBWSxJQUFJLENBQUMsQ0FBQzs0QkFDdEIsQ0FBQzt3QkFDTCxDQUFDO3dCQUVELElBQUksWUFBWSxJQUFJLENBQUMsc0JBQXNCLElBQUksY0FBYyxFQUFFLENBQUM7NEJBQzVELE9BQU87d0JBQ1gsQ0FBQzt3QkFFRCw0Q0FBNEM7d0JBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBRXJDLFFBQVEsR0FBRyxNQUFNLENBQUM7b0JBQ3RCLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztvQkFFRCxJQUFJLFNBQVMsS0FBSyxlQUFlLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2pFLE9BQU87b0JBQ1gsQ0FBQztvQkFFRCxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUNyQixDQUFDO2dCQUVELElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNyRywyQ0FBMkM7b0JBQzNDLE9BQU87Z0JBQ1gsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzlCLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixNQUFNLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN4QixDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQy9HLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBeUIsQ0FBQyxHQUFHLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUMsQ0FBQztRQUNuSCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQXFELE1BQXNDO0lBQ3pILE1BQU0sSUFBSSxHQUFtQztRQUN6QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtLQUN4QixDQUFDO0lBRUYsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3ZFLE1BQU0sV0FBVyxHQUFHLEtBQXVCLENBQUM7WUFDNUMsT0FBTztnQkFDSCxHQUFHLEdBQUc7Z0JBQ04sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDSCxHQUFHLFdBQVc7b0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSztpQkFDckU7YUFDdEIsQ0FBQztRQUNOLENBQUMsRUFBRSxFQUFrQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FBQyxLQUFjLEVBQUUsU0FBUyxHQUFHLEtBQUs7SUFDbEYsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUMvQyxJQUFJLEtBQUssSUFBSSxJQUFJO1FBQUUsTUFBTSxJQUFJLG9CQUFvQixDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQyx5REFBeUQ7SUFDakssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNwQixPQUFPLEtBQUs7YUFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDNUQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLEtBQUssWUFBWSxJQUFJO1lBQUUsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2FBQzdFLENBQUM7WUFDRixNQUFNLElBQUksb0JBQW9CLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtUYWJsZUxhenlMb2FkRXZlbnR9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuXG5pbXBvcnQge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBmcm9tICcuLi9lcnJvci9lcnJvci5tb2RlbCc7XG5pbXBvcnQge2RhdGVUb0lzb1N0cmluZ30gZnJvbSAnLi4vaGVscGVycy9kYXRlJztcbmltcG9ydCB7RGF0YUxpc3RGaWx0ZXIsIERhdGFMaXN0RmlsdGVyVmFsdWVUeXBlLCBEYXRhTGlzdEZpbHRlcnNUeXBlLCBEYXRhTGlzdFBhcmFtc30gZnJvbSAnLi9kYXRhLWxpc3QubW9kZWwnO1xuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGV9IGZyb20gJy4vZmlsdGVyLW1hdGNoLm1vZGVsJztcbmltcG9ydCB7Q29tbW9uc0ZpbHRlck1ldGFkYXRhfSBmcm9tICcuL2ZpbHRlci1tZXRhZGF0YS5tb2RlbCc7XG5cbi8qKlxuICogQ29udmVydHMgYSBUYWJsZUxhenlMb2FkRXZlbnQgdG8gRGF0YUxpc3RQYXJhbXMuXG4gKlxuICogQHBhcmFtIHtUYWJsZUxhenlMb2FkRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29udmVydC5cbiAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRhYmxlTG9hZFRvRGF0YUxpc3RQYXJhbXMoZXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IERhdGFMaXN0UGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICBpZiAoZXZlbnQuZmlyc3QgIT0gbnVsbCkge1xuICAgICAgICBwYXJhbXMub2Zmc2V0ID0gZXZlbnQuZmlyc3Q7XG4gICAgfVxuICAgIGlmIChldmVudC5yb3dzICE9IG51bGwpIHtcbiAgICAgICAgcGFyYW1zLmxpbWl0ID0gZXZlbnQucm93cztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV2ZW50Lmdsb2JhbEZpbHRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1zLnNlYXJjaCA9IGV2ZW50Lmdsb2JhbEZpbHRlcjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQuZ2xvYmFsRmlsdGVyKSAmJiBldmVudC5nbG9iYWxGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICBwYXJhbXMuc2VhcmNoID0gZXZlbnQuZ2xvYmFsRmlsdGVyWzBdO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50Lm11bHRpU29ydE1ldGEpICYmIGV2ZW50Lm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xuICAgICAgICBwYXJhbXMuc29ydCA9IGV2ZW50Lm11bHRpU29ydE1ldGEubWFwKG0gPT4gKHtwcm9wZXJ0eTogbS5maWVsZCwgYXNjZW5kaW5nOiBtLm9yZGVyID49IDB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmZpbHRlcnMpIHtcbiAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSBPYmplY3Qua2V5cyhldmVudC5maWx0ZXJzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXI6IERhdGFMaXN0RmlsdGVyID0ge307XG4gICAgICAgICAgICBjb25zdCBldmVudEZpbHRlcjogQ29tbW9uc0ZpbHRlck1ldGFkYXRhIHwgQ29tbW9uc0ZpbHRlck1ldGFkYXRhW10gfCB1bmRlZmluZWQgPSBldmVudC5maWx0ZXJzPy5ba2V5IGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudEZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIudmFsdWUgPSBldmVudEZpbHRlclswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlID0gZXZlbnRGaWx0ZXJbMF0ubWF0Y2hNb2RlO1xuICAgICAgICAgICAgICAgIGZpbHRlci5jYXNlU2Vuc2l0aXZlID0gZXZlbnRGaWx0ZXJbMF0uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRGaWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGV2ZW50RmlsdGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgIGZpbHRlci5tYXRjaE1vZGUgPSBldmVudEZpbHRlci5tYXRjaE1vZGU7XG4gICAgICAgICAgICAgICAgZmlsdGVyLmNhc2VTZW5zaXRpdmUgPSBldmVudEZpbHRlci5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHNlYXJjaCBjYXNlIHNlbnNpdGl2aXR5IHRvIGJlIGFsc28gd3JpdHRlbiBvbiBzZWFyY2hDYXNlU2Vuc2l0aXZlXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnZ2xvYmFsJyAmJiB0eXBlb2YgcGFyYW1zLnNlYXJjaCA9PT0gJ3N0cmluZycgJiYgZmlsdGVyLmNhc2VTZW5zaXRpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2hDYXNlU2Vuc2l0aXZlID0gZmlsdGVyLmNhc2VTZW5zaXRpdmU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7Li4uYWNjLCBba2V5XTogZmlsdGVyfTtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdG8gVVJMIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gKiBTb3J0cyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBzb3J0IHF1ZXJ5IGxhbmd1YWdlOiBgYXNjOnByb3AxLGRlc2M6cHJvcDJgLCAuLi5cbiAqIEZpbHRlciBrZXlzIGFyZSBcImZsYXR0ZW5lZFwiIGluIHRoZSBuZXcgb2JqZWN0LCB2YWx1ZXMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgZmlsdGVyIHF1ZXJ5IGxhbmd1YWdlOiBgY3M6ZXE6YXNkYCwgYGluOmFzZCxxd2VgLCBgZXhgLCAuLi5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBjb252ZXJ0LlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc3xudWxsfSBkZWZhdWx0cyAtIFRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgdXNlZCBpZiBubyBtYXRjaGluZyBwcm9wZXJ0eSBpbiBwYXJhbXMgaXMgYXZhaWxhYmxlLiBEZWZhdWx0cyB0byB7IGxpbWl0OiAyNSwgb2Zmc2V0OiAwIH0gaWYgbm90IHByb3ZpZGVkLlxuICogQHBhcmFtIG9wdHMgLSBPcHRpb25zIGluIGNvbnZlcnRpbmcgdG8gdXJsIHF1ZXJ5OlxuICogICAtIHByZXBlbmRGaWx0ZXJOYW1lIFByZXBlbmRzIGZpbHRlciBrZXkgd2l0aCBwcm92aWRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHtQYXJhbXN9IC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zVG9VcmxRdWVyeShcbiAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgYW55PixcbiAgICBkZWZhdWx0czogRGF0YUxpc3RQYXJhbXM8YW55LCBhbnk+IHwgbnVsbCA9IHtcbiAgICAgICAgbGltaXQ6IDI1LFxuICAgICAgICBvZmZzZXQ6IDBcbiAgICB9LFxuICAgIG9wdHM/OiB7XG4gICAgICAgIHByZXBlbmRGaWx0ZXJOYW1lPzogc3RyaW5nO1xuICAgIH1cbik6IFBhcmFtcyB7XG4gICAgY29uc3QgdXJsUGFyYW1zOiBQYXJhbXMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMubGltaXQgJiYgcGFyYW1zLmxpbWl0ICE9PSBkZWZhdWx0cz8ubGltaXQpIHtcbiAgICAgICAgdXJsUGFyYW1zWydsaW1pdCddID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLm9mZnNldCAmJiBwYXJhbXMub2Zmc2V0ICE9PSBkZWZhdWx0cz8ub2Zmc2V0KSB7XG4gICAgICAgIHVybFBhcmFtc1snb2Zmc2V0J10gPSBwYXJhbXMub2Zmc2V0O1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMuc2VhcmNoICE9PSBkZWZhdWx0cz8uc2VhcmNoKSB7XG4gICAgICAgIHVybFBhcmFtc1sncSddID0gYCR7cGFyYW1zLnNlYXJjaENhc2VTZW5zaXRpdmUgPyBgY3M6YCA6ICcnfSR7cGFyYW1zLnNlYXJjaH1gO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnNvcnQgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydCkgJiYgcGFyYW1zLnNvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWZhdWx0cz8uc29ydCA9PSBudWxsIHx8XG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShkZWZhdWx0cy5zb3J0KSB8fFxuICAgICAgICAgICAgZGVmYXVsdHMuc29ydC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIHBhcmFtcy5zb3J0Lmxlbmd0aCAhPT0gZGVmYXVsdHMuc29ydC5sZW5ndGggfHxcbiAgICAgICAgICAgIGRlZmF1bHRzLnNvcnQuc29tZSgoZHMsIGlkeCkgPT4gZHMucHJvcGVydHkgIT09IHBhcmFtcy5zb3J0IVtpZHhdLnByb3BlcnR5IHx8IChkcy5hc2NlbmRpbmcgPz8gdHJ1ZSkgIT09IChwYXJhbXMuc29ydCFbaWR4XS5hc2NlbmRpbmcgPz8gdHJ1ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdXJsUGFyYW1zWydzb3J0J10gPSBkYXRhTGlzdFBhcmFtc1NvcnRUb1VybFF1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAgICAgLy8gZ2xvYmFsIHNlYXJjaCBmaWx0ZXIgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgJ3EnIHBhcmFtZXRlciwgbm8gbmVlZCB0byBpbmNsdWRlIGl0IGhlcmVcbiAgICAgICAgICAgIGlmIChrID09PSAnZ2xvYmFsJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtRmlsdGVyID0gcGFyYW1zLmZpbHRlcnMhW2sgYXMga2V5b2Ygb2JqZWN0XSE7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gZGVmYXVsdHM/LmZpbHRlcnM/LltrIGFzIGtleW9mIG9iamVjdF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlciAmJlxuICAgICAgICAgICAgICAgICgoQXJyYXkuaXNBcnJheShkZWZhdWx0RmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHBhcmFtRmlsdGVyLnZhbHVlKSAmJlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyLnZhbHVlLmxlbmd0aCA9PT0gcGFyYW1GaWx0ZXIudmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXIudmFsdWUuZXZlcnkoKHYsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAocGFyYW1GaWx0ZXIudmFsdWUgYXMgQXJyYXk8RGF0YUxpc3RGaWx0ZXJWYWx1ZVR5cGU+KVtpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJiB2IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIHZhbHVlLmdldFRpbWUoKSA9PT0gdi5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiB2YWx1ZSA9PT0gdjtcbiAgICAgICAgICAgICAgICAgICAgfSkpIHx8IC8vIGhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci52YWx1ZSA9PT0gcGFyYW1GaWx0ZXIudmFsdWUpICYmXG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlci5tYXRjaE1vZGUgPT09IHBhcmFtRmlsdGVyLm1hdGNoTW9kZSAmJlxuICAgICAgICAgICAgICAgIChkZWZhdWx0RmlsdGVyLmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpID09PSAocGFyYW1GaWx0ZXIuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhcmFtRmlsdGVyLnZhbHVlID09IG51bGwgJiZcbiAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyPy52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmXG4gICAgICAgICAgICAgICAgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVybFBhcmFtc1tgJHtvcHRzPy5wcmVwZW5kRmlsdGVyTmFtZSA/PyAnJ30ke2t9YF0gPSBkYXRhTGlzdFBhcmFtc0ZpbHRlcnNUb1VybFF1ZXJ5KHBhcmFtcywgaywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdHM/LmZpbHRlcnMpIHtcbiAgICAgICAgLy8gYWRkIG90aGVyIGRlZmF1bHRzXG4gICAgICAgIGNvbnN0IHBhcmFtRmlsdGVyS2V5cyA9IHBhcmFtcy5maWx0ZXJzID8gT2JqZWN0LmtleXMocGFyYW1zLmZpbHRlcnMpIDogW107XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmZpbHRlcnMpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gcGFyYW1GaWx0ZXJLZXlzLmluZGV4T2YoaykgPCAwKVxuICAgICAgICAgICAgLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zW2Ake29wdHM/LnByZXBlbmRGaWx0ZXJOYW1lID8/ICcnfSR7a31gXSA9IGRhdGFMaXN0UGFyYW1zRmlsdGVyc1RvVXJsUXVlcnkoZGVmYXVsdHMsIGspO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFBhcmFtcztcbn1cblxuLyoqXG4gKiBNZXJnZXMgdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0UGFyYW1zfSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyB0byBtZXJnZSB3aXRoIGRlZmF1bHRzLlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtc30gZGVmYXVsdHMgLSBUaGUgZGVmYXVsdCB2YWx1ZXMgdG8gbWVyZ2Ugd2l0aCBwYXJhbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIHsgbGltaXQ6IDI1LCBvZmZzZXQ6IDAgfSkuXG4gKiBAcmV0dXJucyB7RGF0YUxpc3RQYXJhbXN9IC0gVGhlIG1lcmdlZCBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGF0YUxpc3RQYXJhbXNXaXRoRGVmYXVsdHM8U29ydHMgPSBhbnksIEZpbHRlcnMgZXh0ZW5kcyBrZXlvZiBhbnkgPSBhbnk+KFxuICAgIHBhcmFtczogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+LFxuICAgIGRlZmF1bHRzOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4gPSB7XG4gICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgb2Zmc2V0OiAwXG4gICAgfVxuKTogRGF0YUxpc3RQYXJhbXM8U29ydHMsIEZpbHRlcnM+IHtcbiAgICBjb25zdCBtZXJnZWQ6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5saW1pdCA/PyBkZWZhdWx0cy5saW1pdCxcbiAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0ID8/IGRlZmF1bHRzLm9mZnNldCxcbiAgICAgICAgc2VhcmNoOiBwYXJhbXMuc2VhcmNoID8/IGRlZmF1bHRzLnNlYXJjaCxcbiAgICAgICAgc29ydDogKHBhcmFtcy5zb3J0ID8/IGRlZmF1bHRzLnNvcnQpPy5tYXAocyA9PiAoey4uLnN9KSlcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5maWx0ZXJzKSB7XG4gICAgICAgIG1lcmdlZC5maWx0ZXJzID0ge30gYXMgRGF0YUxpc3RGaWx0ZXJzVHlwZTxGaWx0ZXJzPjtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocGFyYW1zLmZpbHRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gKG1lcmdlZC5maWx0ZXJzIVtrZXkgYXMgRmlsdGVyc10gPSB7Li4uKHZhbHVlIGFzIERhdGFMaXN0RmlsdGVyKX0pKTtcbiAgICB9XG4gICAgaWYgKGRlZmF1bHRzLmZpbHRlcnMpIHtcbiAgICAgICAgaWYgKCFtZXJnZWQuZmlsdGVycykgbWVyZ2VkLmZpbHRlcnMgPSB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+O1xuICAgICAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cy5maWx0ZXJzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChtZXJnZWQuZmlsdGVycyFba2V5IGFzIEZpbHRlcnNdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXJnZWQuZmlsdGVycyFba2V5IGFzIEZpbHRlcnNdID0gey4uLih2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcil9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiBwYXJhbWV0ZXJzIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZyBmb3Igc29ydGluZy5cbiAqIFNvcnRzIGFyZSBmb3JtYXR0ZWQgaW4gTWVkaXVzIGRhdGEgQVBJIHNvcnQgcXVlcnkgbGFuZ3VhZ2U6IGBhc2M6cHJvcDEsZGVzYzpwcm9wMmAsIC4uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXN9IHBhcmFtcyAtIEFuIG9wdGlvbmFsIG9iamVjdCBjb250YWluaW5nIHNvcnQgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIHF1ZXJ5IG9yIHVuZGVmaW5lZCBpZiBubyBzb3J0IHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YUxpc3RQYXJhbXNTb3J0VG9VcmxRdWVyeShwYXJhbXM/OiBEYXRhTGlzdFBhcmFtczxhbnksIGFueT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBwYXJhbXMgJiYgQXJyYXkuaXNBcnJheShwYXJhbXMuc29ydClcbiAgICAgICAgPyBwYXJhbXMuc29ydC5tYXAocyA9PiBgJHtzLmFzY2VuZGluZyA9PT0gdHJ1ZSB8fCBzLmFzY2VuZGluZyA9PT0gdW5kZWZpbmVkID8gJ2FzYycgOiAnZGVzYyd9OiR7U3RyaW5nKHMucHJvcGVydHkpfWApLmpvaW4oJywnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNwZWNpZmljIGZpbHRlciBwYXJhbWV0ZXIgKGJ5IGtleSkgZnJvbSBEYXRhTGlzdFBhcmFtcyBvYmplY3QgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLlxuICogRmlsdGVyIGtleXMgYXJlIFwiZmxhdHRlbmVkXCIgaW4gdGhlIG5ldyBvYmplY3QsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGluIE1lZGl1cyBkYXRhIEFQSSBmaWx0ZXIgcXVlcnkgbGFuZ3VhZ2U6IGBjczplcTphc2RgLCBgaW46YXNkLHF3ZWAsIGBleGAsIC4uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUxpc3RQYXJhbXM8YW55LCBGaWx0ZXJzPiB8IHVuZGVmaW5lZH0gcGFyYW1zIC0gVGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWx0ZXJzLlxuICogQHBhcmFtIHtGaWx0ZXJzfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBmaWx0ZXIgdG8gY29udmVydC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciB0byBhbGxvdyBudWxsIHZhbHVlcyBpbiB0aGUgcXVlcnkgc3RyaW5nLlxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBVUkwgcXVlcnkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIGZpbHRlciwgb3IgdW5kZWZpbmVkIGlmIHRoZSBmaWx0ZXIgaXMgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YUxpc3RQYXJhbXNGaWx0ZXJzVG9VcmxRdWVyeTxGaWx0ZXJzIGV4dGVuZHMga2V5b2YgYW55ID0gc3RyaW5nPihcbiAgICBwYXJhbXM6IERhdGFMaXN0UGFyYW1zPGFueSwgRmlsdGVycz4gfCB1bmRlZmluZWQsXG4gICAga2V5OiBGaWx0ZXJzLFxuICAgIGFsbG93TnVsbCA9IGZhbHNlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmFtRmlsdGVyID0gcGFyYW1zPy5maWx0ZXJzPy5ba2V5XTtcbiAgICByZXR1cm4gZGF0YUxpc3RQYXJhbXNGaWx0ZXJUb1VybFF1ZXJ5KHBhcmFtRmlsdGVyLCBhbGxvd051bGwpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZmlsdGVyIHRvIGEgVVJMIHF1ZXJ5IHN0cmluZy5cbiAqIEZpbHRlciBrZXlzIGFyZSBcImZsYXR0ZW5lZFwiIGluIHRoZSBuZXcgb2JqZWN0LCB2YWx1ZXMgYXJlIGZvcm1hdHRlZCBpbiBNZWRpdXMgZGF0YSBBUEkgZmlsdGVyIHF1ZXJ5IGxhbmd1YWdlOiBgY3M6ZXE6YXNkYCwgYGluOmFzZCxxd2VgLCBgZXhgLCAuLi5cbiAqXG4gKiBAcGFyYW0ge0RhdGFMaXN0RmlsdGVyfSBwYXJhbUZpbHRlciAtIFRoZSBmaWx0ZXIgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciB0byBhbGxvdyBudWxsIHZhbHVlcyBpbiB0aGUgZmlsdGVyLlxuICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IC0gVGhlIGZpbHRlciBjb252ZXJ0ZWQgdG8gYSBVUkwgcXVlcnkgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkIG9yIHRoZSBmaWx0ZXIgaGFzIGVtcHR5IG9yIGludmFsaWQgdmFsdWVzLlxuICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgdGhlIGZpbHRlciBoYXMgaW52YWxpZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhTGlzdFBhcmFtc0ZpbHRlclRvVXJsUXVlcnkocGFyYW1GaWx0ZXI/OiBEYXRhTGlzdEZpbHRlciwgYWxsb3dOdWxsID0gZmFsc2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbHRlclZhbHVlQXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGFyYW1GaWx0ZXI/LnZhbHVlKSA/IHBhcmFtRmlsdGVyIS52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93TnVsbCB8fCB2ICE9PSBudWxsKSkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF0Y2hNb2RlID0gcGFyYW1GaWx0ZXI/Lm1hdGNoTW9kZSA/PyBGaWx0ZXJNYXRjaE1vZGUuRXF1YWxzO1xuICAgIGlmIChcbiAgICAgICAgcGFyYW1GaWx0ZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoIWFsbG93TnVsbCAmJiBtYXRjaE1vZGUgIT09ICdleGlzdHMnICYmIG1hdGNoTW9kZSAhPT0gJ2RvZXNOb3RFeGlzdCcgJiYgcGFyYW1GaWx0ZXIudmFsdWUgPT0gbnVsbCkgfHxcbiAgICAgICAgKHR5cGVvZiBwYXJhbUZpbHRlci52YWx1ZSA9PT0gJ3N0cmluZycgJiYgcGFyYW1GaWx0ZXIudmFsdWUubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZUFzQXJyYXkpICYmIGZpbHRlclZhbHVlQXNBcnJheS5sZW5ndGggPT09IDApXG4gICAgKSB7XG4gICAgICAgIC8vIG5vIG5lZWQgdG8gaW5jbHVkZSBmaWx0ZXJzIGZvciBlbXB0eSB2YWx1ZXNcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiAhKEFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSAmJiBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAyKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlIGJldHdlZW4gcmVxdWlyZXMgZXhhY3RseSAyIHZhbHVlczogJHtwYXJhbUZpbHRlci52YWx1ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoKG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IG1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluKSAmJiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyVmFsdWVBc0FycmF5KSB8fCBmaWx0ZXJWYWx1ZUFzQXJyYXkubGVuZ3RoID09PSAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEZpbHRlciBtYXRjaCBtb2RlICR7bWF0Y2hNb2RlfSByZXF1aXJlcyBub24tZW1wdHkgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgfVxuXG4gICAgaWYgKChbRmlsdGVyTWF0Y2hNb2RlLkluLCBGaWx0ZXJNYXRjaE1vZGUuTm90SW4sIEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuXSBhcyBzdHJpbmdbXSkuaW5kZXhPZihtYXRjaE1vZGUpID09PSAtMSAmJiBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlQXNBcnJheSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbW1vbnNJbnRlcm5hbEVycm9yKGBGaWx0ZXIgbWF0Y2ggbW9kZSAke21hdGNoTW9kZX0gbXVzdCBub3QgYmUgYXJyYXk6ICR7cGFyYW1GaWx0ZXIudmFsdWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9WYWwgPSBwYXJhbUZpbHRlci5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgcGFyYW1GaWx0ZXIubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0O1xuICAgIGNvbnN0IHVybFZhbHVlUGFydCA9IG5vVmFsID8gJycgOiBgOiR7ZGF0YUxpc3RQYXJhbXNGaWx0ZXJWYWx1ZVRvVXJsU3RyaW5nKGZpbHRlclZhbHVlQXNBcnJheSA/PyBwYXJhbUZpbHRlci52YWx1ZSwgYWxsb3dOdWxsKX1gO1xuXG4gICAgcmV0dXJuIGAke3BhcmFtRmlsdGVyLmNhc2VTZW5zaXRpdmUgPyAnY3M6JyA6IHBhcmFtRmlsdGVyLmNhc2VTZW5zaXRpdmUgPT09IGZhbHNlID8gJ2NpOicgOiAnJ30ke0ZpbHRlck1hdGNoTW9kZS5nZXRBYmJyZXZpYXRpb24obWF0Y2hNb2RlKSA/PyBtYXRjaE1vZGV9JHt1cmxWYWx1ZVBhcnR9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBVUkwgcXVlcnkgcGFyYW1ldGVycyB0byBhIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqIFNvcnRzIGFyZSBmb3JtYXR0ZWQgZnJvbSBNZWRpdXMgZGF0YSBBUEkgc29ydCBxdWVyeSBsYW5ndWFnZTogYGFzYzpwcm9wMSxkZXNjOnByb3AyYCwgLi4uXG4gKiBGaWx0ZXIga2V5cyBhcmUgYWxsIGtleXMgaW4gUGFyYW1zIG9iamVjdCB0aGF0IGFyZSBub3QgbWF0Y2hlZCBlbHNld2hlcmUsIHZhbHVlcyBhcmUgZm9ybWF0dGVkIGZyb20gTWVkaXVzIGRhdGEgQVBJIGZpbHRlciBxdWVyeSBsYW5ndWFnZTogYGNzOmVxOmFzZGAsIGBpbjphc2QscXdlYCwgYGV4YCwgLi4uXG4gKlxuICogQHBhcmFtIHtQYXJhbXN9IHVybFBhcmFtcyAtIFRoZSBVUkwgcXVlcnkgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSBvcHRzIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgY29udmVyc2lvbjpcbiAqICAtIHNlYXJjaEFzR2xvYmFsIC0gVGhlIFVSTCBxdWVyeSBwYXJhbWV0ZXJzLlxuICogIC0gcHJlcGVuZEZpbHRlck5hbWUgLSBGaWx0ZXIgbmFtZXMgYXJlIHByZXBlbmRlZCB3aXRoIHByb3ZpZGVkIHN0cmluZy5cbiAqIEByZXR1cm4ge0RhdGFMaXN0UGFyYW1zfSAtIFRoZSBjb252ZXJ0ZWQgRGF0YUxpc3RQYXJhbXMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbVVybFF1ZXJ5VG9EYXRhTGlzdFBhcmFtcyhcbiAgICB1cmxQYXJhbXM6IFBhcmFtcyxcbiAgICBvcHRzPzoge1xuICAgICAgICBzZWFyY2hBc0dsb2JhbD86IGJvb2xlYW47XG4gICAgICAgIHByZXBlbmRGaWx0ZXJOYW1lPzogc3RyaW5nO1xuICAgIH1cbik6IERhdGFMaXN0UGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXM6IERhdGFMaXN0UGFyYW1zID0ge307XG5cbiAgICBPYmplY3QuZW50cmllcyh1cmxQYXJhbXMpLmZvckVhY2goKFt1cmxQYXJhbUtleSwgdXJsUGFyYW1WYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHVybFBhcmFtS2V5ID09PSAnbGltaXQnKSB7XG4gICAgICAgICAgICBwYXJhbXMubGltaXQgPSArdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgIGlmIChpc05hTihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1zLmxpbWl0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHVybFBhcmFtS2V5ID09PSAnb2Zmc2V0Jykge1xuICAgICAgICAgICAgcGFyYW1zLm9mZnNldCA9ICt1cmxQYXJhbVZhbHVlO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHBhcmFtcy5vZmZzZXQpIHx8IHBhcmFtcy5vZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtcy5vZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdxJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJyAmJiB1cmxQYXJhbVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hRdWVyeSA9IHVybFBhcmFtVmFsdWUuc3RhcnRzV2l0aCgnY3M6JykgfHwgdXJsUGFyYW1WYWx1ZS5zdGFydHNXaXRoKCdjaTonKSA/IHVybFBhcmFtVmFsdWUuc3Vic3RyaW5nKDMpIDogdXJsUGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdXJsUGFyYW1WYWx1ZS5zdGFydHNXaXRoKCdjczonKTtcblxuICAgICAgICAgICAgICAgIHBhcmFtcy5zZWFyY2ggPSBzZWFyY2hRdWVyeTtcbiAgICAgICAgICAgICAgICBwYXJhbXMuc2VhcmNoQ2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0cz8uc2VhcmNoQXNHbG9iYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyc1snZ2xvYmFsJ10gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VhcmNoUXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IEZpbHRlck1hdGNoTW9kZS5Db250YWlucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodXJsUGFyYW1LZXkgPT09ICdzb3J0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zb3J0ID0gdXJsUGFyYW1WYWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2RpcmVjdGlvbiwgcHJvcGVydHldID0gcy5zcGxpdCgnOicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Byb3BlcnR5OiAocHJvcGVydHkgPz8gZGlyZWN0aW9uKSBhcyBrZXlvZiBvYmplY3QsIGFzY2VuZGluZzogZGlyZWN0aW9uICE9PSAnZGVzYyd9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYFN0cmluZyBpcyBleHBlY3RlZCBhcyB2YWx1ZSBmb3IgJyR7dXJsUGFyYW1LZXl9JyB3aGVuIGNvbnZlcnRpbmcgZnJvbSB1cmxQYXJhbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgoIW9wdHM/LnByZXBlbmRGaWx0ZXJOYW1lIHx8IHVybFBhcmFtS2V5LnN0YXJ0c1dpdGgob3B0cy5wcmVwZW5kRmlsdGVyTmFtZSkpICYmIHR5cGVvZiB1cmxQYXJhbVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHVybFBhcmFtVmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJQYXJ0cyA9IHVybFBhcmFtVmFsdWUuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGxldCBwYXJ0SWR4ID0gMDtcblxuICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgIGxldCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY3MnIHx8IGZpbHRlclBhcnRzW3BhcnRJZHhdID09PSAnY2knKSB7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IGZpbHRlclBhcnRzW3BhcnRJZHgrK10gPT09ICdjcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hdGNoIG1vZGVcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IGZpbHRlclBhcnRzW3BhcnRJZHhdID8gRmlsdGVyTWF0Y2hNb2RlLmZyb21BYmJyZXZpYXRpb24oZmlsdGVyUGFydHNbcGFydElkeF0pID8/IGZpbHRlclBhcnRzW3BhcnRJZHhdIDogRmlsdGVyTWF0Y2hNb2RlLkVxdWFscztcbiAgICAgICAgICAgIHBhcnRJZHgrKztcblxuICAgICAgICAgICAgY29uc3Qgbm9WYWwgPSBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0O1xuXG4gICAgICAgICAgICAvLyB2YWx1ZVxuICAgICAgICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IG51bGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIW5vVmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwYXJ0SWR4ID09PSBmaWx0ZXJQYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsdGVyUGFydHNbcGFydElkeF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0SWR4IDwgZmlsdGVyUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IHRoYXQgc2hvdWxkIG5vdCBiZSBhcnJheSwgc28gam9pbiBiYWNrIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsdGVyUGFydHMuc2xpY2UocGFydElkeCwgZmlsdGVyUGFydHMubGVuZ3RoKS5qb2luKCc6Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWF0Y2hNb2RlICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmIG1hdGNoTW9kZSAhPT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSB1bmRlZmluZWQgYW5kIG1hdGNoIG1vZGUgZXhwZWN0cyB2YWx1ZSwgdGhlbiBza2lwXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKChtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5JbiB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Ob3RJbiB8fCBtYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcnJheVZhbDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgbWF0Y2ggbW9kZXMgZXhwZWN0IGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdcIicpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBsaWNpdFF1b3RlcyA9IGZhbHNlOyAvL3Rva2VuIGlzIHF1b3RlZCwgZS5nLiBpbjoxLDIsXCIyMlwiXCJcIixcIiwxMjNcIlwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdW90ZXNPcGVuZWQgPSBmYWxzZTsgLy90b2tlbiBoYXMgc3RhcnRlZCBwcm9jZXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVvdGVzRXhwbGljaXRseUNsb3NlZCA9IGZhbHNlOyAvL3Rva2VuIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLCBhZnRlciBzaW5nbGUgXCIgaW4gcXVvdGVkIG1vZGUsIG9yIGJlZm9yZSAsIGluIG5vdCBxdW90ZWRcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSB2YWx1ZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB0b2tlbml6ZXIgd2hlbiBzZWVpbmcgdGhlIHRva2VuIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgZWl0aGVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdW90ZXMgaGF2ZSBub3QgYmVlbiBvcGVuZWQgeWV0ICh3aGVuIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGJldHdlZW4gc2VwYXJhdG9ycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRva2VuIGhhcyBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkICh3aGVuIHdlIGFjdHVhbGx5IGhhdmUgZXhwbGljaXQgb3BlbmluZyBpLmUuLCBxdW90ZXMgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB3ZSBoYXZlIGltcGxpY2l0IHF1b3RlcyAoaS5lLiwgcXVvdGVzIGFyZSBub3QgdGhlIGZpcnN0IGNoYXJhY3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJywnICYmICghcXVvdGVzT3BlbmVkIHx8IHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgfHwgIWV4cGxpY2l0UXVvdGVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVzT3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRRdW90ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkIGRvdWJsZS1xdW90ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGxpY2l0UXVvdGVzICYmIGkgKyAxIDwgdmFsdWUubGVuZ3RoICYmIHZhbHVlW2kgKyAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuICs9IGM7IC8vIEFwcGVuZCBvbmUgZG91YmxlLXF1b3RlIHRvIHRoZSBjdXJyZW50IHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7IC8vIFNraXAgdGhlIG5leHQgZG91YmxlLXF1b3RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZW5jb3VudGVyIHF1b3RlcyBhZ2FpbiBhZnRlciB0aGV5IHdlcmUgdGhlIGZpcnN0IGNoYXJhY3RlciA9PiB3ZSBjbG9zZSB0aGUgdG9rZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwbGljaXRRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IHF1b3Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChxdW90ZXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1b3RlcyBhcmUgdGhlIGZpcnN0IGNoYXJhY3RlciA9PiBleHBsaWNpdGx5IG9wZW4gdGhlIHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZXNPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc0V4cGxpY2l0bHlDbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rlc09wZW5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbiArPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3Rlc09wZW5lZCAmJiAhcXVvdGVzRXhwbGljaXRseUNsb3NlZCAmJiBleHBsaWNpdFF1b3Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIHRoZSBsYXN0IHRva2VuIGFmdGVyIHRoZSBsb29wIGVuZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWwgPSB0b2tlbnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbCA9IHZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiBhcnJheVZhbC5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJyYXlWYWw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlIS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciB3aXRoIGVtcHR5IHZhbHVlIGlzIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZmlsdGVycykge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleSA9IG9wdHM/LnByZXBlbmRGaWx0ZXJOYW1lID8gdXJsUGFyYW1LZXkuc3Vic3RyaW5nKG9wdHMucHJlcGVuZEZpbHRlck5hbWUubGVuZ3RoKSA6IHVybFBhcmFtS2V5O1xuICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnNbZmlsdGVyS2V5IGFzIGtleW9mIG9iamVjdF0gPSB7dmFsdWU6IHZhbHVlLCBtYXRjaE1vZGU6IG1hdGNoTW9kZSwgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbi8qKlxuICogTWFrZXMgYSBjb3B5IG9mIHRoZSBnaXZlbiBEYXRhTGlzdFBhcmFtcyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz59IHBhcmFtcyAtIFRoZSBEYXRhTGlzdFBhcmFtcyBvYmplY3QgdG8gYmUgY29waWVkLlxuICogQHJldHVybnMge0RhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPn0gLSBSZXR1cm5zIGEgbmV3IGNvcHkgb2YgdGhlIERhdGFMaXN0UGFyYW1zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlEYXRhTGlzdFBhcmFtczxTb3J0cyA9IHN0cmluZywgRmlsdGVycyBleHRlbmRzIGtleW9mIGFueSA9IHN0cmluZz4ocGFyYW1zOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4pOiBEYXRhTGlzdFBhcmFtczxTb3J0cywgRmlsdGVycz4ge1xuICAgIGNvbnN0IGNvcHk6IERhdGFMaXN0UGFyYW1zPFNvcnRzLCBGaWx0ZXJzPiA9IHtcbiAgICAgICAgb2Zmc2V0OiBwYXJhbXMub2Zmc2V0LFxuICAgICAgICBsaW1pdDogcGFyYW1zLmxpbWl0LFxuICAgICAgICBzZWFyY2g6IHBhcmFtcy5zZWFyY2hcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICAgIGNvcHkuc29ydCA9IHBhcmFtcy5zb3J0Py5tYXAocyA9PiAoey4uLnN9KSk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZmlsdGVycykge1xuICAgICAgICBjb3B5LmZpbHRlcnMgPSBPYmplY3QuZW50cmllcyhwYXJhbXMuZmlsdGVycykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZSBhcyBEYXRhTGlzdEZpbHRlcjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgICAgICAgIFtrZXldOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmZpbHRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZS52YWx1ZSkgPyBbLi4uZmlsdGVyVmFsdWUudmFsdWVdIDogZmlsdGVyVmFsdWUudmFsdWVcbiAgICAgICAgICAgICAgICB9IGFzIERhdGFMaXN0RmlsdGVyXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSBhcyBEYXRhTGlzdEZpbHRlcnNUeXBlPEZpbHRlcnM+KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGEgVVJMIHF1ZXJ5IHBhcmFtIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93TnVsbD1mYWxzZV0gLSBJbmRpY2F0ZXMgd2hldGhlciBudWxsIHZhbHVlcyBhcmUgYWxsb3dlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBVUkwgcGFyYW1ldGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS5cbiAqIEB0aHJvd3Mge0NvbW1vbnNJbnRlcm5hbEVycm9yfSBJZiBhbiB1bmRlZmluZWQgdmFsdWUgaXMgcGFzc2VkIHdpdGhvdXQgYWxsb3dOdWxsIHNldCB0byB0cnVlLlxuICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IElmIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBEYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2YWx1ZTogdW5rbm93biwgYWxsb3dOdWxsID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiBhbGxvd051bGwpIHJldHVybiAnbnVsbCc7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignVW5kZWZpbmVkIHZhbHVlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdXJsIHBhcmFtLicpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGVhcmxpZXJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgLm1hcCh2ID0+IGRhdGFMaXN0UGFyYW1zRmlsdGVyVmFsdWVUb1VybFN0cmluZyh2LCBhbGxvd051bGwpKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh2LmluZGV4T2YoJywnKSA+PSAwIHx8IHYuaW5kZXhPZignXCInKSA+PSAwID8gYFwiJHt2LnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cImAgOiB2KSlcbiAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGRhdGVUb0lzb1N0cmluZyh2YWx1ZSwgJ2RhdGVUaW1lJywge3V0YzogdHJ1ZX0pO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcignRmlsdGVyIHZhbHVlIGNhbm5vdCBiZSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbiJdfQ==
@@ -2,9 +2,14 @@ export class FilterGenericDescriptor {
2
2
  constructor(propertyLookupDataProvider) {
3
3
  this._propertyLookup = propertyLookupDataProvider;
4
4
  }
5
+ // must set return types explicitly due to ng-packagr bug: https://github.com/ng-packagr/ng-packagr/issues/1405
5
6
  get propertyLookup() {
6
7
  return this._propertyLookup;
7
8
  }
9
+ get propertySearch() {
10
+ return this._propertySearch;
11
+ }
12
+ // must set return types explicitly due to ng-packagr bug: https://github.com/ng-packagr/ng-packagr/issues/1405
8
13
  get valueLookup() {
9
14
  return this._valueLookup;
10
15
  }
@@ -12,10 +17,15 @@ export class FilterGenericDescriptor {
12
17
  this._valueLookup = valueLookup;
13
18
  return this;
14
19
  }
20
+ withPropertySearch(search = true) {
21
+ this._propertySearch = search;
22
+ return this;
23
+ }
15
24
  copy() {
16
25
  const descriptor = new FilterGenericDescriptor(this._propertyLookup);
26
+ descriptor._propertySearch = this._propertySearch;
17
27
  descriptor._valueLookup = this._valueLookup;
18
28
  return descriptor;
19
29
  }
20
30
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWdlbmVyaWMuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2ZpbHRlci9zcmMvZGVzY3JpcHRvcnMvZmlsdGVyLWdlbmVyaWMuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sdUJBQXVCO0lBSWhDLFlBQVksMEJBQXlFO1FBQ2pGLElBQUksQ0FBQyxlQUFlLEdBQUcsMEJBQTBCLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVNLGVBQWUsQ0FBQyxXQUE4RDtRQUNqRixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sSUFBSTtRQUNQLE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM1QyxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xvb2t1cERhdGFQcm92aWRlckluc3R9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuXG5pbXBvcnQge0ZpbHRlckdlbmVyaWNQcm9wZXJ0eX0gZnJvbSAnLi4vbW9kZWxzL2ZpbHRlci1nZW5lcmljLXByb3BlcnR5Lm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yIHtcbiAgICBwcm90ZWN0ZWQgX3Byb3BlcnR5TG9va3VwOiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PEZpbHRlckdlbmVyaWNQcm9wZXJ0eT47XG4gICAgcHJvdGVjdGVkIF92YWx1ZUxvb2t1cD86IExvb2t1cERhdGFQcm92aWRlckluc3Q8c3RyaW5nLCBhbnksIGFueSwgJ2ZpZWxkJz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eUxvb2t1cERhdGFQcm92aWRlcjogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxGaWx0ZXJHZW5lcmljUHJvcGVydHk+KSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnR5TG9va3VwID0gcHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9wZXJ0eUxvb2t1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5TG9va3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsdWVMb29rdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZUxvb2t1cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFZhbHVlTG9va3VwKHZhbHVlTG9va3VwOiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PHN0cmluZywgYW55LCBhbnksICdmaWVsZCc+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3ZhbHVlTG9va3VwID0gdmFsdWVMb29rdXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvcih0aGlzLl9wcm9wZXJ0eUxvb2t1cCk7XG4gICAgICAgIGRlc2NyaXB0b3IuX3ZhbHVlTG9va3VwID0gdGhpcy5fdmFsdWVMb29rdXA7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cbiJdfQ==
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWdlbmVyaWMuZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2ZpbHRlci9zcmMvZGVzY3JpcHRvcnMvZmlsdGVyLWdlbmVyaWMuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sdUJBQXVCO0lBS2hDLFlBQVksMEJBQXlFO1FBQ2pGLElBQUksQ0FBQyxlQUFlLEdBQUcsMEJBQTBCLENBQUM7SUFDdEQsQ0FBQztJQUVELCtHQUErRztJQUMvRyxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCwrR0FBK0c7SUFDL0csSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRU0sZUFBZSxDQUFDLFdBQThEO1FBQ2pGLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsSUFBSTtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0sSUFBSTtRQUNQLE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNsRCxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDNUMsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb29rdXBEYXRhUHJvdmlkZXJJbnN0fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0vYXBpJztcblxuaW1wb3J0IHtGaWx0ZXJHZW5lcmljUHJvcGVydHl9IGZyb20gJy4uL21vZGVscy9maWx0ZXItZ2VuZXJpYy1wcm9wZXJ0eS5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvciB7XG4gICAgcHJvdGVjdGVkIF9wcm9wZXJ0eUxvb2t1cDogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxGaWx0ZXJHZW5lcmljUHJvcGVydHk+O1xuICAgIHByb3RlY3RlZCBfcHJvcGVydHlTZWFyY2g/OiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfdmFsdWVMb29rdXA/OiBMb29rdXBEYXRhUHJvdmlkZXJJbnN0PHN0cmluZywgYW55LCBhbnksICdmaWVsZCc+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHlMb29rdXBEYXRhUHJvdmlkZXI6IExvb2t1cERhdGFQcm92aWRlckluc3Q8RmlsdGVyR2VuZXJpY1Byb3BlcnR5Pikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0eUxvb2t1cCA9IHByb3BlcnR5TG9va3VwRGF0YVByb3ZpZGVyO1xuICAgIH1cblxuICAgIC8vIG11c3Qgc2V0IHJldHVybiB0eXBlcyBleHBsaWNpdGx5IGR1ZSB0byBuZy1wYWNrYWdyIGJ1ZzogaHR0cHM6Ly9naXRodWIuY29tL25nLXBhY2thZ3IvbmctcGFja2Fnci9pc3N1ZXMvMTQwNVxuICAgIHB1YmxpYyBnZXQgcHJvcGVydHlMb29rdXAoKTogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxGaWx0ZXJHZW5lcmljUHJvcGVydHk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5TG9va3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJvcGVydHlTZWFyY2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eVNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBtdXN0IHNldCByZXR1cm4gdHlwZXMgZXhwbGljaXRseSBkdWUgdG8gbmctcGFja2FnciBidWc6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wYWNrYWdyL25nLXBhY2thZ3IvaXNzdWVzLzE0MDVcbiAgICBwdWJsaWMgZ2V0IHZhbHVlTG9va3VwKCk6IExvb2t1cERhdGFQcm92aWRlckluc3Q8c3RyaW5nLCBhbnksIGFueSwgJ2ZpZWxkJz4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVMb29rdXA7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhWYWx1ZUxvb2t1cCh2YWx1ZUxvb2t1cDogTG9va3VwRGF0YVByb3ZpZGVySW5zdDxzdHJpbmcsIGFueSwgYW55LCAnZmllbGQnPik6IHRoaXMge1xuICAgICAgICB0aGlzLl92YWx1ZUxvb2t1cCA9IHZhbHVlTG9va3VwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFByb3BlcnR5U2VhcmNoKHNlYXJjaCA9IHRydWUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydHlTZWFyY2ggPSBzZWFyY2g7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb3B5KCk6IEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvcih0aGlzLl9wcm9wZXJ0eUxvb2t1cCk7XG4gICAgICAgIGRlc2NyaXB0b3IuX3Byb3BlcnR5U2VhcmNoID0gdGhpcy5fcHJvcGVydHlTZWFyY2g7XG4gICAgICAgIGRlc2NyaXB0b3IuX3ZhbHVlTG9va3VwID0gdGhpcy5fdmFsdWVMb29rdXA7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbn1cbiJdfQ==