@firestitch/report 18.10.1 → 18.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +1 -0
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -1
  4. package/app/reports/components/report-component/report-component.component.d.ts +1 -0
  5. package/app/reports/data/report.data.d.ts +9 -13
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
  7. package/app/reports/export/report-export-collector.service.d.ts +13 -6
  8. package/app/reports/export/report-filter-lines.d.ts +3 -2
  9. package/app/reports/filter-text.d.ts +8 -0
  10. package/app/reports/format.d.ts +1 -0
  11. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +0 -2
  12. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
  13. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -3
  14. package/app/reports/interfaces/report-saved-filter-changes.interface.d.ts +4 -0
  15. package/app/reports/interfaces/report-saved-filter.interface.d.ts +6 -0
  16. package/app/reports/interfaces/{report-view-config.interface.d.ts → report-state-snapshot.interface.d.ts} +1 -2
  17. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
  18. package/app/reports/report-chat-viewer-state.d.ts +3 -3
  19. package/app/reports/report-filter-items.d.ts +9 -0
  20. package/app/reports/report-saved-filters.d.ts +3 -0
  21. package/app/reports/report-state.d.ts +15 -0
  22. package/app/reports/services/report-filter-state.service.d.ts +9 -25
  23. package/app/reports/text.d.ts +16 -0
  24. package/app/reports/tile-data-state.d.ts +5 -5
  25. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -5
  26. package/esm2022/app/reports/canvas-landing-page.mjs +3 -3
  27. package/esm2022/app/reports/components/component-list/component-list.component.mjs +3 -3
  28. package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
  29. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
  30. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +124 -23
  31. package/esm2022/app/reports/components/report-component/report-component.component.mjs +45 -31
  32. package/esm2022/app/reports/data/report.data.mjs +33 -45
  33. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
  34. package/esm2022/app/reports/export/report-export-collector.service.mjs +93 -49
  35. package/esm2022/app/reports/export/report-filter-lines.mjs +28 -21
  36. package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
  37. package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
  38. package/esm2022/app/reports/filter-settings-rules.mjs +2 -2
  39. package/esm2022/app/reports/filter-text.mjs +154 -0
  40. package/esm2022/app/reports/format.mjs +3 -2
  41. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  42. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  43. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  45. package/esm2022/app/reports/interfaces/report-saved-filter-changes.interface.mjs +2 -0
  46. package/esm2022/app/reports/interfaces/report-saved-filter.interface.mjs +2 -0
  47. package/esm2022/app/reports/interfaces/report-state-snapshot.interface.mjs +2 -0
  48. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  49. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +1 -1
  50. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
  51. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  52. package/esm2022/app/reports/mark-click.mjs +2 -2
  53. package/esm2022/app/reports/report-chat-viewer-state.mjs +3 -3
  54. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  55. package/esm2022/app/reports/report-filter-items.mjs +24 -2
  56. package/esm2022/app/reports/report-saved-filters.mjs +92 -0
  57. package/esm2022/app/reports/report-state.mjs +169 -0
  58. package/esm2022/app/reports/report-viewer-features.mjs +2 -4
  59. package/esm2022/app/reports/services/report-filter-state.service.mjs +83 -310
  60. package/esm2022/app/reports/text.mjs +59 -13
  61. package/esm2022/app/reports/tile-data-state.mjs +4 -4
  62. package/esm2022/app/reports/tile-loads.mjs +5 -6
  63. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +172 -98
  64. package/esm2022/app/reports/views/report/report.component.mjs +23 -22
  65. package/esm2022/public_api.mjs +4 -8
  66. package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs → firestitch-report-echarts-DKXlgu1D.mjs} +2 -2
  67. package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs.map → firestitch-report-echarts-DKXlgu1D.mjs.map} +1 -1
  68. package/fesm2022/{firestitch-report-firestitch-report-ZcHTnNKq.mjs → firestitch-report-firestitch-report-Bnv62suw.mjs} +2523 -2814
  69. package/fesm2022/firestitch-report-firestitch-report-Bnv62suw.mjs.map +1 -0
  70. package/fesm2022/firestitch-report.mjs +1 -1
  71. package/package.json +1 -1
  72. package/public_api.d.ts +3 -7
  73. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +0 -21
  74. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +0 -13
  75. package/app/reports/interfaces/report-view-create.interface.d.ts +0 -7
  76. package/app/reports/interfaces/report-view-deleted.interface.d.ts +0 -4
  77. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +0 -7
  78. package/app/reports/interfaces/report-view-dropped.interface.d.ts +0 -5
  79. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +0 -10
  80. package/app/reports/interfaces/report-view-summary.interface.d.ts +0 -11
  81. package/app/reports/interfaces/report-view.interface.d.ts +0 -7
  82. package/app/reports/interfaces/report-views.interface.d.ts +0 -7
  83. package/app/reports/report-view-config.d.ts +0 -34
  84. package/app/reports/report-view-menu.d.ts +0 -15
  85. package/app/reports/services/report-view.service.d.ts +0 -39
  86. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +0 -115
  87. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +0 -52
  88. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +0 -2
  89. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +0 -2
  90. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +0 -2
  91. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +0 -2
  92. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +0 -2
  93. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +0 -2
  94. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +0 -2
  95. package/esm2022/app/reports/interfaces/report-view.interface.mjs +0 -2
  96. package/esm2022/app/reports/interfaces/report-views.interface.mjs +0 -2
  97. package/esm2022/app/reports/report-view-config.mjs +0 -587
  98. package/esm2022/app/reports/report-view-menu.mjs +0 -119
  99. package/esm2022/app/reports/services/report-view.service.mjs +0 -218
  100. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +0 -1
@@ -0,0 +1,169 @@
1
+ import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
2
+ import { dateBoundString } from './report-filter-items';
3
+ // The server's cap on a drill path.
4
+ export const DRILL_MAX_DEPTH = 5;
5
+ // Every relative range name the server knows, in its enum's order. A record
6
+ // rather than a list, so the build fails when ReportRelativeRange gains a
7
+ // name this misses.
8
+ const RELATIVE_RANGES = {
9
+ thisWeek: true,
10
+ lastWeek: true,
11
+ last7Days: true,
12
+ last30Days: true,
13
+ last3Months: true,
14
+ last6Months: true,
15
+ last12Months: true,
16
+ thisMonth: true,
17
+ thisQuarter: true,
18
+ thisYear: true,
19
+ yearToDate: true,
20
+ };
21
+ // The same names as a list, in the server enum's order (the record's key
22
+ // order): the order the date picker offers them in.
23
+ export const RELATIVE_RANGE_NAMES = Object.keys(RELATIVE_RANGES);
24
+ const DAY_PATTERN = /^(\d{4})-(\d{2})-(\d{2})$/;
25
+ // A number as text: what a masked input sends.
26
+ const NUMBER_PATTERN = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
27
+ // Whether a name is a relative range the server resolves.
28
+ export function isRelativeRange(name) {
29
+ return typeof name === 'string' && Object.prototype.hasOwnProperty.call(RELATIVE_RANGES, name);
30
+ }
31
+ export function isChartGranularity(value) {
32
+ return GRANULARITY_OPTIONS.some((option) => option.value === value);
33
+ }
34
+ // Whether text is a real calendar day written 'yyyy-MM-dd' (no 2026-02-30).
35
+ export function isCalendarDay(text) {
36
+ const parts = DAY_PATTERN.exec(text);
37
+ if (!parts) {
38
+ return false;
39
+ }
40
+ const [year, month, day] = parts.slice(1).map(Number);
41
+ const date = new Date(Date.UTC(year, month - 1, day));
42
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
43
+ }
44
+ // A number written as text (a masked input's value), or null when the text
45
+ // is not one finite number.
46
+ export function numberFromText(text) {
47
+ const number = NUMBER_PATTERN.test(text) ? Number(text) : NaN;
48
+ return Number.isFinite(number) ? number : null;
49
+ }
50
+ // A group's value in its stored shape, read for the keys its group's type
51
+ // owns, or null when it holds nothing. A date range that still carries its
52
+ // relative preset is written as that preset whatever today is.
53
+ export function toStoredGroupValue(type, value) {
54
+ if (!value) {
55
+ return null;
56
+ }
57
+ switch (type) {
58
+ case 'dateRange':
59
+ return isRelativeRange(value.preset)
60
+ ? { relative: value.preset }
61
+ : storedOrNull({ start: dateBoundString(value.start), end: dateBoundString(value.end) });
62
+ case 'select': {
63
+ const excludeValues = keptPicks(value.excludeValues);
64
+ return storedOrNull(excludeValues ? { excludeValues } : { values: keptPicks(value.values) });
65
+ }
66
+ case 'numberRange':
67
+ return storedOrNull({ min: finiteNumber(value.min), max: finiteNumber(value.max) });
68
+ default:
69
+ return storedOrNull({ value: value.value?.trim() || undefined });
70
+ }
71
+ }
72
+ // Whether the screen's state (`current`, a snapshot) differs from the
73
+ // report's authored defaults (`defaults`): the match, the grain, a group's
74
+ // value, or a tile's sort, search, hidden columns or drill path. The page is
75
+ // not compared (moving to another page changes no filter). Picks are
76
+ // compared in any order.
77
+ export function stateDiffers(defaults, current) {
78
+ return (defaults.match ?? 'all') !== (current.match ?? 'all')
79
+ || (defaults.groupBy ?? null) !== (current.groupBy ?? null)
80
+ || Object.entries(current.groups ?? {})
81
+ .some(([groupId, value]) => storedValueKey(defaults.groups?.[Number(groupId)]) !== storedValueKey(value))
82
+ || tilesDiffer(defaults.tiles ?? {}, current.tiles ?? {});
83
+ }
84
+ // Whether two stored group values are the same filter: picks in any order,
85
+ // text trimmed, an empty value read as none.
86
+ export function sameStoredGroupValue(a, b) {
87
+ return storedValueKey(a) === storedValueKey(b);
88
+ }
89
+ // A drill path kept to what a tile can carry: its steps up to the first that
90
+ // is not a time level with a plain value (the steps before it are kept), at
91
+ // most DRILL_MAX_DEPTH of them.
92
+ export function cleanDrillPath(path) {
93
+ const kept = [];
94
+ for (const step of path ?? []) {
95
+ if (!isPlainObject(step) || !isChartGranularity(step.level) || !isDrillValue(step.value)
96
+ || kept.length === DRILL_MAX_DEPTH) {
97
+ break;
98
+ }
99
+ kept.push({ level: step.level, value: step.value });
100
+ }
101
+ return kept;
102
+ }
103
+ // Whether two drill paths are the same steps. A value is compared as text,
104
+ // so 2026 and '2026' are the same step.
105
+ export function sameDrillPath(a, b) {
106
+ return drillKey(a) === drillKey(b);
107
+ }
108
+ // A range end as a number. A masked input sends its number as text, so
109
+ // numeric text is read as its number.
110
+ export function finiteNumber(value) {
111
+ const number = typeof value === 'string' ? numberFromText(value.trim()) : value;
112
+ return typeof number === 'number' && Number.isFinite(number) ? number : undefined;
113
+ }
114
+ function tilesDiffer(base, current) {
115
+ const ids = new Set([...Object.keys(base), ...Object.keys(current)].map(Number));
116
+ return [...ids].some((componentId) => tileStateKey(base[componentId]) !== tileStateKey(current[componentId]));
117
+ }
118
+ // One text for a stored group value, the same for every way of writing the
119
+ // same filter: picks in any order, text trimmed, and an empty value read as
120
+ // none.
121
+ function storedValueKey(value) {
122
+ const stored = value ?? {};
123
+ const picks = (list) => [...(keptPicks(list) ?? [])].map(String).sort();
124
+ return JSON.stringify([
125
+ stored.relative ?? null,
126
+ stored.start?.slice(0, 10) ?? null,
127
+ stored.end?.slice(0, 10) ?? null,
128
+ picks(stored.values),
129
+ picks(stored.excludeValues),
130
+ (stored.value ?? '').trim(),
131
+ finiteNumber(stored.min) ?? null,
132
+ finiteNumber(stored.max) ?? null,
133
+ ]);
134
+ }
135
+ // One text for a tile's state, over the keys this viewer reads. No direction
136
+ // reads as ascending, the way a list applies it.
137
+ function tileStateKey(tile) {
138
+ return JSON.stringify([
139
+ tile?.sort?.column ? [tile.sort.column, tile.sort.direction ?? 'asc'] : null,
140
+ tile?.search ?? '',
141
+ [...(tile?.hidden ?? [])].sort(),
142
+ drillKey(tile?.drill),
143
+ ]);
144
+ }
145
+ function drillKey(path) {
146
+ return JSON.stringify((path ?? [])
147
+ .map((step) => [step.level, step.value === null || step.value === undefined ? null : String(step.value)]));
148
+ }
149
+ // The picks of a list with blanks (null, '') left out, or undefined when none
150
+ // is left.
151
+ function keptPicks(list) {
152
+ const kept = (list ?? []).filter((pick) => isSet(pick) && pick !== '');
153
+ return kept.length ? kept : undefined;
154
+ }
155
+ // Only the parts that hold something, or null when none does.
156
+ function storedOrNull(value) {
157
+ const stored = Object.fromEntries(Object.entries(value).filter(([, part]) => isSet(part)));
158
+ return Object.keys(stored).length ? stored : null;
159
+ }
160
+ function isDrillValue(value) {
161
+ return value === null || typeof value === 'string' || typeof value === 'number';
162
+ }
163
+ function isSet(value) {
164
+ return value !== undefined && value !== null;
165
+ }
166
+ function isPlainObject(value) {
167
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
168
+ }
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3JlcG9ydC1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFZQSxPQUFPLEVBSUwsbUJBQW1CLEdBR3BCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3hELG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLDRFQUE0RTtBQUM1RSwwRUFBMEU7QUFDMUUsb0JBQW9CO0FBQ3BCLE1BQU0sZUFBZSxHQUFzQztJQUN6RCxRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsU0FBUyxFQUFFLElBQUk7SUFDZixVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsSUFBSTtJQUNqQixXQUFXLEVBQUUsSUFBSTtJQUNqQixZQUFZLEVBQUUsSUFBSTtJQUNsQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQztBQUVGLHlFQUF5RTtBQUN6RSxvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQTBCLENBQUM7QUFFMUYsTUFBTSxXQUFXLEdBQUcsMkJBQTJCLENBQUM7QUFFaEQsK0NBQStDO0FBQy9DLE1BQU0sY0FBYyxHQUFHLCtDQUErQyxDQUFDO0FBR3ZFLDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQWE7SUFDM0MsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVk7SUFDeEMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFdEQsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxHQUFHLENBQUM7QUFDekcsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSw0QkFBNEI7QUFDNUIsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTlELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBc0IsRUFDdEIsS0FBMEM7SUFFMUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssV0FBVztZQUNkLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUM1QixDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTdGLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFckQsT0FBTyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDO1FBRUQsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sWUFBWSxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRGO1lBQ0UsT0FBTyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7QUFDSCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLDJFQUEyRTtBQUMzRSw2RUFBNkU7QUFDN0UscUVBQXFFO0FBQ3JFLHlCQUF5QjtBQUN6QixNQUFNLFVBQVUsWUFBWSxDQUFDLFFBQTZCLEVBQUUsT0FBNEI7SUFDdEYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztXQUN4RCxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztXQUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2FBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQ3hHLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsQ0FBd0MsRUFDeEMsQ0FBd0M7SUFFeEMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLGdDQUFnQztBQUNoQyxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQTJDO0lBQ3hFLE1BQU0sSUFBSSxHQUFzQixFQUFFLENBQUM7SUFFbkMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2VBQ25GLElBQUksQ0FBQyxNQUFNLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDckMsTUFBTTtRQUNSLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCwyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxhQUFhLENBQzNCLENBQWdELEVBQ2hELENBQWdEO0lBRWhELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWM7SUFDekMsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUVoRixPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNwRixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBcUMsRUFBRSxPQUF3QztJQUNsRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVqRixPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoSCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSxRQUFRO0FBQ1IsU0FBUyxjQUFjLENBQUMsS0FBNEM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMzQixNQUFNLEtBQUssR0FBRyxDQUFDLElBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUUvRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJO1FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJO1FBQ2hDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzNCLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDM0IsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJO1FBQ2hDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSTtLQUNqQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLGlEQUFpRDtBQUNqRCxTQUFTLFlBQVksQ0FBQyxJQUFpQztJQUNyRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDcEIsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDNUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxFQUFFO1FBQ2xCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUM7S0FDdEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQW1EO0lBQ25FLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7U0FDL0IsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRyxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLFdBQVc7QUFDWCxTQUFTLFNBQVMsQ0FBQyxJQUFrQztJQUNuRCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFdkUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsOERBQThEO0FBQzlELFNBQVMsWUFBWSxDQUFDLEtBQThCO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUF1QixDQUFDO0lBRWpILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO0lBQ2xDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ2xGLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxLQUFjO0lBQzNCLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcHVyZSBydWxlcyBvZiB0aGUgdmlld2VyJ3Mgc3RhdGUgKFJlcG9ydFN0YXRlU25hcHNob3QpOiB0aGUgcmVsYXRpdmVcbi8vIHJhbmdlcyB0aGUgc2VydmVyIHJlc29sdmVzLCBhIGdyb3VwIHZhbHVlIGluIGl0cyBzdG9yZWQgc2hhcGUsIGEgY2hhcnQnc1xuLy8gZHJpbGwgcGF0aCwgYW5kIHdoZXRoZXIgdGhlIHNjcmVlbiBzdGlsbCBzaG93cyB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4vLyBQdXJlLCBzbyB0aGUgbm9kZSBoYXJuZXNzIHJ1bnMgdGhlbS5cbi8vXG4vLyAtIFRoZSBzdGF0ZSBzZXJ2aWNlIHR1cm5zIGl0cyB2YWx1ZXMgaW50byB0aGUgc3RvcmVkIHNoYXBlXG4vLyAgICh0b1N0b3JlZEdyb3VwVmFsdWUpIGFuZCBhc2tzIHN0YXRlRGlmZmVycyB3aGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVyc1xuLy8gICBmcm9tIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cy5cbi8vIC0gQSBkcmlsbCBwYXRoIGlzIGtlcHQgdG8gd2hhdCBhIHRpbGUgY2FuIGNhcnJ5IChjbGVhbkRyaWxsUGF0aCkuXG5pbXBvcnQgeyBSZXBvcnREcmlsbFN0ZXAgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLXN0ZXAuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFN0YXRlU25hcHNob3QgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXN0YXRlLXNuYXBzaG90LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRUaWxlU3RhdGUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXRpbGUtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgUmVwb3J0RmlsdGVyVHlwZSxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nIH0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcblxuXG4vLyBUaGUgc2VydmVyJ3MgY2FwIG9uIGEgZHJpbGwgcGF0aC5cbmV4cG9ydCBjb25zdCBEUklMTF9NQVhfREVQVEggPSA1O1xuXG4vLyBFdmVyeSByZWxhdGl2ZSByYW5nZSBuYW1lIHRoZSBzZXJ2ZXIga25vd3MsIGluIGl0cyBlbnVtJ3Mgb3JkZXIuIEEgcmVjb3JkXG4vLyByYXRoZXIgdGhhbiBhIGxpc3QsIHNvIHRoZSBidWlsZCBmYWlscyB3aGVuIFJlcG9ydFJlbGF0aXZlUmFuZ2UgZ2FpbnMgYVxuLy8gbmFtZSB0aGlzIG1pc3Nlcy5cbmNvbnN0IFJFTEFUSVZFX1JBTkdFUzogUmVjb3JkPFJlcG9ydFJlbGF0aXZlUmFuZ2UsIHRydWU+ID0ge1xuICB0aGlzV2VlazogdHJ1ZSxcbiAgbGFzdFdlZWs6IHRydWUsXG4gIGxhc3Q3RGF5czogdHJ1ZSxcbiAgbGFzdDMwRGF5czogdHJ1ZSxcbiAgbGFzdDNNb250aHM6IHRydWUsXG4gIGxhc3Q2TW9udGhzOiB0cnVlLFxuICBsYXN0MTJNb250aHM6IHRydWUsXG4gIHRoaXNNb250aDogdHJ1ZSxcbiAgdGhpc1F1YXJ0ZXI6IHRydWUsXG4gIHRoaXNZZWFyOiB0cnVlLFxuICB5ZWFyVG9EYXRlOiB0cnVlLFxufTtcblxuLy8gVGhlIHNhbWUgbmFtZXMgYXMgYSBsaXN0LCBpbiB0aGUgc2VydmVyIGVudW0ncyBvcmRlciAodGhlIHJlY29yZCdzIGtleVxuLy8gb3JkZXIpOiB0aGUgb3JkZXIgdGhlIGRhdGUgcGlja2VyIG9mZmVycyB0aGVtIGluLlxuZXhwb3J0IGNvbnN0IFJFTEFUSVZFX1JBTkdFX05BTUVTID0gT2JqZWN0LmtleXMoUkVMQVRJVkVfUkFOR0VTKSBhcyBSZXBvcnRSZWxhdGl2ZVJhbmdlW107XG5cbmNvbnN0IERBWV9QQVRURVJOID0gL14oXFxkezR9KS0oXFxkezJ9KS0oXFxkezJ9KSQvO1xuXG4vLyBBIG51bWJlciBhcyB0ZXh0OiB3aGF0IGEgbWFza2VkIGlucHV0IHNlbmRzLlxuY29uc3QgTlVNQkVSX1BBVFRFUk4gPSAvXlsrLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPyQvaTtcblxuXG4vLyBXaGV0aGVyIGEgbmFtZSBpcyBhIHJlbGF0aXZlIHJhbmdlIHRoZSBzZXJ2ZXIgcmVzb2x2ZXMuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGl2ZVJhbmdlKG5hbWU6IHVua25vd24pOiBuYW1lIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2Uge1xuICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSRUxBVElWRV9SQU5HRVMsIG5hbWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDaGFydEdyYW51bGFyaXR5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ2hhcnRHcmFudWxhcml0eSB7XG4gIHJldHVybiBHUkFOVUxBUklUWV9PUFRJT05TLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZSk7XG59XG5cbi8vIFdoZXRoZXIgdGV4dCBpcyBhIHJlYWwgY2FsZW5kYXIgZGF5IHdyaXR0ZW4gJ3l5eXktTU0tZGQnIChubyAyMDI2LTAyLTMwKS5cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbGVuZGFyRGF5KHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJ0cyA9IERBWV9QQVRURVJOLmV4ZWModGV4dCk7XG4gIGlmICghcGFydHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBwYXJ0cy5zbGljZSgxKS5tYXAoTnVtYmVyKTtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5KSk7XG5cbiAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSA9PT0geWVhciAmJiBkYXRlLmdldFVUQ01vbnRoKCkgPT09IG1vbnRoIC0gMSAmJiBkYXRlLmdldFVUQ0RhdGUoKSA9PT0gZGF5O1xufVxuXG4vLyBBIG51bWJlciB3cml0dGVuIGFzIHRleHQgKGEgbWFza2VkIGlucHV0J3MgdmFsdWUpLCBvciBudWxsIHdoZW4gdGhlIHRleHRcbi8vIGlzIG5vdCBvbmUgZmluaXRlIG51bWJlci5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGcm9tVGV4dCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgbnVtYmVyID0gTlVNQkVSX1BBVFRFUk4udGVzdCh0ZXh0KSA/IE51bWJlcih0ZXh0KSA6IE5hTjtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWJlcikgPyBudW1iZXIgOiBudWxsO1xufVxuXG4vLyBBIGdyb3VwJ3MgdmFsdWUgaW4gaXRzIHN0b3JlZCBzaGFwZSwgcmVhZCBmb3IgdGhlIGtleXMgaXRzIGdyb3VwJ3MgdHlwZVxuLy8gb3ducywgb3IgbnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcuIEEgZGF0ZSByYW5nZSB0aGF0IHN0aWxsIGNhcnJpZXMgaXRzXG4vLyByZWxhdGl2ZSBwcmVzZXQgaXMgd3JpdHRlbiBhcyB0aGF0IHByZXNldCB3aGF0ZXZlciB0b2RheSBpcy5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0b3JlZEdyb3VwVmFsdWUoXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGUsXG4gIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGlzUmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpXG4gICAgICAgID8geyByZWxhdGl2ZTogdmFsdWUucHJlc2V0IH1cbiAgICAgICAgOiBzdG9yZWRPck51bGwoeyBzdGFydDogZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KSwgZW5kOiBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSB9KTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6IHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGVWYWx1ZXMgPSBrZXB0UGlja3ModmFsdWUuZXhjbHVkZVZhbHVlcyk7XG5cbiAgICAgIHJldHVybiBzdG9yZWRPck51bGwoZXhjbHVkZVZhbHVlcyA/IHsgZXhjbHVkZVZhbHVlcyB9IDogeyB2YWx1ZXM6IGtlcHRQaWNrcyh2YWx1ZS52YWx1ZXMpIH0pO1xuICAgIH1cblxuICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgIHJldHVybiBzdG9yZWRPck51bGwoeyBtaW46IGZpbml0ZU51bWJlcih2YWx1ZS5taW4pLCBtYXg6IGZpbml0ZU51bWJlcih2YWx1ZS5tYXgpIH0pO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdG9yZWRPck51bGwoeyB2YWx1ZTogdmFsdWUudmFsdWU/LnRyaW0oKSB8fCB1bmRlZmluZWQgfSk7XG4gIH1cbn1cblxuLy8gV2hldGhlciB0aGUgc2NyZWVuJ3Mgc3RhdGUgKGBjdXJyZW50YCwgYSBzbmFwc2hvdCkgZGlmZmVycyBmcm9tIHRoZVxuLy8gcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMgKGBkZWZhdWx0c2ApOiB0aGUgbWF0Y2gsIHRoZSBncmFpbiwgYSBncm91cCdzXG4vLyB2YWx1ZSwgb3IgYSB0aWxlJ3Mgc29ydCwgc2VhcmNoLCBoaWRkZW4gY29sdW1ucyBvciBkcmlsbCBwYXRoLiBUaGUgcGFnZSBpc1xuLy8gbm90IGNvbXBhcmVkIChtb3ZpbmcgdG8gYW5vdGhlciBwYWdlIGNoYW5nZXMgbm8gZmlsdGVyKS4gUGlja3MgYXJlXG4vLyBjb21wYXJlZCBpbiBhbnkgb3JkZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhdGVEaWZmZXJzKGRlZmF1bHRzOiBSZXBvcnRTdGF0ZVNuYXBzaG90LCBjdXJyZW50OiBSZXBvcnRTdGF0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gIHJldHVybiAoZGVmYXVsdHMubWF0Y2ggPz8gJ2FsbCcpICE9PSAoY3VycmVudC5tYXRjaCA/PyAnYWxsJylcbiAgICB8fCAoZGVmYXVsdHMuZ3JvdXBCeSA/PyBudWxsKSAhPT0gKGN1cnJlbnQuZ3JvdXBCeSA/PyBudWxsKVxuICAgIHx8IE9iamVjdC5lbnRyaWVzKGN1cnJlbnQuZ3JvdXBzID8/IHt9KVxuICAgICAgLnNvbWUoKFtncm91cElkLCB2YWx1ZV0pID0+IHN0b3JlZFZhbHVlS2V5KGRlZmF1bHRzLmdyb3Vwcz8uW051bWJlcihncm91cElkKV0pICE9PSBzdG9yZWRWYWx1ZUtleSh2YWx1ZSkpXG4gICAgfHwgdGlsZXNEaWZmZXIoZGVmYXVsdHMudGlsZXMgPz8ge30sIGN1cnJlbnQudGlsZXMgPz8ge30pO1xufVxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgZ3JvdXAgdmFsdWVzIGFyZSB0aGUgc2FtZSBmaWx0ZXI6IHBpY2tzIGluIGFueSBvcmRlcixcbi8vIHRleHQgdHJpbW1lZCwgYW4gZW1wdHkgdmFsdWUgcmVhZCBhcyBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTdG9yZWRHcm91cFZhbHVlKFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzdG9yZWRWYWx1ZUtleShhKSA9PT0gc3RvcmVkVmFsdWVLZXkoYik7XG59XG5cbi8vIEEgZHJpbGwgcGF0aCBrZXB0IHRvIHdoYXQgYSB0aWxlIGNhbiBjYXJyeTogaXRzIHN0ZXBzIHVwIHRvIHRoZSBmaXJzdCB0aGF0XG4vLyBpcyBub3QgYSB0aW1lIGxldmVsIHdpdGggYSBwbGFpbiB2YWx1ZSAodGhlIHN0ZXBzIGJlZm9yZSBpdCBhcmUga2VwdCksIGF0XG4vLyBtb3N0IERSSUxMX01BWF9ERVBUSCBvZiB0aGVtLlxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuRHJpbGxQYXRoKHBhdGg6IHJlYWRvbmx5IHVua25vd25bXSB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnREcmlsbFN0ZXBbXSB7XG4gIGNvbnN0IGtlcHQ6IFJlcG9ydERyaWxsU3RlcFtdID0gW107XG5cbiAgZm9yIChjb25zdCBzdGVwIG9mIHBhdGggPz8gW10pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qoc3RlcCkgfHwgIWlzQ2hhcnRHcmFudWxhcml0eShzdGVwLmxldmVsKSB8fCAhaXNEcmlsbFZhbHVlKHN0ZXAudmFsdWUpXG4gICAgICB8fCBrZXB0Lmxlbmd0aCA9PT0gRFJJTExfTUFYX0RFUFRIKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBrZXB0LnB1c2goeyBsZXZlbDogc3RlcC5sZXZlbCwgdmFsdWU6IHN0ZXAudmFsdWUgfSk7XG4gIH1cblxuICByZXR1cm4ga2VwdDtcbn1cblxuLy8gV2hldGhlciB0d28gZHJpbGwgcGF0aHMgYXJlIHRoZSBzYW1lIHN0ZXBzLiBBIHZhbHVlIGlzIGNvbXBhcmVkIGFzIHRleHQsXG4vLyBzbyAyMDI2IGFuZCAnMjAyNicgYXJlIHRoZSBzYW1lIHN0ZXAuXG5leHBvcnQgZnVuY3Rpb24gc2FtZURyaWxsUGF0aChcbiAgYTogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGRyaWxsS2V5KGEpID09PSBkcmlsbEtleShiKTtcbn1cblxuLy8gQSByYW5nZSBlbmQgYXMgYSBudW1iZXIuIEEgbWFza2VkIGlucHV0IHNlbmRzIGl0cyBudW1iZXIgYXMgdGV4dCwgc29cbi8vIG51bWVyaWMgdGV4dCBpcyByZWFkIGFzIGl0cyBudW1iZXIuXG5leHBvcnQgZnVuY3Rpb24gZmluaXRlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbnVtYmVyID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG51bWJlckZyb21UZXh0KHZhbHVlLnRyaW0oKSkgOiB2YWx1ZTtcblxuICByZXR1cm4gdHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG51bWJlcikgPyBudW1iZXIgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRpbGVzRGlmZmVyKGJhc2U6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4sIGN1cnJlbnQ6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4pOiBib29sZWFuIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoYmFzZSksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXS5tYXAoTnVtYmVyKSk7XG5cbiAgcmV0dXJuIFsuLi5pZHNdLnNvbWUoKGNvbXBvbmVudElkKSA9PiB0aWxlU3RhdGVLZXkoYmFzZVtjb21wb25lbnRJZF0pICE9PSB0aWxlU3RhdGVLZXkoY3VycmVudFtjb21wb25lbnRJZF0pKTtcbn1cblxuLy8gT25lIHRleHQgZm9yIGEgc3RvcmVkIGdyb3VwIHZhbHVlLCB0aGUgc2FtZSBmb3IgZXZlcnkgd2F5IG9mIHdyaXRpbmcgdGhlXG4vLyBzYW1lIGZpbHRlcjogcGlja3MgaW4gYW55IG9yZGVyLCB0ZXh0IHRyaW1tZWQsIGFuZCBhbiBlbXB0eSB2YWx1ZSByZWFkIGFzXG4vLyBub25lLlxuZnVuY3Rpb24gc3RvcmVkVmFsdWVLZXkodmFsdWU6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCBzdG9yZWQgPSB2YWx1ZSA/PyB7fTtcbiAgY29uc3QgcGlja3MgPSAobGlzdDogdW5rbm93bltdIHwgdW5kZWZpbmVkKSA9PiBbLi4uKGtlcHRQaWNrcyhsaXN0KSA/PyBbXSldLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW1xuICAgIHN0b3JlZC5yZWxhdGl2ZSA/PyBudWxsLFxuICAgIHN0b3JlZC5zdGFydD8uc2xpY2UoMCwgMTApID8/IG51bGwsXG4gICAgc3RvcmVkLmVuZD8uc2xpY2UoMCwgMTApID8/IG51bGwsXG4gICAgcGlja3Moc3RvcmVkLnZhbHVlcyksXG4gICAgcGlja3Moc3RvcmVkLmV4Y2x1ZGVWYWx1ZXMpLFxuICAgIChzdG9yZWQudmFsdWUgPz8gJycpLnRyaW0oKSxcbiAgICBmaW5pdGVOdW1iZXIoc3RvcmVkLm1pbikgPz8gbnVsbCxcbiAgICBmaW5pdGVOdW1iZXIoc3RvcmVkLm1heCkgPz8gbnVsbCxcbiAgXSk7XG59XG5cbi8vIE9uZSB0ZXh0IGZvciBhIHRpbGUncyBzdGF0ZSwgb3ZlciB0aGUga2V5cyB0aGlzIHZpZXdlciByZWFkcy4gTm8gZGlyZWN0aW9uXG4vLyByZWFkcyBhcyBhc2NlbmRpbmcsIHRoZSB3YXkgYSBsaXN0IGFwcGxpZXMgaXQuXG5mdW5jdGlvbiB0aWxlU3RhdGVLZXkodGlsZTogUmVwb3J0VGlsZVN0YXRlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICB0aWxlPy5zb3J0Py5jb2x1bW4gPyBbdGlsZS5zb3J0LmNvbHVtbiwgdGlsZS5zb3J0LmRpcmVjdGlvbiA/PyAnYXNjJ10gOiBudWxsLFxuICAgIHRpbGU/LnNlYXJjaCA/PyAnJyxcbiAgICBbLi4uKHRpbGU/LmhpZGRlbiA/PyBbXSldLnNvcnQoKSxcbiAgICBkcmlsbEtleSh0aWxlPy5kcmlsbCksXG4gIF0pO1xufVxuXG5mdW5jdGlvbiBkcmlsbEtleShwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoKHBhdGggPz8gW10pXG4gICAgLm1hcCgoc3RlcCkgPT4gW3N0ZXAubGV2ZWwsIHN0ZXAudmFsdWUgPT09IG51bGwgfHwgc3RlcC52YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhzdGVwLnZhbHVlKV0pKTtcbn1cblxuLy8gVGhlIHBpY2tzIG9mIGEgbGlzdCB3aXRoIGJsYW5rcyAobnVsbCwgJycpIGxlZnQgb3V0LCBvciB1bmRlZmluZWQgd2hlbiBub25lXG4vLyBpcyBsZWZ0LlxuZnVuY3Rpb24ga2VwdFBpY2tzKGxpc3Q6IHVua25vd25bXSB8IG51bGwgfCB1bmRlZmluZWQpOiB1bmtub3duW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXB0ID0gKGxpc3QgPz8gW10pLmZpbHRlcigocGljaykgPT4gaXNTZXQocGljaykgJiYgcGljayAhPT0gJycpO1xuXG4gIHJldHVybiBrZXB0Lmxlbmd0aCA/IGtlcHQgOiB1bmRlZmluZWQ7XG59XG5cbi8vIE9ubHkgdGhlIHBhcnRzIHRoYXQgaG9sZCBzb21ldGhpbmcsIG9yIG51bGwgd2hlbiBub25lIGRvZXMuXG5mdW5jdGlvbiBzdG9yZWRPck51bGwodmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB7XG4gIGNvbnN0IHN0b3JlZCA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh2YWx1ZSkuZmlsdGVyKChbLCBwYXJ0XSkgPT4gaXNTZXQocGFydCkpKSBhcyBGaWx0ZXJHcm91cERlZmF1bHQ7XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZCkubGVuZ3RoID8gc3RvcmVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNEcmlsbFZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVwb3J0RHJpbGxTdGVwWyd2YWx1ZSddIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNTZXQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdfQ==
@@ -10,8 +10,7 @@
10
10
  // numberRange its min/max control, matchAny the report bar's Match select,
11
11
  // and pageScope shows a page's groups in the report bar of that page.
12
12
  // cascadingOptions narrows a select's list by the other filters of its tile
13
- // (ReportFilterOptionsService). views is the Views picker in the report's
14
- // header (ReportViewPickerComponent). drill is a time chart's click down, with
13
+ // (ReportFilterOptionsService). drill is a time chart's click down, with
15
14
  // the tile header's breadcrumb and its menu's Drill up and Back to top as the
16
15
  // way back.
17
16
  export const VIEWER_FEATURES = [
@@ -21,7 +20,6 @@ export const VIEWER_FEATURES = [
21
20
  'matchAny',
22
21
  'pageScope',
23
22
  'cascadingOptions',
24
- 'views',
25
23
  'drill',
26
24
  ];
27
25
  // The features a report offers on this screen: the ones its server serves
@@ -39,4 +37,4 @@ export function offersExclude(group, features) {
39
37
  && !group.multiColumn
40
38
  && (features ?? []).includes('excludeValues');
41
39
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXdlci1mZWF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdmlld2VyLWZlYXR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLHdFQUF3RTtBQUN4RSwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UscUNBQXFDO0FBQ3JDLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLFlBQVk7QUFDWixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQW1DO0lBQzdELGNBQWM7SUFDZCxlQUFlO0lBQ2YsYUFBYTtJQUNiLFVBQVU7SUFDVixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLE9BQU87SUFDUCxPQUFPO0NBQ1IsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXlEO0lBQzdGLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSxnRUFBZ0U7QUFDaEUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsS0FBc0QsRUFDdEQsUUFBMkQ7SUFFM0QsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDekIsQ0FBQyxLQUFLLENBQUMsV0FBVztXQUNsQixDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXAgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGlzIHZpZXdlciBpbXBsZW1lbnRzOiB0aGUgcmVwb3J0IEdFVCBuYW1lcyB0aGVtXG4vLyAoZmVhdHVyZXM9PGNvbW1hIGxpc3Q+KSwgYW5kIHRoZSBzZXJ2ZXIgYXNzZW1ibGVzIHRoZSByZXBvcnQgZm9yIGV4YWN0bHlcbi8vIHRoZXNlLiBBIGZlYXR1cmUgam9pbnMgdGhlIGxpc3QgaW4gdGhlIGNoYW5nZSB0aGF0IGJ1aWxkcyBpdHMgY29udHJvbCwgbmV2ZXJcbi8vIGJlZm9yZTogdGhlIHNlcnZlciBzZW5kcyBhIGdyb3VwIG9ubHkgaW4gYSBzaGFwZSB0aGUgdmlld2VyIHNheXMgaXQgY2FuIHNob3dcbi8vIGFuZCBjbGVhciwgYW5kIGEgbGlzdGVkIGZlYXR1cmUgd2l0aG91dCBpdHMgY29udHJvbCB3b3VsZCBnZXQgYSBmaWx0ZXIgdGhlXG4vLyB2aWV3ZXIgY2FuIG5laXRoZXIgc2hvdyBub3IgY2xlYXIuXG4vL1xuLy8gc2NvcGVGaWx0ZXJzIG5lZWRzIG5vIGNvbnRyb2wgb2YgaXRzIG93bjogYSBzY29wZSBtZW1iZXIgaXMgYW4gb3JkaW5hcnlcbi8vIGZpbHRlciByb3cgb24gaXRzIHRpbGUuIGV4Y2x1ZGVWYWx1ZXMgaXMgYSBzZWxlY3QncyAnRXhjbHVkZSB0aGVzZScgcm93LFxuLy8gbnVtYmVyUmFuZ2UgaXRzIG1pbi9tYXggY29udHJvbCwgbWF0Y2hBbnkgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBzZWxlY3QsXG4vLyBhbmQgcGFnZVNjb3BlIHNob3dzIGEgcGFnZSdzIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciBvZiB0aGF0IHBhZ2UuXG4vLyBjYXNjYWRpbmdPcHRpb25zIG5hcnJvd3MgYSBzZWxlY3QncyBsaXN0IGJ5IHRoZSBvdGhlciBmaWx0ZXJzIG9mIGl0cyB0aWxlXG4vLyAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLiB2aWV3cyBpcyB0aGUgVmlld3MgcGlja2VyIGluIHRoZSByZXBvcnQnc1xuLy8gaGVhZGVyIChSZXBvcnRWaWV3UGlja2VyQ29tcG9uZW50KS4gZHJpbGwgaXMgYSB0aW1lIGNoYXJ0J3MgY2xpY2sgZG93biwgd2l0aFxuLy8gdGhlIHRpbGUgaGVhZGVyJ3MgYnJlYWRjcnVtYiBhbmQgaXRzIG1lbnUncyBEcmlsbCB1cCBhbmQgQmFjayB0byB0b3AgYXMgdGhlXG4vLyB3YXkgYmFjay5cbmV4cG9ydCBjb25zdCBWSUVXRVJfRkVBVFVSRVM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSA9IFtcbiAgJ3Njb3BlRmlsdGVycycsXG4gICdleGNsdWRlVmFsdWVzJyxcbiAgJ251bWJlclJhbmdlJyxcbiAgJ21hdGNoQW55JyxcbiAgJ3BhZ2VTY29wZScsXG4gICdjYXNjYWRpbmdPcHRpb25zJyxcbiAgJ3ZpZXdzJyxcbiAgJ2RyaWxsJyxcbl07XG5cbi8vIFRoZSBmZWF0dXJlcyBhIHJlcG9ydCBvZmZlcnMgb24gdGhpcyBzY3JlZW46IHRoZSBvbmVzIGl0cyBzZXJ2ZXIgc2VydmVzXG4vLyAoUmVwb3J0LnZpZXdlckZlYXR1cmVzKSB0aGF0IHRoaXMgdmlld2VyIGFsc28gaW1wbGVtZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvZmZlcmVkVmlld2VyRmVhdHVyZXMoc2VydmVkOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHtcbiAgcmV0dXJuIChzZXJ2ZWQgPz8gW10pLmZpbHRlcigoZmVhdHVyZSkgPT4gVklFV0VSX0ZFQVRVUkVTLmluY2x1ZGVzKGZlYXR1cmUpKTtcbn1cblxuLy8gV2hldGhlciBhIHNlbGVjdCBncm91cCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnOiB0aGUgb25lIHJ1bGUgdGhlIHJlcG9ydCBiYXIsXG4vLyB0aGUgdGlsZSBoZWFkZXJzIGFuZCB0aGUgcmVwb3J0IHNldHRpbmdzJyBkZWZhdWx0IHJvdyBzaGFyZS4gVGhlIHNlcnZlclxuLy8gbXVzdCBzZXJ2ZSBleGNsdWRlVmFsdWVzLCBhbmQgbm8gZW5hYmxlZCBtZW1iZXIgbWF5IGJpbmQgc2V2ZXJhbCBjb2x1bW5zXG4vLyAobXVsdGlDb2x1bW4pLCBzaW5jZSB0aGUgc2VydmVyIGNhbm5vdCBsZWF2ZSB2YWx1ZXMgb3V0IHRoZXJlIChhbiBvbGRlclxuLy8gc2VydmVyIHNlbmRzIG5vIG11bHRpQ29sdW1uLCBhbmQgdGhlIHRvZ2dsZSBzaG93cyBhcyBiZWZvcmUpLlxuZXhwb3J0IGZ1bmN0aW9uIG9mZmVyc0V4Y2x1ZGUoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAndHlwZScgfCAnbXVsdGlDb2x1bW4nPixcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnXG4gICAgJiYgIWdyb3VwLm11bHRpQ29sdW1uXG4gICAgJiYgKGZlYXR1cmVzID8/IFtdKS5pbmNsdWRlcygnZXhjbHVkZVZhbHVlcycpO1xufVxuIl19
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXdlci1mZWF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdmlld2VyLWZlYXR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLHdFQUF3RTtBQUN4RSwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UscUNBQXFDO0FBQ3JDLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsWUFBWTtBQUNaLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBbUM7SUFDN0QsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsVUFBVTtJQUNWLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsT0FBTztDQUNSLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUF5RDtJQUM3RixPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxhQUFhLENBQzNCLEtBQXNELEVBQ3RELFFBQTJEO0lBRTNELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO1dBQ3pCLENBQUMsS0FBSyxDQUFDLFdBQVc7V0FDbEIsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvcnRWaWV3ZXJGZWF0dXJlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3ZXItZmVhdHVyZS50eXBlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlckdyb3VwIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFRoZSB2aWV3ZXIgZmVhdHVyZXMgdGhpcyB2aWV3ZXIgaW1wbGVtZW50czogdGhlIHJlcG9ydCBHRVQgbmFtZXMgdGhlbVxuLy8gKGZlYXR1cmVzPTxjb21tYSBsaXN0PiksIGFuZCB0aGUgc2VydmVyIGFzc2VtYmxlcyB0aGUgcmVwb3J0IGZvciBleGFjdGx5XG4vLyB0aGVzZS4gQSBmZWF0dXJlIGpvaW5zIHRoZSBsaXN0IGluIHRoZSBjaGFuZ2UgdGhhdCBidWlsZHMgaXRzIGNvbnRyb2wsIG5ldmVyXG4vLyBiZWZvcmU6IHRoZSBzZXJ2ZXIgc2VuZHMgYSBncm91cCBvbmx5IGluIGEgc2hhcGUgdGhlIHZpZXdlciBzYXlzIGl0IGNhbiBzaG93XG4vLyBhbmQgY2xlYXIsIGFuZCBhIGxpc3RlZCBmZWF0dXJlIHdpdGhvdXQgaXRzIGNvbnRyb2wgd291bGQgZ2V0IGEgZmlsdGVyIHRoZVxuLy8gdmlld2VyIGNhbiBuZWl0aGVyIHNob3cgbm9yIGNsZWFyLlxuLy9cbi8vIHNjb3BlRmlsdGVycyBuZWVkcyBubyBjb250cm9sIG9mIGl0cyBvd246IGEgc2NvcGUgbWVtYmVyIGlzIGFuIG9yZGluYXJ5XG4vLyBmaWx0ZXIgcm93IG9uIGl0cyB0aWxlLiBleGNsdWRlVmFsdWVzIGlzIGEgc2VsZWN0J3MgJ0V4Y2x1ZGUgdGhlc2UnIHJvdyxcbi8vIG51bWJlclJhbmdlIGl0cyBtaW4vbWF4IGNvbnRyb2wsIG1hdGNoQW55IHRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggc2VsZWN0LFxuLy8gYW5kIHBhZ2VTY29wZSBzaG93cyBhIHBhZ2UncyBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIgb2YgdGhhdCBwYWdlLlxuLy8gY2FzY2FkaW5nT3B0aW9ucyBuYXJyb3dzIGEgc2VsZWN0J3MgbGlzdCBieSB0aGUgb3RoZXIgZmlsdGVycyBvZiBpdHMgdGlsZVxuLy8gKFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKS4gZHJpbGwgaXMgYSB0aW1lIGNoYXJ0J3MgY2xpY2sgZG93biwgd2l0aFxuLy8gdGhlIHRpbGUgaGVhZGVyJ3MgYnJlYWRjcnVtYiBhbmQgaXRzIG1lbnUncyBEcmlsbCB1cCBhbmQgQmFjayB0byB0b3AgYXMgdGhlXG4vLyB3YXkgYmFjay5cbmV4cG9ydCBjb25zdCBWSUVXRVJfRkVBVFVSRVM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSA9IFtcbiAgJ3Njb3BlRmlsdGVycycsXG4gICdleGNsdWRlVmFsdWVzJyxcbiAgJ251bWJlclJhbmdlJyxcbiAgJ21hdGNoQW55JyxcbiAgJ3BhZ2VTY29wZScsXG4gICdjYXNjYWRpbmdPcHRpb25zJyxcbiAgJ2RyaWxsJyxcbl07XG5cbi8vIFRoZSBmZWF0dXJlcyBhIHJlcG9ydCBvZmZlcnMgb24gdGhpcyBzY3JlZW46IHRoZSBvbmVzIGl0cyBzZXJ2ZXIgc2VydmVzXG4vLyAoUmVwb3J0LnZpZXdlckZlYXR1cmVzKSB0aGF0IHRoaXMgdmlld2VyIGFsc28gaW1wbGVtZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvZmZlcmVkVmlld2VyRmVhdHVyZXMoc2VydmVkOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHtcbiAgcmV0dXJuIChzZXJ2ZWQgPz8gW10pLmZpbHRlcigoZmVhdHVyZSkgPT4gVklFV0VSX0ZFQVRVUkVTLmluY2x1ZGVzKGZlYXR1cmUpKTtcbn1cblxuLy8gV2hldGhlciBhIHNlbGVjdCBncm91cCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnOiB0aGUgb25lIHJ1bGUgdGhlIHJlcG9ydCBiYXIsXG4vLyB0aGUgdGlsZSBoZWFkZXJzIGFuZCB0aGUgcmVwb3J0IHNldHRpbmdzJyBkZWZhdWx0IHJvdyBzaGFyZS4gVGhlIHNlcnZlclxuLy8gbXVzdCBzZXJ2ZSBleGNsdWRlVmFsdWVzLCBhbmQgbm8gZW5hYmxlZCBtZW1iZXIgbWF5IGJpbmQgc2V2ZXJhbCBjb2x1bW5zXG4vLyAobXVsdGlDb2x1bW4pLCBzaW5jZSB0aGUgc2VydmVyIGNhbm5vdCBsZWF2ZSB2YWx1ZXMgb3V0IHRoZXJlIChhbiBvbGRlclxuLy8gc2VydmVyIHNlbmRzIG5vIG11bHRpQ29sdW1uLCBhbmQgdGhlIHRvZ2dsZSBzaG93cyBhcyBiZWZvcmUpLlxuZXhwb3J0IGZ1bmN0aW9uIG9mZmVyc0V4Y2x1ZGUoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAndHlwZScgfCAnbXVsdGlDb2x1bW4nPixcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnXG4gICAgJiYgIWdyb3VwLm11bHRpQ29sdW1uXG4gICAgJiYgKGZlYXR1cmVzID8/IFtdKS5pbmNsdWRlcygnZXhjbHVkZVZhbHVlcycpO1xufVxuIl19