@firestitch/report 18.21.2 → 18.21.4

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.
@@ -38,19 +38,12 @@ export interface ReportExportWording {
38
38
  filterFields: Record<number, TextFilterField>;
39
39
  titles: Record<number, string>;
40
40
  }
41
- export interface TextOverflow {
42
- componentId: number;
43
- page: string;
44
- snippet: string;
45
- }
46
41
  export interface UndrawnComponent {
47
42
  componentId: number;
48
43
  page: string;
49
44
  name: string;
50
45
  }
51
46
  export interface BuiltExport {
52
- overflows: TextOverflow[];
53
- overflowNote: string;
54
47
  undrawn: UndrawnComponent[];
55
48
  save: () => void | Promise<void>;
56
49
  }
@@ -79,7 +72,7 @@ export declare const HEADER_FOOTER_NAME = "Header & footer";
79
72
  export declare function emptyLabel(item: CollectedComponent): string;
80
73
  export declare function exportTitle(component: ReportComponent, tokens: TextTokenContext, search?: string | null, crumbs?: readonly string[] | null, filtered?: boolean): string;
81
74
  export declare function isFailed(item: CollectedComponent): boolean;
82
- export declare function textOverflow(component: ReportComponent, page: string, tokens: TextTokenContext): TextOverflow;
75
+ export declare function textSnippet(component: ReportComponent, tokens: TextTokenContext): string;
83
76
  export declare function coverLines(collected: CollectedReport): string[];
84
77
  export declare function exportCell(value: unknown, column: ListColumn & {
85
78
  output?: ListOutputColumn;
@@ -12,7 +12,6 @@ export declare class ReportExportService {
12
12
  private _buildAndSave;
13
13
  private _failureGate;
14
14
  private _undrawnGate;
15
- private _overflowGate;
16
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportExportService, never>;
17
16
  static ɵprov: i0.ɵɵInjectableDeclaration<ReportExportService>;
18
17
  }
@@ -9,7 +9,6 @@ export declare class ReportPdfService {
9
9
  private _guarded;
10
10
  private _undrawnBox;
11
11
  private _renderMaster;
12
- private _recordOverflow;
13
12
  private _titlePage;
14
13
  private _renderText;
15
14
  private _textBox;
@@ -9,14 +9,12 @@ export declare class ReportPptxService {
9
9
  build(collected: CollectedReport): Promise<BuiltExport>;
10
10
  private _renderPage;
11
11
  private _renderMaster;
12
- private _recordOverflow;
13
12
  private _titleSlide;
14
13
  private _renderText;
15
14
  private _addTextBox;
16
15
  private _renderTextStack;
17
16
  private _addTextSegment;
18
17
  private _addTextTable;
19
- private _keptRows;
20
18
  private _tableRows;
21
19
  private _tableCell;
22
20
  private _paragraphRuns;
@@ -15,13 +15,9 @@ export interface TextTableLayout {
15
15
  }
16
16
  export interface TextBlockLayout {
17
17
  contentWidth: number;
18
- contentHeight: number;
19
- usedHeight: number;
20
- overflow: boolean;
21
18
  segments: (TextSegmentLayout | null)[];
22
19
  tables: TextTableLayout[];
23
20
  }
24
- export declare const OVERFLOW_SLACK: number;
25
21
  export declare class ReportTextLayoutService {
26
22
  private readonly _appRef;
27
23
  private readonly _environmentInjector;
@@ -18,6 +18,18 @@ const NUMBER_UNITS = {
18
18
  };
19
19
  // What an abbreviated number's suffix multiplies it by, when a viewer types one.
20
20
  const UNIT_SUFFIXES = { k: 1e3, m: 1e6 };
21
+ // A column written in thousands or millions is typed in them: the grid's
22
+ // filter shows its K or M beside the inputs, so 12 there means 12,000. A K or
23
+ // M typed after the digits wins, so 12K is still 12,000.
24
+ const TYPED_UNITS = {
25
+ [GridUnits.Thousands]: 1e3,
26
+ [GridUnits.Millions]: 1e6,
27
+ };
28
+ // The significant digits a scaled typed number keeps, as fs-grid's own reader
29
+ // keeps them: scaling leaves binary noise behind (12.3% reads
30
+ // 0.12300000000000001, 1.005K 1004.9999999999999), which would move a range's
31
+ // end past the very value it names.
32
+ const TYPED_DIGITS = 15;
21
33
  const YES = 'Yes';
22
34
  const NO = 'No';
23
35
  // A grid tile's formatter: every value written as the report writes it on
@@ -95,22 +107,27 @@ function optionLabel(value, field) {
95
107
  return field.options?.find((option) => option.key === value)?.label ?? null;
96
108
  }
97
109
  // A number a viewer typed, read in the report's locale: its grouping dropped,
98
- // its decimal mark read, a K or M suffix multiplied out, and a percent of a
99
- // ratio-percent report read back to its ratio. null when it is no number.
110
+ // its decimal mark read, a K or M suffix multiplied out (else the column's own
111
+ // thousands or millions), and a percent of a ratio-percent report read back to
112
+ // its ratio. The placement's units and format win over the field's, as they do
113
+ // where the number is written (numberSpec). null when it is no number.
100
114
  function readGridNumber(context, text, field, placement) {
101
115
  const decimal = decimalMark(context.format.locale);
102
116
  const trimmed = text.trim().toLowerCase();
103
- const multiplier = UNIT_SUFFIXES[trimmed.slice(-1)] ?? 1;
117
+ const multiplier = UNIT_SUFFIXES[trimmed.slice(-1)]
118
+ ?? TYPED_UNITS[placement?.units ?? field.units ?? GridUnits.None]
119
+ ?? 1;
104
120
  const digits = trimmed
105
121
  .split(decimal).map((part) => part.replace(/[^0-9-]/g, '')).join('.');
106
122
  const number = digits && digits !== '-' && digits !== '.' ? Number(digits) * multiplier : NaN;
107
123
  if (!Number.isFinite(number)) {
108
124
  return null;
109
125
  }
110
- const isPercent = (placement?.format ?? field.format) === GridFormat.Percent;
111
- return isPercent && context.format.ratioPercent ? number / 100 : number;
126
+ const isRatio = (placement?.format ?? field.format) === GridFormat.Percent && context.format.ratioPercent;
127
+ const value = isRatio ? number / 100 : number;
128
+ return multiplier === 1 && !isRatio ? value : Number(value.toPrecision(TYPED_DIGITS));
112
129
  }
113
130
  function decimalMark(locale) {
114
131
  return numberFormat(locale, {}).formatToParts(1.5).find((part) => part.type === 'decimal')?.value ?? '.';
115
132
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYzlELE1BQU0sYUFBYSxHQUFvRDtJQUNyRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO0lBQzdDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE9BQU87SUFDL0MsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtDQUNsRCxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQW1EO0lBQ25FLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLElBQUk7SUFDeEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsU0FBUztJQUNsRCxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMs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bnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhcnREYXRlTGFiZWwgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LW51bWJlci11bml0cy5lbnVtJztcbmltcG9ydCB7IFJlcG9ydFZhbHVlRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0T3V0cHV0VmFsdWUsIGZvcm1hdFJlcG9ydERhdGUsIG51bWJlckZvcm1hdCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkUmVwb3J0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENoYXJ0R3JhbnVsYXJpdHksIE51bWJlckZvcm1hdFNwZWMsIFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZm9ybWF0UGVyaW9kTGFiZWwgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBHUklEX0dSQU5VTEFSSVRJRVMgfSBmcm9tICcuLi8uLi9yZXBvcnQtZ3JpZC1sYXlvdXQnO1xuXG5cbnR5cGUgR3JpZFBsYWNlbWVudCA9IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCBHcmlkTGV2ZWw7XG5cbi8vIFdoYXQgYSBncmlkIHRpbGUgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBjdXJyZW5jeSBhbmRcbi8vIHBlcmNlbnQgZm9ybSwgdGhlIHpvbmUgaXRzIGluc3RhbnRzIHJlYWQgaW4sIGFuZCB0aGUgcmVwb3J0IGxpbmUgb2YgaXRzXG4vLyBsYXRlc3QgcmVhZCAod2hhdCBlYWNoIG91dHB1dCBmaWVsZCBob2xkcykuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICByZXBvcnQ6IFJlcG9ydEdyaWRSZXBvcnQgfCBudWxsO1xufVxuXG5jb25zdCBWQUxVRV9GT1JNQVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZEZvcm1hdCwgUmVwb3J0VmFsdWVGb3JtYXQ+PiA9IHtcbiAgW0dyaWRGb3JtYXQuTnVtYmVyXTogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLFxuICBbR3JpZEZvcm1hdC5QZXJjZW50XTogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgW0dyaWRGb3JtYXQuQ3VycmVuY3ldOiBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSxcbn07XG5cbmNvbnN0IE5VTUJFUl9VTklUUzogUmVhZG9ubHk8UmVjb3JkPEdyaWRVbml0cywgUmVwb3J0TnVtYmVyVW5pdHM+PiA9IHtcbiAgW0dyaWRVbml0cy5Ob25lXTogUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSxcbiAgW0dyaWRVbml0cy5UaG91c2FuZHNdOiBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHMsXG4gIFtHcmlkVW5pdHMuTWlsbGlvbnNdOiBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9ucyxcbiAgW0dyaWRVbml0cy5BdXRvXTogUmVwb3J0TnVtYmVyVW5pdHMuQXV0byxcbn07XG5cbi8vIFdoYXQgYW4gYWJicmV2aWF0ZWQgbnVtYmVyJ3Mgc3VmZml4IG11bHRpcGxpZXMgaXQgYnksIHdoZW4gYSB2aWV3ZXIgdHlwZXMgb25lLlxuY29uc3QgVU5JVF9TVUZGSVhFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7IGs6IDFlMywgbTogMWU2IH07XG5cbmNvbnN0IFlFUyA9ICdZZXMnO1xuY29uc3QgTk8gPSAnTm8nO1xuXG4vLyBBIGdyaWQgdGlsZSdzIGZvcm1hdHRlcjogZXZlcnkgdmFsdWUgd3JpdHRlbiBhcyB0aGUgcmVwb3J0IHdyaXRlcyBpdCBvblxuLy8gYSBsaXN0IHRvZGF5LiBBbiBvdXRwdXQgbnVtYmVyIHJlYWRzIHRocm91Z2ggZm9ybWF0T3V0cHV0VmFsdWUgd2l0aCB3aGF0XG4vLyB0aGUgcmVwb3J0IGxpbmUgc2F5cyB0aGUgb3V0cHV0IGhvbGRzIChhIGNoYW5nZSBpcyBzaWduZWQsIGEgbWlzc2luZyBwcmlvclxuLy8gcmVhZHMgYXMgdGhlIGxpc3QncyBkYXNoKTsgYSBwbGFpbiBudW1iZXIgdGhyb3VnaCBmb3JtYXROdW1iZXI7IGEga2V5J3Ncbi8vIGRpZ2l0cyBhcyB0aGV5IGFyZTsgYSBkYXRlIGF0IGl0cyBncmFpbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbiBpbnN0YW50XG4vLyBpbiBpdHMgem9uZS4gVGhlIHBsYWNlbWVudCdzIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyB3aW4gb3ZlciB0aGVcbi8vIGZpZWxkJ3MuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0R3JpZEZvcm1hdHRlcihjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCk6IEdyaWRGb3JtYXR0ZXIge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdDogKHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KSA9PiBmb3JtYXRHcmlkVmFsdWUoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpLFxuICAgIHRvTnVtYmVyOiAodGV4dCwgZmllbGQsIHBsYWNlbWVudCkgPT4gcmVhZEdyaWROdW1iZXIoY29udGV4dCwgdGV4dCwgZmllbGQsIHBsYWNlbWVudCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEdyaWRWYWx1ZShcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLk51bWJlcjpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkTnVtYmVyKGNvbnRleHQsIHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KTtcbiAgICBjYXNlIEdyaWRGaWVsZFR5cGUuRGF0ZTpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkRGF0ZShjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkRhdGV0aW1lOlxuICAgICAgcmV0dXJuIGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkJvb2xlYW46XG4gICAgICByZXR1cm4gdmFsdWUgPyBZRVMgOiBOTztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsKHZhbHVlLCBmaWVsZCkgPz8gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICAvLyBBIGtleSwgc3VjaCBhcyBhIGNsaWVudCdzIGlkLCBpcyBhIG5hbWU6IGl0cyBkaWdpdHMgcHJpbnQgYXMgdGhleSBhcmUsIG5ldmVyIGdyb3VwZWRcbiAgaWYgKGZpZWxkLmlkZW50aWZpZXIgJiYgIWlzQWdncmVnYXRlKHBsYWNlbWVudCkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHNwZWMgPSBudW1iZXJTcGVjKGZpZWxkLCBwbGFjZW1lbnQpO1xuICBjb25zdCBvdXRwdXQgPSBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQpID8gbnVsbCA6IGNvbnRleHQucmVwb3J0Py5vdXRwdXRzPy5bZmllbGQubmFtZV07XG5cbiAgcmV0dXJuIG91dHB1dFxuICAgID8gZm9ybWF0T3V0cHV0VmFsdWUodmFsdWUsIG91dHB1dCwgc3BlYywgY29udGV4dC5mb3JtYXQpLnRleHRcbiAgICA6IGZvcm1hdE51bWJlcih2YWx1ZSwgc3BlYywgY29udGV4dC5mb3JtYXQpO1xufVxuXG4vLyBBIGNhbGVuZGFyIGRhdGUgYXQgdGhlIGdyYWluIGl0IHByaW50cyBhdDogdGhlIHBsYWNlbWVudCdzLCBlbHNlIHRoZVxuLy8gZmllbGQncyBvd24sIHdoaWNoIG9uIGEgdGltZSBheGlzIGlzIHRoZSByZXBvcnQncyBncm91cC1ieS4gQSBxdWFydGVyIHJlYWRzXG4vLyBcIlEzIDIwMjNcIiwgYSBtb250aCBcIkp1bCAyMDIzXCIgYW5kIGEgeWVhciBcIjIwMjNcIiwgYXMgdGhlIHJlcG9ydCdzIGNoYXJ0c1xuLy8gbGFiZWwgdGhlbSwgcmF0aGVyIHRoYW4gYXMgdGhlaXIgZmlyc3QgZGF5OyBhIHdlZWssIGxpa2UgYSBjaGFydCdzLCByZWFkcyBhc1xuLy8gdGhlIGRheSBpdCBzdGFydHMuIEEgZGF5IHJlYWRzIGFzIHRoZSByZXBvcnQgd3JpdGVzIGEgZGF0ZS5cbmZ1bmN0aW9uIGZvcm1hdEdyaWREYXRlKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBncmFudWxhcml0eSA9IChwbGFjZW1lbnQgYXMgR3JpZERldGFpbCB8IEdyaWRMZXZlbCB8IHVuZGVmaW5lZCk/LmdyYW51bGFyaXR5ID8/IGZpZWxkLmdyYW51bGFyaXRpZXM/LlswXTtcbiAgY29uc3QgY2hhcnRHcmFudWxhcml0eSA9IChPYmplY3Qua2V5cyhHUklEX0dSQU5VTEFSSVRJRVMpIGFzIENoYXJ0R3JhbnVsYXJpdHlbXSlcbiAgICAuZmluZCgobmFtZSkgPT4gR1JJRF9HUkFOVUxBUklUSUVTW25hbWVdID09PSBncmFudWxhcml0eSk7XG5cbiAgcmV0dXJuIGNoYXJ0R3JhbnVsYXJpdHkgJiYgY2hhcnRHcmFudWxhcml0eSAhPT0gJ2RheScgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgID8gZm9ybWF0UGVyaW9kTGFiZWwodmFsdWUuc2xpY2UoMCwgMTApLCBjaGFydEdyYW51bGFyaXR5LCBmYWxzZSwgY29udGV4dC5mb3JtYXQubG9jYWxlLCBSZXBvcnRDaGFydERhdGVMYWJlbC5Mb25nKVxuICAgIDogZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXQubG9jYWxlKTtcbn1cblxuLy8gVGhlIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyBhIG51bWJlciBpcyB3cml0dGVuIHdpdGg6IHRoZSBwbGFjZW1lbnQncyxcbi8vIGVsc2UgdGhlIGZpZWxkJ3MuXG5mdW5jdGlvbiBudW1iZXJTcGVjKGZpZWxkOiBHcmlkRmllbGQsIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQpOiBOdW1iZXJGb3JtYXRTcGVjIHtcbiAgY29uc3QgcGxhY2VkID0gcGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcm1hdCA9IHBsYWNlZD8uZm9ybWF0ID8/IGZpZWxkLmZvcm1hdDtcbiAgY29uc3QgcHJlY2lzaW9uID0gcGxhY2VkPy5wcmVjaXNpb24gPz8gZmllbGQucHJlY2lzaW9uO1xuICBjb25zdCB1bml0cyA9IHBsYWNlZD8udW5pdHMgPz8gZmllbGQudW5pdHM7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oZm9ybWF0ID8geyBmb3JtYXQ6IFZBTFVFX0ZPUk1BVFNbZm9ybWF0XSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyA/IHsgcHJlY2lzaW9uIH0gOiB7fSksXG4gICAgLi4uKHVuaXRzID8geyB1bml0czogTlVNQkVSX1VOSVRTW3VuaXRzXSB9IDoge30pLFxuICB9O1xufVxuXG4vLyBBIHZhbHVlIHBsYWNlbWVudCBpcyBhbiBhZ2dyZWdhdGUgb2YgdGhlIGZpZWxkLCBub3QgdGhlIG91dHB1dCBpdHNlbGYuXG5mdW5jdGlvbiBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShwbGFjZW1lbnQgYXMgR3JpZFZhbHVlIHwgdW5kZWZpbmVkKT8uYWdncmVnYXRpb247XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKHZhbHVlOiB1bmtub3duLCBmaWVsZDogR3JpZEZpZWxkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiBmaWVsZC5vcHRpb25zPy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5rZXkgPT09IHZhbHVlKT8ubGFiZWwgPz8gbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgYSB2aWV3ZXIgdHlwZWQsIHJlYWQgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTogaXRzIGdyb3VwaW5nIGRyb3BwZWQsXG4vLyBpdHMgZGVjaW1hbCBtYXJrIHJlYWQsIGEgSyBvciBNIHN1ZmZpeCBtdWx0aXBsaWVkIG91dCwgYW5kIGEgcGVyY2VudCBvZiBhXG4vLyByYXRpby1wZXJjZW50IHJlcG9ydCByZWFkIGJhY2sgdG8gaXRzIHJhdGlvLiBudWxsIHdoZW4gaXQgaXMgbm8gbnVtYmVyLlxuZnVuY3Rpb24gcmVhZEdyaWROdW1iZXIoXG4gIGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0LFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwsXG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZGVjaW1hbCA9IGRlY2ltYWxNYXJrKGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gIGNvbnN0IHRyaW1tZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtdWx0aXBsaWVyID0gVU5JVF9TVUZGSVhFU1t0cmltbWVkLnNsaWNlKC0xKV0gPz8gMTtcbiAgY29uc3QgZGlnaXRzID0gdHJpbW1lZFxuICAgIC5zcGxpdChkZWNpbWFsKS5tYXAoKHBhcnQpID0+IHBhcnQucmVwbGFjZSgvW14wLTktXS9nLCAnJykpLmpvaW4oJy4nKTtcbiAgY29uc3QgbnVtYmVyID0gZGlnaXRzICYmIGRpZ2l0cyAhPT0gJy0nICYmIGRpZ2l0cyAhPT0gJy4nID8gTnVtYmVyKGRpZ2l0cykgKiBtdWx0aXBsaWVyIDogTmFOO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlzUGVyY2VudCA9IChwbGFjZW1lbnQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQpID09PSBHcmlkRm9ybWF0LlBlcmNlbnQ7XG5cbiAgcmV0dXJuIGlzUGVyY2VudCAmJiBjb250ZXh0LmZvcm1hdC5yYXRpb1BlcmNlbnQgPyBudW1iZXIgLyAxMDAgOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGRlY2ltYWxNYXJrKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlckZvcm1hdChsb2NhbGUsIHt9KS5mb3JtYXRUb1BhcnRzKDEuNSkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnZGVjaW1hbCcpPy52YWx1ZSA/PyAnLic7XG59XG4iXX0=
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYzlELE1BQU0sYUFBYSxHQUFvRDtJQUNyRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO0lBQzdDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE9BQU87SUFDL0MsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtDQUNsRCxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQW1EO0lBQ25FLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLElBQUk7SUFDeEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsU0FBUztJQUNsRCxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMs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Q0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDMUcsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFOUMsT0FBTyxVQUFVLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFDakMsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhcnREYXRlTGFiZWwgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LW51bWJlci11bml0cy5lbnVtJztcbmltcG9ydCB7IFJlcG9ydFZhbHVlRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0T3V0cHV0VmFsdWUsIGZvcm1hdFJlcG9ydERhdGUsIG51bWJlckZvcm1hdCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkUmVwb3J0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENoYXJ0R3JhbnVsYXJpdHksIE51bWJlckZvcm1hdFNwZWMsIFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZm9ybWF0UGVyaW9kTGFiZWwgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBHUklEX0dSQU5VTEFSSVRJRVMgfSBmcm9tICcuLi8uLi9yZXBvcnQtZ3JpZC1sYXlvdXQnO1xuXG5cbnR5cGUgR3JpZFBsYWNlbWVudCA9IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCBHcmlkTGV2ZWw7XG5cbi8vIFdoYXQgYSBncmlkIHRpbGUgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBjdXJyZW5jeSBhbmRcbi8vIHBlcmNlbnQgZm9ybSwgdGhlIHpvbmUgaXRzIGluc3RhbnRzIHJlYWQgaW4sIGFuZCB0aGUgcmVwb3J0IGxpbmUgb2YgaXRzXG4vLyBsYXRlc3QgcmVhZCAod2hhdCBlYWNoIG91dHB1dCBmaWVsZCBob2xkcykuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICByZXBvcnQ6IFJlcG9ydEdyaWRSZXBvcnQgfCBudWxsO1xufVxuXG5jb25zdCBWQUxVRV9GT1JNQVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZEZvcm1hdCwgUmVwb3J0VmFsdWVGb3JtYXQ+PiA9IHtcbiAgW0dyaWRGb3JtYXQuTnVtYmVyXTogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLFxuICBbR3JpZEZvcm1hdC5QZXJjZW50XTogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgW0dyaWRGb3JtYXQuQ3VycmVuY3ldOiBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSxcbn07XG5cbmNvbnN0IE5VTUJFUl9VTklUUzogUmVhZG9ubHk8UmVjb3JkPEdyaWRVbml0cywgUmVwb3J0TnVtYmVyVW5pdHM+PiA9IHtcbiAgW0dyaWRVbml0cy5Ob25lXTogUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSxcbiAgW0dyaWRVbml0cy5UaG91c2FuZHNdOiBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHMsXG4gIFtHcmlkVW5pdHMuTWlsbGlvbnNdOiBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9ucyxcbiAgW0dyaWRVbml0cy5BdXRvXTogUmVwb3J0TnVtYmVyVW5pdHMuQXV0byxcbn07XG5cbi8vIFdoYXQgYW4gYWJicmV2aWF0ZWQgbnVtYmVyJ3Mgc3VmZml4IG11bHRpcGxpZXMgaXQgYnksIHdoZW4gYSB2aWV3ZXIgdHlwZXMgb25lLlxuY29uc3QgVU5JVF9TVUZGSVhFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7IGs6IDFlMywgbTogMWU2IH07XG5cbi8vIEEgY29sdW1uIHdyaXR0ZW4gaW4gdGhvdXNhbmRzIG9yIG1pbGxpb25zIGlzIHR5cGVkIGluIHRoZW06IHRoZSBncmlkJ3Ncbi8vIGZpbHRlciBzaG93cyBpdHMgSyBvciBNIGJlc2lkZSB0aGUgaW5wdXRzLCBzbyAxMiB0aGVyZSBtZWFucyAxMiwwMDAuIEEgSyBvclxuLy8gTSB0eXBlZCBhZnRlciB0aGUgZGlnaXRzIHdpbnMsIHNvIDEySyBpcyBzdGlsbCAxMiwwMDAuXG5jb25zdCBUWVBFRF9VTklUUzogUmVhZG9ubHk8UGFydGlhbDxSZWNvcmQ8R3JpZFVuaXRzLCBudW1iZXI+Pj4gPSB7XG4gIFtHcmlkVW5pdHMuVGhvdXNhbmRzXTogMWUzLFxuICBbR3JpZFVuaXRzLk1pbGxpb25zXTogMWU2LFxufTtcblxuLy8gVGhlIHNpZ25pZmljYW50IGRpZ2l0cyBhIHNjYWxlZCB0eXBlZCBudW1iZXIga2VlcHMsIGFzIGZzLWdyaWQncyBvd24gcmVhZGVyXG4vLyBrZWVwcyB0aGVtOiBzY2FsaW5nIGxlYXZlcyBiaW5hcnkgbm9pc2UgYmVoaW5kICgxMi4zJSByZWFkc1xuLy8gMC4xMjMwMDAwMDAwMDAwMDAwMSwgMS4wMDVLIDEwMDQuOTk5OTk5OTk5OTk5OSksIHdoaWNoIHdvdWxkIG1vdmUgYSByYW5nZSdzXG4vLyBlbmQgcGFzdCB0aGUgdmVyeSB2YWx1ZSBpdCBuYW1lcy5cbmNvbnN0IFRZUEVEX0RJR0lUUyA9IDE1O1xuXG5jb25zdCBZRVMgPSAnWWVzJztcbmNvbnN0IE5PID0gJ05vJztcblxuLy8gQSBncmlkIHRpbGUncyBmb3JtYXR0ZXI6IGV2ZXJ5IHZhbHVlIHdyaXR0ZW4gYXMgdGhlIHJlcG9ydCB3cml0ZXMgaXQgb25cbi8vIGEgbGlzdCB0b2RheS4gQW4gb3V0cHV0IG51bWJlciByZWFkcyB0aHJvdWdoIGZvcm1hdE91dHB1dFZhbHVlIHdpdGggd2hhdFxuLy8gdGhlIHJlcG9ydCBsaW5lIHNheXMgdGhlIG91dHB1dCBob2xkcyAoYSBjaGFuZ2UgaXMgc2lnbmVkLCBhIG1pc3NpbmcgcHJpb3Jcbi8vIHJlYWRzIGFzIHRoZSBsaXN0J3MgZGFzaCk7IGEgcGxhaW4gbnVtYmVyIHRocm91Z2ggZm9ybWF0TnVtYmVyOyBhIGtleSdzXG4vLyBkaWdpdHMgYXMgdGhleSBhcmU7IGEgZGF0ZSBhdCBpdHMgZ3JhaW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgYW4gaW5zdGFudFxuLy8gaW4gaXRzIHpvbmUuIFRoZSBwbGFjZW1lbnQncyBmb3JtYXQsIHByZWNpc2lvbiBhbmQgdW5pdHMgd2luIG92ZXIgdGhlXG4vLyBmaWVsZCdzLlxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEdyaWRGb3JtYXR0ZXIoY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQpOiBHcmlkRm9ybWF0dGVyIHtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6ICh2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCkgPT4gZm9ybWF0R3JpZFZhbHVlKGNvbnRleHQsIHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KSxcbiAgICB0b051bWJlcjogKHRleHQsIGZpZWxkLCBwbGFjZW1lbnQpID0+IHJlYWRHcmlkTnVtYmVyKGNvbnRleHQsIHRleHQsIGZpZWxkLCBwbGFjZW1lbnQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRHcmlkVmFsdWUoXG4gIGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0LFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmllbGQ6IEdyaWRGaWVsZCxcbiAgcGxhY2VtZW50PzogR3JpZFBsYWNlbWVudCxcbik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5OdW1iZXI6XG4gICAgICByZXR1cm4gZm9ybWF0R3JpZE51bWJlcihjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkRhdGU6XG4gICAgICByZXR1cm4gZm9ybWF0R3JpZERhdGUoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5EYXRldGltZTpcbiAgICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5Cb29sZWFuOlxuICAgICAgcmV0dXJuIHZhbHVlID8gWUVTIDogTk87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25MYWJlbCh2YWx1ZSwgZmllbGQpID8/IFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0R3JpZE51bWJlcihcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgLy8gQSBrZXksIHN1Y2ggYXMgYSBjbGllbnQncyBpZCwgaXMgYSBuYW1lOiBpdHMgZGlnaXRzIHByaW50IGFzIHRoZXkgYXJlLCBuZXZlciBncm91cGVkXG4gIGlmIChmaWVsZC5pZGVudGlmaWVyICYmICFpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQpKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzcGVjID0gbnVtYmVyU3BlYyhmaWVsZCwgcGxhY2VtZW50KTtcbiAgY29uc3Qgb3V0cHV0ID0gaXNBZ2dyZWdhdGUocGxhY2VtZW50KSA/IG51bGwgOiBjb250ZXh0LnJlcG9ydD8ub3V0cHV0cz8uW2ZpZWxkLm5hbWVdO1xuXG4gIHJldHVybiBvdXRwdXRcbiAgICA/IGZvcm1hdE91dHB1dFZhbHVlKHZhbHVlLCBvdXRwdXQsIHNwZWMsIGNvbnRleHQuZm9ybWF0KS50ZXh0XG4gICAgOiBmb3JtYXROdW1iZXIodmFsdWUsIHNwZWMsIGNvbnRleHQuZm9ybWF0KTtcbn1cblxuLy8gQSBjYWxlbmRhciBkYXRlIGF0IHRoZSBncmFpbiBpdCBwcmludHMgYXQ6IHRoZSBwbGFjZW1lbnQncywgZWxzZSB0aGVcbi8vIGZpZWxkJ3Mgb3duLCB3aGljaCBvbiBhIHRpbWUgYXhpcyBpcyB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkuIEEgcXVhcnRlciByZWFkc1xuLy8gXCJRMyAyMDIzXCIsIGEgbW9udGggXCJKdWwgMjAyM1wiIGFuZCBhIHllYXIgXCIyMDIzXCIsIGFzIHRoZSByZXBvcnQncyBjaGFydHNcbi8vIGxhYmVsIHRoZW0sIHJhdGhlciB0aGFuIGFzIHRoZWlyIGZpcnN0IGRheTsgYSB3ZWVrLCBsaWtlIGEgY2hhcnQncywgcmVhZHMgYXNcbi8vIHRoZSBkYXkgaXQgc3RhcnRzLiBBIGRheSByZWFkcyBhcyB0aGUgcmVwb3J0IHdyaXRlcyBhIGRhdGUuXG5mdW5jdGlvbiBmb3JtYXRHcmlkRGF0ZShcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JhbnVsYXJpdHkgPSAocGxhY2VtZW50IGFzIEdyaWREZXRhaWwgfCBHcmlkTGV2ZWwgfCB1bmRlZmluZWQpPy5ncmFudWxhcml0eSA/PyBmaWVsZC5ncmFudWxhcml0aWVzPy5bMF07XG4gIGNvbnN0IGNoYXJ0R3JhbnVsYXJpdHkgPSAoT2JqZWN0LmtleXMoR1JJRF9HUkFOVUxBUklUSUVTKSBhcyBDaGFydEdyYW51bGFyaXR5W10pXG4gICAgLmZpbmQoKG5hbWUpID0+IEdSSURfR1JBTlVMQVJJVElFU1tuYW1lXSA9PT0gZ3JhbnVsYXJpdHkpO1xuXG4gIHJldHVybiBjaGFydEdyYW51bGFyaXR5ICYmIGNoYXJ0R3JhbnVsYXJpdHkgIT09ICdkYXknICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICA/IGZvcm1hdFBlcmlvZExhYmVsKHZhbHVlLnNsaWNlKDAsIDEwKSwgY2hhcnRHcmFudWxhcml0eSwgZmFsc2UsIGNvbnRleHQuZm9ybWF0LmxvY2FsZSwgUmVwb3J0Q2hhcnREYXRlTGFiZWwuTG9uZylcbiAgICA6IGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG59XG5cbi8vIFRoZSBmb3JtYXQsIHByZWNpc2lvbiBhbmQgdW5pdHMgYSBudW1iZXIgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcGxhY2VtZW50J3MsXG4vLyBlbHNlIHRoZSBmaWVsZCdzLlxuZnVuY3Rpb24gbnVtYmVyU3BlYyhmaWVsZDogR3JpZEZpZWxkLCBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIGNvbnN0IHBsYWNlZCA9IHBsYWNlbWVudCBhcyBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JtYXQgPSBwbGFjZWQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQ7XG4gIGNvbnN0IHByZWNpc2lvbiA9IHBsYWNlZD8ucHJlY2lzaW9uID8/IGZpZWxkLnByZWNpc2lvbjtcbiAgY29uc3QgdW5pdHMgPSBwbGFjZWQ/LnVuaXRzID8/IGZpZWxkLnVuaXRzO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGZvcm1hdCA/IHsgZm9ybWF0OiBWQUxVRV9GT1JNQVRTW2Zvcm1hdF0gfSA6IHt9KSxcbiAgICAuLi4odHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicgPyB7IHByZWNpc2lvbiB9IDoge30pLFxuICAgIC4uLih1bml0cyA/IHsgdW5pdHM6IE5VTUJFUl9VTklUU1t1bml0c10gfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gQSB2YWx1ZSBwbGFjZW1lbnQgaXMgYW4gYWdncmVnYXRlIG9mIHRoZSBmaWVsZCwgbm90IHRoZSBvdXRwdXQgaXRzZWxmLlxuZnVuY3Rpb24gaXNBZ2dyZWdhdGUocGxhY2VtZW50PzogR3JpZFBsYWNlbWVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEocGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IHVuZGVmaW5lZCk/LmFnZ3JlZ2F0aW9uO1xufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbCh2YWx1ZTogdW5rbm93biwgZmllbGQ6IEdyaWRGaWVsZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gZmllbGQub3B0aW9ucz8uZmluZCgob3B0aW9uKSA9PiBvcHRpb24ua2V5ID09PSB2YWx1ZSk/LmxhYmVsID8/IG51bGw7XG59XG5cbi8vIEEgbnVtYmVyIGEgdmlld2VyIHR5cGVkLCByZWFkIGluIHRoZSByZXBvcnQncyBsb2NhbGU6IGl0cyBncm91cGluZyBkcm9wcGVkLFxuLy8gaXRzIGRlY2ltYWwgbWFyayByZWFkLCBhIEsgb3IgTSBzdWZmaXggbXVsdGlwbGllZCBvdXQgKGVsc2UgdGhlIGNvbHVtbidzIG93blxuLy8gdGhvdXNhbmRzIG9yIG1pbGxpb25zKSwgYW5kIGEgcGVyY2VudCBvZiBhIHJhdGlvLXBlcmNlbnQgcmVwb3J0IHJlYWQgYmFjayB0b1xuLy8gaXRzIHJhdGlvLiBUaGUgcGxhY2VtZW50J3MgdW5pdHMgYW5kIGZvcm1hdCB3aW4gb3ZlciB0aGUgZmllbGQncywgYXMgdGhleSBkb1xuLy8gd2hlcmUgdGhlIG51bWJlciBpcyB3cml0dGVuIChudW1iZXJTcGVjKS4gbnVsbCB3aGVuIGl0IGlzIG5vIG51bWJlci5cbmZ1bmN0aW9uIHJlYWRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdGV4dDogc3RyaW5nLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGRlY2ltYWwgPSBkZWNpbWFsTWFyayhjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbXVsdGlwbGllciA9IFVOSVRfU1VGRklYRVNbdHJpbW1lZC5zbGljZSgtMSldXG4gICAgPz8gVFlQRURfVU5JVFNbcGxhY2VtZW50Py51bml0cyA/PyBmaWVsZC51bml0cyA/PyBHcmlkVW5pdHMuTm9uZV1cbiAgICA/PyAxO1xuICBjb25zdCBkaWdpdHMgPSB0cmltbWVkXG4gICAgLnNwbGl0KGRlY2ltYWwpLm1hcCgocGFydCkgPT4gcGFydC5yZXBsYWNlKC9bXjAtOS1dL2csICcnKSkuam9pbignLicpO1xuICBjb25zdCBudW1iZXIgPSBkaWdpdHMgJiYgZGlnaXRzICE9PSAnLScgJiYgZGlnaXRzICE9PSAnLicgPyBOdW1iZXIoZGlnaXRzKSAqIG11bHRpcGxpZXIgOiBOYU47XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtYmVyKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaXNSYXRpbyA9IChwbGFjZW1lbnQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQpID09PSBHcmlkRm9ybWF0LlBlcmNlbnQgJiYgY29udGV4dC5mb3JtYXQucmF0aW9QZXJjZW50O1xuICBjb25zdCB2YWx1ZSA9IGlzUmF0aW8gPyBudW1iZXIgLyAxMDAgOiBudW1iZXI7XG5cbiAgcmV0dXJuIG11bHRpcGxpZXIgPT09IDEgJiYgIWlzUmF0aW8gPyB2YWx1ZSA6IE51bWJlcih2YWx1ZS50b1ByZWNpc2lvbihUWVBFRF9ESUdJVFMpKTtcbn1cblxuZnVuY3Rpb24gZGVjaW1hbE1hcmsobG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbnVtYmVyRm9ybWF0KGxvY2FsZSwge30pLmZvcm1hdFRvUGFydHMoMS41KS5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdkZWNpbWFsJyk/LnZhbHVlID8/ICcuJztcbn1cbiJdfQ==
@@ -373,7 +373,7 @@ export class ComponentTextComponent {
373
373
  }
374
374
  }
375
375
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
376
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentTextComponent, isStandalone: true, selector: "app-report-component-text", inputs: { html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, tokens: { classPropertyName: "tokens", publicName: "tokens", isSignal: true, isRequired: true, transformFunction: null }, editing: { classPropertyName: "editing", publicName: "editing", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, shownElsewhere: { classPropertyName: "shownElsewhere", publicName: "shownElsewhere", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", editEnded: "editEnded", valueSettings: "valueSettings" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "style.--text-size": "typeScale.body", "style.--text-h1-size": "typeScale.h1", "style.--text-h2-size": "typeScale.h2", "style.--text-h3-size": "typeScale.h3", "style.--text-color": "typeScale.color", "style.--text-table-border": "tableLook.border", "style.--text-table-padding": "tableLook.padding", "style.--text-table-margin": "tableLook.margin" } }, viewQueries: [{ propertyName: "_editor", first: true, predicate: FsHtmlEditorComponent, descendants: true, isSignal: true }, { propertyName: "_valuePopoverAnchor", first: true, predicate: ["valuePopoverAnchor"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (editing()) {\n <!-- Floating fs-html-editor: no frame, Froala's inline toolbar pops up over\n the text. pointerdown stays here so a press in the text never starts a\n drag of the block or a pan of the canvas. -->\n <fs-html-editor\n class=\"text-content editing\"\n [config]=\"editorConfig\"\n [(ngModel)]=\"draft\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n </fs-html-editor>\n\n <!-- One notice at a time: an edit stopped because it would have removed\n values, an edit that left values no text reads, or a refused command.\n mousedown keeps the editor's focus and selection, so Undo reaches it. -->\n @if (notice(); as current) {\n <div\n class=\"value-notice fs-row.gap-sm\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\">\n @switch (current.kind) {\n @case ('blocked') {\n @if (current.block.removeSelection) {\n <span>\n This selection includes {{ current.block.count }} {{ current.block.count === 1 ? 'value' : 'values' }}.\n </span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"removeBlockedSelection()\">\n Remove text and {{ current.block.count === 1 ? 'value' : current.block.count + ' values' }}\n </button>\n } @else {\n <span>To take a value out, select it, then press Delete.</span>\n }\n }\n @case ('unused') {\n <span>{{ current.count }} {{ current.count === 1 ? 'value' : 'values' }} moved to Not used</span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"undoValuesUnused()\">\n Undo\n </button>\n }\n @case ('message') {\n <span>{{ current.text }}</span>\n }\n }\n <button\n mat-button\n type=\"button\"\n (click)=\"dismissNotice()\">\n Dismiss\n </button>\n </div>\n }\n} @else if (editMode() && isBlank()) {\n <!-- An empty block while the canvas is laid out: a hint in the block's own\n type, never its html, so nothing is typed onto it or exported. -->\n <div class=\"text-content text-hint\">Double-click to edit</div>\n} @else {\n <div\n class=\"text-content\"\n [innerHTML]=\"displayHtml()\">\n </div>\n}\n\n<!-- A clicked value chip's popover: an fs-popover on an invisible anchor laid\n over the chip (the chip itself belongs to the editor). Outside the editing\n block, so a popover still open when editing ends closes the usual way. -->\n<span\n #valuePopoverAnchor\n class=\"value-popover-anchor\"\n aria-hidden=\"true\"\n fsPopover\n trigger=\"click\"\n wrapperClass=\"value-popover-wrapper\"\n [template]=\"valuePopoverTemplate\"\n [indication]=\"false\"\n [maxWidth]=\"320\"\n [style.left.px]=\"valuePopover()?.left\"\n [style.top.px]=\"valuePopover()?.top\"\n [style.width.px]=\"valuePopover()?.width\"\n [style.height.px]=\"valuePopover()?.height\">\n</span>\n<ng-template\n #valuePopoverTemplate\n let-popover=\"popover\">\n <!-- What the value is, and its settings (where it can also be deleted); a\n chip naming no value on the page has no settings. -->\n <div class=\"value-popover fs-row\">\n <div class=\"fs-flex\">\n <div class=\"value-popover-name\">{{ valuePopoverValue()?.name ?? valuePopover()?.key }}</div>\n @if (!valuePopoverValue()) {\n <div class=\"small\">Not a value on this page</div>\n }\n </div>\n @if (valuePopoverValue()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"value-popover-settings\"\n matTooltip=\"Settings\"\n (click)=\"openValueSettings(popover)\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;height:100%}.text-content{display:block;width:100%;height:100%;overflow:hidden;font-family:Arial,Helvetica,sans-serif;font-size:var(--text-size);line-height:1.25;color:var(--text-color);word-wrap:break-word;letter-spacing:normal;word-spacing:normal;font-weight:400;font-style:normal;text-transform:none;white-space:normal}.text-content ::ng-deep p,.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3,.text-content ::ng-deep ul,.text-content ::ng-deep ol{margin:0}.text-content ::ng-deep h1{font-size:var(--text-h1-size)}.text-content ::ng-deep h2{font-size:var(--text-h2-size)}.text-content ::ng-deep h3{font-size:var(--text-h3-size)}.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3{font-weight:700;line-height:1.2}.text-content ::ng-deep ul,.text-content ::ng-deep ol{padding-left:1.4em}.text-content ::ng-deep p:empty:before{content:\"\\200b\"}.text-content ::ng-deep a{color:inherit}.text-content ::ng-deep table{border-collapse:collapse;margin:var(--text-table-margin) 0}.text-content ::ng-deep th,.text-content ::ng-deep td{border:var(--text-table-border);padding:var(--text-table-padding);vertical-align:middle;text-align:left}.text-content ::ng-deep th{text-align:center;font-weight:700}.text-content.editing{overflow:auto;cursor:text}.text-content.editing ::ng-deep [data-embed-key],.text-content.editing ::ng-deep [data-embed-field]{padding:0 2px;border-radius:3px;background-color:#4e79a729;-webkit-user-select:all;user-select:all}.text-content.editing ::ng-deep [data-embed-key]{cursor:pointer}.text-content.editing ::ng-deep [data-embed-key]:hover{background-color:#4e79a747}.text-content.editing ::ng-deep [data-embed-missing]{background-color:#e1575924;outline:1px dashed rgba(225,87,89,.7)}.text-content.editing ::ng-deep th,.text-content.editing ::ng-deep tfoot td{background-color:transparent}.text-content.editing ::ng-deep .fr-table-selector{display:none}.text-content.editing ::ng-deep .fr-table-selection-hover{outline:none}.text-hint{color:#9aa5b1;-webkit-user-select:none;user-select:none}.value-popover-anchor{position:absolute;pointer-events:none}::ng-deep .value-popover-wrapper .popover-content{padding:15px!important}.value-popover{gap:15px}.value-popover-name{font-weight:600}.value-popover-settings{--mdc-icon-button-state-layer-size: 24px;width:24px;height:24px;padding:0}.value-notice{position:absolute;top:100%;left:0;z-index:2;margin-top:4px;padding:2px 4px 2px 10px;border:1px solid #d9dee3;border-radius:4px;background:#fff;white-space:nowrap;font-family:Arial,Helvetica,sans-serif}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FsHtmlEditorComponent, selector: "fs-html-editor", inputs: ["config", "disabled"] }, { kind: "directive", type: FsPopoverDirective, selector: "[fsPopover]", inputs: ["text", "template", "data", "leaveDelay", "showDelay", "maxWidth", "maxHeight", "wrapperClass", "autoShow", "autoClose", "loadingDiameter", "loading", "indication", "position", "theme", "size", "trigger", "enabled", "panel"], outputs: ["closed"], exportAs: ["fsPopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
376
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentTextComponent, isStandalone: true, selector: "app-report-component-text", inputs: { html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, tokens: { classPropertyName: "tokens", publicName: "tokens", isSignal: true, isRequired: true, transformFunction: null }, editing: { classPropertyName: "editing", publicName: "editing", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, shownElsewhere: { classPropertyName: "shownElsewhere", publicName: "shownElsewhere", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { saved: "saved", editEnded: "editEnded", valueSettings: "valueSettings" }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "style.--text-size": "typeScale.body", "style.--text-h1-size": "typeScale.h1", "style.--text-h2-size": "typeScale.h2", "style.--text-h3-size": "typeScale.h3", "style.--text-color": "typeScale.color", "style.--text-table-border": "tableLook.border", "style.--text-table-padding": "tableLook.padding", "style.--text-table-margin": "tableLook.margin" } }, viewQueries: [{ propertyName: "_editor", first: true, predicate: FsHtmlEditorComponent, descendants: true, isSignal: true }, { propertyName: "_valuePopoverAnchor", first: true, predicate: ["valuePopoverAnchor"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@if (editing()) {\n <!-- Floating fs-html-editor: no frame, Froala's inline toolbar pops up over\n the text. pointerdown stays here so a press in the text never starts a\n drag of the block or a pan of the canvas. -->\n <fs-html-editor\n class=\"text-content editing\"\n [config]=\"editorConfig\"\n [(ngModel)]=\"draft\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n </fs-html-editor>\n\n <!-- One notice at a time: an edit stopped because it would have removed\n values, an edit that left values no text reads, or a refused command.\n mousedown keeps the editor's focus and selection, so Undo reaches it. -->\n @if (notice(); as current) {\n <div\n class=\"value-notice fs-row.gap-sm\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\">\n @switch (current.kind) {\n @case ('blocked') {\n @if (current.block.removeSelection) {\n <span>\n This selection includes {{ current.block.count }} {{ current.block.count === 1 ? 'value' : 'values' }}.\n </span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"removeBlockedSelection()\">\n Remove text and {{ current.block.count === 1 ? 'value' : current.block.count + ' values' }}\n </button>\n } @else {\n <span>To take a value out, select it, then press Delete.</span>\n }\n }\n @case ('unused') {\n <span>{{ current.count }} {{ current.count === 1 ? 'value' : 'values' }} moved to Not used</span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"undoValuesUnused()\">\n Undo\n </button>\n }\n @case ('message') {\n <span>{{ current.text }}</span>\n }\n }\n <button\n mat-button\n type=\"button\"\n (click)=\"dismissNotice()\">\n Dismiss\n </button>\n </div>\n }\n} @else if (editMode() && isBlank()) {\n <!-- An empty block while the canvas is laid out: a hint in the block's own\n type, never its html, so nothing is typed onto it or exported. -->\n <div class=\"text-content text-hint\">Double-click to edit</div>\n} @else {\n <div\n class=\"text-content\"\n [innerHTML]=\"displayHtml()\">\n </div>\n}\n\n<!-- A clicked value chip's popover: an fs-popover on an invisible anchor laid\n over the chip (the chip itself belongs to the editor). Outside the editing\n block, so a popover still open when editing ends closes the usual way. -->\n<span\n #valuePopoverAnchor\n class=\"value-popover-anchor\"\n aria-hidden=\"true\"\n fsPopover\n trigger=\"click\"\n wrapperClass=\"value-popover-wrapper\"\n [template]=\"valuePopoverTemplate\"\n [indication]=\"false\"\n [maxWidth]=\"320\"\n [style.left.px]=\"valuePopover()?.left\"\n [style.top.px]=\"valuePopover()?.top\"\n [style.width.px]=\"valuePopover()?.width\"\n [style.height.px]=\"valuePopover()?.height\">\n</span>\n<ng-template\n #valuePopoverTemplate\n let-popover=\"popover\">\n <!-- What the value is, and its settings (where it can also be deleted); a\n chip naming no value on the page has no settings. -->\n <div class=\"value-popover fs-row\">\n <div class=\"fs-flex\">\n <div class=\"value-popover-name\">{{ valuePopoverValue()?.name ?? valuePopover()?.key }}</div>\n @if (!valuePopoverValue()) {\n <div class=\"small\">Not a value on this page</div>\n }\n </div>\n @if (valuePopoverValue()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"value-popover-settings\"\n matTooltip=\"Settings\"\n (click)=\"openValueSettings(popover)\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;height:100%}.text-content{display:block;width:100%;height:100%;overflow:visible;font-family:Arial,Helvetica,sans-serif;font-size:var(--text-size);line-height:1.25;color:var(--text-color);word-wrap:break-word;letter-spacing:normal;word-spacing:normal;font-weight:400;font-style:normal;text-transform:none;white-space:normal}.text-content ::ng-deep p,.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3,.text-content ::ng-deep ul,.text-content ::ng-deep ol{margin:0}.text-content ::ng-deep h1{font-size:var(--text-h1-size)}.text-content ::ng-deep h2{font-size:var(--text-h2-size)}.text-content ::ng-deep h3{font-size:var(--text-h3-size)}.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3{font-weight:700;line-height:1.2}.text-content ::ng-deep ul,.text-content ::ng-deep ol{padding-left:1.4em}.text-content ::ng-deep p:empty:before{content:\"\\200b\"}.text-content ::ng-deep a{color:inherit}.text-content ::ng-deep table{border-collapse:collapse;margin:var(--text-table-margin) 0}.text-content ::ng-deep th,.text-content ::ng-deep td{border:var(--text-table-border);padding:var(--text-table-padding);vertical-align:middle;text-align:left}.text-content ::ng-deep th{text-align:center;font-weight:700}.text-content.editing{cursor:text}.text-content.editing ::ng-deep [data-embed-key],.text-content.editing ::ng-deep [data-embed-field]{padding:0 2px;border-radius:3px;background-color:#4e79a729;-webkit-user-select:all;user-select:all}.text-content.editing ::ng-deep [data-embed-key]{cursor:pointer}.text-content.editing ::ng-deep [data-embed-key]:hover{background-color:#4e79a747}.text-content.editing ::ng-deep [data-embed-missing]{background-color:#e1575924;outline:1px dashed rgba(225,87,89,.7)}.text-content.editing ::ng-deep th,.text-content.editing ::ng-deep tfoot td{background-color:transparent}.text-content.editing ::ng-deep .fr-table-selector{display:none}.text-content.editing ::ng-deep .fr-table-selection-hover{outline:none}.text-hint{color:#9aa5b1;-webkit-user-select:none;user-select:none}.value-popover-anchor{position:absolute;pointer-events:none}::ng-deep .value-popover-wrapper .popover-content{padding:15px!important}.value-popover{gap:15px}.value-popover-name{font-weight:600}.value-popover-settings{--mdc-icon-button-state-layer-size: 24px;width:24px;height:24px;padding:0}.value-notice{position:absolute;top:100%;left:0;z-index:2;margin-top:4px;padding:2px 4px 2px 10px;border:1px solid #d9dee3;border-radius:4px;background:#fff;white-space:nowrap;font-family:Arial,Helvetica,sans-serif}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FsHtmlEditorComponent, selector: "fs-html-editor", inputs: ["config", "disabled"] }, { kind: "directive", type: FsPopoverDirective, selector: "[fsPopover]", inputs: ["text", "template", "data", "leaveDelay", "showDelay", "maxWidth", "maxHeight", "wrapperClass", "autoShow", "autoClose", "loadingDiameter", "loading", "indication", "position", "theme", "size", "trigger", "enabled", "panel"], outputs: ["closed"], exportAs: ["fsPopover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
377
377
  }
378
378
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentTextComponent, decorators: [{
379
379
  type: Component,
@@ -398,6 +398,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
398
398
  '[style.--text-table-border]': 'tableLook.border',
399
399
  '[style.--text-table-padding]': 'tableLook.padding',
400
400
  '[style.--text-table-margin]': 'tableLook.margin',
401
- }, template: "@if (editing()) {\n <!-- Floating fs-html-editor: no frame, Froala's inline toolbar pops up over\n the text. pointerdown stays here so a press in the text never starts a\n drag of the block or a pan of the canvas. -->\n <fs-html-editor\n class=\"text-content editing\"\n [config]=\"editorConfig\"\n [(ngModel)]=\"draft\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n </fs-html-editor>\n\n <!-- One notice at a time: an edit stopped because it would have removed\n values, an edit that left values no text reads, or a refused command.\n mousedown keeps the editor's focus and selection, so Undo reaches it. -->\n @if (notice(); as current) {\n <div\n class=\"value-notice fs-row.gap-sm\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\">\n @switch (current.kind) {\n @case ('blocked') {\n @if (current.block.removeSelection) {\n <span>\n This selection includes {{ current.block.count }} {{ current.block.count === 1 ? 'value' : 'values' }}.\n </span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"removeBlockedSelection()\">\n Remove text and {{ current.block.count === 1 ? 'value' : current.block.count + ' values' }}\n </button>\n } @else {\n <span>To take a value out, select it, then press Delete.</span>\n }\n }\n @case ('unused') {\n <span>{{ current.count }} {{ current.count === 1 ? 'value' : 'values' }} moved to Not used</span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"undoValuesUnused()\">\n Undo\n </button>\n }\n @case ('message') {\n <span>{{ current.text }}</span>\n }\n }\n <button\n mat-button\n type=\"button\"\n (click)=\"dismissNotice()\">\n Dismiss\n </button>\n </div>\n }\n} @else if (editMode() && isBlank()) {\n <!-- An empty block while the canvas is laid out: a hint in the block's own\n type, never its html, so nothing is typed onto it or exported. -->\n <div class=\"text-content text-hint\">Double-click to edit</div>\n} @else {\n <div\n class=\"text-content\"\n [innerHTML]=\"displayHtml()\">\n </div>\n}\n\n<!-- A clicked value chip's popover: an fs-popover on an invisible anchor laid\n over the chip (the chip itself belongs to the editor). Outside the editing\n block, so a popover still open when editing ends closes the usual way. -->\n<span\n #valuePopoverAnchor\n class=\"value-popover-anchor\"\n aria-hidden=\"true\"\n fsPopover\n trigger=\"click\"\n wrapperClass=\"value-popover-wrapper\"\n [template]=\"valuePopoverTemplate\"\n [indication]=\"false\"\n [maxWidth]=\"320\"\n [style.left.px]=\"valuePopover()?.left\"\n [style.top.px]=\"valuePopover()?.top\"\n [style.width.px]=\"valuePopover()?.width\"\n [style.height.px]=\"valuePopover()?.height\">\n</span>\n<ng-template\n #valuePopoverTemplate\n let-popover=\"popover\">\n <!-- What the value is, and its settings (where it can also be deleted); a\n chip naming no value on the page has no settings. -->\n <div class=\"value-popover fs-row\">\n <div class=\"fs-flex\">\n <div class=\"value-popover-name\">{{ valuePopoverValue()?.name ?? valuePopover()?.key }}</div>\n @if (!valuePopoverValue()) {\n <div class=\"small\">Not a value on this page</div>\n }\n </div>\n @if (valuePopoverValue()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"value-popover-settings\"\n matTooltip=\"Settings\"\n (click)=\"openValueSettings(popover)\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;height:100%}.text-content{display:block;width:100%;height:100%;overflow:hidden;font-family:Arial,Helvetica,sans-serif;font-size:var(--text-size);line-height:1.25;color:var(--text-color);word-wrap:break-word;letter-spacing:normal;word-spacing:normal;font-weight:400;font-style:normal;text-transform:none;white-space:normal}.text-content ::ng-deep p,.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3,.text-content ::ng-deep ul,.text-content ::ng-deep ol{margin:0}.text-content ::ng-deep h1{font-size:var(--text-h1-size)}.text-content ::ng-deep h2{font-size:var(--text-h2-size)}.text-content ::ng-deep h3{font-size:var(--text-h3-size)}.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3{font-weight:700;line-height:1.2}.text-content ::ng-deep ul,.text-content ::ng-deep ol{padding-left:1.4em}.text-content ::ng-deep p:empty:before{content:\"\\200b\"}.text-content ::ng-deep a{color:inherit}.text-content ::ng-deep table{border-collapse:collapse;margin:var(--text-table-margin) 0}.text-content ::ng-deep th,.text-content ::ng-deep td{border:var(--text-table-border);padding:var(--text-table-padding);vertical-align:middle;text-align:left}.text-content ::ng-deep th{text-align:center;font-weight:700}.text-content.editing{overflow:auto;cursor:text}.text-content.editing ::ng-deep [data-embed-key],.text-content.editing ::ng-deep [data-embed-field]{padding:0 2px;border-radius:3px;background-color:#4e79a729;-webkit-user-select:all;user-select:all}.text-content.editing ::ng-deep [data-embed-key]{cursor:pointer}.text-content.editing ::ng-deep [data-embed-key]:hover{background-color:#4e79a747}.text-content.editing ::ng-deep [data-embed-missing]{background-color:#e1575924;outline:1px dashed rgba(225,87,89,.7)}.text-content.editing ::ng-deep th,.text-content.editing ::ng-deep tfoot td{background-color:transparent}.text-content.editing ::ng-deep .fr-table-selector{display:none}.text-content.editing ::ng-deep .fr-table-selection-hover{outline:none}.text-hint{color:#9aa5b1;-webkit-user-select:none;user-select:none}.value-popover-anchor{position:absolute;pointer-events:none}::ng-deep .value-popover-wrapper .popover-content{padding:15px!important}.value-popover{gap:15px}.value-popover-name{font-weight:600}.value-popover-settings{--mdc-icon-button-state-layer-size: 24px;width:24px;height:24px;padding:0}.value-notice{position:absolute;top:100%;left:0;z-index:2;margin-top:4px;padding:2px 4px 2px 10px;border:1px solid #d9dee3;border-radius:4px;background:#fff;white-space:nowrap;font-family:Arial,Helvetica,sans-serif}\n"] }]
401
+ }, template: "@if (editing()) {\n <!-- Floating fs-html-editor: no frame, Froala's inline toolbar pops up over\n the text. pointerdown stays here so a press in the text never starts a\n drag of the block or a pan of the canvas. -->\n <fs-html-editor\n class=\"text-content editing\"\n [config]=\"editorConfig\"\n [(ngModel)]=\"draft\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.stopPropagation()\">\n </fs-html-editor>\n\n <!-- One notice at a time: an edit stopped because it would have removed\n values, an edit that left values no text reads, or a refused command.\n mousedown keeps the editor's focus and selection, so Undo reaches it. -->\n @if (notice(); as current) {\n <div\n class=\"value-notice fs-row.gap-sm\"\n (pointerdown)=\"$event.stopPropagation()\"\n (mousedown)=\"$event.preventDefault()\">\n @switch (current.kind) {\n @case ('blocked') {\n @if (current.block.removeSelection) {\n <span>\n This selection includes {{ current.block.count }} {{ current.block.count === 1 ? 'value' : 'values' }}.\n </span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"removeBlockedSelection()\">\n Remove text and {{ current.block.count === 1 ? 'value' : current.block.count + ' values' }}\n </button>\n } @else {\n <span>To take a value out, select it, then press Delete.</span>\n }\n }\n @case ('unused') {\n <span>{{ current.count }} {{ current.count === 1 ? 'value' : 'values' }} moved to Not used</span>\n <button\n mat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"undoValuesUnused()\">\n Undo\n </button>\n }\n @case ('message') {\n <span>{{ current.text }}</span>\n }\n }\n <button\n mat-button\n type=\"button\"\n (click)=\"dismissNotice()\">\n Dismiss\n </button>\n </div>\n }\n} @else if (editMode() && isBlank()) {\n <!-- An empty block while the canvas is laid out: a hint in the block's own\n type, never its html, so nothing is typed onto it or exported. -->\n <div class=\"text-content text-hint\">Double-click to edit</div>\n} @else {\n <div\n class=\"text-content\"\n [innerHTML]=\"displayHtml()\">\n </div>\n}\n\n<!-- A clicked value chip's popover: an fs-popover on an invisible anchor laid\n over the chip (the chip itself belongs to the editor). Outside the editing\n block, so a popover still open when editing ends closes the usual way. -->\n<span\n #valuePopoverAnchor\n class=\"value-popover-anchor\"\n aria-hidden=\"true\"\n fsPopover\n trigger=\"click\"\n wrapperClass=\"value-popover-wrapper\"\n [template]=\"valuePopoverTemplate\"\n [indication]=\"false\"\n [maxWidth]=\"320\"\n [style.left.px]=\"valuePopover()?.left\"\n [style.top.px]=\"valuePopover()?.top\"\n [style.width.px]=\"valuePopover()?.width\"\n [style.height.px]=\"valuePopover()?.height\">\n</span>\n<ng-template\n #valuePopoverTemplate\n let-popover=\"popover\">\n <!-- What the value is, and its settings (where it can also be deleted); a\n chip naming no value on the page has no settings. -->\n <div class=\"value-popover fs-row\">\n <div class=\"fs-flex\">\n <div class=\"value-popover-name\">{{ valuePopoverValue()?.name ?? valuePopover()?.key }}</div>\n @if (!valuePopoverValue()) {\n <div class=\"small\">Not a value on this page</div>\n }\n </div>\n @if (valuePopoverValue()) {\n <button\n mat-icon-button\n type=\"button\"\n class=\"value-popover-settings\"\n matTooltip=\"Settings\"\n (click)=\"openValueSettings(popover)\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:block;position:relative;width:100%;height:100%}.text-content{display:block;width:100%;height:100%;overflow:visible;font-family:Arial,Helvetica,sans-serif;font-size:var(--text-size);line-height:1.25;color:var(--text-color);word-wrap:break-word;letter-spacing:normal;word-spacing:normal;font-weight:400;font-style:normal;text-transform:none;white-space:normal}.text-content ::ng-deep p,.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3,.text-content ::ng-deep ul,.text-content ::ng-deep ol{margin:0}.text-content ::ng-deep h1{font-size:var(--text-h1-size)}.text-content ::ng-deep h2{font-size:var(--text-h2-size)}.text-content ::ng-deep h3{font-size:var(--text-h3-size)}.text-content ::ng-deep h1,.text-content ::ng-deep h2,.text-content ::ng-deep h3{font-weight:700;line-height:1.2}.text-content ::ng-deep ul,.text-content ::ng-deep ol{padding-left:1.4em}.text-content ::ng-deep p:empty:before{content:\"\\200b\"}.text-content ::ng-deep a{color:inherit}.text-content ::ng-deep table{border-collapse:collapse;margin:var(--text-table-margin) 0}.text-content ::ng-deep th,.text-content ::ng-deep td{border:var(--text-table-border);padding:var(--text-table-padding);vertical-align:middle;text-align:left}.text-content ::ng-deep th{text-align:center;font-weight:700}.text-content.editing{cursor:text}.text-content.editing ::ng-deep [data-embed-key],.text-content.editing ::ng-deep [data-embed-field]{padding:0 2px;border-radius:3px;background-color:#4e79a729;-webkit-user-select:all;user-select:all}.text-content.editing ::ng-deep [data-embed-key]{cursor:pointer}.text-content.editing ::ng-deep [data-embed-key]:hover{background-color:#4e79a747}.text-content.editing ::ng-deep [data-embed-missing]{background-color:#e1575924;outline:1px dashed rgba(225,87,89,.7)}.text-content.editing ::ng-deep th,.text-content.editing ::ng-deep tfoot td{background-color:transparent}.text-content.editing ::ng-deep .fr-table-selector{display:none}.text-content.editing ::ng-deep .fr-table-selection-hover{outline:none}.text-hint{color:#9aa5b1;-webkit-user-select:none;user-select:none}.value-popover-anchor{position:absolute;pointer-events:none}::ng-deep .value-popover-wrapper .popover-content{padding:15px!important}.value-popover{gap:15px}.value-popover-name{font-weight:600}.value-popover-settings{--mdc-icon-button-state-layer-size: 24px;width:24px;height:24px;padding:0}.value-notice{position:absolute;top:100%;left:0;z-index:2;margin-top:4px;padding:2px 4px 2px 10px;border:1px solid #d9dee3;border-radius:4px;background:#fff;white-space:nowrap;font-family:Arial,Helvetica,sans-serif}\n"] }]
402
402
  }], ctorParameters: () => [] });
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvY29tcG9uZW50LXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvY29tcG9uZW50LXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUMzRyxTQUFTLEVBQUUsU0FBUyxHQUNyQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSxPQUFPLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBRXZFLE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDM0csdUJBQXVCLEVBQUUsaUJBQWlCLEVBQStCLFVBQVUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUMvRyxVQUFVLEdBQ1gsTUFB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c0JBQXNCOzRGQUF0QixzQkFBc0Isc3dDQXNKSSxxQkFBcUIsdUpBQ3FCLFVBQVUsNkNDNVMzRiwrK0hBZ0hBLGtwRkRjSSxXQUFXLCtWQUNYLFNBQVMsaUxBQ1QsYUFBYSw2RkFDYixPQUFPLDJJQUNQLFVBQVUsaVJBQ1YscUJBQXFCLDJGQUNyQixrQkFBa0I7OzRGQWlCVCxzQkFBc0I7a0JBOUJsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxTQUFTO3dCQUNULGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLHFCQUFxQjt3QkFDckIsa0JBQWtCO3FCQUNuQixRQUNLO3dCQUNKLFdBQVcsRUFBRSxtQkFBbUI7d0JBQ2hDLDJFQUEyRTt3QkFDM0Usa0VBQWtFO3dCQUNsRSxxQkFBcUIsRUFBRSxnQkFBZ0I7d0JBQ3ZDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHNCQUFzQixFQUFFLGlCQUFpQjt3QkFDekMsK0NBQStDO3dCQUMvQyw2QkFBNkIsRUFBRSxrQkFBa0I7d0JBQ2pELDhCQUE4QixFQUFFLG1CQUFtQjt3QkFDbkQsNkJBQTZCLEVBQUUsa0JBQWtCO3FCQUNsRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLFxuICB1bnRyYWNrZWQsIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbiwgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IEZzSHRtbEVkaXRvckNvbXBvbmVudCwgRnNIdG1sRWRpdG9yQ29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvaHRtbC1lZGl0b3InO1xuaW1wb3J0IHsgRnNQb3BvdmVyRGlyZWN0aXZlLCBGc1BvcG92ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9wb3BvdmVyJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgSEVBRElOR19URVhUX1NJWkVTLCBURVhUX1RBQkxFX0JPUkRFUl9DT0xPUiwgVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsXG4gIFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HLCBURVhUX1RBQkxFX01BUkdJTiwgVGV4dFRva2VuQ29udGV4dCwgVGV4dFZhbHVlLCBmaWVsZFRva2VuLCBmaWxsVGV4dFRva2VucywgdGV4dEZpZWxkcyxcbiAgdmFsdWVUb2tlbixcbn0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBOT19WQUxVRV9LRVlTLCByZWFkS2V5cyB9IGZyb20gJy4uLy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB7XG4gIEVtYmVkTWVudUVudHJ5LCBWQUxVRV9FTUJFRF9BVFRSSUJVVEVTLCBWYWx1ZUVtYmVkQmxvY2ssIFZhbHVlRW1iZWRQbHVnaW4sIFZhbHVlRW1iZWRSZW1vdmFsLFxufSBmcm9tICcuL3ZhbHVlLWVtYmVkLnBsdWdpbic7XG5cblxuLy8gUG9pbnQgc2l6ZXMg4oCUIHRoZSByZXBvcnQncyB0eXBlIHVuaXQgKDE6MSB3aXRoIFBvd2VyUG9pbnQgYW5kIFBERikuXG5jb25zdCBGT05UX1NJWkVTID0gWyc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInLCAnMTQnLCAnMTYnLCAnMTgnLCAnMjAnLCAnMjQnLCAnMjgnLCAnMzInLCAnMzYnLCAnNDAnLCAnNDgnLCAnNjAnLCAnNzInXTtcblxuLy8gVGhlIHRvb2xiYXIgZHJvcGRvd24gdGhhdCBpbnNlcnRzIGEgZmllbGQgb3IgYSB2YWx1ZSBpbnRvIHRoZSB0ZXh0LlxuY29uc3QgSU5TRVJUX0ZJRUxEX0JVVFRPTiA9ICdpbnNlcnRGaWVsZCc7XG5cbi8vIFdoYXQgdGhlIGVkaXRvciBtYXkgcHJvZHVjZSDigJQgZXhhY3RseSB3aGF0IHRoZSBzZXJ2ZXIga2VlcHNcbi8vIChSZXBvcnRUZXh0SHRtbCkgYW5kIHRoZSBleHBvcnRzIGRyYXcuIEFueXRoaW5nIGVsc2Ugd291bGQgZWRpdCBmaW5lIGFuZFxuLy8gdGhlbiB2YW5pc2ggb24gc2F2ZS4gQSB0YWJsZSBrZWVwcyBpdHMgcm93cywgY2VsbHMgYW5kIHNwYW5zLCBhbmQgYSBjZWxsIGl0c1xuLy8gYWxpZ25tZW50LCBmaWxsIGFuZCB3aWR0aDsgaXRzIGJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIG5ldmVyIHN0b3JlZCwgc29cbi8vIGV2ZXJ5IHJlbmRlcmVyIGRyYXdzIHRoZSBvbmUgZ3JpZCBpbiB0ZXh0LnRzIChURVhUX1RBQkxFXyopLlxuY29uc3QgQUxMT1dFRF9UQUdTID0gW1xuICAncCcsICdoMScsICdoMicsICdoMycsICdicicsICdzdHJvbmcnLCAnZW0nLCAndScsICdzJywgJ3NwYW4nLCAnYScsICd1bCcsICdvbCcsICdsaScsXG4gICd0YWJsZScsICd0aGVhZCcsICd0Ym9keScsICd0Zm9vdCcsICd0cicsICd0aCcsICd0ZCcsXG5dO1xuY29uc3QgQUxMT1dFRF9TVFlMRVMgPSBbXG4gICdjb2xvcicsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2ZvbnQtc2l6ZScsICdmb250LXdlaWdodCcsICdmb250LXN0eWxlJywgJ3RleHQtZGVjb3JhdGlvbicsICdmb250LWZhbWlseScsICd0ZXh0LWFsaWduJyxcbiAgJ3ZlcnRpY2FsLWFsaWduJywgJ3dpZHRoJyxcbl07XG5cbi8vIFdpdGggdXNlQ2xhc3NlczogZmFsc2UsIEZyb2FsYSdzIGh0bWwuZ2V0IGNvcGllcyBldmVyeSBzdHlsZXNoZWV0IGRlY2xhcmF0aW9uXG4vLyB0aGF0IG1hdGNoZXMgYW4gZWxlbWVudCBpbnRvIGl0cyBpbmxpbmUgc3R5bGUsIHRoZW4gbGF5cyB0aGUgZWxlbWVudCdzIG93blxuLy8gaW5saW5lIHN0eWxlIGJhY2sgb3ZlciBpdC4gU28gYW4gaWdub3JlZCBwcm9wZXJ0eSBuZXZlciBsb3NlcyB3aGF0IHRoZSB1c2VyXG4vLyBzZXQ7IGl0IG9ubHkga2VlcHMgdGhlIGNhbnZhcydzLCBGcm9hbGEncyBhbmQgdGhlIGhvc3QgYXBwJ3MgY3NzIG91dCBvZiB0aGVcbi8vIHNhdmVkIGh0bWwuIExpc3RlZDogZXZlcnkgcHJvcGVydHkgdGhlIHNlcnZlciBrZWVwcyBhbmQgdGhlIHNob3J0aGFuZHMgdGhhdFxuLy8gc2V0IG9uZSAob3RoZXJ3aXNlIEZyb2FsYSdzIGdyZXkgaGVhZGVyIGZpbGwgd291bGQgYmUgc2F2ZWQgYXMgdGhlIHVzZXIncyksXG4vLyB0aGVuIGV2ZXJ5dGhpbmcgZWxzZSB0aG9zZSBzdHlsZXNoZWV0cyBzZXQgb24gYSBibG9jaydzIGVsZW1lbnRzLCBzbyBhIGJsb2NrXG4vLyBvcGVuZWQgYW5kIGNsb3NlZCB1bnRvdWNoZWQgc2F2ZXMgbm90aGluZyBuZXcuIE5hbWVzIG1hdGNoIGV4YWN0bHksIHNvIGFcbi8vIHJ1bGUncyBsb25naGFuZHMgYXJlIGxpc3RlZCB0b286IHRoZSBicm93c2VyIHNwZWxscyBGcm9hbGEncyB0YWJsZVxuLy8gYGJvcmRlcjogbm9uZWAgYXMgYm9yZGVyLXdpZHRoLy1zdHlsZS8tY29sb3IvLWltYWdlLCBhbmQgdGhlIGhvc3QgYXBwJ3Ncbi8vIGhlYWRpbmdzIHNldCBtYXJnaW4tdG9wIGFuZCBtYXJnaW4tYm90dG9tLiBGcm9hbGEgYWxzbyBvdXRsaW5lcyBhIHRhYmxlIHRoZVxuLy8gcG9pbnRlciBpcyBvdmVyLCB3aXRoIGEgY2xhc3MgdGhhdCBpcyBzdGlsbCBvbiBpdCB3aGVuIHRoZSBodG1sIGlzIHJlYWQuXG5jb25zdCBJR05PUkVEX1NIRUVUX1NUWUxFUyA9IFtcbiAgJ2NvbG9yJywgJ2JhY2tncm91bmQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdmb250JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXN0eWxlJywgJ2ZvbnQtd2VpZ2h0JyxcbiAgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LWFsaWduJywgJ3ZlcnRpY2FsLWFsaWduJywgJ3dpZHRoJyxcbiAgJ2hlaWdodCcsICdtaW4td2lkdGgnLCAnbWF4LXdpZHRoJywgJ21hcmdpbicsICdtYXJnaW4tdG9wJywgJ21hcmdpbi1ib3R0b20nLCAncGFkZGluZycsICdwYWRkaW5nLWxlZnQnLFxuICAnYm9yZGVyJywgJ2JvcmRlci13aWR0aCcsICdib3JkZXItc3R5bGUnLCAnYm9yZGVyLWNvbG9yJywgJ2JvcmRlci1pbWFnZScsICdib3JkZXItY29sbGFwc2UnLCAnZW1wdHktY2VsbHMnLFxuICAnb3V0bGluZScsICdwb3NpdGlvbicsICdkaXNwbGF5JywgJ2xpc3Qtc3R5bGUnLCAnbGluZS1oZWlnaHQnLCAndXNlci1zZWxlY3QnLFxuXTtcblxuLy8gRnJvYWxhJ3Mgb3duIHRvb2xiYXJzIGFuZCBwb3B1cHMgbGl2ZSBvbiB0aGUgYm9keSwgbm90IGluIHRoZSBibG9jaywgYW5kIHNvXG4vLyBkb2VzIGEgdmFsdWUgY2hpcCdzIHBvcG92ZXIgKGFuIG92ZXJsYXkpOyBhIHByZXNzIG9uIGFueSBvZiB0aGVtIGlzIHN0aWxsIHBhcnRcbi8vIG9mIGVkaXRpbmcgdGhlIGJsb2NrLlxuY29uc3QgRURJVE9SX0NIUk9NRSA9ICcuZnItdG9vbGJhciwgLmZyLXBvcHVwLCAuZnItZHJvcGRvd24tbWVudSwgLmZyLW1vZGFsLCAuZnItdG9vbHRpcCwgLmNkay1vdmVybGF5LWNvbnRhaW5lcic7XG5cbi8vIFRoZSB0b29sYmFyIHRvZ2dsZSBiZXR3ZWVuIGEgY2hpcCdzIG51bWJlciBhbmQgaXRzIG5hbWUuXG5jb25zdCBWQUxVRV9OQU1FU19CVVRUT04gPSAndmFsdWVOYW1lcyc7XG5cbi8vIEhvdyBsb25nIGEgbm90aWNlIHVuZGVyIHRoZSBvcGVuIGJsb2NrIHN0YXlzIHVwLlxuY29uc3QgVkFMVUVfQkxPQ0tfTk9USUNFX01TID0gNjAwMDtcblxuLy8gV2hhdCB0aGUgbm90aWNlIHVuZGVyIHRoZSBvcGVuIGJsb2NrIHNheXMsIG9uZSBhdCBhIHRpbWU6IGFuIGVkaXQgd2FzXG4vLyBzdG9wcGVkIGJlY2F1c2UgaXQgd291bGQgaGF2ZSByZW1vdmVkIHZhbHVlczsgYW4gZWRpdCBsZWZ0IHZhbHVlcyB0aGF0IG5vXG4vLyB0ZXh0IHJlYWRzIGFueSBtb3JlLCB3aXRoIHRoZSB1bmRvIHRoYXQgcHV0cyB0aGVtIGJhY2s7IG9yIGEgY29tbWFuZCB3YXNcbi8vIHJlZnVzZWQuXG50eXBlIFRleHROb3RpY2UgPVxuICB8IHsga2luZDogJ2Jsb2NrZWQnOyBibG9jazogVmFsdWVFbWJlZEJsb2NrIH1cbiAgfCB7IGtpbmQ6ICd1bnVzZWQnOyBjb3VudDogbnVtYmVyOyB1bmRvOiAoKSA9PiB2b2lkIH1cbiAgfCB7IGtpbmQ6ICdtZXNzYWdlJzsgdGV4dDogc3RyaW5nIH07XG5cbi8vIEEgY2xpY2tlZCB2YWx1ZSBjaGlwJ3MgcG9wb3ZlciBpcyBhbiBmcy1wb3BvdmVyLCB3aGljaCBhdHRhY2hlcyB0byBhbiBlbGVtZW50XG4vLyBvZiB0aGlzIGNvbXBvbmVudCdzIG93biB0ZW1wbGF0ZSDigJQgdGhlIGNoaXAgYmVsb25ncyB0byB0aGUgZWRpdG9yLiBTbyBpdFxuLy8gb3BlbnMgZnJvbSBhbiBpbnZpc2libGUgYW5jaG9yIGxhaWQgb3ZlciB0aGUgY2hpcCwgaW4gdGhlIGJsb2NrJ3Mgb3duXG4vLyAodW5zY2FsZWQpIHBpeGVscy5cbmludGVyZmFjZSBWYWx1ZVBvcG92ZXJBbmNob3Ige1xuICBrZXk6IHN0cmluZztcbiAgY2hpcDogSFRNTEVsZW1lbnQ7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vLyBBIHRleHQgYmxvY2s6IGF1dGhvcmVkIHJpY2ggdGV4dCBvbiB0aGUgcGFnZS5cbi8vXG4vLyBSZWFkIG1vZGUgcmVuZGVycyB0aGUgc3RvcmVkIGh0bWwgd2l0aCBpdHMgdG9rZW5zICh7e3BhZ2UubnVtYmVyfX0sIOKApikgZmlsbGVkXG4vLyBmb3IgdGhlIHBhZ2UgaXQgaXMgZHJhd24gb24uIFRoZSBodG1sIGhhcyBhbHJlYWR5IGJlZW4gcmVidWlsdCBzZXJ2ZXItc2lkZVxuLy8gZnJvbSBhbiBhbGxvd2xpc3QgKFJlcG9ydFRleHRIdG1sKSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBiaW5kaW5nIGl0IGFzIHRydXN0ZWRcbi8vIG1hcmt1cCBzYWZlIOKAlCBBbmd1bGFyJ3Mgb3duIHNhbml0aXplciB3b3VsZCBzdHJpcCB0aGUgaW5saW5lIHN0eWxlcyB0aGF0IEFSRVxuLy8gdGhlIGZvcm1hdHRpbmcuXG4vL1xuLy8gRWRpdCBtb2RlIG1vdW50cyA8ZnMtaHRtbC1lZGl0b3I+IGluIGl0cyBmbG9hdGluZyBtb2RlIGluIHBsYWNlIOKAlCB0aGUgd29yZHNcbi8vIHN0YXkgd2hlcmUgdGhleSBzaXQgb24gdGhlIHNsaWRlIOKAlCB3aXRoIEZyb2FsYSdzIGlubGluZSB0b29sYmFyIHBvcHBpbmcgdXBcbi8vIG92ZXIgdGhlbS4gVGhlIGVkaXRvciBleGlzdHMgb25seSB3aGlsZSBlZGl0aW5nOyB0aGUgcmF3IGh0bWwgaXMgZWRpdGVkLCBidXRcbi8vIGV2ZXJ5IHRva2VuIGVkaXRzIGFzIGEgY2hpcCB0aGF0IHJlYWRzIGFzIHRoZSB0b2tlbiBkb2VzIChWYWx1ZUVtYmVkUGx1Z2luKSxcbi8vIGFuZCBJbnNlcnQgZmllbGQgcHV0cyBhbnkgb2YgdGhlbSBpbi4gQSBwYWdlLCByZXBvcnQgb3IgZmlsdGVyIGZpZWxkXG4vLyAoe3twYWdlLm51bWJlcn19LCB7e2ZpbHRlci4xMn19KSBkZWxldGVzIGxpa2UgYSBjaGFyYWN0ZXIuIEEgbGl2ZSB2YWx1ZVxuLy8gKHt7dmFsdWUua2V5fX0pIGlzIGd1YXJkZWQ6IG5vIHN0cmF5IGtleXN0cm9rZSByZW1vdmVzIGl0LCBhbmQgc2VsZWN0aW5nIGl0XG4vLyBhbmQgcHJlc3NpbmcgRGVsZXRlIG9mZmVycyB0byB0YWtlIGl0IG91dC4gRGVsZXRpbmcgYSB0YWJsZSdzIHJvd3MsIGNvbHVtbnNcbi8vIG9yIGNlbGxzIGRvZXMgdGFrZSB0aGUgY2hpcHMgaW4gdGhlbSwgYW5kIGEgbm90aWNlIHVuZGVyIHRoZSBibG9jayBjb3VudHMgdGhlXG4vLyB2YWx1ZXMgdGhhdCBsZWF2ZXMgdW51c2VkLCB3aXRoIGFuIFVuZG8uXG4vL1xuLy8gVGhlIGJsb2NrIG5ldmVyIHNhdmVzIG9uIGl0cyBvd246IGl0IGVtaXRzIHRoZSBuZXcgaHRtbCB3aGVuIGVkaXRpbmcgZW5kc1xuLy8gYW5kIHRoZSBob3N0IHBlcnNpc3RzIGl0LlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtdGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtdGV4dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC10ZXh0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0SWNvbixcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzSHRtbEVkaXRvckNvbXBvbmVudCxcbiAgICBGc1BvcG92ZXJEaXJlY3RpdmUsXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnKGtleWRvd24pJzogJ29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAvLyBUaGUgZG9jdW1lbnQgdHlwZSBzY2FsZSBjb21lcyBmcm9tIHRoZSBzYW1lIGNvbnN0YW50cyB0aGUgUG93ZXJQb2ludCBhbmRcbiAgICAvLyBQREYgZXhwb3J0cyBkcmF3IHdpdGgsIHNvIGEgcGFyYWdyYXBoIGlzIG9uZSBzaXplIGluIGFsbCB0aHJlZS5cbiAgICAnW3N0eWxlLi0tdGV4dC1zaXplXSc6ICd0eXBlU2NhbGUuYm9keScsXG4gICAgJ1tzdHlsZS4tLXRleHQtaDEtc2l6ZV0nOiAndHlwZVNjYWxlLmgxJyxcbiAgICAnW3N0eWxlLi0tdGV4dC1oMi1zaXplXSc6ICd0eXBlU2NhbGUuaDInLFxuICAgICdbc3R5bGUuLS10ZXh0LWgzLXNpemVdJzogJ3R5cGVTY2FsZS5oMycsXG4gICAgJ1tzdHlsZS4tLXRleHQtY29sb3JdJzogJ3R5cGVTY2FsZS5jb2xvcicsXG4gICAgLy8gQSB0YWJsZSdzIGdyaWQgY29tZXMgZnJvbSB0aGVtIHRoZSBzYW1lIHdheS5cbiAgICAnW3N0eWxlLi0tdGV4dC10YWJsZS1ib3JkZXJdJzogJ3RhYmxlTG9vay5ib3JkZXInLFxuICAgICdbc3R5bGUuLS10ZXh0LXRhYmxlLXBhZGRpbmddJzogJ3RhYmxlTG9vay5wYWRkaW5nJyxcbiAgICAnW3N0eWxlLi0tdGV4dC10YWJsZS1tYXJnaW5dJzogJ3RhYmxlTG9vay5tYXJnaW4nLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRUZXh0Q29tcG9uZW50IHtcblxuICAvLyBUaGUgYmxvY2sncyBzdG9yZWQgaHRtbCAoY29uZmlnLmh0bWwpLiBJdHMgb3duIGlucHV0IHJhdGhlciB0aGFuIHJlYWQgb2ZmXG4gIC8vIHRoZSBjb21wb25lbnQsIHNvIGEgc2F2ZWQgZWRpdCDigJQgYSBuZXcgc3RyaW5nIG9uIHRoZSBzYW1lIGNvbXBvbmVudCDigJQgaXNcbiAgLy8gc2VlbiBhcyBhIGNoYW5nZSBhbmQgcmVwYWludHMuXG4gIHB1YmxpYyByZWFkb25seSBodG1sID0gaW5wdXQoJycpO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5zID0gaW5wdXQucmVxdWlyZWQ8VGV4dFRva2VuQ29udGV4dD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRpbmcgPSBpbnB1dChmYWxzZSk7XG5cbiAgLy8gVGhlIGNhbnZhcyBpcyBiZWluZyBsYWlkIG91dCwgc28gYW4gZW1wdHkgYmxvY2sgc2hvd3MgaG93IHRvIGZpbGwgaXQuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IGlucHV0KGZhbHNlKTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgdGhpcyBibG9jaydzIGxheWVyIHNob3cuIEFza2VkXG4gIC8vIGZvciB3aGVuIGFuIGVkaXQgdGFrZXMgdGhlIGxhc3QgY2hpcCBvZiBhIHZhbHVlIG91dCBvZiB0aGlzIGJsb2NrLCBhcyBhXG4gIC8vIHZhbHVlIGFub3RoZXIgYmxvY2sgc3RpbGwgc2hvd3MgaXMgbm90IGxlZnQgdW51c2VkOyBhIGZ1bmN0aW9uLCBhcyBhXG4gIC8vIHNhdmVkIGJsb2NrJ3MgaHRtbCBjaGFuZ2VzIHdpdGhvdXQgYW55IGlucHV0IGNoYW5naW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd25FbHNld2hlcmUgPSBpbnB1dDwoKSA9PiBSZWFkb25seVNldDxzdHJpbmc+PigoKSA9PiBOT19WQUxVRV9LRVlTKTtcblxuICAvLyBUaGUgaHRtbCBhZnRlciBhbiBlZGl0LCBvbmx5IHdoZW4gaXQgY2hhbmdlZC5cbiAgcHVibGljIHJlYWRvbmx5IHNhdmVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBBIHByZXNzIGxhbmRlZCBvdXRzaWRlIHRoZSBibG9jayAob3IgRXNjYXBlKTogdGhlIGhvc3QgZW5kcyBlZGl0IG1vZGUsXG4gIC8vIHdoaWNoIHNhdmVzLlxuICBwdWJsaWMgcmVhZG9ubHkgZWRpdEVuZGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgLy8gQSB2YWx1ZSdzIHNldHRpbmdzIHdlcmUgYXNrZWQgZm9yIGZyb20gaXRzIHBvcG92ZXIsIGJ5IHRoZSB2YWx1ZSdzIGtleS5cbiAgLy8gVGhlIGhvc3Qgb3BlbnMgdGhlIHZhbHVlJ3Mgc2V0dGluZ3MgZGlhbG9nLCB3aGVyZSBpdCBjYW4gYWxzbyBiZSBkZWxldGVkXG4gIC8vICh0aGVuIHJlbW92ZVZhbHVlKCkpLlxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVTZXR0aW5ncyA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVTY2FsZSA9IHtcbiAgICBib2R5OiBgJHtERUZBVUxUX1RFWFRfU0laRX1wdGAsXG4gICAgaDE6IGAke0hFQURJTkdfVEVYVF9TSVpFU1sxXX1wdGAsXG4gICAgaDI6IGAke0hFQURJTkdfVEVYVF9TSVpFU1syXX1wdGAsXG4gICAgaDM6IGAke0hFQURJTkdfVEVYVF9TSVpFU1szXX1wdGAsXG4gICAgY29sb3I6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVMb29rID0ge1xuICAgIGJvcmRlcjogYCR7VEVYVF9UQUJMRV9CT1JERVJfV0lEVEh9cHQgc29saWQgJHtURVhUX1RBQkxFX0JPUkRFUl9DT0xPUn1gLFxuICAgIHBhZGRpbmc6IGAke1RFWFRfVEFCTEVfQ0VMTF9QQURESU5HLnZlcnRpY2FsfXB0ICR7VEVYVF9UQUJMRV9DRUxMX1BBRERJTkcuaG9yaXpvbnRhbH1wdGAsXG4gICAgbWFyZ2luOiBgJHtURVhUX1RBQkxFX01BUkdJTn1wdGAsXG4gIH07XG5cbiAgLy8gQ2hpcHMgbGFiZWwgdmFsdWVzIHdpdGggdGhlaXIgbmFtZXMgaW5zdGVhZCBvZiB0aGVpciBudW1iZXJzLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1ZhbHVlTmFtZXMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSBub3RpY2UgdW5kZXIgdGhlIG9wZW4gYmxvY2suIEEgbmV3IG9uZSByZXBsYWNlcyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGljZSA9IHNpZ25hbDxUZXh0Tm90aWNlIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNoaXAgd2hvc2UgcG9wb3ZlciB3YXMgb3BlbmVkIGxhc3QsIGFuZCB3aGF0IHRoZSBwb3BvdmVyIHNheXMgYWJvdXQgaXQuXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVBvcG92ZXIgPSBzaWduYWw8VmFsdWVQb3BvdmVyQW5jaG9yIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVBvcG92ZXJWYWx1ZSA9IGNvbXB1dGVkPFRleHRWYWx1ZSB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnZhbHVlUG9wb3ZlcigpPy5rZXk7XG5cbiAgICByZXR1cm4ga2V5ID8gdGhpcy50b2tlbnMoKS52YWx1ZXM/LltrZXldID8/IG51bGwgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVFbWJlZHMgPSBuZXcgVmFsdWVFbWJlZFBsdWdpbih7XG4gICAgbmFtZTogJ3JlcG9ydFZhbHVlRW1iZWRzJyxcbiAgICBob3N0OiAoKSA9PiB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgdmFsdWVzOiAoKSA9PiB0aGlzLnRva2VucygpLnZhbHVlcyA/PyB7fSxcbiAgICBzY29wZTogKCkgPT4gU3RyaW5nKHRoaXMudG9rZW5zKCkudmFsdWVQYWdlSWQgPz8gJycpLFxuICAgIGZpZWxkczogKCkgPT4gdGhpcy50b2tlbnMoKSxcbiAgICBtZW51OiB7IGNvbW1hbmQ6IElOU0VSVF9GSUVMRF9CVVRUT04sIGVudHJpZXM6ICgpID0+IHRoaXMuX2luc2VydEZpZWxkRW50cmllcygpIH0sXG4gICAgc2hvd05hbWVzOiAoKSA9PiB0aGlzLnNob3dWYWx1ZU5hbWVzKCksXG4gICAgY2xpY2s6IChrZXksIGNoaXApID0+IHRoaXMuX29wZW5WYWx1ZVBvcG92ZXIoa2V5LCBjaGlwKSxcbiAgICBibG9ja2VkOiAoYmxvY2spID0+IHRoaXMuX3Nob3dOb3RpY2UoeyBraW5kOiAnYmxvY2tlZCcsIGJsb2NrIH0pLFxuICAgIHJlbW92ZWQ6IChyZW1vdmFsKSA9PiB0aGlzLl9vblZhbHVlc1JlbW92ZWQocmVtb3ZhbCksXG4gICAgY2hhbmdlZDogKCkgPT4gdGhpcy5kaXNtaXNzTm90aWNlKCksXG4gICAgcmVmdXNlZDogKHRleHQpID0+IHRoaXMuX3Nob3dOb3RpY2UoeyBraW5kOiAnbWVzc2FnZScsIHRleHQgfSksXG4gIH0pO1xuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0b3JDb25maWc6IEZzSHRtbEVkaXRvckNvbmZpZyA9IHtcbiAgICBmbG9hdGluZzogdHJ1ZSxcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgcGxhY2Vob2xkZXI6ICdUeXBlIGhlcmUnLFxuICAgIHBsdWdpbnM6IFt0aGlzLnZhbHVlRW1iZWRzXSxcbiAgICBidXR0b25zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IElOU0VSVF9GSUVMRF9CVVRUT04sXG4gICAgICAgIHRpdGxlOiAnSW5zZXJ0IGZpZWxkJyxcbiAgICAgICAgc3ZnS2V5OiAndGFncycsXG4gICAgICAgIC8vIE9wdGlvbnMgbWFrZSBpdCBhIGRyb3Bkb3duLiBJdHMgZW50cmllcyBhcmUgdGhlIGJsb2NrJ3Mgb3duLCBmaWxsZWRcbiAgICAgICAgLy8gaW4gYnkgVmFsdWVFbWJlZFBsdWdpbiBlYWNoIHRpbWUgYW4gZWRpdG9yIGlzIGJ1aWx0LlxuICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgICAgY2xpY2s6IChlZGl0b3IsIHRva2VuKSA9PiB0aGlzLnZhbHVlRW1iZWRzLmluc2VydCh0b2tlbiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBWQUxVRV9OQU1FU19CVVRUT04sXG4gICAgICAgIHRpdGxlOiAnU2hvdyB2YWx1ZSBuYW1lcycsXG4gICAgICAgIHN2Z0tleTogJ3RleHRNb3JlJyxcbiAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuc2hvd1ZhbHVlTmFtZXMudXBkYXRlKChuYW1lcykgPT4gIW5hbWVzKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmcm9hbGFDb25maWc6IHtcbiAgICAgIHRvb2xiYXJCdXR0b25zOiBbXG4gICAgICAgICdwYXJhZ3JhcGhGb3JtYXQnLCAnZm9udFNpemUnLCAnfCcsXG4gICAgICAgICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlVGhyb3VnaCcsICd0ZXh0Q29sb3InLCAnfCcsXG4gICAgICAgICdhbGlnbicsICdmb3JtYXRVTCcsICdmb3JtYXRPTCcsICdpbnNlcnRUYWJsZScsICd8JyxcbiAgICAgICAgJ2luc2VydExpbmsnLCBJTlNFUlRfRklFTERfQlVUVE9OLCBWQUxVRV9OQU1FU19CVVRUT04sICdjbGVhckZvcm1hdHRpbmcnLFxuICAgICAgXSxcbiAgICAgIC8vIEEgdGFibGUncyBwb3B1cCBvZmZlcnMgb25seSB3aGF0IHRoZSBzZXJ2ZXIga2VlcHM6IG5vIHRhYmxlIG9yIGNlbGxcbiAgICAgIC8vIHN0eWxlcyAoY2xhc3NlcykgYW5kIG5vIGZvb3RlciByb3cuXG4gICAgICB0YWJsZUVkaXRCdXR0b25zOiBbXG4gICAgICAgICd0YWJsZUhlYWRlcicsICd0YWJsZVJlbW92ZScsICd0YWJsZVJvd3MnLCAndGFibGVDb2x1bW5zJywgJy0nLFxuICAgICAgICAndGFibGVDZWxscycsICd0YWJsZUNlbGxCYWNrZ3JvdW5kJywgJ3RhYmxlQ2VsbFZlcnRpY2FsQWxpZ24nLCAndGFibGVDZWxsSG9yaXpvbnRhbEFsaWduJyxcbiAgICAgIF0sXG4gICAgICB0YWJsZURlZmF1bHRXaWR0aDogJzEwMCUnLFxuICAgICAgLy8gQm90aCBhcmUgcG9zaXRpb25lZCBpbiBzY3JlZW4gc3BhY2UgaW5zaWRlIHRoZSBjYW52YXMncyBDU1Mgc2NhbGUsIHNvXG4gICAgICAvLyB0aGV5IGxhbmQgb2ZmIHRoZSB0YWJsZTsgcm93cyBhbmQgY29sdW1ucyBhcmUgYWRkZWQgZnJvbSB0aGUgdGFibGUnc1xuICAgICAgLy8gcG9wdXAgaW5zdGVhZC5cbiAgICAgIHRhYmxlUmVzaXplcjogZmFsc2UsXG4gICAgICB0YWJsZUluc2VydEhlbHBlcjogZmFsc2UsXG4gICAgICBwYXJhZ3JhcGhGb3JtYXQ6IHsgTjogJ05vcm1hbCcsIEgxOiAnSGVhZGluZyAxJywgSDI6ICdIZWFkaW5nIDInLCBIMzogJ0hlYWRpbmcgMycgfSxcbiAgICAgIHBhcmFncmFwaEZvcm1hdFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIGZvbnRTaXplOiBGT05UX1NJWkVTLFxuICAgICAgZm9udFNpemVVbml0OiAncHQnLFxuICAgICAgZm9udFNpemVTZWxlY3Rpb246IHRydWUsXG4gICAgICBodG1sQWxsb3dlZFRhZ3M6IEFMTE9XRURfVEFHUyxcbiAgICAgIGh0bWxBbGxvd2VkQXR0cnM6IFsnc3R5bGUnLCAnaHJlZicsICd0YXJnZXQnLCAncmVsJywgJ2NvbHNwYW4nLCAncm93c3BhbicsIC4uLlZBTFVFX0VNQkVEX0FUVFJJQlVURVNdLFxuICAgICAgaHRtbEFsbG93ZWRTdHlsZVByb3BzOiBBTExPV0VEX1NUWUxFUyxcbiAgICAgIGh0bWxJZ25vcmVDU1NQcm9wZXJ0aWVzOiBJR05PUkVEX1NIRUVUX1NUWUxFUyxcbiAgICAgIGh0bWxSZW1vdmVUYWdzOiBbJ3NjcmlwdCcsICdzdHlsZSddLFxuICAgICAgLy8gSW5saW5lIHN0eWxlcyByYXRoZXIgdGhhbiBGcm9hbGEncyBmci0qIGNsYXNzZXMsIHdoaWNoIG5laXRoZXIgdGhlXG4gICAgICAvLyBzZXJ2ZXIgbm9yIHRoZSBleHBvcnRzIGtub3cuXG4gICAgICB1c2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIC8vIEEgcGFzdGUgaXMgaXRzIHdvcmRzIG9ubHk6IGEgcGFzdGVkIHRhYmxlIGZsYXR0ZW5zIHRvIHRleHQuXG4gICAgICBwYXN0ZVBsYWluOiB0cnVlLFxuICAgICAgLy8gRXZlcnkga2V5c3Ryb2tlIHJlYWNoZXMgdGhlIG1vZGVsIHN0cmFpZ2h0IGF3YXksIHNvIGVuZGluZyB0aGUgZWRpdCBhblxuICAgICAgLy8gaW5zdGFudCBhZnRlciB0eXBpbmcgbmV2ZXIgbG9zZXMgdGhlIGxhc3Qgd29yZC5cbiAgICAgIHR5cGluZ1RpbWVyOiAwLFxuICAgIH0sXG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlIdG1sID0gY29tcHV0ZWQ8U2FmZUh0bWw+KCgpID0+IHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICBmaWxsVGV4dFRva2Vucyh0aGlzLmh0bWwoKSwgdGhpcy50b2tlbnMoKSksXG4gICkpO1xuXG4gIC8vIFRoZSBibG9jayBzaG93cyBub3RoaW5nOiBubyB3b3JkcyBhbmQgbm8gdGFibGUuIEEgbmV3IGJsb2NrIGlzIHN0b3JlZFxuICAvLyBlbXB0eSwgYW5kIGFuIGVtcHRpZWQgZWRpdG9yIGNhbiBzdGlsbCBsZWF2ZSBhIGJhcmUgPHA+PGJyPjwvcD4uXG4gIHB1YmxpYyByZWFkb25seSBpc0JsYW5rID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHRoaXMuaHRtbCgpLCAndGV4dC9odG1sJykuYm9keTtcblxuICAgIHJldHVybiAhYm9keS50ZXh0Q29udGVudD8udHJpbSgpICYmICFib2R5LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gIH0pO1xuXG4gIC8vIFdoYXQgdGhlIGVkaXRvciBob2xkcyByaWdodCBub3cuXG4gIHB1YmxpYyBkcmFmdCA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRvciA9IHZpZXdDaGlsZChGc0h0bWxFZGl0b3JDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZVBvcG92ZXJBbmNob3IgPSB2aWV3Q2hpbGQoJ3ZhbHVlUG9wb3ZlckFuY2hvcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbm90aWNlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gT3BlbmluZyBzZWVkcyB0aGUgZHJhZnQ7IGNsb3Npbmcg4oCUIHdob2V2ZXIgY2xvc2VkIGl0OiBhIHByZXNzIG91dHNpZGUsXG4gICAgLy8gRXNjYXBlLCB0aGUgYmxvY2sgYmVpbmcgZGVzZWxlY3RlZCBvciBlZGl0IG1vZGUgZW5kaW5nIOKAlCBzYXZlcyBpdC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGluZyA9IHRoaXMuZWRpdGluZygpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoZWRpdGluZyAmJiAhdGhpcy5faXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRyYWZ0ID0gdGhpcy5odG1sKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWVkaXRpbmcgJiYgdGhpcy5faXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hpcHMsIGFuZCB0aGUgSW5zZXJ0IGZpZWxkIG1lbnUsIGZvbGxvdyB0aGUgYmxvY2sncyB2YWx1ZXMgYW5kIGZpZWxkc1xuICAgIC8vIGFuZCB0aGUgbmFtZXMgdG9nZ2xlLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLnRva2VucygpO1xuICAgICAgdGhpcy5zaG93VmFsdWVOYW1lcygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMudmFsdWVFbWJlZHMucmVmcmVzaCgpKTtcbiAgICB9KTtcblxuICAgIC8vIEEgcHJlc3MgYW55d2hlcmUgdGhhdCBpcyBub3QgdGhlIGJsb2NrIG9yIHRoZSBlZGl0b3IncyBvd24gY2hyb21lIGVuZHNcbiAgICAvLyB0aGUgZWRpdC4gQ2FwdHVyZWQsIHNvIGl0IGlzIHNlZW4gYmVmb3JlIHRoZSBjYW52YXMgb3IgYSBzaWJsaW5nXG4gICAgLy8gY29tcG9uZW50IGFjdHMgb24gdGhlIHNhbWUgcHJlc3MuXG4gICAgY29uc3Qgb25QcmVzcyA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB0aGlzLl9vbkRvY3VtZW50UHJlc3MoZXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25QcmVzcywgdHJ1ZSk7XG4gICAgdGhpcy5fZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblByZXNzLCB0cnVlKTtcbiAgICAgIHRoaXMuX2NsZWFyTm90aWNlVGltZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nKCkgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGFrZSBhIHZhbHVlIG91dCBvZiB0aGUgdGV4dDogaXRzIHNldHRpbmdzIGRpYWxvZyBkZWxldGVkIGl0LlxuICBwdWJsaWMgcmVtb3ZlVmFsdWUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlRW1iZWRzLnJlbW92ZUtleShrZXkpO1xuICB9XG5cbiAgLy8gT25seSBmb3IgYSB2YWx1ZSB0aGUgcGFnZSBoYXM6IGEgY2hpcCBuYW1pbmcgbm8gdmFsdWUgdGhlcmUgaGFzIG5vXG4gIC8vIHNldHRpbmdzIHRvIG9wZW4uXG4gIHB1YmxpYyBvcGVuVmFsdWVTZXR0aW5ncyhwb3BvdmVyOiBGc1BvcG92ZXJSZWYpOiB2b2lkIHtcbiAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy52YWx1ZVBvcG92ZXIoKT8ua2V5O1xuICAgIGlmIChrZXkgJiYgdGhpcy50b2tlbnMoKS52YWx1ZXM/LltrZXldKSB7XG4gICAgICB0aGlzLnZhbHVlU2V0dGluZ3MuZW1pdChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCbG9ja2VkU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGljZSA9IHRoaXMubm90aWNlKCk7XG4gICAgaWYgKG5vdGljZT8ua2luZCA9PT0gJ2Jsb2NrZWQnKSB7XG4gICAgICBub3RpY2UuYmxvY2sucmVtb3ZlU2VsZWN0aW9uPy4oKTtcbiAgICB9XG4gICAgdGhpcy5kaXNtaXNzTm90aWNlKCk7XG4gIH1cblxuICAvLyBQdXQgYmFjayB0aGUgdmFsdWVzIGFuIGVkaXQgbGVmdCB1bnVzZWQ6IHRoZSBlZGl0b3IncyBvd24gdW5kbyBvZiBpdC5cbiAgcHVibGljIHVuZG9WYWx1ZXNVbnVzZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWNlID0gdGhpcy5ub3RpY2UoKTtcbiAgICBpZiAobm90aWNlPy5raW5kID09PSAndW51c2VkJykge1xuICAgICAgbm90aWNlLnVuZG8oKTtcbiAgICB9XG4gICAgdGhpcy5kaXNtaXNzTm90aWNlKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzbWlzc05vdGljZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhck5vdGljZVRpbWVyKCk7XG4gICAgdGhpcy5ub3RpY2Uuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gV2hhdCBJbnNlcnQgZmllbGQgbGlzdHMsIGluIG9yZGVyOiB0aGUgcGFnZSBhbmQgcmVwb3J0IGZpZWxkcywgZWFjaCBmaWx0ZXJcbiAgLy8gb2YgdGhlIHJlcG9ydCBieSBpdHMgbGFiZWwgaW4gdGhlIGZpbHRlciBiYXIncyBvcmRlciwgdGhlbiBldmVyeSB2YWx1ZSBvZlxuICAvLyB0aGUgYmxvY2sncyBsYXllciBieSBpdHMgbmFtZSwgd2hldGhlciBhbnkgdGV4dCBzaG93cyBpdCBvciBub3QuXG4gIHByaXZhdGUgX2luc2VydEZpZWxkRW50cmllcygpOiBFbWJlZE1lbnVFbnRyeVtdIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy50b2tlbnMoKTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi50ZXh0RmllbGRzKGNvbnRleHQpLm1hcCgoeyBmaWVsZCwgbmFtZSB9KSA9PiAoeyB0b2tlbjogZmllbGRUb2tlbihmaWVsZCksIG5hbWUgfSkpLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoY29udGV4dC52YWx1ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyB0b2tlbjogdmFsdWVUb2tlbihrZXkpLCBuYW1lOiB2YWx1ZS5uYW1lIH0pKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3BlblZhbHVlUG9wb3ZlcihrZXk6IHN0cmluZywgY2hpcDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjaGlwUmVjdCA9IGNoaXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gVGhlIGNhbnZhcyBpcyBDU1Mtc2NhbGVkOyB0aGUgYW5jaG9yIHNpdHMgaW4gdGhlIGJsb2NrJ3Mgb3duIHBpeGVscy5cbiAgICBjb25zdCBzY2FsZSA9IGhvc3Qub2Zmc2V0V2lkdGggPyBob3N0UmVjdC53aWR0aCAvIGhvc3Qub2Zmc2V0V2lkdGggOiAxO1xuXG4gICAgdGhpcy52YWx1ZUVtYmVkcy5oaWRlVG9vbGJhcigpO1xuICAgIHRoaXMudmFsdWVQb3BvdmVyLnNldCh7XG4gICAgICBrZXksXG4gICAgICBjaGlwLFxuICAgICAgbGVmdDogKGNoaXBSZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0KSAvIHNjYWxlLFxuICAgICAgdG9wOiAoY2hpcFJlY3QudG9wIC0gaG9zdFJlY3QudG9wKSAvIHNjYWxlLFxuICAgICAgd2lkdGg6IGNoaXBSZWN0LndpZHRoIC8gc2NhbGUsXG4gICAgICBoZWlnaHQ6IGNoaXBSZWN0LmhlaWdodCAvIHNjYWxlLFxuICAgIH0pO1xuXG4gICAgLy8gZnMtcG9wb3ZlciBvcGVucyBvbiBhIGNsaWNrIG9uIGl0cyBlbGVtZW50OiBvbmNlIHRoZSBhbmNob3IgaGFzIG1vdmVkXG4gICAgLy8gb3ZlciB0aGUgY2hpcCwgY2xpY2sgaXQuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl92YWx1ZVBvcG92ZXJBbmNob3IoKT8ubmF0aXZlRWxlbWVudC5jbGljaygpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Nob3dOb3RpY2Uobm90aWNlOiBUZXh0Tm90aWNlKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJOb3RpY2VUaW1lcigpO1xuICAgIHRoaXMubm90aWNlLnNldChub3RpY2UpO1xuICAgIHRoaXMuX25vdGljZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLm5vdGljZS5zZXQobnVsbCksIFZBTFVFX0JMT0NLX05PVElDRV9NUyk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhck5vdGljZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ub3RpY2VUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX25vdGljZVRpbWVyKTtcbiAgICAgIHRoaXMuX25vdGljZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBBbiBlZGl0IHRvb2sgdGhlIGxhc3QgY2hpcCBvZiBzb21lIHZhbHVlcyBvdXQgb2YgdGhpcyBibG9jay4gQ291bnRlZCBhcmVcbiAgLy8gdGhlIHZhbHVlcyB0aGUgbGF5ZXIgbm8gbG9uZ2VyIHJlYWRzOiBzaG93biBieSBubyBibG9jaywgdGhpcyBvbmUgb3JcbiAgLy8gYW5vdGhlciwgbm9yIHJlYWQgYnkgYSBmb3JtdWxhIG9uZSBvZiB0aGVtIHNob3dzLiBUaGV5IGFyZSBub3QgZGVsZXRlZDpcbiAgLy8gc2F2aW5nIGh0bWwgbmV2ZXIgZGVsZXRlcyBhIHZhbHVlLlxuICBwcml2YXRlIF9vblZhbHVlc1JlbW92ZWQocmVtb3ZhbDogVmFsdWVFbWJlZFJlbW92YWwpOiB2b2lkIHtcbiAgICBjb25zdCBlbHNld2hlcmUgPSBbLi4udGhpcy5zaG93bkVsc2V3aGVyZSgpKCldO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMudG9rZW5zKCkudmFsdWVzID8/IHt9O1xuICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRLZXlzKFsuLi5yZW1vdmFsLmJlZm9yZSwgLi4uZWxzZXdoZXJlXSwgdmFsdWVzKTtcbiAgICBjb25zdCBhZnRlciA9IHJlYWRLZXlzKFsuLi5yZW1vdmFsLmFmdGVyLCAuLi5lbHNld2hlcmVdLCB2YWx1ZXMpO1xuICAgIGNvbnN0IGNvdW50ID0gWy4uLmJlZm9yZV0uZmlsdGVyKChrZXkpID0+ICFhZnRlci5oYXMoa2V5KSAmJiAhIXZhbHVlc1trZXldKS5sZW5ndGg7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICB0aGlzLl9zaG93Tm90aWNlKHsga2luZDogJ3VudXNlZCcsIGNvdW50LCB1bmRvOiByZW1vdmFsLnVuZG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25Eb2N1bWVudFByZXNzKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodGFyZ2V0ICYmICh0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSB8fCB0YXJnZXQuY2xvc2VzdChFRElUT1JfQ0hST01FKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG5cbiAgLy8gU2F2ZSBOT1csIHRoZW4gYXNrIHRoZSBob3N0IHRvIGNsb3NlLiBTYXZpbmcgaGVyZSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvclxuICAvLyB0aGUgZWRpdGluZyBpbnB1dCB0byBmbGlwIG1hdHRlcnM6IHRoZSBzYW1lIHByZXNzIG1heSBiZSBvbiBhIHBhZ2UgdGFiLFxuICAvLyBhbmQgYnkgdGhlIHRpbWUgdGhlIGlucHV0IGNoYW5nZWQgdGhpcyBibG9jayBjb3VsZCBhbHJlYWR5IGJlIGRlc3Ryb3llZCxcbiAgLy8gd2l0aCBpdHMgZWRpdCBnb25lLlxuICBwcml2YXRlIF9jbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zeW5jRHJhZnQoKTtcbiAgICB0aGlzLl9maW5pc2goKTtcbiAgICB0aGlzLmVkaXRFbmRlZC5lbWl0KCk7XG4gIH1cblxuICAvLyBSZWFkIHRoZSBlZGl0b3IgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlIGxhc3QgbW9kZWwgdXBkYXRlLlxuICBwcml2YXRlIF9zeW5jRHJhZnQoKTogdm9pZCB7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuX2VkaXRvcigpPy5lZGl0b3I/Lmh0bWw/LmdldCgpO1xuICAgIGlmICh0eXBlb2YgaHRtbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuZHJhZnQgPSBodG1sO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmlzaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZGlzbWlzc05vdGljZSgpO1xuICAgIGlmICh0aGlzLmRyYWZ0ICE9PSB0aGlzLmh0bWwoKSkge1xuICAgICAgdGhpcy5zYXZlZC5lbWl0KHRoaXMuZHJhZnQpO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmIChlZGl0aW5nKCkpIHtcbiAgPCEtLSBGbG9hdGluZyBmcy1odG1sLWVkaXRvcjogbm8gZnJhbWUsIEZyb2FsYSdzIGlubGluZSB0b29sYmFyIHBvcHMgdXAgb3ZlclxuICAgICAgIHRoZSB0ZXh0LiBwb2ludGVyZG93biBzdGF5cyBoZXJlIHNvIGEgcHJlc3MgaW4gdGhlIHRleHQgbmV2ZXIgc3RhcnRzIGFcbiAgICAgICBkcmFnIG9mIHRoZSBibG9jayBvciBhIHBhbiBvZiB0aGUgY2FudmFzLiAtLT5cbiAgPGZzLWh0bWwtZWRpdG9yXG4gICAgICBjbGFzcz1cInRleHQtY29udGVudCBlZGl0aW5nXCJcbiAgICAgIFtjb25maWddPVwiZWRpdG9yQ29uZmlnXCJcbiAgICAgIFsobmdNb2RlbCldPVwiZHJhZnRcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICA8L2ZzLWh0bWwtZWRpdG9yPlxuXG4gIDwhLS0gT25lIG5vdGljZSBhdCBhIHRpbWU6IGFuIGVkaXQgc3RvcHBlZCBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgcmVtb3ZlZFxuICAgICAgIHZhbHVlcywgYW4gZWRpdCB0aGF0IGxlZnQgdmFsdWVzIG5vIHRleHQgcmVhZHMsIG9yIGEgcmVmdXNlZCBjb21tYW5kLlxuICAgICAgIG1vdXNlZG93biBrZWVwcyB0aGUgZWRpdG9yJ3MgZm9jdXMgYW5kIHNlbGVjdGlvbiwgc28gVW5kbyByZWFjaGVzIGl0LiAtLT5cbiAgQGlmIChub3RpY2UoKTsgYXMgY3VycmVudCkge1xuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ2YWx1ZS1ub3RpY2UgZnMtcm93LmdhcC1zbVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICBAc3dpdGNoIChjdXJyZW50LmtpbmQpIHtcbiAgICAgICAgQGNhc2UgKCdibG9ja2VkJykge1xuICAgICAgICAgIEBpZiAoY3VycmVudC5ibG9jay5yZW1vdmVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICBUaGlzIHNlbGVjdGlvbiBpbmNsdWRlcyB7eyBjdXJyZW50LmJsb2NrLmNvdW50IH19IHt7IGN1cnJlbnQuYmxvY2suY291bnQgPT09IDEgPyAndmFsdWUnIDogJ3ZhbHVlcycgfX0uXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUJsb2NrZWRTZWxlY3Rpb24oKVwiPlxuICAgICAgICAgICAgICBSZW1vdmUgdGV4dCBhbmQge3sgY3VycmVudC5ibG9jay5jb3VudCA9PT0gMSA/ICd2YWx1ZScgOiBjdXJyZW50LmJsb2NrLmNvdW50ICsgJyB2YWx1ZXMnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuPlRvIHRha2UgYSB2YWx1ZSBvdXQsIHNlbGVjdCBpdCwgdGhlbiBwcmVzcyBEZWxldGUuPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3VudXNlZCcpIHtcbiAgICAgICAgICA8c3Bhbj57eyBjdXJyZW50LmNvdW50IH19IHt7IGN1cnJlbnQuY291bnQgPT09IDEgPyAndmFsdWUnIDogJ3ZhbHVlcycgfX0gbW92ZWQgdG8gTm90IHVzZWQ8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidW5kb1ZhbHVlc1VudXNlZCgpXCI+XG4gICAgICAgICAgICBVbmRvXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtZXNzYWdlJykge1xuICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbnQudGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGlzbWlzc05vdGljZSgpXCI+XG4gICAgICAgIERpc21pc3NcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG59IEBlbHNlIGlmIChlZGl0TW9kZSgpICYmIGlzQmxhbmsoKSkge1xuICA8IS0tIEFuIGVtcHR5IGJsb2NrIHdoaWxlIHRoZSBjYW52YXMgaXMgbGFpZCBvdXQ6IGEgaGludCBpbiB0aGUgYmxvY2sncyBvd25cbiAgICAgICB0eXBlLCBuZXZlciBpdHMgaHRtbCwgc28gbm90aGluZyBpcyB0eXBlZCBvbnRvIGl0IG9yIGV4cG9ydGVkLiAtLT5cbiAgPGRpdiBjbGFzcz1cInRleHQtY29udGVudCB0ZXh0LWhpbnRcIj5Eb3VibGUtY2xpY2sgdG8gZWRpdDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXZcbiAgICAgIGNsYXNzPVwidGV4dC1jb250ZW50XCJcbiAgICAgIFtpbm5lckhUTUxdPVwiZGlzcGxheUh0bWwoKVwiPlxuICA8L2Rpdj5cbn1cblxuPCEtLSBBIGNsaWNrZWQgdmFsdWUgY2hpcCdzIHBvcG92ZXI6IGFuIGZzLXBvcG92ZXIgb24gYW4gaW52aXNpYmxlIGFuY2hvciBsYWlkXG4gICAgIG92ZXIgdGhlIGNoaXAgKHRoZSBjaGlwIGl0c2VsZiBiZWxvbmdzIHRvIHRoZSBlZGl0b3IpLiBPdXRzaWRlIHRoZSBlZGl0aW5nXG4gICAgIGJsb2NrLCBzbyBhIHBvcG92ZXIgc3RpbGwgb3BlbiB3aGVuIGVkaXRpbmcgZW5kcyBjbG9zZXMgdGhlIHVzdWFsIHdheS4gLS0+XG48c3BhblxuICAgICN2YWx1ZVBvcG92ZXJBbmNob3JcbiAgICBjbGFzcz1cInZhbHVlLXBvcG92ZXItYW5jaG9yXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgIGZzUG9wb3ZlclxuICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgd3JhcHBlckNsYXNzPVwidmFsdWUtcG9wb3Zlci13cmFwcGVyXCJcbiAgICBbdGVtcGxhdGVdPVwidmFsdWVQb3BvdmVyVGVtcGxhdGVcIlxuICAgIFtpbmRpY2F0aW9uXT1cImZhbHNlXCJcbiAgICBbbWF4V2lkdGhdPVwiMzIwXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJ2YWx1ZVBvcG92ZXIoKT8ubGVmdFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJ2YWx1ZVBvcG92ZXIoKT8udG9wXCJcbiAgICBbc3R5bGUud2lkdGgucHhdPVwidmFsdWVQb3BvdmVyKCk/LndpZHRoXCJcbiAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInZhbHVlUG9wb3ZlcigpPy5oZWlnaHRcIj5cbjwvc3Bhbj5cbjxuZy10ZW1wbGF0ZVxuICAgICN2YWx1ZVBvcG92ZXJUZW1wbGF0ZVxuICAgIGxldC1wb3BvdmVyPVwicG9wb3ZlclwiPlxuICA8IS0tIFdoYXQgdGhlIHZhbHVlIGlzLCBhbmQgaXRzIHNldHRpbmdzICh3aGVyZSBpdCBjYW4gYWxzbyBiZSBkZWxldGVkKTsgYVxuICAgICAgIGNoaXAgbmFtaW5nIG5vIHZhbHVlIG9uIHRoZSBwYWdlIGhhcyBubyBzZXR0aW5ncy4gLS0+XG4gIDxkaXYgY2xhc3M9XCJ2YWx1ZS1wb3BvdmVyIGZzLXJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtcG9wb3Zlci1uYW1lXCI+e3sgdmFsdWVQb3BvdmVyVmFsdWUoKT8ubmFtZSA/PyB2YWx1ZVBvcG92ZXIoKT8ua2V5IH19PC9kaXY+XG4gICAgICBAaWYgKCF2YWx1ZVBvcG92ZXJWYWx1ZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPk5vdCBhIHZhbHVlIG9uIHRoaXMgcGFnZTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAodmFsdWVQb3BvdmVyVmFsdWUoKSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidmFsdWUtcG9wb3Zlci1zZXR0aW5nc1wiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblZhbHVlU2V0dGluZ3MocG9wb3ZlcilcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvY29tcG9uZW50LXRleHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LXRleHQvY29tcG9uZW50LXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUMzRyxTQUFTLEVBQUUsU0FBUyxHQUNyQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUVuRSxPQUFPLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBRXZFLE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDM0csdUJBQXVCLEVBQUUsaUJBQWlCLEVBQStCLFVBQVUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUMvRyxVQUFVLEdBQ1gsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkQsT0FBTyxFQUNXLHNCQUFzQixFQUFtQixnQkFBZ0IsR0FDMUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRzlCLHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV4SCxzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUM7QUFFMUMsOERBQThEO0FBQzlELDJFQUEyRTtBQUMzRSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLCtEQUErRDtBQUMvRCxNQUFNLFlBQVksR0FBRztJQUNuQixHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtJQUNwRixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0NBQ3JELENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRztJQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLFlBQVk7SUFDckgsZ0JBQWdCLEVBQUUsT0FBTztDQUMxQixDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSxxRUFBcUU7QUFDckUsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSwyRUFBMkU7QUFDM0UsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhO0lBQzFHLGlCQUFpQixFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPO0lBQzFELFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxjQUFjO0lBQ3RHLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsYUFBYTtJQUMxRyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGFBQWE7Q0FDN0UsQ0FBQztBQUVGLDhFQUE4RTtBQUM5RSxpRkFBaUY7QUFDakYsd0JBQXdCO0FBQ3hCLE1BQU0sYUFBYSxHQUFHLDJGQUEyRixDQUFDO0FBRWxILDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQztBQUV4QyxtREFBbUQ7QUFDbkQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUF3Qm5DLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLGtCQUFrQjtBQUNsQixFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLHVFQUF1RTtBQUN2RSwwRUFBMEU7QUFDMUUsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSxnRkFBZ0Y7QUFDaEYsMkNBQTJDO0FBQzNDLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsNEJBQTRCO0FBK0I1QixNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsaUNBQWlDO0lBQ2pCLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakIsTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW9CLENBQUM7SUFDNUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2Qyx3RUFBd0U7SUFDeEQsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4Qyx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHVFQUF1RTtJQUN2RSx5REFBeUQ7SUFDekMsY0FBYyxHQUFHLEtBQUssQ0FBNEIsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFdkYsZ0RBQWdEO0lBQ2hDLEtBQUssR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUV6Qyx5RUFBeUU7SUFDekUsZUFBZTtJQUNDLFNBQVMsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUUzQywwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLHdCQUF3QjtJQUNSLGFBQWEsR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUVqQyxTQUFTLEdBQUc7UUFDMUIsSUFBSSxFQUFFLEdBQUcsaUJBQWlCLElBQUk7UUFDOUIsRUFBRSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDaEMsRUFBRSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDaEMsRUFBRSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDaEMsS0FBSyxFQUFFLGtCQUFrQjtLQUMxQixDQUFDO0lBRWMsU0FBUyxHQUFHO1FBQzFCLE1BQU0sRUFBRSxHQUFHLHVCQUF1QixZQUFZLHVCQUF1QixFQUFFO1FBQ3ZFLE9BQU8sRUFBRSxHQUFHLHVCQUF1QixDQUFDLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQyxVQUFVLElBQUk7UUFDeEYsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLElBQUk7S0FDakMsQ0FBQztJQUVGLGdFQUFnRTtJQUNoRCxjQUFjLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9DLDBEQUEwRDtJQUMxQyxNQUFNLEdBQUcsTUFBTSxDQUFvQixJQUFJLENBQUMsQ0FBQztJQUV6RCw4RUFBOEU7SUFDOUQsWUFBWSxHQUFHLE1BQU0sQ0FBNEIsSUFBSSxDQUFDLENBQUM7SUFDdkQsaUJBQWlCLEdBQUcsUUFBUSxDQUFtQixHQUFHLEVBQUU7UUFDbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEdBQUcsQ0FBQztRQUVyQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0lBRWEsV0FBVyxHQUFHLElBQUksZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUU7UUFDeEMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUMzQixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO1FBQ2pGLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ3RDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDaEUsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ25DLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDL0QsQ0FBQyxDQUFDO0lBRWEsWUFBWSxHQUF1QjtRQUNqRCxRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLFdBQVc7UUFDeEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMzQixPQUFPLEVBQUU7WUFDUDtnQkFDRSxJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixLQUFLLEVBQUUsY0FBYztnQkFDckIsTUFBTSxFQUFFLE1BQU07Z0JBQ2Qsc0VBQXNFO2dCQUN0RSx1REFBdUQ7Z0JBQ3ZELE9BQU8sRUFBRSxFQUFFO2dCQUNYLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUN6RDtZQUNEO2dCQUNFLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLEtBQUssRUFBRSxrQkFBa0I7Z0JBQ3pCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQzNEO1NBQ0Y7UUFDRCxZQUFZLEVBQUU7WUFDWixjQUFjLEVBQUU7Z0JBQ2QsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEdBQUc7Z0JBQ2xDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsR0FBRztnQkFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLEdBQUc7Z0JBQ25ELFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUI7YUFDekU7WUFDRCxzRUFBc0U7WUFDdEUsc0NBQXNDO1lBQ3RDLGdCQUFnQixFQUFFO2dCQUNoQixhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FBRztnQkFDOUQsWUFBWSxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLDBCQUEwQjthQUMxRjtZQUNELGlCQUFpQixFQUFFLE1BQU07WUFDekIsd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSxpQkFBaUI7WUFDakIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsaUJBQWlCLEVBQUUsS0FBSztZQUN4QixlQUFlLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFO1lBQ25GLHdCQUF3QixFQUFFLElBQUk7WUFDOUIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixlQUFlLEVBQUUsWUFBWTtZQUM3QixnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsc0JBQXNCLENBQUM7WUFDckcscUJBQXFCLEVBQUUsY0FBYztZQUNyQyx1QkFBdUIsRUFBRSxvQkFBb0I7WUFDN0MsY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztZQUNuQyxxRUFBcUU7WUFDckUsK0JBQStCO1lBQy9CLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLDhEQUE4RDtZQUM5RCxVQUFVLEVBQUUsSUFBSTtZQUNoQix5RUFBeUU7WUFDekUsa0RBQWtEO1lBQ2xELFdBQVcsRUFBRSxDQUFDO1NBQ2Y7S0FDRixDQUFDO0lBRWMsV0FBVyxHQUFHLFFBQVEsQ0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUM1RixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUMzQyxDQUFDLENBQUM7SUFFSCx3RUFBd0U7SUFDeEUsbUVBQW1FO0lBQ25ELE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsbUNBQW1DO0lBQzVCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFRCxPQUFPLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDM0MsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDNUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxLQUFLLEdBQTRCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsWUFBWSxHQUF5QyxJQUFJLENBQUM7SUFFbEU7UUFDRSx5RUFBeUU7UUFDekUscUVBQXFFO1FBQ3JFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0IsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzQixDQUFDO3FCQUFNLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCx5RUFBeUU7UUFDekUsbUVBQW1FO1FBQ25FLG9DQUFvQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQW1CLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQW9CO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUN6RCxXQUFXLENBQUMsR0FBVztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9CQUFvQjtJQUNiLGlCQUFpQixDQUFDLE9BQXFCO1FBQzVDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsR0FBRyxDQUFDO1FBQ3JDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELHdFQUF3RTtJQUNqRSxnQkFBZ0I7UUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxFQUFFLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxtRUFBbUU7SUFDM0QsbUJBQW1CO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUU5QixPQUFPO1lBQ0wsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckYsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUM5RyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLEdBQVcsRUFBRSxJQUFpQjtRQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM5Qyx1RUFBdUU7UUFDdkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUNwQixHQUFHO1lBQ0gsSUFBSTtZQUNKLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUs7WUFDN0MsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztZQUMxQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLO1lBQzdCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUs7U0FDaEMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQ3hFLDJCQUEyQjtRQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFrQjtRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLHFDQUFxQztJQUM3QixnQkFBZ0IsQ0FBQyxPQUEwQjtRQUNqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRSxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUVuRixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFtQjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBNEIsQ0FBQztRQUNsRCxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0Usc0JBQXNCO0lBQ2QsTUFBTTtRQUNaLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCx1RUFBdUU7SUFDL0QsVUFBVTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRU8sT0FBTztRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQzt3R0FyVlUsc0JBQXNCOzRGQUF0QixzQkFBc0Isc3dDQXNKSSxxQkFBcUIsdUpBQ3FCLFVBQVUsNkNDNVMzRiwrK0hBZ0hBLHFvRkRjSSxXQUFXLCtWQUNYLFNBQVMsaUxBQ1QsYUFBYSw2RkFDYixPQUFPLDJJQUNQLFVBQVUsaVJBQ1YscUJBQXFCLDJGQUNyQixrQkFBa0I7OzRGQWlCVCxzQkFBc0I7a0JBOUJsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsV0FBVzt3QkFDWCxTQUFTO3dCQUNULGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLHFCQUFxQjt3QkFDckIsa0JBQWtCO3FCQUNuQixRQUNLO3dCQUNKLFdBQVcsRUFBRSxtQkFBbUI7d0JBQ2hDLDJFQUEyRTt3QkFDM0Usa0VBQWtFO3dCQUNsRSxxQkFBcUIsRUFBRSxnQkFBZ0I7d0JBQ3ZDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHdCQUF3QixFQUFFLGNBQWM7d0JBQ3hDLHNCQUFzQixFQUFFLGlCQUFpQjt3QkFDekMsK0NBQStDO3dCQUMvQyw2QkFBNkIsRUFBRSxrQkFBa0I7d0JBQ2pELDhCQUE4QixFQUFFLG1CQUFtQjt3QkFDbkQsNkJBQTZCLEVBQUUsa0JBQWtCO3FCQUNsRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLFxuICB1bnRyYWNrZWQsIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEJ1dHRvbiwgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IEZzSHRtbEVkaXRvckNvbXBvbmVudCwgRnNIdG1sRWRpdG9yQ29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvaHRtbC1lZGl0b3InO1xuaW1wb3J0IHsgRnNQb3BvdmVyRGlyZWN0aXZlLCBGc1BvcG92ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9wb3BvdmVyJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgSEVBRElOR19URVhUX1NJWkVTLCBURVhUX1RBQkxFX0JPUkRFUl9DT0xPUiwgVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsXG4gIFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HLCBURVhUX1RBQkxFX01BUkdJTiwgVGV4dFRva2VuQ29udGV4dCwgVGV4dFZhbHVlLCBmaWVsZFRva2VuLCBmaWxsVGV4dFRva2VucywgdGV4dEZpZWxkcyxcbiAgdmFsdWVUb2tlbixcbn0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBOT19WQUxVRV9LRVlTLCByZWFkS2V5cyB9IGZyb20gJy4uLy4uL3ZhbHVlcyc7XG5cbmltcG9ydCB7XG4gIEVtYmVkTWVudUVudHJ5LCBWQUxVRV9FTUJFRF9BVFRSSUJVVEVTLCBWYWx1ZUVtYmVkQmxvY2ssIFZhbHVlRW1iZWRQbHVnaW4sIFZhbHVlRW1iZWRSZW1vdmFsLFxufSBmcm9tICcuL3ZhbHVlLWVtYmVkLnBsdWdpbic7XG5cblxuLy8gUG9pbnQgc2l6ZXMg4oCUIHRoZSByZXBvcnQncyB0eXBlIHVuaXQgKDE6MSB3aXRoIFBvd2VyUG9pbnQgYW5kIFBERikuXG5jb25zdCBGT05UX1NJWkVTID0gWyc4JywgJzknLCAnMTAnLCAnMTEnLCAnMTInLCAnMTQnLCAnMTYnLCAnMTgnLCAnMjAnLCAnMjQnLCAnMjgnLCAnMzInLCAnMzYnLCAnNDAnLCAnNDgnLCAnNjAnLCAnNzInXTtcblxuLy8gVGhlIHRvb2xiYXIgZHJvcGRvd24gdGhhdCBpbnNlcnRzIGEgZmllbGQgb3IgYSB2YWx1ZSBpbnRvIHRoZSB0ZXh0LlxuY29uc3QgSU5TRVJUX0ZJRUxEX0JVVFRPTiA9ICdpbnNlcnRGaWVsZCc7XG5cbi8vIFdoYXQgdGhlIGVkaXRvciBtYXkgcHJvZHVjZSDigJQgZXhhY3RseSB3aGF0IHRoZSBzZXJ2ZXIga2VlcHNcbi8vIChSZXBvcnRUZXh0SHRtbCkgYW5kIHRoZSBleHBvcnRzIGRyYXcuIEFueXRoaW5nIGVsc2Ugd291bGQgZWRpdCBmaW5lIGFuZFxuLy8gdGhlbiB2YW5pc2ggb24gc2F2ZS4gQSB0YWJsZSBrZWVwcyBpdHMgcm93cywgY2VsbHMgYW5kIHNwYW5zLCBhbmQgYSBjZWxsIGl0c1xuLy8gYWxpZ25tZW50LCBmaWxsIGFuZCB3aWR0aDsgaXRzIGJvcmRlcnMgYW5kIHBhZGRpbmcgYXJlIG5ldmVyIHN0b3JlZCwgc29cbi8vIGV2ZXJ5IHJlbmRlcmVyIGRyYXdzIHRoZSBvbmUgZ3JpZCBpbiB0ZXh0LnRzIChURVhUX1RBQkxFXyopLlxuY29uc3QgQUxMT1dFRF9UQUdTID0gW1xuICAncCcsICdoMScsICdoMicsICdoMycsICdicicsICdzdHJvbmcnLCAnZW0nLCAndScsICdzJywgJ3NwYW4nLCAnYScsICd1bCcsICdvbCcsICdsaScsXG4gICd0YWJsZScsICd0aGVhZCcsICd0Ym9keScsICd0Zm9vdCcsICd0cicsICd0aCcsICd0ZCcsXG5dO1xuY29uc3QgQUxMT1dFRF9TVFlMRVMgPSBbXG4gICdjb2xvcicsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2ZvbnQtc2l6ZScsICdmb250LXdlaWdodCcsICdmb250LXN0eWxlJywgJ3RleHQtZGVjb3JhdGlvbicsICdmb250LWZhbWlseScsICd0ZXh0LWFsaWduJyxcbiAgJ3ZlcnRpY2FsLWFsaWduJywgJ3dpZHRoJyxcbl07XG5cbi8vIFdpdGggdXNlQ2xhc3NlczogZmFsc2UsIEZyb2FsYSdzIGh0bWwuZ2V0IGNvcGllcyBldmVyeSBzdHlsZXNoZWV0IGRlY2xhcmF0aW9uXG4vLyB0aGF0IG1hdGNoZXMgYW4gZWxlbWVudCBpbnRvIGl0cyBpbmxpbmUgc3R5bGUsIHRoZW4gbGF5cyB0aGUgZWxlbWVudCdzIG93blxuLy8gaW5saW5lIHN0eWxlIGJhY2sgb3ZlciBpdC4gU28gYW4gaWdub3JlZCBwcm9wZXJ0eSBuZXZlciBsb3NlcyB3aGF0IHRoZSB1c2VyXG4vLyBzZXQ7IGl0IG9ubHkga2VlcHMgdGhlIGNhbnZhcydzLCBGcm9hbGEncyBhbmQgdGhlIGhvc3QgYXBwJ3MgY3NzIG91dCBvZiB0aGVcbi8vIHNhdmVkIGh0bWwuIExpc3RlZDogZXZlcnkgcHJvcGVydHkgdGhlIHNlcnZlciBrZWVwcyBhbmQgdGhlIHNob3J0aGFuZHMgdGhhdFxuLy8gc2V0IG9uZSAob3RoZXJ3aXNlIEZyb2FsYSdzIGdyZXkgaGVhZGVyIGZpbGwgd291bGQgYmUgc2F2ZWQgYXMgdGhlIHVzZXIncyksXG4vLyB0aGVuIGV2ZXJ5dGhpbmcgZWxzZSB0aG9zZSBzdHlsZXNoZWV0cyBzZXQgb24gYSBibG9jaydzIGVsZW1lbnRzLCBzbyBhIGJsb2NrXG4vLyBvcGVuZWQgYW5kIGNsb3NlZCB1bnRvdWNoZWQgc2F2ZXMgbm90aGluZyBuZXcuIE5hbWVzIG1hdGNoIGV4YWN0bHksIHNvIGFcbi8vIHJ1bGUncyBsb25naGFuZHMgYXJlIGxpc3RlZCB0b286IHRoZSBicm93c2VyIHNwZWxscyBGcm9hbGEncyB0YWJsZVxuLy8gYGJvcmRlcjogbm9uZWAgYXMgYm9yZGVyLXdpZHRoLy1zdHlsZS8tY29sb3IvLWltYWdlLCBhbmQgdGhlIGhvc3QgYXBwJ3Ncbi8vIGhlYWRpbmdzIHNldCBtYXJnaW4tdG9wIGFuZCBtYXJnaW4tYm90dG9tLiBGcm9hbGEgYWxzbyBvdXRsaW5lcyBhIHRhYmxlIHRoZVxuLy8gcG9pbnRlciBpcyBvdmVyLCB3aXRoIGEgY2xhc3MgdGhhdCBpcyBzdGlsbCBvbiBpdCB3aGVuIHRoZSBodG1sIGlzIHJlYWQuXG5jb25zdCBJR05PUkVEX1NIRUVUX1NUWUxFUyA9IFtcbiAgJ2NvbG9yJywgJ2JhY2tncm91bmQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdmb250JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXN0eWxlJywgJ2ZvbnQtd2VpZ2h0JyxcbiAgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LWFsaWduJywgJ3ZlcnRpY2FsLWFsaWduJywgJ3dpZHRoJyxcbiAgJ2hlaWdodCcsICdtaW4td2lkdGgnLCAnbWF4LXdpZHRoJywgJ21hcmdpbicsICdtYXJnaW4tdG9wJywgJ21hcmdpbi1ib3R0b20nLCAncGFkZGluZycsICdwYWRkaW5nLWxlZnQnLFxuICAnYm9yZGVyJywgJ2JvcmRlci13aWR0aCcsICdib3JkZXItc3R5bGUnLCAnYm9yZGVyLWNvbG9yJywgJ2JvcmRlci1pbWFnZScsICdib3JkZXItY29sbGFwc2UnLCAnZW1wdHktY2VsbHMnLFxuICAnb3V0bGluZScsICdwb3NpdGlvbicsICdkaXNwbGF5JywgJ2xpc3Qtc3R5bGUnLCAnbGluZS1oZWlnaHQnLCAndXNlci1zZWxlY3QnLFxuXTtcblxuLy8gRnJvYWxhJ3Mgb3duIHRvb2xiYXJzIGFuZCBwb3B1cHMgbGl2ZSBvbiB0aGUgYm9keSwgbm90IGluIHRoZSBibG9jaywgYW5kIHNvXG4vLyBkb2VzIGEgdmFsdWUgY2hpcCdzIHBvcG92ZXIgKGFuIG92ZXJsYXkpOyBhIHByZXNzIG9uIGFueSBvZiB0aGVtIGlzIHN0aWxsIHBhcnRcbi8vIG9mIGVkaXRpbmcgdGhlIGJsb2NrLlxuY29uc3QgRURJVE9SX0NIUk9NRSA9ICcuZnItdG9vbGJhciwgLmZyLXBvcHVwLCAuZnItZHJvcGRvd24tbWVudSwgLmZyLW1vZGFsLCAuZnItdG9vbHRpcCwgLmNkay1vdmVybGF5LWNvbnRhaW5lcic7XG5cbi8vIFRoZSB0b29sYmFyIHRvZ2dsZSBiZXR3ZWVuIGEgY2hpcCdzIG51bWJlciBhbmQgaXRzIG5hbWUuXG5jb25zdCBWQUxVRV9OQU1FU19CVVRUT04gPSAndmFsdWVOYW1lcyc7XG5cbi8vIEhvdyBsb25nIGEgbm90aWNlIHVuZGVyIHRoZSBvcGVuIGJsb2NrIHN0YXlzIHVwLlxuY29uc3QgVkFMVUVfQkxPQ0tfTk9USUNFX01TID0gNjAwMDtcblxuLy8gV2hhdCB0aGUgbm90aWNlIHVuZGVyIHRoZSBvcGVuIGJsb2NrIHNheXMsIG9uZSBhdCBhIHRpbWU6IGFuIGVkaXQgd2FzXG4vLyBzdG9wcGVkIGJlY2F1c2UgaXQgd291bGQgaGF2ZSByZW1vdmVkIHZhbHVlczsgYW4gZWRpdCBsZWZ0IHZhbHVlcyB0aGF0IG5vXG4vLyB0ZXh0IHJlYWRzIGFueSBtb3JlLCB3aXRoIHRoZSB1bmRvIHRoYXQgcHV0cyB0aGVtIGJhY2s7IG9yIGEgY29tbWFuZCB3YXNcbi8vIHJlZnVzZWQuXG50eXBlIFRleHROb3RpY2UgPVxuICB8IHsga2luZDogJ2Jsb2NrZWQnOyBibG9jazogVmFsdWVFbWJlZEJsb2NrIH1cbiAgfCB7IGtpbmQ6ICd1bnVzZWQnOyBjb3VudDogbnVtYmVyOyB1bmRvOiAoKSA9PiB2b2lkIH1cbiAgfCB7IGtpbmQ6ICdtZXNzYWdlJzsgdGV4dDogc3RyaW5nIH07XG5cbi8vIEEgY2xpY2tlZCB2YWx1ZSBjaGlwJ3MgcG9wb3ZlciBpcyBhbiBmcy1wb3BvdmVyLCB3aGljaCBhdHRhY2hlcyB0byBhbiBlbGVtZW50XG4vLyBvZiB0aGlzIGNvbXBvbmVudCdzIG93biB0ZW1wbGF0ZSDigJQgdGhlIGNoaXAgYmVsb25ncyB0byB0aGUgZWRpdG9yLiBTbyBpdFxuLy8gb3BlbnMgZnJvbSBhbiBpbnZpc2libGUgYW5jaG9yIGxhaWQgb3ZlciB0aGUgY2hpcCwgaW4gdGhlIGJsb2NrJ3Mgb3duXG4vLyAodW5zY2FsZWQpIHBpeGVscy5cbmludGVyZmFjZSBWYWx1ZVBvcG92ZXJBbmNob3Ige1xuICBrZXk6IHN0cmluZztcbiAgY2hpcDogSFRNTEVsZW1lbnQ7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG4vLyBBIHRleHQgYmxvY2s6IGF1dGhvcmVkIHJpY2ggdGV4dCBvbiB0aGUgcGFnZS5cbi8vXG4vLyBSZWFkIG1vZGUgcmVuZGVycyB0aGUgc3RvcmVkIGh0bWwgd2l0aCBpdHMgdG9rZW5zICh7e3BhZ2UubnVtYmVyfX0sIOKApikgZmlsbGVkXG4vLyBmb3IgdGhlIHBhZ2UgaXQgaXMgZHJhd24gb24uIFRoZSBodG1sIGhhcyBhbHJlYWR5IGJlZW4gcmVidWlsdCBzZXJ2ZXItc2lkZVxuLy8gZnJvbSBhbiBhbGxvd2xpc3QgKFJlcG9ydFRleHRIdG1sKSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBiaW5kaW5nIGl0IGFzIHRydXN0ZWRcbi8vIG1hcmt1cCBzYWZlIOKAlCBBbmd1bGFyJ3Mgb3duIHNhbml0aXplciB3b3VsZCBzdHJpcCB0aGUgaW5saW5lIHN0eWxlcyB0aGF0IEFSRVxuLy8gdGhlIGZvcm1hdHRpbmcuXG4vL1xuLy8gRWRpdCBtb2RlIG1vdW50cyA8ZnMtaHRtbC1lZGl0b3I+IGluIGl0cyBmbG9hdGluZyBtb2RlIGluIHBsYWNlIOKAlCB0aGUgd29yZHNcbi8vIHN0YXkgd2hlcmUgdGhleSBzaXQgb24gdGhlIHNsaWRlIOKAlCB3aXRoIEZyb2FsYSdzIGlubGluZSB0b29sYmFyIHBvcHBpbmcgdXBcbi8vIG92ZXIgdGhlbS4gVGhlIGVkaXRvciBleGlzdHMgb25seSB3aGlsZSBlZGl0aW5nOyB0aGUgcmF3IGh0bWwgaXMgZWRpdGVkLCBidXRcbi8vIGV2ZXJ5IHRva2VuIGVkaXRzIGFzIGEgY2hpcCB0aGF0IHJlYWRzIGFzIHRoZSB0b2tlbiBkb2VzIChWYWx1ZUVtYmVkUGx1Z2luKSxcbi8vIGFuZCBJbnNlcnQgZmllbGQgcHV0cyBhbnkgb2YgdGhlbSBpbi4gQSBwYWdlLCByZXBvcnQgb3IgZmlsdGVyIGZpZWxkXG4vLyAoe3twYWdlLm51bWJlcn19LCB7e2ZpbHRlci4xMn19KSBkZWxldGVzIGxpa2UgYSBjaGFyYWN0ZXIuIEEgbGl2ZSB2YWx1ZVxuLy8gKHt7dmFsdWUua2V5fX0pIGlzIGd1YXJkZWQ6IG5vIHN0cmF5IGtleXN0cm9rZSByZW1vdmVzIGl0LCBhbmQgc2VsZWN0aW5nIGl0XG4vLyBhbmQgcHJlc3NpbmcgRGVsZXRlIG9mZmVycyB0byB0YWtlIGl0IG91dC4gRGVsZXRpbmcgYSB0YWJsZSdzIHJvd3MsIGNvbHVtbnNcbi8vIG9yIGNlbGxzIGRvZXMgdGFrZSB0aGUgY2hpcHMgaW4gdGhlbSwgYW5kIGEgbm90aWNlIHVuZGVyIHRoZSBibG9jayBjb3VudHMgdGhlXG4vLyB2YWx1ZXMgdGhhdCBsZWF2ZXMgdW51c2VkLCB3aXRoIGFuIFVuZG8uXG4vL1xuLy8gVGhlIGJsb2NrIG5ldmVyIHNhdmVzIG9uIGl0cyBvd246IGl0IGVtaXRzIHRoZSBuZXcgaHRtbCB3aGVuIGVkaXRpbmcgZW5kc1xuLy8gYW5kIHRoZSBob3N0IHBlcnNpc3RzIGl0LlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtdGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtdGV4dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC10ZXh0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTWF0QnV0dG9uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0SWNvbixcbiAgICBNYXRUb29sdGlwLFxuICAgIEZzSHRtbEVkaXRvckNvbXBvbmVudCxcbiAgICBGc1BvcG92ZXJEaXJlY3RpdmUsXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnKGtleWRvd24pJzogJ29uS2V5ZG93bigkZXZlbnQpJyxcbiAgICAvLyBUaGUgZG9jdW1lbnQgdHlwZSBzY2FsZSBjb21lcyBmcm9tIHRoZSBzYW1lIGNvbnN0YW50cyB0aGUgUG93ZXJQb2ludCBhbmRcbiAgICAvLyBQREYgZXhwb3J0cyBkcmF3IHdpdGgsIHNvIGEgcGFyYWdyYXBoIGlzIG9uZSBzaXplIGluIGFsbCB0aHJlZS5cbiAgICAnW3N0eWxlLi0tdGV4dC1zaXplXSc6ICd0eXBlU2NhbGUuYm9keScsXG4gICAgJ1tzdHlsZS4tLXRleHQtaDEtc2l6ZV0nOiAndHlwZVNjYWxlLmgxJyxcbiAgICAnW3N0eWxlLi0tdGV4dC1oMi1zaXplXSc6ICd0eXBlU2NhbGUuaDInLFxuICAgICdbc3R5bGUuLS10ZXh0LWgzLXNpemVdJzogJ3R5cGVTY2FsZS5oMycsXG4gICAgJ1tzdHlsZS4tLXRleHQtY29sb3JdJzogJ3R5cGVTY2FsZS5jb2xvcicsXG4gICAgLy8gQSB0YWJsZSdzIGdyaWQgY29tZXMgZnJvbSB0aGVtIHRoZSBzYW1lIHdheS5cbiAgICAnW3N0eWxlLi0tdGV4dC10YWJsZS1ib3JkZXJdJzogJ3RhYmxlTG9vay5ib3JkZXInLFxuICAgICdbc3R5bGUuLS10ZXh0LXRhYmxlLXBhZGRpbmddJzogJ3RhYmxlTG9vay5wYWRkaW5nJyxcbiAgICAnW3N0eWxlLi0tdGV4dC10YWJsZS1tYXJnaW5dJzogJ3RhYmxlTG9vay5tYXJnaW4nLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRUZXh0Q29tcG9uZW50IHtcblxuICAvLyBUaGUgYmxvY2sncyBzdG9yZWQgaHRtbCAoY29uZmlnLmh0bWwpLiBJdHMgb3duIGlucHV0IHJhdGhlciB0aGFuIHJlYWQgb2ZmXG4gIC8vIHRoZSBjb21wb25lbnQsIHNvIGEgc2F2ZWQgZWRpdCDigJQgYSBuZXcgc3RyaW5nIG9uIHRoZSBzYW1lIGNvbXBvbmVudCDigJQgaXNcbiAgLy8gc2VlbiBhcyBhIGNoYW5nZSBhbmQgcmVwYWludHMuXG4gIHB1YmxpYyByZWFkb25seSBodG1sID0gaW5wdXQoJycpO1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5zID0gaW5wdXQucmVxdWlyZWQ8VGV4dFRva2VuQ29udGV4dD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRpbmcgPSBpbnB1dChmYWxzZSk7XG5cbiAgLy8gVGhlIGNhbnZhcyBpcyBiZWluZyBsYWlkIG91dCwgc28gYW4gZW1wdHkgYmxvY2sgc2hvd3MgaG93IHRvIGZpbGwgaXQuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0TW9kZSA9IGlucHV0KGZhbHNlKTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgdGhpcyBibG9jaydzIGxheWVyIHNob3cuIEFza2VkXG4gIC8vIGZvciB3aGVuIGFuIGVkaXQgdGFrZXMgdGhlIGxhc3QgY2hpcCBvZiBhIHZhbHVlIG91dCBvZiB0aGlzIGJsb2NrLCBhcyBhXG4gIC8vIHZhbHVlIGFub3RoZXIgYmxvY2sgc3RpbGwgc2hvd3MgaXMgbm90IGxlZnQgdW51c2VkOyBhIGZ1bmN0aW9uLCBhcyBhXG4gIC8vIHNhdmVkIGJsb2NrJ3MgaHRtbCBjaGFuZ2VzIHdpdGhvdXQgYW55IGlucHV0IGNoYW5naW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd25FbHNld2hlcmUgPSBpbnB1dDwoKSA9PiBSZWFkb25seVNldDxzdHJpbmc+PigoKSA9PiBOT19WQUxVRV9LRVlTKTtcblxuICAvLyBUaGUgaHRtbCBhZnRlciBhbiBlZGl0LCBvbmx5IHdoZW4gaXQgY2hhbmdlZC5cbiAgcHVibGljIHJlYWRvbmx5IHNhdmVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBBIHByZXNzIGxhbmRlZCBvdXRzaWRlIHRoZSBibG9jayAob3IgRXNjYXBlKTogdGhlIGhvc3QgZW5kcyBlZGl0IG1vZGUsXG4gIC8vIHdoaWNoIHNhdmVzLlxuICBwdWJsaWMgcmVhZG9ubHkgZWRpdEVuZGVkID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgLy8gQSB2YWx1ZSdzIHNldHRpbmdzIHdlcmUgYXNrZWQgZm9yIGZyb20gaXRzIHBvcG92ZXIsIGJ5IHRoZSB2YWx1ZSdzIGtleS5cbiAgLy8gVGhlIGhvc3Qgb3BlbnMgdGhlIHZhbHVlJ3Mgc2V0dGluZ3MgZGlhbG9nLCB3aGVyZSBpdCBjYW4gYWxzbyBiZSBkZWxldGVkXG4gIC8vICh0aGVuIHJlbW92ZVZhbHVlKCkpLlxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVTZXR0aW5ncyA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVTY2FsZSA9IHtcbiAgICBib2R5OiBgJHtERUZBVUxUX1RFWFRfU0laRX1wdGAsXG4gICAgaDE6IGAke0hFQURJTkdfVEVYVF9TSVpFU1sxXX1wdGAsXG4gICAgaDI6IGAke0hFQURJTkdfVEVYVF9TSVpFU1syXX1wdGAsXG4gICAgaDM6IGAke0hFQURJTkdfVEVYVF9TSVpFU1szXX1wdGAsXG4gICAgY29sb3I6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVMb29rID0ge1xuICAgIGJvcmRlcjogYCR7VEVYVF9UQUJMRV9CT1JERVJfV0lEVEh9cHQgc29saWQgJHtURVhUX1RBQkxFX0JPUkRFUl9DT0xPUn1gLFxuICAgIHBhZGRpbmc6IGAke1RFWFRfVEFCTEVfQ0VMTF9QQURESU5HLnZlcnRpY2FsfXB0ICR7VEVYVF9UQUJMRV9DRUxMX1BBRERJTkcuaG9yaXpvbnRhbH1wdGAsXG4gICAgbWFyZ2luOiBgJHtURVhUX1RBQkxFX01BUkdJTn1wdGAsXG4gIH07XG5cbiAgLy8gQ2hpcHMgbGFiZWwgdmFsdWVzIHdpdGggdGhlaXIgbmFtZXMgaW5zdGVhZCBvZiB0aGVpciBudW1iZXJzLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1ZhbHVlTmFtZXMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSBub3RpY2UgdW5kZXIgdGhlIG9wZW4gYmxvY2suIEEgbmV3IG9uZSByZXBsYWNlcyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGljZSA9IHNpZ25hbDxUZXh0Tm90aWNlIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGNoaXAgd2hvc2UgcG9wb3ZlciB3YXMgb3BlbmVkIGxhc3QsIGFuZCB3aGF0IHRoZSBwb3BvdmVyIHNheXMgYWJvdXQgaXQuXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVBvcG92ZXIgPSBzaWduYWw8VmFsdWVQb3BvdmVyQW5jaG9yIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVBvcG92ZXJWYWx1ZSA9IGNvbXB1dGVkPFRleHRWYWx1ZSB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnZhbHVlUG9wb3ZlcigpPy5rZXk7XG5cbiAgICByZXR1cm4ga2V5ID8gdGhpcy50b2tlbnMoKS52YWx1ZXM/LltrZXldID8/IG51bGwgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVFbWJlZHMgPSBuZXcgVmFsdWVFbWJlZFBsdWdpbih7XG4gICAgbmFtZTogJ3JlcG9ydFZhbHVlRW1iZWRzJyxcbiAgICBob3N0OiAoKSA9PiB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgdmFsdWVzOiAoKSA9PiB0aGlzLnRva2VucygpLnZhbHVlcyA/PyB7fSxcbiAgICBzY29wZTogKCkgPT4gU3RyaW5nKHRoaXMudG9rZW5zKCkudmFsdWVQYWdlSWQgPz8gJycpLFxuICAgIGZpZWxkczogKCkgPT4gdGhpcy50b2tlbnMoKSxcbiAgICBtZW51OiB7IGNvbW1hbmQ6IElOU0VSVF9GSUVMRF9CVVRUT04sIGVudHJpZXM6ICgpID0+IHRoaXMuX2luc2VydEZpZWxkRW50cmllcygpIH0sXG4gICAgc2hvd05hbWVzOiAoKSA9PiB0aGlzLnNob3dWYWx1ZU5hbWVzKCksXG4gICAgY2xpY2s6IChrZXksIGNoaXApID0+IHRoaXMuX29wZW5WYWx1ZVBvcG92ZXIoa2V5LCBjaGlwKSxcbiAgICBibG9ja2VkOiAoYmxvY2spID0+IHRoaXMuX3Nob3dOb3RpY2UoeyBraW5kOiAnYmxvY2tlZCcsIGJsb2NrIH0pLFxuICAgIHJlbW92ZWQ6IChyZW1vdmFsKSA9PiB0aGlzLl9vblZhbHVlc1JlbW92ZWQocmVtb3ZhbCksXG4gICAgY2hhbmdlZDogKCkgPT4gdGhpcy5kaXNtaXNzTm90aWNlKCksXG4gICAgcmVmdXNlZDogKHRleHQpID0+IHRoaXMuX3Nob3dOb3RpY2UoeyBraW5kOiAnbWVzc2FnZScsIHRleHQgfSksXG4gIH0pO1xuXG4gIHB1YmxpYyByZWFkb25seSBlZGl0b3JDb25maWc6IEZzSHRtbEVkaXRvckNvbmZpZyA9IHtcbiAgICBmbG9hdGluZzogdHJ1ZSxcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgcGxhY2Vob2xkZXI6ICdUeXBlIGhlcmUnLFxuICAgIHBsdWdpbnM6IFt0aGlzLnZhbHVlRW1iZWRzXSxcbiAgICBidXR0b25zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IElOU0VSVF9GSUVMRF9CVVRUT04sXG4gICAgICAgIHRpdGxlOiAnSW5zZXJ0IGZpZWxkJyxcbiAgICAgICAgc3ZnS2V5OiAndGFncycsXG4gICAgICAgIC8vIE9wdGlvbnMgbWFrZSBpdCBhIGRyb3Bkb3duLiBJdHMgZW50cmllcyBhcmUgdGhlIGJsb2NrJ3Mgb3duLCBmaWxsZWRcbiAgICAgICAgLy8gaW4gYnkgVmFsdWVFbWJlZFBsdWdpbiBlYWNoIHRpbWUgYW4gZWRpdG9yIGlzIGJ1aWx0LlxuICAgICAgICBvcHRpb25zOiB7fSxcbiAgICAgICAgY2xpY2s6IChlZGl0b3IsIHRva2VuKSA9PiB0aGlzLnZhbHVlRW1iZWRzLmluc2VydCh0b2tlbiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBWQUxVRV9OQU1FU19CVVRUT04sXG4gICAgICAgIHRpdGxlOiAnU2hvdyB2YWx1ZSBuYW1lcycsXG4gICAgICAgIHN2Z0tleTogJ3RleHRNb3JlJyxcbiAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuc2hvd1ZhbHVlTmFtZXMudXBkYXRlKChuYW1lcykgPT4gIW5hbWVzKSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBmcm9hbGFDb25maWc6IHtcbiAgICAgIHRvb2xiYXJCdXR0b25zOiBbXG4gICAgICAgICdwYXJhZ3JhcGhGb3JtYXQnLCAnZm9udFNpemUnLCAnfCcsXG4gICAgICAgICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlVGhyb3VnaCcsICd0ZXh0Q29sb3InLCAnfCcsXG4gICAgICAgICdhbGlnbicsICdmb3JtYXRVTCcsICdmb3JtYXRPTCcsICdpbnNlcnRUYWJsZScsICd8JyxcbiAgICAgICAgJ2luc2VydExpbmsnLCBJTlNFUlRfRklFTERfQlVUVE9OLCBWQUxVRV9OQU1FU19CVVRUT04sICdjbGVhckZvcm1hdHRpbmcnLFxuICAgICAgXSxcbiAgICAgIC8vIEEgdGFibGUncyBwb3B1cCBvZmZlcnMgb25seSB3aGF0IHRoZSBzZXJ2ZXIga2VlcHM6IG5vIHRhYmxlIG9yIGNlbGxcbiAgICAgIC8vIHN0eWxlcyAoY2xhc3NlcykgYW5kIG5vIGZvb3RlciByb3cuXG4gICAgICB0YWJsZUVkaXRCdXR0b25zOiBbXG4gICAgICAgICd0YWJsZUhlYWRlcicsICd0YWJsZVJlbW92ZScsICd0YWJsZVJvd3MnLCAndGFibGVDb2x1bW5zJywgJy0nLFxuICAgICAgICAndGFibGVDZWxscycsICd0YWJsZUNlbGxCYWNrZ3JvdW5kJywgJ3RhYmxlQ2VsbFZlcnRpY2FsQWxpZ24nLCAndGFibGVDZWxsSG9yaXpvbnRhbEFsaWduJyxcbiAgICAgIF0sXG4gICAgICB0YWJsZURlZmF1bHRXaWR0aDogJzEwMCUnLFxuICAgICAgLy8gQm90aCBhcmUgcG9zaXRpb25lZCBpbiBzY3JlZW4gc3BhY2UgaW5zaWRlIHRoZSBjYW52YXMncyBDU1Mgc2NhbGUsIHNvXG4gICAgICAvLyB0aGV5IGxhbmQgb2ZmIHRoZSB0YWJsZTsgcm93cyBhbmQgY29sdW1ucyBhcmUgYWRkZWQgZnJvbSB0aGUgdGFibGUnc1xuICAgICAgLy8gcG9wdXAgaW5zdGVhZC5cbiAgICAgIHRhYmxlUmVzaXplcjogZmFsc2UsXG4gICAgICB0YWJsZUluc2VydEhlbHBlcjogZmFsc2UsXG4gICAgICBwYXJhZ3JhcGhGb3JtYXQ6IHsgTjogJ05vcm1hbCcsIEgxOiAnSGVhZGluZyAxJywgSDI6ICdIZWFkaW5nIDInLCBIMzogJ0hlYWRpbmcgMycgfSxcbiAgICAgIHBhcmFncmFwaEZvcm1hdFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgIGZvbnRTaXplOiBGT05UX1NJWkVTLFxuICAgICAgZm9udFNpemVVbml0OiAncHQnLFxuICAgICAgZm9udFNpemVTZWxlY3Rpb246IHRydWUsXG4gICAgICBodG1sQWxsb3dlZFRhZ3M6IEFMTE9XRURfVEFHUyxcbiAgICAgIGh0bWxBbGxvd2VkQXR0cnM6IFsnc3R5bGUnLCAnaHJlZicsICd0YXJnZXQnLCAncmVsJywgJ2NvbHNwYW4nLCAncm93c3BhbicsIC4uLlZBTFVFX0VNQkVEX0FUVFJJQlVURVNdLFxuICAgICAgaHRtbEFsbG93ZWRTdHlsZVByb3BzOiBBTExPV0VEX1NUWUxFUyxcbiAgICAgIGh0bWxJZ25vcmVDU1NQcm9wZXJ0aWVzOiBJR05PUkVEX1NIRUVUX1NUWUxFUyxcbiAgICAgIGh0bWxSZW1vdmVUYWdzOiBbJ3NjcmlwdCcsICdzdHlsZSddLFxuICAgICAgLy8gSW5saW5lIHN0eWxlcyByYXRoZXIgdGhhbiBGcm9hbGEncyBmci0qIGNsYXNzZXMsIHdoaWNoIG5laXRoZXIgdGhlXG4gICAgICAvLyBzZXJ2ZXIgbm9yIHRoZSBleHBvcnRzIGtub3cuXG4gICAgICB1c2VDbGFzc2VzOiBmYWxzZSxcbiAgICAgIC8vIEEgcGFzdGUgaXMgaXRzIHdvcmRzIG9ubHk6IGEgcGFzdGVkIHRhYmxlIGZsYXR0ZW5zIHRvIHRleHQuXG4gICAgICBwYXN0ZVBsYWluOiB0cnVlLFxuICAgICAgLy8gRXZlcnkga2V5c3Ryb2tlIHJlYWNoZXMgdGhlIG1vZGVsIHN0cmFpZ2h0IGF3YXksIHNvIGVuZGluZyB0aGUgZWRpdCBhblxuICAgICAgLy8gaW5zdGFudCBhZnRlciB0eXBpbmcgbmV2ZXIgbG9zZXMgdGhlIGxhc3Qgd29yZC5cbiAgICAgIHR5cGluZ1RpbWVyOiAwLFxuICAgIH0sXG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlIdG1sID0gY29tcHV0ZWQ8U2FmZUh0bWw+KCgpID0+IHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICBmaWxsVGV4dFRva2Vucyh0aGlzLmh0bWwoKSwgdGhpcy50b2tlbnMoKSksXG4gICkpO1xuXG4gIC8vIFRoZSBibG9jayBzaG93cyBub3RoaW5nOiBubyB3b3JkcyBhbmQgbm8gdGFibGUuIEEgbmV3IGJsb2NrIGlzIHN0b3JlZFxuICAvLyBlbXB0eSwgYW5kIGFuIGVtcHRpZWQgZWRpdG9yIGNhbiBzdGlsbCBsZWF2ZSBhIGJhcmUgPHA+PGJyPjwvcD4uXG4gIHB1YmxpYyByZWFkb25seSBpc0JsYW5rID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHRoaXMuaHRtbCgpLCAndGV4dC9odG1sJykuYm9keTtcblxuICAgIHJldHVybiAhYm9keS50ZXh0Q29udGVudD8udHJpbSgpICYmICFib2R5LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gIH0pO1xuXG4gIC8vIFdoYXQgdGhlIGVkaXRvciBob2xkcyByaWdodCBub3cuXG4gIHB1YmxpYyBkcmFmdCA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRvciA9IHZpZXdDaGlsZChGc0h0bWxFZGl0b3JDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZVBvcG92ZXJBbmNob3IgPSB2aWV3Q2hpbGQoJ3ZhbHVlUG9wb3ZlckFuY2hvcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbm90aWNlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gT3BlbmluZyBzZWVkcyB0aGUgZHJhZnQ7IGNsb3Npbmcg4oCUIHdob2V2ZXIgY2xvc2VkIGl0OiBhIHByZXNzIG91dHNpZGUsXG4gICAgLy8gRXNjYXBlLCB0aGUgYmxvY2sgYmVpbmcgZGVzZWxlY3RlZCBvciBlZGl0IG1vZGUgZW5kaW5nIOKAlCBzYXZlcyBpdC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdGluZyA9IHRoaXMuZWRpdGluZygpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoZWRpdGluZyAmJiAhdGhpcy5faXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmRyYWZ0ID0gdGhpcy5odG1sKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWVkaXRpbmcgJiYgdGhpcy5faXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5fZmluaXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ2hpcHMsIGFuZCB0aGUgSW5zZXJ0IGZpZWxkIG1lbnUsIGZvbGxvdyB0aGUgYmxvY2sncyB2YWx1ZXMgYW5kIGZpZWxkc1xuICAgIC8vIGFuZCB0aGUgbmFtZXMgdG9nZ2xlLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLnRva2VucygpO1xuICAgICAgdGhpcy5zaG93VmFsdWVOYW1lcygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMudmFsdWVFbWJlZHMucmVmcmVzaCgpKTtcbiAgICB9KTtcblxuICAgIC8vIEEgcHJlc3MgYW55d2hlcmUgdGhhdCBpcyBub3QgdGhlIGJsb2NrIG9yIHRoZSBlZGl0b3IncyBvd24gY2hyb21lIGVuZHNcbiAgICAvLyB0aGUgZWRpdC4gQ2FwdHVyZWQsIHNvIGl0IGlzIHNlZW4gYmVmb3JlIHRoZSBjYW52YXMgb3IgYSBzaWJsaW5nXG4gICAgLy8gY29tcG9uZW50IGFjdHMgb24gdGhlIHNhbWUgcHJlc3MuXG4gICAgY29uc3Qgb25QcmVzcyA9IChldmVudDogUG9pbnRlckV2ZW50KSA9PiB0aGlzLl9vbkRvY3VtZW50UHJlc3MoZXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgb25QcmVzcywgdHJ1ZSk7XG4gICAgdGhpcy5fZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBvblByZXNzLCB0cnVlKTtcbiAgICAgIHRoaXMuX2NsZWFyTm90aWNlVGltZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nKCkgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGFrZSBhIHZhbHVlIG91dCBvZiB0aGUgdGV4dDogaXRzIHNldHRpbmdzIGRpYWxvZyBkZWxldGVkIGl0LlxuICBwdWJsaWMgcmVtb3ZlVmFsdWUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlRW1iZWRzLnJlbW92ZUtleShrZXkpO1xuICB9XG5cbiAgLy8gT25seSBmb3IgYSB2YWx1ZSB0aGUgcGFnZSBoYXM6IGEgY2hpcCBuYW1pbmcgbm8gdmFsdWUgdGhlcmUgaGFzIG5vXG4gIC8vIHNldHRpbmdzIHRvIG9wZW4uXG4gIHB1YmxpYyBvcGVuVmFsdWVTZXR0aW5ncyhwb3BvdmVyOiBGc1BvcG92ZXJSZWYpOiB2b2lkIHtcbiAgICBwb3BvdmVyLmNsb3NlKCk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy52YWx1ZVBvcG92ZXIoKT8ua2V5O1xuICAgIGlmIChrZXkgJiYgdGhpcy50b2tlbnMoKS52YWx1ZXM/LltrZXldKSB7XG4gICAgICB0aGlzLnZhbHVlU2V0dGluZ3MuZW1pdChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVCbG9ja2VkU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGljZSA9IHRoaXMubm90aWNlKCk7XG4gICAgaWYgKG5vdGljZT8ua2luZCA9PT0gJ2Jsb2NrZWQnKSB7XG4gICAgICBub3RpY2UuYmxvY2sucmVtb3ZlU2VsZWN0aW9uPy4oKTtcbiAgICB9XG4gICAgdGhpcy5kaXNtaXNzTm90aWNlKCk7XG4gIH1cblxuICAvLyBQdXQgYmFjayB0aGUgdmFsdWVzIGFuIGVkaXQgbGVmdCB1bnVzZWQ6IHRoZSBlZGl0b3IncyBvd24gdW5kbyBvZiBpdC5cbiAgcHVibGljIHVuZG9WYWx1ZXNVbnVzZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgbm90aWNlID0gdGhpcy5ub3RpY2UoKTtcbiAgICBpZiAobm90aWNlPy5raW5kID09PSAndW51c2VkJykge1xuICAgICAgbm90aWNlLnVuZG8oKTtcbiAgICB9XG4gICAgdGhpcy5kaXNtaXNzTm90aWNlKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzbWlzc05vdGljZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhck5vdGljZVRpbWVyKCk7XG4gICAgdGhpcy5ub3RpY2Uuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gV2hhdCBJbnNlcnQgZmllbGQgbGlzdHMsIGluIG9yZGVyOiB0aGUgcGFnZSBhbmQgcmVwb3J0IGZpZWxkcywgZWFjaCBmaWx0ZXJcbiAgLy8gb2YgdGhlIHJlcG9ydCBieSBpdHMgbGFiZWwgaW4gdGhlIGZpbHRlciBiYXIncyBvcmRlciwgdGhlbiBldmVyeSB2YWx1ZSBvZlxuICAvLyB0aGUgYmxvY2sncyBsYXllciBieSBpdHMgbmFtZSwgd2hldGhlciBhbnkgdGV4dCBzaG93cyBpdCBvciBub3QuXG4gIHByaXZhdGUgX2luc2VydEZpZWxkRW50cmllcygpOiBFbWJlZE1lbnVFbnRyeVtdIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy50b2tlbnMoKTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi50ZXh0RmllbGRzKGNvbnRleHQpLm1hcCgoeyBmaWVsZCwgbmFtZSB9KSA9PiAoeyB0b2tlbjogZmllbGRUb2tlbihmaWVsZCksIG5hbWUgfSkpLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoY29udGV4dC52YWx1ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyB0b2tlbjogdmFsdWVUb2tlbihrZXkpLCBuYW1lOiB2YWx1ZS5uYW1lIH0pKSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfb3BlblZhbHVlUG9wb3ZlcihrZXk6IHN0cmluZywgY2hpcDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5faG9zdC5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGhvc3RSZWN0ID0gaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBjaGlwUmVjdCA9IGNoaXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gVGhlIGNhbnZhcyBpcyBDU1Mtc2NhbGVkOyB0aGUgYW5jaG9yIHNpdHMgaW4gdGhlIGJsb2NrJ3Mgb3duIHBpeGVscy5cbiAgICBjb25zdCBzY2FsZSA9IGhvc3Qub2Zmc2V0V2lkdGggPyBob3N0UmVjdC53aWR0aCAvIGhvc3Qub2Zmc2V0V2lkdGggOiAxO1xuXG4gICAgdGhpcy52YWx1ZUVtYmVkcy5oaWRlVG9vbGJhcigpO1xuICAgIHRoaXMudmFsdWVQb3BvdmVyLnNldCh7XG4gICAgICBrZXksXG4gICAgICBjaGlwLFxuICAgICAgbGVmdDogKGNoaXBSZWN0LmxlZnQgLSBob3N0UmVjdC5sZWZ0KSAvIHNjYWxlLFxuICAgICAgdG9wOiAoY2hpcFJlY3QudG9wIC0gaG9zdFJlY3QudG9wKSAvIHNjYWxlLFxuICAgICAgd2lkdGg6IGNoaXBSZWN0LndpZHRoIC8gc2NhbGUsXG4gICAgICBoZWlnaHQ6IGNoaXBSZWN0LmhlaWdodCAvIHNjYWxlLFxuICAgIH0pO1xuXG4gICAgLy8gZnMtcG9wb3ZlciBvcGVucyBvbiBhIGNsaWNrIG9uIGl0cyBlbGVtZW50OiBvbmNlIHRoZSBhbmNob3IgaGFzIG1vdmVkXG4gICAgLy8gb3ZlciB0aGUgY2hpcCwgY2xpY2sgaXQuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl92YWx1ZVBvcG92ZXJBbmNob3IoKT8ubmF0aXZlRWxlbWVudC5jbGljaygpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Nob3dOb3RpY2Uobm90aWNlOiBUZXh0Tm90aWNlKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJOb3RpY2VUaW1lcigpO1xuICAgIHRoaXMubm90aWNlLnNldChub3RpY2UpO1xuICAgIHRoaXMuX25vdGljZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLm5vdGljZS5zZXQobnVsbCksIFZBTFVFX0JMT0NLX05PVElDRV9NUyk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhck5vdGljZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9ub3RpY2VUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX25vdGljZVRpbWVyKTtcbiAgICAgIHRoaXMuX25vdGljZVRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBBbiBlZGl0IHRvb2sgdGhlIGxhc3QgY2hpcCBvZiBzb21lIHZhbHVlcyBvdXQgb2YgdGhpcyBibG9jay4gQ291bnRlZCBhcmVcbiAgLy8gdGhlIHZhbHVlcyB0aGUgbGF5ZXIgbm8gbG9uZ2VyIHJlYWRzOiBzaG93biBieSBubyBibG9jaywgdGhpcyBvbmUgb3JcbiAgLy8gYW5vdGhlciwgbm9yIHJlYWQgYnkgYSBmb3JtdWxhIG9uZSBvZiB0aGVtIHNob3dzLiBUaGV5IGFyZSBub3QgZGVsZXRlZDpcbiAgLy8gc2F2aW5nIGh0bWwgbmV2ZXIgZGVsZXRlcyBhIHZhbHVlLlxuICBwcml2YXRlIF9vblZhbHVlc1JlbW92ZWQocmVtb3ZhbDogVmFsdWVFbWJlZFJlbW92YWwpOiB2b2lkIHtcbiAgICBjb25zdCBlbHNld2hlcmUgPSBbLi4udGhpcy5zaG93bkVsc2V3aGVyZSgpKCldO1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMudG9rZW5zKCkudmFsdWVzID8/IHt9O1xuICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRLZXlzKFsuLi5yZW1vdmFsLmJlZm9yZSwgLi4uZWxzZXdoZXJlXSwgdmFsdWVzKTtcbiAgICBjb25zdCBhZnRlciA9IHJlYWRLZXlzKFsuLi5yZW1vdmFsLmFmdGVyLCAuLi5lbHNld2hlcmVdLCB2YWx1ZXMpO1xuICAgIGNvbnN0IGNvdW50ID0gWy4uLmJlZm9yZV0uZmlsdGVyKChrZXkpID0+ICFhZnRlci5oYXMoa2V5KSAmJiAhIXZhbHVlc1trZXldKS5sZW5ndGg7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICB0aGlzLl9zaG93Tm90aWNlKHsga2luZDogJ3VudXNlZCcsIGNvdW50LCB1bmRvOiByZW1vdmFsLnVuZG8gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25Eb2N1bWVudFByZXNzKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodGFyZ2V0ICYmICh0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSB8fCB0YXJnZXQuY2xvc2VzdChFRElUT1JfQ0hST01FKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG5cbiAgLy8gU2F2ZSBOT1csIHRoZW4gYXNrIHRoZSBob3N0IHRvIGNsb3NlLiBTYXZpbmcgaGVyZSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvclxuICAvLyB0aGUgZWRpdGluZyBpbnB1dCB0byBmbGlwIG1hdHRlcnM6IHRoZSBzYW1lIHByZXNzIG1heSBiZSBvbiBhIHBhZ2UgdGFiLFxuICAvLyBhbmQgYnkgdGhlIHRpbWUgdGhlIGlucHV0IGNoYW5nZWQgdGhpcyBibG9jayBjb3VsZCBhbHJlYWR5IGJlIGRlc3Ryb3llZCxcbiAgLy8gd2l0aCBpdHMgZWRpdCBnb25lLlxuICBwcml2YXRlIF9jbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zeW5jRHJhZnQoKTtcbiAgICB0aGlzLl9maW5pc2goKTtcbiAgICB0aGlzLmVkaXRFbmRlZC5lbWl0KCk7XG4gIH1cblxuICAvLyBSZWFkIHRoZSBlZGl0b3IgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlIGxhc3QgbW9kZWwgdXBkYXRlLlxuICBwcml2YXRlIF9zeW5jRHJhZnQoKTogdm9pZCB7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuX2VkaXRvcigpPy5lZGl0b3I/Lmh0bWw/LmdldCgpO1xuICAgIGlmICh0eXBlb2YgaHRtbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuZHJhZnQgPSBodG1sO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmlzaCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuZGlzbWlzc05vdGljZSgpO1xuICAgIGlmICh0aGlzLmRyYWZ0ICE9PSB0aGlzLmh0bWwoKSkge1xuICAgICAgdGhpcy5zYXZlZC5lbWl0KHRoaXMuZHJhZnQpO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmIChlZGl0aW5nKCkpIHtcbiAgPCEtLSBGbG9hdGluZyBmcy1odG1sLWVkaXRvcjogbm8gZnJhbWUsIEZyb2FsYSdzIGlubGluZSB0b29sYmFyIHBvcHMgdXAgb3ZlclxuICAgICAgIHRoZSB0ZXh0LiBwb2ludGVyZG93biBzdGF5cyBoZXJlIHNvIGEgcHJlc3MgaW4gdGhlIHRleHQgbmV2ZXIgc3RhcnRzIGFcbiAgICAgICBkcmFnIG9mIHRoZSBibG9jayBvciBhIHBhbiBvZiB0aGUgY2FudmFzLiAtLT5cbiAgPGZzLWh0bWwtZWRpdG9yXG4gICAgICBjbGFzcz1cInRleHQtY29udGVudCBlZGl0aW5nXCJcbiAgICAgIFtjb25maWddPVwiZWRpdG9yQ29uZmlnXCJcbiAgICAgIFsobmdNb2RlbCldPVwiZHJhZnRcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICA8L2ZzLWh0bWwtZWRpdG9yPlxuXG4gIDwhLS0gT25lIG5vdGljZSBhdCBhIHRpbWU6IGFuIGVkaXQgc3RvcHBlZCBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgcmVtb3ZlZFxuICAgICAgIHZhbHVlcywgYW4gZWRpdCB0aGF0IGxlZnQgdmFsdWVzIG5vIHRleHQgcmVhZHMsIG9yIGEgcmVmdXNlZCBjb21tYW5kLlxuICAgICAgIG1vdXNlZG93biBrZWVwcyB0aGUgZWRpdG9yJ3MgZm9jdXMgYW5kIHNlbGVjdGlvbiwgc28gVW5kbyByZWFjaGVzIGl0LiAtLT5cbiAgQGlmIChub3RpY2UoKTsgYXMgY3VycmVudCkge1xuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ2YWx1ZS1ub3RpY2UgZnMtcm93LmdhcC1zbVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICBAc3dpdGNoIChjdXJyZW50LmtpbmQpIHtcbiAgICAgICAgQGNhc2UgKCdibG9ja2VkJykge1xuICAgICAgICAgIEBpZiAoY3VycmVudC5ibG9jay5yZW1vdmVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICBUaGlzIHNlbGVjdGlvbiBpbmNsdWRlcyB7eyBjdXJyZW50LmJsb2NrLmNvdW50IH19IHt7IGN1cnJlbnQuYmxvY2suY291bnQgPT09IDEgPyAndmFsdWUnIDogJ3ZhbHVlcycgfX0uXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUJsb2NrZWRTZWxlY3Rpb24oKVwiPlxuICAgICAgICAgICAgICBSZW1vdmUgdGV4dCBhbmQge3sgY3VycmVudC5ibG9jay5jb3VudCA9PT0gMSA/ICd2YWx1ZScgOiBjdXJyZW50LmJsb2NrLmNvdW50ICsgJyB2YWx1ZXMnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuPlRvIHRha2UgYSB2YWx1ZSBvdXQsIHNlbGVjdCBpdCwgdGhlbiBwcmVzcyBEZWxldGUuPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3VudXNlZCcpIHtcbiAgICAgICAgICA8c3Bhbj57eyBjdXJyZW50LmNvdW50IH19IHt7IGN1cnJlbnQuY291bnQgPT09IDEgPyAndmFsdWUnIDogJ3ZhbHVlcycgfX0gbW92ZWQgdG8gTm90IHVzZWQ8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidW5kb1ZhbHVlc1VudXNlZCgpXCI+XG4gICAgICAgICAgICBVbmRvXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtZXNzYWdlJykge1xuICAgICAgICAgIDxzcGFuPnt7IGN1cnJlbnQudGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiZGlzbWlzc05vdGljZSgpXCI+XG4gICAgICAgIERpc21pc3NcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG59IEBlbHNlIGlmIChlZGl0TW9kZSgpICYmIGlzQmxhbmsoKSkge1xuICA8IS0tIEFuIGVtcHR5IGJsb2NrIHdoaWxlIHRoZSBjYW52YXMgaXMgbGFpZCBvdXQ6IGEgaGludCBpbiB0aGUgYmxvY2sncyBvd25cbiAgICAgICB0eXBlLCBuZXZlciBpdHMgaHRtbCwgc28gbm90aGluZyBpcyB0eXBlZCBvbnRvIGl0IG9yIGV4cG9ydGVkLiAtLT5cbiAgPGRpdiBjbGFzcz1cInRleHQtY29udGVudCB0ZXh0LWhpbnRcIj5Eb3VibGUtY2xpY2sgdG8gZWRpdDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXZcbiAgICAgIGNsYXNzPVwidGV4dC1jb250ZW50XCJcbiAgICAgIFtpbm5lckhUTUxdPVwiZGlzcGxheUh0bWwoKVwiPlxuICA8L2Rpdj5cbn1cblxuPCEtLSBBIGNsaWNrZWQgdmFsdWUgY2hpcCdzIHBvcG92ZXI6IGFuIGZzLXBvcG92ZXIgb24gYW4gaW52aXNpYmxlIGFuY2hvciBsYWlkXG4gICAgIG92ZXIgdGhlIGNoaXAgKHRoZSBjaGlwIGl0c2VsZiBiZWxvbmdzIHRvIHRoZSBlZGl0b3IpLiBPdXRzaWRlIHRoZSBlZGl0aW5nXG4gICAgIGJsb2NrLCBzbyBhIHBvcG92ZXIgc3RpbGwgb3BlbiB3aGVuIGVkaXRpbmcgZW5kcyBjbG9zZXMgdGhlIHVzdWFsIHdheS4gLS0+XG48c3BhblxuICAgICN2YWx1ZVBvcG92ZXJBbmNob3JcbiAgICBjbGFzcz1cInZhbHVlLXBvcG92ZXItYW5jaG9yXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgIGZzUG9wb3ZlclxuICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgd3JhcHBlckNsYXNzPVwidmFsdWUtcG9wb3Zlci13cmFwcGVyXCJcbiAgICBbdGVtcGxhdGVdPVwidmFsdWVQb3BvdmVyVGVtcGxhdGVcIlxuICAgIFtpbmRpY2F0aW9uXT1cImZhbHNlXCJcbiAgICBbbWF4V2lkdGhdPVwiMzIwXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJ2YWx1ZVBvcG92ZXIoKT8ubGVmdFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJ2YWx1ZVBvcG92ZXIoKT8udG9wXCJcbiAgICBbc3R5bGUud2lkdGgucHhdPVwidmFsdWVQb3BvdmVyKCk/LndpZHRoXCJcbiAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cInZhbHVlUG9wb3ZlcigpPy5oZWlnaHRcIj5cbjwvc3Bhbj5cbjxuZy10ZW1wbGF0ZVxuICAgICN2YWx1ZVBvcG92ZXJUZW1wbGF0ZVxuICAgIGxldC1wb3BvdmVyPVwicG9wb3ZlclwiPlxuICA8IS0tIFdoYXQgdGhlIHZhbHVlIGlzLCBhbmQgaXRzIHNldHRpbmdzICh3aGVyZSBpdCBjYW4gYWxzbyBiZSBkZWxldGVkKTsgYVxuICAgICAgIGNoaXAgbmFtaW5nIG5vIHZhbHVlIG9uIHRoZSBwYWdlIGhhcyBubyBzZXR0aW5ncy4gLS0+XG4gIDxkaXYgY2xhc3M9XCJ2YWx1ZS1wb3BvdmVyIGZzLXJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmcy1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdWUtcG9wb3Zlci1uYW1lXCI+e3sgdmFsdWVQb3BvdmVyVmFsdWUoKT8ubmFtZSA/PyB2YWx1ZVBvcG92ZXIoKT8ua2V5IH19PC9kaXY+XG4gICAgICBAaWYgKCF2YWx1ZVBvcG92ZXJWYWx1ZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbFwiPk5vdCBhIHZhbHVlIG9uIHRoaXMgcGFnZTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAodmFsdWVQb3BvdmVyVmFsdWUoKSkge1xuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidmFsdWUtcG9wb3Zlci1zZXR0aW5nc1wiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlNldHRpbmdzXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblZhbHVlU2V0dGluZ3MocG9wb3ZlcilcIj5cbiAgICAgICAgPG1hdC1pY29uPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19