@tolle_/tolle-ui 18.2.24 → 18.2.25

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 (184) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +17 -5
  2. package/esm2022/lib/alert-dialog-dynamic.component.mjs +1 -1
  3. package/esm2022/lib/alert-dialog.component.mjs +48 -10
  4. package/esm2022/lib/alert-dialog.service.mjs +13 -2
  5. package/esm2022/lib/alert.component.mjs +5 -5
  6. package/esm2022/lib/avatar.component.mjs +30 -9
  7. package/esm2022/lib/badge.component.mjs +41 -15
  8. package/esm2022/lib/breadcrumb-link.component.mjs +5 -5
  9. package/esm2022/lib/button.component.mjs +14 -3
  10. package/esm2022/lib/calendar.component.mjs +99 -17
  11. package/esm2022/lib/card.component.mjs +29 -9
  12. package/esm2022/lib/carousel/carousel.component.mjs +19 -3
  13. package/esm2022/lib/checkbox.component.mjs +44 -21
  14. package/esm2022/lib/collapsible.component.mjs +12 -4
  15. package/esm2022/lib/country-selector.component.mjs +140 -20
  16. package/esm2022/lib/data-table.component.mjs +27 -16
  17. package/esm2022/lib/date-picker.component.mjs +24 -4
  18. package/esm2022/lib/date-range-picker.component.mjs +37 -9
  19. package/esm2022/lib/dropdown-item.component.mjs +19 -5
  20. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  21. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  22. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  23. package/esm2022/lib/dropdown-trigger.directive.mjs +7 -3
  24. package/esm2022/lib/empty-state.component.mjs +3 -3
  25. package/esm2022/lib/hover-card.component.mjs +4 -2
  26. package/esm2022/lib/input.component.mjs +7 -5
  27. package/esm2022/lib/label.component.mjs +2 -2
  28. package/esm2022/lib/masked-input.component.mjs +3 -3
  29. package/esm2022/lib/modal.component.mjs +58 -22
  30. package/esm2022/lib/modal.service.mjs +13 -1
  31. package/esm2022/lib/multi-select.component.mjs +228 -20
  32. package/esm2022/lib/otp.component.mjs +6 -3
  33. package/esm2022/lib/pagination.component.mjs +19 -9
  34. package/esm2022/lib/progress.component.mjs +8 -5
  35. package/esm2022/lib/radio-group.component.mjs +51 -3
  36. package/esm2022/lib/radio-item.component.mjs +46 -8
  37. package/esm2022/lib/radio-service.mjs +60 -1
  38. package/esm2022/lib/range-calendar.component.mjs +317 -98
  39. package/esm2022/lib/resizable-panel.component.mjs +5 -4
  40. package/esm2022/lib/scroll-area.component.mjs +5 -5
  41. package/esm2022/lib/segment.component.mjs +73 -7
  42. package/esm2022/lib/select-item.component.mjs +20 -2
  43. package/esm2022/lib/select-separator.component.mjs +3 -3
  44. package/esm2022/lib/select.component.mjs +221 -14
  45. package/esm2022/lib/separator.component.mjs +12 -6
  46. package/esm2022/lib/sheet-ref.mjs +8 -1
  47. package/esm2022/lib/sheet-wrapper.component.mjs +27 -11
  48. package/esm2022/lib/sheet.component.mjs +57 -16
  49. package/esm2022/lib/sheet.service.mjs +5 -1
  50. package/esm2022/lib/sidebar.component.mjs +73 -15
  51. package/esm2022/lib/skeleton.component.mjs +19 -5
  52. package/esm2022/lib/switch.component.mjs +59 -53
  53. package/esm2022/lib/tabs.component.mjs +75 -13
  54. package/esm2022/lib/tag-input.component.mjs +6 -3
  55. package/esm2022/lib/textarea.component.mjs +9 -7
  56. package/esm2022/lib/theme.service.mjs +114 -138
  57. package/esm2022/lib/toaster.component.mjs +19 -9
  58. package/esm2022/lib/toggle-group.component.mjs +76 -4
  59. package/esm2022/lib/tolle-config.mjs +1 -1
  60. package/esm2022/lib/tooltip.directive.mjs +41 -17
  61. package/esm2022/lib/utils/color.mjs +324 -0
  62. package/esm2022/public-api.mjs +2 -1
  63. package/fesm2022/tolle-ui.mjs +2645 -637
  64. package/fesm2022/tolle-ui.mjs.map +1 -1
  65. package/lib/alert-dialog.component.d.ts +10 -1
  66. package/lib/avatar.component.d.ts +16 -3
  67. package/lib/badge.component.d.ts +17 -5
  68. package/lib/button.component.d.ts +10 -3
  69. package/lib/calendar.component.d.ts +21 -3
  70. package/lib/card.component.d.ts +6 -0
  71. package/lib/carousel/carousel.component.d.ts +1 -0
  72. package/lib/checkbox.component.d.ts +12 -4
  73. package/lib/country-selector.component.d.ts +11 -2
  74. package/lib/date-picker.component.d.ts +1 -0
  75. package/lib/date-range-picker.component.d.ts +4 -1
  76. package/lib/dropdown-item.component.d.ts +4 -2
  77. package/lib/dropdown-trigger.directive.d.ts +1 -1
  78. package/lib/modal.component.d.ts +6 -0
  79. package/lib/multi-select.component.d.ts +20 -0
  80. package/lib/otp.component.d.ts +1 -0
  81. package/lib/progress.component.d.ts +1 -0
  82. package/lib/radio-group.component.d.ts +8 -0
  83. package/lib/radio-item.component.d.ts +10 -4
  84. package/lib/radio-service.d.ts +29 -0
  85. package/lib/range-calendar.component.d.ts +33 -4
  86. package/lib/segment.component.d.ts +13 -0
  87. package/lib/select-item.component.d.ts +4 -1
  88. package/lib/select.component.d.ts +20 -0
  89. package/lib/separator.component.d.ts +2 -0
  90. package/lib/sheet-wrapper.component.d.ts +4 -0
  91. package/lib/sheet.component.d.ts +10 -1
  92. package/lib/sidebar.component.d.ts +2 -0
  93. package/lib/skeleton.component.d.ts +9 -3
  94. package/lib/switch.component.d.ts +13 -20
  95. package/lib/tabs.component.d.ts +11 -1
  96. package/lib/theme.service.d.ts +21 -6
  97. package/lib/toaster.component.d.ts +2 -2
  98. package/lib/toggle-group.component.d.ts +20 -2
  99. package/lib/toggle.component.d.ts +1 -1
  100. package/lib/tolle-config.d.ts +8 -0
  101. package/lib/tooltip.directive.d.ts +3 -0
  102. package/lib/utils/color.d.ts +87 -0
  103. package/package.json +4 -1
  104. package/preset.js +28 -0
  105. package/public-api.d.ts +1 -0
  106. package/registry/docs-content.json +4214 -0
  107. package/registry/llms-full.txt +1599 -0
  108. package/registry/llms.txt +83 -0
  109. package/registry/manifest.json +4925 -0
  110. package/registry/r/accordion-item.json +21 -0
  111. package/registry/r/accordion.json +23 -0
  112. package/registry/r/alert-dialog-dynamic.json +31 -0
  113. package/registry/r/alert-dialog.json +26 -0
  114. package/registry/r/alert.json +23 -0
  115. package/registry/r/aspect-ratio.json +21 -0
  116. package/registry/r/avatar-fallback.json +16 -0
  117. package/registry/r/avatar.json +23 -0
  118. package/registry/r/badge.json +23 -0
  119. package/registry/r/breadcrumb-item.json +16 -0
  120. package/registry/r/breadcrumb-link.json +16 -0
  121. package/registry/r/breadcrumb-separator.json +16 -0
  122. package/registry/r/breadcrumb.json +21 -0
  123. package/registry/r/button-group.json +21 -0
  124. package/registry/r/button.json +23 -0
  125. package/registry/r/calendar.json +23 -0
  126. package/registry/r/card.json +21 -0
  127. package/registry/r/carousel.json +18 -0
  128. package/registry/r/checkbox.json +23 -0
  129. package/registry/r/collapsible.json +21 -0
  130. package/registry/r/context-menu-trigger.json +23 -0
  131. package/registry/r/context-menu.json +28 -0
  132. package/registry/r/country-selector.json +31 -0
  133. package/registry/r/data-table.json +38 -0
  134. package/registry/r/date-picker.json +27 -0
  135. package/registry/r/date-range-picker.json +32 -0
  136. package/registry/r/dropdown-item.json +21 -0
  137. package/registry/r/dropdown-label.json +16 -0
  138. package/registry/r/dropdown-menu.json +16 -0
  139. package/registry/r/dropdown-separator.json +16 -0
  140. package/registry/r/dropdown-trigger.json +20 -0
  141. package/registry/r/empty-state.json +23 -0
  142. package/registry/r/hover-card.json +23 -0
  143. package/registry/r/input.json +21 -0
  144. package/registry/r/label.json +21 -0
  145. package/registry/r/masked-input.json +21 -0
  146. package/registry/r/modal.json +36 -0
  147. package/registry/r/multi-select.json +33 -0
  148. package/registry/r/otp-group.json +16 -0
  149. package/registry/r/otp-slot.json +21 -0
  150. package/registry/r/otp.json +21 -0
  151. package/registry/r/pagination.json +32 -0
  152. package/registry/r/phone-number-input.json +34 -0
  153. package/registry/r/popover-content.json +21 -0
  154. package/registry/r/popover.json +18 -0
  155. package/registry/r/progress.json +21 -0
  156. package/registry/r/radio-group.json +26 -0
  157. package/registry/r/radio-item.json +26 -0
  158. package/registry/r/range-calendar.json +28 -0
  159. package/registry/r/resizable-panel-item.json +23 -0
  160. package/registry/r/resizable-panel.json +23 -0
  161. package/registry/r/resizable.json +21 -0
  162. package/registry/r/scroll-area.json +21 -0
  163. package/registry/r/segment.json +21 -0
  164. package/registry/r/select-group.json +21 -0
  165. package/registry/r/select-item.json +26 -0
  166. package/registry/r/select-separator.json +21 -0
  167. package/registry/r/select.json +31 -0
  168. package/registry/r/separator.json +21 -0
  169. package/registry/r/sheet-wrapper.json +31 -0
  170. package/registry/r/sheet.json +21 -0
  171. package/registry/r/sidebar.json +21 -0
  172. package/registry/r/skeleton.json +23 -0
  173. package/registry/r/slider.json +21 -0
  174. package/registry/r/switch.json +23 -0
  175. package/registry/r/tabs.json +23 -0
  176. package/registry/r/tag-input.json +25 -0
  177. package/registry/r/textarea.json +21 -0
  178. package/registry/r/toaster.json +26 -0
  179. package/registry/r/toggle-group.json +25 -0
  180. package/registry/r/toggle.json +23 -0
  181. package/registry/r/tolle-cell.json +16 -0
  182. package/registry/r/tooltip.json +23 -0
  183. package/registry/registry.json +1540 -0
  184. package/theme.css +56 -1
@@ -1,13 +1,20 @@
1
1
  import { Component, Input, forwardRef, Output, EventEmitter } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { addMonths, subMonths, startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isSameDay, isToday, setMonth, setYear, addYears, subYears, isBefore, startOfDay, isWithinInterval } from 'date-fns';
4
+ import { addDays, addMonths, subMonths, startOfMonth, endOfMonth, startOfWeek, endOfWeek, eachDayOfInterval, isSameMonth, isSameDay, isToday, setMonth, setYear, addYears, subYears, isBefore, startOfDay, isWithinInterval, format } from 'date-fns';
5
5
  import { cn } from './utils/cn';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@angular/common";
8
8
  export class RangeCalendarComponent {
9
+ cdr;
10
+ el;
9
11
  class = '';
10
12
  disablePastDates = false;
13
+ /** Renders the calendar's own border/background/shadow. Set `false` inside a
14
+ * card/popover that already provides chrome. @default true */
15
+ bordered = true;
16
+ /** Number of consecutive months rendered side by side. @default 1 */
17
+ numberOfMonths = 1;
11
18
  rangeSelect = new EventEmitter(); // Emits whenever selection changes
12
19
  currentView = 'date';
13
20
  viewDate = new Date();
@@ -15,21 +22,44 @@ export class RangeCalendarComponent {
15
22
  value = { start: null, end: null };
16
23
  weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
17
24
  daysInMonth = [];
25
+ /** Grids for each visible month (multi-month view). */
26
+ visibleMonths = [];
18
27
  months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
19
28
  years = [];
20
- navBtnClass = cn('h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 border border-input rounded-md flex items-center justify-center hover:bg-accent hover:text-accent-foreground transition-all');
29
+ navBtnClass = cn('h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 border border-input rounded-md flex items-center justify-center hover:bg-accent hover:text-accent-foreground transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring');
21
30
  onTouched = () => { };
22
31
  onChange = () => { };
23
32
  cn = cn;
33
+ constructor(cdr, el) {
34
+ this.cdr = cdr;
35
+ this.el = el;
36
+ }
24
37
  ngOnInit() {
25
38
  this.generateDays();
26
39
  this.generateYears();
27
40
  }
41
+ ngOnChanges(changes) {
42
+ // Rebuild the month grids when the visible-month count changes after init
43
+ // (e.g. a `[numberOfMonths]` toggle), so single ⇄ multi-month is reactive.
44
+ if (changes['numberOfMonths'] && !changes['numberOfMonths'].firstChange) {
45
+ this.generateDays();
46
+ }
47
+ }
28
48
  // --- Date Generation Logic (Same as Calendar) ---
29
49
  generateDays() {
30
50
  const start = startOfWeek(startOfMonth(this.viewDate));
31
51
  const end = endOfWeek(endOfMonth(this.viewDate));
32
52
  this.daysInMonth = eachDayOfInterval({ start, end });
53
+ // Multi-month grids: viewDate is the leftmost month, then N-1 consecutive.
54
+ const count = Math.max(1, this.numberOfMonths);
55
+ this.visibleMonths = Array.from({ length: count }, (_, i) => {
56
+ const monthDate = addMonths(this.viewDate, i);
57
+ return {
58
+ date: monthDate,
59
+ days: eachDayOfInterval({ start: startOfWeek(startOfMonth(monthDate)), end: endOfWeek(endOfMonth(monthDate)) }),
60
+ label: format(monthDate, 'MMMM yyyy'),
61
+ };
62
+ });
33
63
  }
34
64
  generateYears() {
35
65
  const currentYear = this.viewDate.getFullYear();
@@ -86,14 +116,83 @@ export class RangeCalendarComponent {
86
116
  else {
87
117
  this.value = { start: date, end: null };
88
118
  }
89
- if (!isSameMonth(date, this.viewDate)) {
90
- this.viewDate = date;
119
+ // Only re-anchor the view when the clicked day isn't already on a visible month
120
+ // (so clicking the right-hand month in a 2-month view doesn't jump the calendar).
121
+ const onVisibleMonth = this.visibleMonths.some((m) => isSameMonth(date, m.date));
122
+ if (!onVisibleMonth) {
123
+ this.viewDate = startOfMonth(date);
91
124
  this.generateDays();
92
125
  }
93
126
  this.onChange(this.value);
94
127
  this.rangeSelect.emit(this.value);
95
128
  this.onTouched();
96
129
  }
130
+ // --- Grid keyboard navigation (date view only) ---
131
+ /**
132
+ * Arrow keys move by day/week, Home/End to week edges, PageUp/PageDown by
133
+ * month. Enter/Space are left to the native day <button>. The focused day is
134
+ * read from its `data-date` key, so navigation is independent of grid layout
135
+ * (adjacent-month days aren't rendered in the multi-month view).
136
+ */
137
+ onGridKeydown(event) {
138
+ if (this.numberOfMonths <= 1 && this.currentView !== 'date')
139
+ return;
140
+ const key = event.target.getAttribute('data-date');
141
+ if (!key)
142
+ return;
143
+ const current = this.keyToDate(key);
144
+ let next = null;
145
+ switch (event.key) {
146
+ case 'ArrowLeft':
147
+ next = addDays(current, -1);
148
+ break;
149
+ case 'ArrowRight':
150
+ next = addDays(current, 1);
151
+ break;
152
+ case 'ArrowUp':
153
+ next = addDays(current, -7);
154
+ break;
155
+ case 'ArrowDown':
156
+ next = addDays(current, 7);
157
+ break;
158
+ case 'Home':
159
+ next = startOfWeek(current);
160
+ break;
161
+ case 'End':
162
+ next = endOfWeek(current);
163
+ break;
164
+ case 'PageUp':
165
+ next = subMonths(current, 1);
166
+ break;
167
+ case 'PageDown':
168
+ next = addMonths(current, 1);
169
+ break;
170
+ default: return;
171
+ }
172
+ event.preventDefault();
173
+ this.focusDay(next);
174
+ }
175
+ focusDay(date) {
176
+ const selector = `[data-date="${this.fmtKey(date)}"]`;
177
+ let btn = this.el.nativeElement.querySelector(selector);
178
+ if (btn) {
179
+ btn.focus();
180
+ return;
181
+ }
182
+ // Target day isn't currently rendered → page the view toward it, then retry.
183
+ if (this.numberOfMonths > 1) {
184
+ this.viewDate = isBefore(date, this.visibleMonths[0].date)
185
+ ? subMonths(this.viewDate, 1)
186
+ : addMonths(this.viewDate, 1);
187
+ }
188
+ else {
189
+ this.viewDate = startOfMonth(date);
190
+ }
191
+ this.generateDays();
192
+ this.cdr.detectChanges();
193
+ btn = this.el.nativeElement.querySelector(selector);
194
+ btn?.focus();
195
+ }
97
196
  selectMonth(monthIndex) {
98
197
  this.viewDate = setMonth(this.viewDate, monthIndex);
99
198
  this.currentView = 'date';
@@ -105,9 +204,25 @@ export class RangeCalendarComponent {
105
204
  this.generateDays();
106
205
  }
107
206
  // --- Visual Styling for Range ---
108
- getDayClass(date) {
207
+ isSelected(date) {
208
+ const { start, end } = this.value;
209
+ return !!((start && isSameDay(date, start)) || (end && isSameDay(date, end)));
210
+ }
211
+ /** True when `date` belongs to `refMonth` (used to blank out adjacent-month cells). */
212
+ isCurrentMonth(date, refMonth) {
213
+ return isSameMonth(date, refMonth);
214
+ }
215
+ /** Stable, timezone-safe `data-date` key used to locate day buttons for focus. */
216
+ fmtKey(date) {
217
+ return format(date, 'yyyy-MM-dd');
218
+ }
219
+ keyToDate(key) {
220
+ const [y, m, d] = key.split('-').map(Number);
221
+ return new Date(y, m - 1, d);
222
+ }
223
+ getDayClass(date, refMonth = this.viewDate) {
109
224
  const { start, end } = this.value;
110
- const isOutside = !isSameMonth(date, this.viewDate);
225
+ const isOutside = !isSameMonth(date, refMonth);
111
226
  const isDisabled = this.isDateDisabled(date);
112
227
  // Range Checks
113
228
  const isStart = start && isSameDay(date, start);
@@ -116,7 +231,7 @@ export class RangeCalendarComponent {
116
231
  const isTodayDate = isToday(date);
117
232
  return cn(
118
233
  // Base: h-9 w-9, but we remove margins/rounding for the 'strip' effect
119
- 'h-9 w-9 p-0 font-normal text-sm transition-all flex items-center justify-center relative z-10',
234
+ 'h-9 w-9 p-0 font-normal text-sm transition-all flex items-center justify-center relative z-10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',
120
235
  // Default State (Not selected, Not disabled)
121
236
  !isInside && !isStart && !isEnd && !isDisabled && 'hover:bg-accent hover:text-accent-foreground rounded-md',
122
237
  // The "Caps": Start and End
@@ -145,65 +260,115 @@ export class RangeCalendarComponent {
145
260
  }
146
261
  registerOnChange(fn) { this.onChange = fn; }
147
262
  registerOnTouched(fn) { this.onTouched = fn; }
148
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RangeCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
149
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RangeCalendarComponent, isStandalone: true, selector: "tolle-range-calendar", inputs: { class: "class", disablePastDates: "disablePastDates" }, outputs: { rangeSelect: "rangeSelect" }, providers: [
263
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RangeCalendarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
264
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RangeCalendarComponent, isStandalone: true, selector: "tolle-range-calendar", inputs: { class: "class", disablePastDates: "disablePastDates", bordered: "bordered", numberOfMonths: "numberOfMonths" }, outputs: { rangeSelect: "rangeSelect" }, providers: [
150
265
  {
151
266
  provide: NG_VALUE_ACCESSOR,
152
267
  useExisting: forwardRef(() => RangeCalendarComponent),
153
268
  multi: true
154
269
  }
155
- ], ngImport: i0, template: `
156
- <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block min-w-fit', class)">
270
+ ], usesOnChanges: true, ngImport: i0, template: `
271
+ <div [class]="cn('text-popover-foreground inline-block min-w-fit', bordered ? 'p-3 border rounded-md bg-background shadow-sm' : '', class)">
157
272
 
158
- <div class="flex items-center justify-between pt-1 pb-4 gap-2">
159
- <div class="flex items-center gap-1">
160
- <button type="button" (click)="setView('month')"
161
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
162
- {{ viewDate | date: 'MMMM' }}
163
- </button>
164
- <button type="button" (click)="setView('year')"
165
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
166
- {{ viewDate | date: 'yyyy' }}
167
- </button>
168
- </div>
169
- <div class="flex items-center space-x-1">
170
- <button type="button" (click)="prev()" [class]="navBtnClass"><i class="ri-arrow-left-s-line text-lg"></i></button>
171
- <button type="button" (click)="next()" [class]="navBtnClass"><i class="ri-arrow-right-s-line text-lg"></i></button>
273
+ <!-- ===== Multi-month view (side-by-side, shared range) ===== -->
274
+ <div *ngIf="numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
275
+ <div *ngFor="let m of visibleMonths; let idx = index" class="space-y-2">
276
+ <div class="flex items-center justify-between pt-1 pb-2">
277
+ <button *ngIf="idx === 0" type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month">
278
+ <i class="ri-arrow-left-s-line text-lg"></i>
279
+ </button>
280
+ <span *ngIf="idx !== 0" class="h-7 w-7"></span>
281
+
282
+ <div class="text-sm font-semibold">{{ m.label }}</div>
283
+
284
+ <button *ngIf="idx === visibleMonths.length - 1" type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month">
285
+ <i class="ri-arrow-right-s-line text-lg"></i>
286
+ </button>
287
+ <span *ngIf="idx !== visibleMonths.length - 1" class="h-7 w-7"></span>
288
+ </div>
289
+
290
+ <div class="grid grid-cols-7 gap-y-1">
291
+ <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">{{ day }}</span>
292
+ </div>
293
+ <div role="grid" class="grid grid-cols-7 gap-y-1" (keydown)="onGridKeydown($event)">
294
+ <ng-container *ngFor="let date of m.days">
295
+ <!-- Only the month's own days are rendered; adjacent-month days are
296
+ blank spacers so each calendar in a multi-month view is self-contained. -->
297
+ <button
298
+ *ngIf="isCurrentMonth(date, m.date); else pad"
299
+ type="button"
300
+ role="gridcell"
301
+ [attr.data-date]="fmtKey(date)"
302
+ [attr.aria-selected]="isSelected(date)"
303
+ [attr.aria-label]="(date | date:'fullDate')"
304
+ (click)="selectDate(date)"
305
+ [disabled]="isDateDisabled(date)"
306
+ [class]="getDayClass(date, m.date)"
307
+ >
308
+ {{ date | date: 'd' }}
309
+ </button>
310
+ <ng-template #pad><span class="h-9 w-9" aria-hidden="true"></span></ng-template>
311
+ </ng-container>
312
+ </div>
172
313
  </div>
173
314
  </div>
174
315
 
175
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
176
- <div class="grid grid-cols-7 gap-y-1 w-full">
177
- <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
178
- {{ day }}
179
- </span>
316
+ <!-- ===== Single-month view (with month / year quick pickers) ===== -->
317
+ <ng-container *ngIf="numberOfMonths <= 1">
318
+ <div class="flex items-center justify-between pt-1 pb-4 gap-2">
319
+ <div class="flex items-center gap-1">
320
+ <button type="button" (click)="setView('month')"
321
+ [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
322
+ {{ viewDate | date: 'MMMM' }}
323
+ </button>
324
+ <button type="button" (click)="setView('year')"
325
+ [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
326
+ {{ viewDate | date: 'yyyy' }}
327
+ </button>
328
+ </div>
329
+ <div class="flex items-center space-x-1">
330
+ <button type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month"><i class="ri-arrow-left-s-line text-lg"></i></button>
331
+ <button type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month"><i class="ri-arrow-right-s-line text-lg"></i></button>
332
+ </div>
180
333
  </div>
181
- <div class="grid grid-cols-7 gap-y-1 w-full">
182
- <button
183
- *ngFor="let date of daysInMonth"
184
- type="button"
185
- (click)="selectDate(date)"
186
- [disabled]="isDateDisabled(date)"
187
- [class]="getDayClass(date)"
188
- >
189
- {{ date | date: 'd' }}
190
- </button>
334
+
335
+ <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
336
+ <div class="grid grid-cols-7 gap-y-1 w-full">
337
+ <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
338
+ {{ day }}
339
+ </span>
340
+ </div>
341
+ <div role="grid" class="grid grid-cols-7 gap-y-1 w-full" (keydown)="onGridKeydown($event)">
342
+ <button
343
+ *ngFor="let date of daysInMonth"
344
+ type="button"
345
+ role="gridcell"
346
+ [attr.data-date]="fmtKey(date)"
347
+ [attr.aria-selected]="isSelected(date)"
348
+ [attr.aria-label]="(date | date:'fullDate')"
349
+ (click)="selectDate(date)"
350
+ [disabled]="isDateDisabled(date)"
351
+ [class]="getDayClass(date)"
352
+ >
353
+ {{ date | date: 'd' }}
354
+ </button>
355
+ </div>
191
356
  </div>
192
- </div>
193
357
 
194
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
195
- <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
196
- [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
197
- {{ month }}
198
- </button>
199
- </div>
358
+ <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
359
+ <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
360
+ [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
361
+ {{ month }}
362
+ </button>
363
+ </div>
200
364
 
201
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
202
- <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
203
- [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
204
- {{ year }}
205
- </button>
206
- </div>
365
+ <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
366
+ <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
367
+ [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
368
+ {{ year }}
369
+ </button>
370
+ </div>
371
+ </ng-container>
207
372
  </div>
208
373
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
209
374
  }
@@ -221,65 +386,119 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
221
386
  }
222
387
  ],
223
388
  template: `
224
- <div [class]="cn('p-3 border rounded-md bg-background text-popover-foreground shadow-sm inline-block min-w-fit', class)">
389
+ <div [class]="cn('text-popover-foreground inline-block min-w-fit', bordered ? 'p-3 border rounded-md bg-background shadow-sm' : '', class)">
225
390
 
226
- <div class="flex items-center justify-between pt-1 pb-4 gap-2">
227
- <div class="flex items-center gap-1">
228
- <button type="button" (click)="setView('month')"
229
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
230
- {{ viewDate | date: 'MMMM' }}
231
- </button>
232
- <button type="button" (click)="setView('year')"
233
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
234
- {{ viewDate | date: 'yyyy' }}
235
- </button>
236
- </div>
237
- <div class="flex items-center space-x-1">
238
- <button type="button" (click)="prev()" [class]="navBtnClass"><i class="ri-arrow-left-s-line text-lg"></i></button>
239
- <button type="button" (click)="next()" [class]="navBtnClass"><i class="ri-arrow-right-s-line text-lg"></i></button>
391
+ <!-- ===== Multi-month view (side-by-side, shared range) ===== -->
392
+ <div *ngIf="numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
393
+ <div *ngFor="let m of visibleMonths; let idx = index" class="space-y-2">
394
+ <div class="flex items-center justify-between pt-1 pb-2">
395
+ <button *ngIf="idx === 0" type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month">
396
+ <i class="ri-arrow-left-s-line text-lg"></i>
397
+ </button>
398
+ <span *ngIf="idx !== 0" class="h-7 w-7"></span>
399
+
400
+ <div class="text-sm font-semibold">{{ m.label }}</div>
401
+
402
+ <button *ngIf="idx === visibleMonths.length - 1" type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month">
403
+ <i class="ri-arrow-right-s-line text-lg"></i>
404
+ </button>
405
+ <span *ngIf="idx !== visibleMonths.length - 1" class="h-7 w-7"></span>
406
+ </div>
407
+
408
+ <div class="grid grid-cols-7 gap-y-1">
409
+ <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">{{ day }}</span>
410
+ </div>
411
+ <div role="grid" class="grid grid-cols-7 gap-y-1" (keydown)="onGridKeydown($event)">
412
+ <ng-container *ngFor="let date of m.days">
413
+ <!-- Only the month's own days are rendered; adjacent-month days are
414
+ blank spacers so each calendar in a multi-month view is self-contained. -->
415
+ <button
416
+ *ngIf="isCurrentMonth(date, m.date); else pad"
417
+ type="button"
418
+ role="gridcell"
419
+ [attr.data-date]="fmtKey(date)"
420
+ [attr.aria-selected]="isSelected(date)"
421
+ [attr.aria-label]="(date | date:'fullDate')"
422
+ (click)="selectDate(date)"
423
+ [disabled]="isDateDisabled(date)"
424
+ [class]="getDayClass(date, m.date)"
425
+ >
426
+ {{ date | date: 'd' }}
427
+ </button>
428
+ <ng-template #pad><span class="h-9 w-9" aria-hidden="true"></span></ng-template>
429
+ </ng-container>
430
+ </div>
240
431
  </div>
241
432
  </div>
242
433
 
243
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
244
- <div class="grid grid-cols-7 gap-y-1 w-full">
245
- <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
246
- {{ day }}
247
- </span>
434
+ <!-- ===== Single-month view (with month / year quick pickers) ===== -->
435
+ <ng-container *ngIf="numberOfMonths <= 1">
436
+ <div class="flex items-center justify-between pt-1 pb-4 gap-2">
437
+ <div class="flex items-center gap-1">
438
+ <button type="button" (click)="setView('month')"
439
+ [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
440
+ {{ viewDate | date: 'MMMM' }}
441
+ </button>
442
+ <button type="button" (click)="setView('year')"
443
+ [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
444
+ {{ viewDate | date: 'yyyy' }}
445
+ </button>
446
+ </div>
447
+ <div class="flex items-center space-x-1">
448
+ <button type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month"><i class="ri-arrow-left-s-line text-lg"></i></button>
449
+ <button type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month"><i class="ri-arrow-right-s-line text-lg"></i></button>
450
+ </div>
248
451
  </div>
249
- <div class="grid grid-cols-7 gap-y-1 w-full">
250
- <button
251
- *ngFor="let date of daysInMonth"
252
- type="button"
253
- (click)="selectDate(date)"
254
- [disabled]="isDateDisabled(date)"
255
- [class]="getDayClass(date)"
256
- >
257
- {{ date | date: 'd' }}
258
- </button>
452
+
453
+ <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
454
+ <div class="grid grid-cols-7 gap-y-1 w-full">
455
+ <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
456
+ {{ day }}
457
+ </span>
458
+ </div>
459
+ <div role="grid" class="grid grid-cols-7 gap-y-1 w-full" (keydown)="onGridKeydown($event)">
460
+ <button
461
+ *ngFor="let date of daysInMonth"
462
+ type="button"
463
+ role="gridcell"
464
+ [attr.data-date]="fmtKey(date)"
465
+ [attr.aria-selected]="isSelected(date)"
466
+ [attr.aria-label]="(date | date:'fullDate')"
467
+ (click)="selectDate(date)"
468
+ [disabled]="isDateDisabled(date)"
469
+ [class]="getDayClass(date)"
470
+ >
471
+ {{ date | date: 'd' }}
472
+ </button>
473
+ </div>
259
474
  </div>
260
- </div>
261
475
 
262
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
263
- <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
264
- [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
265
- {{ month }}
266
- </button>
267
- </div>
476
+ <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
477
+ <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
478
+ [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
479
+ {{ month }}
480
+ </button>
481
+ </div>
268
482
 
269
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
270
- <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
271
- [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
272
- {{ year }}
273
- </button>
274
- </div>
483
+ <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
484
+ <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
485
+ [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
486
+ {{ year }}
487
+ </button>
488
+ </div>
489
+ </ng-container>
275
490
  </div>
276
491
  `
277
492
  }]
278
- }], propDecorators: { class: [{
493
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { class: [{
279
494
  type: Input
280
495
  }], disablePastDates: [{
281
496
  type: Input
497
+ }], bordered: [{
498
+ type: Input
499
+ }], numberOfMonths: [{
500
+ type: Input
282
501
  }], rangeSelect: [{
283
502
  type: Output
284
503
  }] } });
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUM5QyxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQ3ZDLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQXFFaEMsTUFBTSxPQUFPLHNCQUFzQjtJQUN4QixLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDLENBQUMsbUNBQW1DO0lBRTFGLFdBQVcsR0FBOEIsTUFBTSxDQUFDO0lBQ2hELFFBQVEsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRTVCLGtCQUFrQjtJQUNsQixLQUFLLEdBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUU5QyxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUks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SSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBmb3J3YXJkUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZE1vbnRocywgc3ViTW9udGhzLCBzdGFydE9mTW9udGgsIGVuZE9mTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLCBlbmRPZldlZWssIGVhY2hEYXlPZkludGVydmFsLCBpc1NhbWVNb250aCxcbiAgaXNTYW1lRGF5LCBpc1RvZGF5LCBzZXRNb250aCwgc2V0WWVhciwgYWRkWWVhcnMsIHN1YlllYXJzLFxuICBpc0JlZm9yZSwgc3RhcnRPZkRheSwgaXNXaXRoaW5JbnRlcnZhbFxufSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHtEYXRlUmFuZ2V9IGZyb20gJy4vdHlwZXMvZGF0ZS1yYW5nZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXJhbmdlLWNhbGVuZGFyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFuZ2VDYWxlbmRhckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbigncC0zIGJvcmRlciByb3VuZGVkLW1kIGJnLWJhY2tncm91bmQgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LXNtIGlubGluZS1ibG9jayBtaW4tdy1maXQnLCBjbGFzcylcIj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwdC0xIHBiLTQgZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ21vbnRoJylcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLCBjdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/ICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCcgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnKVwiPlxuICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAnTU1NTScgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0VmlldygneWVhcicpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbigndGV4dC1zbSBmb250LXNlbWlib2xkIHB4LTIgcHktMSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzJywgY3VycmVudFZpZXcgPT09ICd5ZWFyJyA/ICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCcgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnKVwiPlxuICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAneXl5eScgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTFcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJuZXh0KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIj48aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiIGNsYXNzPVwic3BhY2UteS0yIGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiPlxuICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIiBjbGFzcz1cInRleHQtWzAuOHJlbV0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbm9ybWFsIHRleHQtY2VudGVyIHctOVwiPlxuICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMSB3LWZ1bGxcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBkYXlzSW5Nb250aFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRhdGUpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF0ZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbW9udGgnXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0TW9udGgoaSlcIlxuICAgICAgICAgIFtjbGFzc109XCJjbigndGV4dC1zbSBweS0yLjUgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsIGkgPT09IHZpZXdEYXRlLmdldE1vbnRoKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICB7eyBtb250aCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICd5ZWFyJ1wiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNCBnYXAtMiB3LTY0IGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMiByb3VuZGVkLW1kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJywgeWVhciA9PT0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKSA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyA6ICcnKVwiPlxuICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHJhbmdlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7IC8vIEVtaXRzIHdoZW5ldmVyIHNlbGVjdGlvbiBjaGFuZ2VzXG5cbiAgY3VycmVudFZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF0ZSc7XG4gIHZpZXdEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICAvLyBUaGUgUmFuZ2UgVmFsdWVcbiAgdmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gIHdlZWtEYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xuICBkYXlzSW5Nb250aDogRGF0ZVtdID0gW107XG4gIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgbmF2QnRuQ2xhc3MgPSBjbignaC03IHctNyBiZy10cmFuc3BhcmVudCBwLTAgb3BhY2l0eS01MCBob3ZlcjpvcGFjaXR5LTEwMCBib3JkZXIgYm9yZGVyLWlucHV0IHJvdW5kZWQtbWQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1hbGwnKTtcblxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZVJhbmdlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICAvLyAtLS0gRGF0ZSBHZW5lcmF0aW9uIExvZ2ljIChTYW1lIGFzIENhbGVuZGFyKSAtLS1cbiAgZ2VuZXJhdGVEYXlzKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZldlZWsoc3RhcnRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICBjb25zdCBlbmQgPSBlbmRPZldlZWsoZW5kT2ZNb250aCh0aGlzLnZpZXdEYXRlKSk7XG4gICAgdGhpcy5kYXlzSW5Nb250aCA9IGVhY2hEYXlPZkludGVydmFsKHsgc3RhcnQsIGVuZCB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlWWVhcnMoKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy55ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDE2IH0sIChfLCBpKSA9PiBjdXJyZW50WWVhciAtIDYgKyBpKTtcbiAgfVxuXG4gIHNldFZpZXcodmlldzogJ2RhdGUnIHwgJ21vbnRoJyB8ICd5ZWFyJykge1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSB2aWV3O1xuICAgIGlmICh2aWV3ID09PSAneWVhcicpIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICB9XG5cbiAgcHJldigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1YlllYXJzKHRoaXMudmlld0RhdGUsIDE2KTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1YlllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gUmFuZ2UgU2VsZWN0aW9uIExvZ2ljIC0tLVxuXG4gIHNlbGVjdERhdGUoZGF0ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpKSByZXR1cm47XG5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMudmFsdWU7XG5cbiAgICAvLyAxLiBJZiBzdGFydCBleGlzdHMgYnV0IGVuZCBkb2Vzbid0XG4gICAgaWYgKHN0YXJ0ICYmICFlbmQpIHtcbiAgICAgIGlmIChpc0JlZm9yZShkYXRlLCBzdGFydCkpIHtcbiAgICAgICAgLy8gVXNlciBjbGlja2VkIGVhcmxpZXIgZGF0ZSAtPiBSZXNldCBzdGFydFxuICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2VyIGNsaWNrZWQgbGF0ZXIgZGF0ZSAtPiBDb21wbGV0ZSByYW5nZVxuICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydCwgZW5kOiBkYXRlIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIDIuIElmIG5laXRoZXIgZXhpc3QgT1IgYm90aCBleGlzdCAocmVzZXQpXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgfVxuXG4gICAgaWYgKCFpc1NhbWVNb250aChkYXRlLCB0aGlzLnZpZXdEYXRlKSkge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGRhdGU7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5yYW5nZVNlbGVjdC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0TW9udGgodGhpcy52aWV3RGF0ZSwgbW9udGhJbmRleCk7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9ICdkYXRlJztcbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICB9XG5cbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0WWVhcih0aGlzLnZpZXdEYXRlLCB5ZWFyKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICAvLyAtLS0gVmlzdWFsIFN0eWxpbmcgZm9yIFJhbmdlIC0tLVxuXG4gIGdldERheUNsYXNzKGRhdGU6IERhdGUpIHtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QgaXNPdXRzaWRlID0gIWlzU2FtZU1vbnRoKGRhdGUsIHRoaXMudmlld0RhdGUpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgLy8gUmFuZ2UgQ2hlY2tzXG4gICAgY29uc3QgaXNTdGFydCA9IHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCk7XG4gICAgY29uc3QgaXNFbmQgPSBlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCk7XG4gICAgY29uc3QgaXNJbnNpZGUgPSBzdGFydCAmJiBlbmQgJiYgaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgY29uc3QgaXNUb2RheURhdGUgPSBpc1RvZGF5KGRhdGUpO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgLy8gQmFzZTogaC05IHctOSwgYnV0IHdlIHJlbW92ZSBtYXJnaW5zL3JvdW5kaW5nIGZvciB0aGUgJ3N0cmlwJyBlZmZlY3RcbiAgICAgICdoLTkgdy05IHAtMCBmb250LW5vcm1hbCB0ZXh0LXNtIHRyYW5zaXRpb24tYWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJlbGF0aXZlIHotMTAnLFxuXG4gICAgICAvLyBEZWZhdWx0IFN0YXRlIChOb3Qgc2VsZWN0ZWQsIE5vdCBkaXNhYmxlZClcbiAgICAgICFpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgIWlzRGlzYWJsZWQgJiYgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBUaGUgXCJDYXBzXCI6IFN0YXJ0IGFuZCBFbmRcbiAgICAgIChpc1N0YXJ0IHx8IGlzRW5kKSAmJiAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvY3VzOmJnLXByaW1hcnkgZm9jdXM6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuXG4gICAgICAvLyBUaGUgXCJTdHJpcFwiOiBEYXRlcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmRcbiAgICAgIGlzSW5zaWRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50IHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1ub25lJyxcblxuICAgICAgLy8gQ29ubmVjdGluZyB0aGUgQ2FwcyB0byB0aGUgU3RyaXAgKFJlY3Rhbmd1bGFyIGluc2lkZSBlZGdlcylcbiAgICAgIGlzU3RhcnQgJiYgZW5kICYmICdyb3VuZGVkLWwtbWQgcm91bmRlZC1yLW5vbmUnLFxuICAgICAgaXNFbmQgJiYgc3RhcnQgJiYgJ3JvdW5kZWQtci1tZCByb3VuZGVkLWwtbm9uZScsXG4gICAgICAvLyBJZiBubyBlbmQgZGF0ZSB5ZXQsIFN0YXJ0IHNob3VsZCBiZSBmdWxseSByb3VuZGVkXG4gICAgICBpc1N0YXJ0ICYmICFlbmQgJiYgJ3JvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBNdXRlZC9EaXNhYmxlZCBsb2dpY1xuICAgICAgIWlzSW5zaWRlICYmIGlzVG9kYXlEYXRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50LzUwIHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1tZCcsXG4gICAgICAoaXNPdXRzaWRlIHx8IGlzRGlzYWJsZWQpICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICBpc0Rpc2FibGVkICYmICdjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGFzdERhdGVzID8gaXNCZWZvcmUoZGF0ZSwgc3RhcnRPZkRheShuZXcgRGF0ZSgpKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLSBDVkEgSW1wbGVtZW50YXRpb24gLS0tXG4gIHdyaXRlVmFsdWUodmFsOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIGlmICh2YWwuc3RhcnQpIHRoaXMudmlld0RhdGUgPSB2YWwuc3RhcnQ7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iXX0=
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RCxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUMvQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUF1SGhDLE1BQU0sT0FBTyxzQkFBc0I7SUE2QmI7SUFBZ0M7SUE1QjNDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEM7a0VBQzhEO0lBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIscUVBQXFFO0lBQzVELGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyxtQ0FBbUM7SUFFMUYsV0FBVyxHQUE4QixNQUFNLENBQUM7SUFDaEQsUUFBUSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFNUIsa0JBQWtC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Ozs7Ozs7Ozs7O0dBdUdUO2lCQUNGOytHQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgYWRkRGF5cywgYWRkTW9udGhzLCBzdWJNb250aHMsIHN0YXJ0T2ZNb250aCwgZW5kT2ZNb250aCxcbiAgc3RhcnRPZldlZWssIGVuZE9mV2VlaywgZWFjaERheU9mSW50ZXJ2YWwsIGlzU2FtZU1vbnRoLFxuICBpc1NhbWVEYXksIGlzVG9kYXksIHNldE1vbnRoLCBzZXRZZWFyLCBhZGRZZWFycywgc3ViWWVhcnMsXG4gIGlzQmVmb3JlLCBzdGFydE9mRGF5LCBpc1dpdGhpbkludGVydmFsLCBmb3JtYXRcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7RGF0ZVJhbmdlfSBmcm9tICcuL3R5cGVzL2RhdGUtcmFuZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1yYW5nZS1jYWxlbmRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlQ2FsZW5kYXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY24oJ3RleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGlubGluZS1ibG9jayBtaW4tdy1maXQnLCBib3JkZXJlZCA/ICdwLTMgYm9yZGVyIHJvdW5kZWQtbWQgYmctYmFja2dyb3VuZCBzaGFkb3ctc20nIDogJycsIGNsYXNzKVwiPlxuXG4gICAgICA8IS0tID09PT09IE11bHRpLW1vbnRoIHZpZXcgKHNpZGUtYnktc2lkZSwgc2hhcmVkIHJhbmdlKSA9PT09PSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJudW1iZXJPZk1vbnRocyA+IDFcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgc206ZmxleC1yb3dcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbSBvZiB2aXNpYmxlTW9udGhzOyBsZXQgaWR4ID0gaW5kZXhcIiBjbGFzcz1cInNwYWNlLXktMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtMSBwYi0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaWR4ID09PSAwXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlkeCAhPT0gMFwiIGNsYXNzPVwiaC03IHctN1wiPjwvc3Bhbj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gZm9udC1zZW1pYm9sZFwiPnt7IG0ubGFiZWwgfX08L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlkeCA9PT0gdmlzaWJsZU1vbnRocy5sZW5ndGggLSAxXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJuZXh0KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiTmV4dCBtb250aFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlkeCAhPT0gdmlzaWJsZU1vbnRocy5sZW5ndGggLSAxXCIgY2xhc3M9XCJoLTcgdy03XCI+PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMVwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiIGNsYXNzPVwidGV4dC1bMC44cmVtXSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9udC1ub3JtYWwgdGV4dC1jZW50ZXIgdy05XCI+e3sgZGF5IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcm9sZT1cImdyaWRcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMVwiIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBtLmRheXNcIj5cbiAgICAgICAgICAgICAgPCEtLSBPbmx5IHRoZSBtb250aCdzIG93biBkYXlzIGFyZSByZW5kZXJlZDsgYWRqYWNlbnQtbW9udGggZGF5cyBhcmVcbiAgICAgICAgICAgICAgICAgICBibGFuayBzcGFjZXJzIHNvIGVhY2ggY2FsZW5kYXIgaW4gYSBtdWx0aS1tb250aCB2aWV3IGlzIHNlbGYtY29udGFpbmVkLiAtLT5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNDdXJyZW50TW9udGgoZGF0ZSwgbS5kYXRlKTsgZWxzZSBwYWRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXRlXT1cImZtdEtleShkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihkYXRlIHwgZGF0ZTonZnVsbERhdGUnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldERheUNsYXNzKGRhdGUsIG0uZGF0ZSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgZGF0ZSB8IGRhdGU6ICdkJyB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwYWQ+PHNwYW4gY2xhc3M9XCJoLTkgdy05XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSA9PT09PSBTaW5nbGUtbW9udGggdmlldyAod2l0aCBtb250aCAvIHllYXIgcXVpY2sgcGlja2VycykgPT09PT0gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtYmVyT2ZNb250aHMgPD0gMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItNCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ21vbnRoJylcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsIGN1cnJlbnRWaWV3ID09PSAnbW9udGgnID8gJ2JnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kJyA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgICAgICAgIHt7IHZpZXdEYXRlIHwgZGF0ZTogJ01NTU0nIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCd5ZWFyJylcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsIGN1cnJlbnRWaWV3ID09PSAneWVhcicgPyAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQnIDogJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJylcIj5cbiAgICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAneXl5eScgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcmV2KClcIiBbY2xhc3NdPVwibmF2QnRuQ2xhc3NcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIj48aSBjbGFzcz1cInJpLWFycm93LWxlZnQtcy1saW5lIHRleHQtbGdcIj48L2k+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj48aSBjbGFzcz1cInJpLWFycm93LXJpZ2h0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdkYXRlJ1wiIGNsYXNzPVwic3BhY2UteS0yIGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTEgdy1mdWxsXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCIgY2xhc3M9XCJ0ZXh0LVswLjhyZW1dIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb250LW5vcm1hbCB0ZXh0LWNlbnRlciB3LTlcIj5cbiAgICAgICAgICAgICAge3sgZGF5IH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiByb2xlPVwiZ3JpZFwiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0ZSBvZiBkYXlzSW5Nb250aFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRhdGVdPVwiZm10S2V5KGRhdGUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZGF0ZSB8IGRhdGU6J2Z1bGxEYXRlJylcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXRlKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnZXREYXlDbGFzcyhkYXRlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICdtb250aCdcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgdy02NCBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdE1vbnRoKGkpXCJcbiAgICAgICAgICAgIFtjbGFzc109XCJjbigndGV4dC1zbSBweS0yLjUgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsIGkgPT09IHZpZXdEYXRlLmdldE1vbnRoKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ3llYXInXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMiByb3VuZGVkLW1kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJywgeWVhciA9PT0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKSA/ICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyA6ICcnKVwiPlxuICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIFJhbmdlQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdERhdGVzID0gZmFsc2U7XG4gIC8qKiBSZW5kZXJzIHRoZSBjYWxlbmRhcidzIG93biBib3JkZXIvYmFja2dyb3VuZC9zaGFkb3cuIFNldCBgZmFsc2VgIGluc2lkZSBhXG4gICAqIGNhcmQvcG9wb3ZlciB0aGF0IGFscmVhZHkgcHJvdmlkZXMgY2hyb21lLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGJvcmRlcmVkID0gdHJ1ZTtcbiAgLyoqIE51bWJlciBvZiBjb25zZWN1dGl2ZSBtb250aHMgcmVuZGVyZWQgc2lkZSBieSBzaWRlLiBAZGVmYXVsdCAxICovXG4gIEBJbnB1dCgpIG51bWJlck9mTW9udGhzID0gMTtcbiAgQE91dHB1dCgpIHJhbmdlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U+KCk7IC8vIEVtaXRzIHdoZW5ldmVyIHNlbGVjdGlvbiBjaGFuZ2VzXG5cbiAgY3VycmVudFZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicgPSAnZGF0ZSc7XG4gIHZpZXdEYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcblxuICAvLyBUaGUgUmFuZ2UgVmFsdWVcbiAgdmFsdWU6IERhdGVSYW5nZSA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuXG4gIHdlZWtEYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xuICBkYXlzSW5Nb250aDogRGF0ZVtdID0gW107XG4gIC8qKiBHcmlkcyBmb3IgZWFjaCB2aXNpYmxlIG1vbnRoIChtdWx0aS1tb250aCB2aWV3KS4gKi9cbiAgdmlzaWJsZU1vbnRoczogeyBkYXRlOiBEYXRlOyBkYXlzOiBEYXRlW107IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XG4gIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcbiAgeWVhcnM6IG51bWJlcltdID0gW107XG5cbiAgbmF2QnRuQ2xhc3MgPSBjbignaC03IHctNyBiZy10cmFuc3BhcmVudCBwLTAgb3BhY2l0eS01MCBob3ZlcjpvcGFjaXR5LTEwMCBib3JkZXIgYm9yZGVyLWlucHV0IHJvdW5kZWQtbWQgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1hbGwgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcnKTtcblxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZVJhbmdlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAvLyBSZWJ1aWxkIHRoZSBtb250aCBncmlkcyB3aGVuIHRoZSB2aXNpYmxlLW1vbnRoIGNvdW50IGNoYW5nZXMgYWZ0ZXIgaW5pdFxuICAgIC8vIChlLmcuIGEgYFtudW1iZXJPZk1vbnRoc11gIHRvZ2dsZSksIHNvIHNpbmdsZSDih4QgbXVsdGktbW9udGggaXMgcmVhY3RpdmUuXG4gICAgaWYgKGNoYW5nZXNbJ251bWJlck9mTW9udGhzJ10gJiYgIWNoYW5nZXNbJ251bWJlck9mTW9udGhzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIERhdGUgR2VuZXJhdGlvbiBMb2dpYyAoU2FtZSBhcyBDYWxlbmRhcikgLS0tXG4gIGdlbmVyYXRlRGF5cygpIHtcbiAgICBjb25zdCBzdGFydCA9IHN0YXJ0T2ZXZWVrKHN0YXJ0T2ZNb250aCh0aGlzLnZpZXdEYXRlKSk7XG4gICAgY29uc3QgZW5kID0gZW5kT2ZXZWVrKGVuZE9mTW9udGgodGhpcy52aWV3RGF0ZSkpO1xuICAgIHRoaXMuZGF5c0luTW9udGggPSBlYWNoRGF5T2ZJbnRlcnZhbCh7IHN0YXJ0LCBlbmQgfSk7XG5cbiAgICAvLyBNdWx0aS1tb250aCBncmlkczogdmlld0RhdGUgaXMgdGhlIGxlZnRtb3N0IG1vbnRoLCB0aGVuIE4tMSBjb25zZWN1dGl2ZS5cbiAgICBjb25zdCBjb3VudCA9IE1hdGgubWF4KDEsIHRoaXMubnVtYmVyT2ZNb250aHMpO1xuICAgIHRoaXMudmlzaWJsZU1vbnRocyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBtb250aERhdGUgPSBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgaSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICAgIGRheXM6IGVhY2hEYXlPZkludGVydmFsKHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKHN0YXJ0T2ZNb250aChtb250aERhdGUpKSwgZW5kOiBlbmRPZldlZWsoZW5kT2ZNb250aChtb250aERhdGUpKSB9KSxcbiAgICAgICAgbGFiZWw6IGZvcm1hdChtb250aERhdGUsICdNTU1NIHl5eXknKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZVllYXJzKCkge1xuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHRoaXMueWVhcnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNiB9LCAoXywgaSkgPT4gY3VycmVudFllYXIgLSA2ICsgaSk7XG4gIH1cblxuICBzZXRWaWV3KHZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicpIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdmlldztcbiAgICBpZiAodmlldyA9PT0gJ3llYXInKSB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1Yk1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9XG4gIH1cblxuICBuZXh0KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIFJhbmdlIFNlbGVjdGlvbiBMb2dpYyAtLS1cblxuICBzZWxlY3REYXRlKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLnZhbHVlO1xuXG4gICAgLy8gMS4gSWYgc3RhcnQgZXhpc3RzIGJ1dCBlbmQgZG9lc24ndFxuICAgIGlmIChzdGFydCAmJiAhZW5kKSB7XG4gICAgICBpZiAoaXNCZWZvcmUoZGF0ZSwgc3RhcnQpKSB7XG4gICAgICAgIC8vIFVzZXIgY2xpY2tlZCBlYXJsaWVyIGRhdGUgLT4gUmVzZXQgc3RhcnRcbiAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciBjbGlja2VkIGxhdGVyIGRhdGUgLT4gQ29tcGxldGUgcmFuZ2VcbiAgICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQsIGVuZDogZGF0ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyAyLiBJZiBuZWl0aGVyIGV4aXN0IE9SIGJvdGggZXhpc3QgKHJlc2V0KVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHsgc3RhcnQ6IGRhdGUsIGVuZDogbnVsbCB9O1xuICAgIH1cblxuICAgIC8vIE9ubHkgcmUtYW5jaG9yIHRoZSB2aWV3IHdoZW4gdGhlIGNsaWNrZWQgZGF5IGlzbid0IGFscmVhZHkgb24gYSB2aXNpYmxlIG1vbnRoXG4gICAgLy8gKHNvIGNsaWNraW5nIHRoZSByaWdodC1oYW5kIG1vbnRoIGluIGEgMi1tb250aCB2aWV3IGRvZXNuJ3QganVtcCB0aGUgY2FsZW5kYXIpLlxuICAgIGNvbnN0IG9uVmlzaWJsZU1vbnRoID0gdGhpcy52aXNpYmxlTW9udGhzLnNvbWUoKG0pID0+IGlzU2FtZU1vbnRoKGRhdGUsIG0uZGF0ZSkpO1xuICAgIGlmICghb25WaXNpYmxlTW9udGgpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdGFydE9mTW9udGgoZGF0ZSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5yYW5nZVNlbGVjdC5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICAvLyAtLS0gR3JpZCBrZXlib2FyZCBuYXZpZ2F0aW9uIChkYXRlIHZpZXcgb25seSkgLS0tXG5cbiAgLyoqXG4gICAqIEFycm93IGtleXMgbW92ZSBieSBkYXkvd2VlaywgSG9tZS9FbmQgdG8gd2VlayBlZGdlcywgUGFnZVVwL1BhZ2VEb3duIGJ5XG4gICAqIG1vbnRoLiBFbnRlci9TcGFjZSBhcmUgbGVmdCB0byB0aGUgbmF0aXZlIGRheSA8YnV0dG9uPi4gVGhlIGZvY3VzZWQgZGF5IGlzXG4gICAqIHJlYWQgZnJvbSBpdHMgYGRhdGEtZGF0ZWAga2V5LCBzbyBuYXZpZ2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGdyaWQgbGF5b3V0XG4gICAqIChhZGphY2VudC1tb250aCBkYXlzIGFyZW4ndCByZW5kZXJlZCBpbiB0aGUgbXVsdGktbW9udGggdmlldykuXG4gICAqL1xuICBvbkdyaWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMubnVtYmVyT2ZNb250aHMgPD0gMSAmJiB0aGlzLmN1cnJlbnRWaWV3ICE9PSAnZGF0ZScpIHJldHVybjtcblxuICAgIGNvbnN0IGtleSA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XG4gICAgaWYgKCFrZXkpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5rZXlUb0RhdGUoa2V5KTtcblxuICAgIGxldCBuZXh0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIC0xKTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIC03KTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCA3KTsgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzogbmV4dCA9IHN0YXJ0T2ZXZWVrKGN1cnJlbnQpOyBicmVhaztcbiAgICAgIGNhc2UgJ0VuZCc6IG5leHQgPSBlbmRPZldlZWsoY3VycmVudCk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZVVwJzogbmV4dCA9IHN1Yk1vbnRocyhjdXJyZW50LCAxKTsgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlRG93bic6IG5leHQgPSBhZGRNb250aHMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgZGVmYXVsdDogcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5mb2N1c0RheShuZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEYXkoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gYFtkYXRhLWRhdGU9XCIke3RoaXMuZm10S2V5KGRhdGUpfVwiXWA7XG4gICAgbGV0IGJ0biA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKGJ0bikgeyBidG4uZm9jdXMoKTsgcmV0dXJuOyB9XG5cbiAgICAvLyBUYXJnZXQgZGF5IGlzbid0IGN1cnJlbnRseSByZW5kZXJlZCDihpIgcGFnZSB0aGUgdmlldyB0b3dhcmQgaXQsIHRoZW4gcmV0cnkuXG4gICAgaWYgKHRoaXMubnVtYmVyT2ZNb250aHMgPiAxKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gaXNCZWZvcmUoZGF0ZSwgdGhpcy52aXNpYmxlTW9udGhzWzBdLmRhdGUpXG4gICAgICAgID8gc3ViTW9udGhzKHRoaXMudmlld0RhdGUsIDEpXG4gICAgICAgIDogYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3RhcnRPZk1vbnRoKGRhdGUpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBidG4gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGJ0bj8uZm9jdXMoKTtcbiAgfVxuXG4gIHNlbGVjdE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudmlld0RhdGUgPSBzZXRNb250aCh0aGlzLnZpZXdEYXRlLCBtb250aEluZGV4KTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xuICAgIHRoaXMudmlld0RhdGUgPSBzZXRZZWFyKHRoaXMudmlld0RhdGUsIHllYXIpO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgfVxuXG4gIC8vIC0tLSBWaXN1YWwgU3R5bGluZyBmb3IgUmFuZ2UgLS0tXG5cbiAgaXNTZWxlY3RlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLnZhbHVlO1xuICAgIHJldHVybiAhISgoc3RhcnQgJiYgaXNTYW1lRGF5KGRhdGUsIHN0YXJ0KSkgfHwgKGVuZCAmJiBpc1NhbWVEYXkoZGF0ZSwgZW5kKSkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgZGF0ZWAgYmVsb25ncyB0byBgcmVmTW9udGhgICh1c2VkIHRvIGJsYW5rIG91dCBhZGphY2VudC1tb250aCBjZWxscykuICovXG4gIGlzQ3VycmVudE1vbnRoKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2FtZU1vbnRoKGRhdGUsIHJlZk1vbnRoKTtcbiAgfVxuXG4gIC8qKiBTdGFibGUsIHRpbWV6b25lLXNhZmUgYGRhdGEtZGF0ZWAga2V5IHVzZWQgdG8gbG9jYXRlIGRheSBidXR0b25zIGZvciBmb2N1cy4gKi9cbiAgZm10S2V5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgJ3l5eXktTU0tZGQnKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9EYXRlKGtleTogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgW3ksIG0sIGRdID0ga2V5LnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcbiAgfVxuXG4gIGdldERheUNsYXNzKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlID0gdGhpcy52aWV3RGF0ZSkge1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgcmVmTW9udGgpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgLy8gUmFuZ2UgQ2hlY2tzXG4gICAgY29uc3QgaXNTdGFydCA9IHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCk7XG4gICAgY29uc3QgaXNFbmQgPSBlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCk7XG4gICAgY29uc3QgaXNJbnNpZGUgPSBzdGFydCAmJiBlbmQgJiYgaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgY29uc3QgaXNUb2RheURhdGUgPSBpc1RvZGF5KGRhdGUpO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgLy8gQmFzZTogaC05IHctOSwgYnV0IHdlIHJlbW92ZSBtYXJnaW5zL3JvdW5kaW5nIGZvciB0aGUgJ3N0cmlwJyBlZmZlY3RcbiAgICAgICdoLTkgdy05IHAtMCBmb250LW5vcm1hbCB0ZXh0LXNtIHRyYW5zaXRpb24tYWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJlbGF0aXZlIHotMTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcnLFxuXG4gICAgICAvLyBEZWZhdWx0IFN0YXRlIChOb3Qgc2VsZWN0ZWQsIE5vdCBkaXNhYmxlZClcbiAgICAgICFpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgIWlzRGlzYWJsZWQgJiYgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBUaGUgXCJDYXBzXCI6IFN0YXJ0IGFuZCBFbmRcbiAgICAgIChpc1N0YXJ0IHx8IGlzRW5kKSAmJiAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvY3VzOmJnLXByaW1hcnkgZm9jdXM6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuXG4gICAgICAvLyBUaGUgXCJTdHJpcFwiOiBEYXRlcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmRcbiAgICAgIGlzSW5zaWRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50IHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1ub25lJyxcblxuICAgICAgLy8gQ29ubmVjdGluZyB0aGUgQ2FwcyB0byB0aGUgU3RyaXAgKFJlY3Rhbmd1bGFyIGluc2lkZSBlZGdlcylcbiAgICAgIGlzU3RhcnQgJiYgZW5kICYmICdyb3VuZGVkLWwtbWQgcm91bmRlZC1yLW5vbmUnLFxuICAgICAgaXNFbmQgJiYgc3RhcnQgJiYgJ3JvdW5kZWQtci1tZCByb3VuZGVkLWwtbm9uZScsXG4gICAgICAvLyBJZiBubyBlbmQgZGF0ZSB5ZXQsIFN0YXJ0IHNob3VsZCBiZSBmdWxseSByb3VuZGVkXG4gICAgICBpc1N0YXJ0ICYmICFlbmQgJiYgJ3JvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBNdXRlZC9EaXNhYmxlZCBsb2dpY1xuICAgICAgIWlzSW5zaWRlICYmIGlzVG9kYXlEYXRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50LzUwIHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1tZCcsXG4gICAgICAoaXNPdXRzaWRlIHx8IGlzRGlzYWJsZWQpICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICBpc0Rpc2FibGVkICYmICdjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGFzdERhdGVzID8gaXNCZWZvcmUoZGF0ZSwgc3RhcnRPZkRheShuZXcgRGF0ZSgpKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLSBDVkEgSW1wbGVtZW50YXRpb24gLS0tXG4gIHdyaXRlVmFsdWUodmFsOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIGlmICh2YWwuc3RhcnQpIHRoaXMudmlld0RhdGUgPSB2YWwuc3RhcnQ7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iXX0=