@rivet-health/design-system 40.7.1 → 40.9.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.
@@ -190,18 +190,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
190
190
  'large',
191
191
  'xlarge',
192
192
  ];
193
- // Accepts MM/DD/YYYY, M/D/YY, and YYYY-MM-DD with /, -, or . separators.
194
- // A 4-digit leading segment is treated as year.
193
+ // Accepts MM/DD/YYYY, M/D/YY, and YYYY-MM-DD with /, -, or . separators, as
194
+ // well as separator-less digit runs (MMDDYYYY or MMDDYY). A 4-digit leading
195
+ // segment in the separated form is treated as an ISO year; 2-digit years
196
+ // pivot at 50 (<50 → 2000s, >=50 → 1900s).
195
197
  function parseDate(input) {
196
- const parts = input.trim().split(/[/.-]/);
197
- if (parts.length !== 3)
198
+ const trimmed = input.trim();
199
+ if (!trimmed)
198
200
  return undefined;
199
- const nums = parts.map(p => parseInt(p, 10));
200
- if (nums.some(isNaN))
201
+ const ymd = /^\d+$/.test(trimmed)
202
+ ? parseDigits(trimmed)
203
+ : parseSeparated(trimmed);
204
+ if (!ymd)
201
205
  return undefined;
202
- let [year, month, day] = parts[0].length === 4 ? nums : [nums[2], nums[0], nums[1]];
203
- if (parts[0].length !== 4 && year < 100)
204
- year += year < 50 ? 2000 : 1900;
206
+ const [year, month, day] = ymd;
205
207
  const date = new Date(year, month - 1, day);
206
208
  return date.getFullYear() === year &&
207
209
  date.getMonth() === month - 1 &&
@@ -210,10 +212,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
210
212
  : undefined;
211
213
  }
212
214
  DateComponent.parseDate = parseDate;
215
+ function expandTwoDigitYear(year) {
216
+ return year < 100 ? year + (year < 50 ? 2000 : 1900) : year;
217
+ }
218
+ // A run of digits with no separators: 8 → MMDDYYYY (literal year), 6 → MMDDYY
219
+ // (2-digit year pivoted at 50).
220
+ function parseDigits(digits) {
221
+ if (digits.length !== 8 && digits.length !== 6)
222
+ return undefined;
223
+ const year = parseInt(digits.slice(4), 10);
224
+ return [
225
+ digits.length === 6 ? expandTwoDigitYear(year) : year,
226
+ parseInt(digits.slice(0, 2), 10),
227
+ parseInt(digits.slice(2, 4), 10),
228
+ ];
229
+ }
230
+ function parseSeparated(input) {
231
+ const parts = input.split(/[/.-]/);
232
+ if (parts.length !== 3)
233
+ return undefined;
234
+ const nums = parts.map(p => parseInt(p, 10));
235
+ if (nums.some(isNaN))
236
+ return undefined;
237
+ const [year, month, day] = parts[0].length === 4 ? nums : [nums[2], nums[0], nums[1]];
238
+ return [
239
+ parts[0].length === 4 ? year : expandTwoDigitYear(year),
240
+ month,
241
+ day,
242
+ ];
243
+ }
213
244
  function isValidDate(date, min, max) {
214
245
  const time = date.getTime();
215
246
  return time >= min.getTime() && time <= max.getTime();
216
247
  }
217
248
  DateComponent.isValidDate = isValidDate;
218
249
  })(DateComponent || (DateComponent = {}));
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9kYXRlL2RhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvZGF0ZS9kYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7OztBQVEzRSxNQUFNLE9BQU8sYUFBYyxTQUFRLG1CQUFtQjtJQU9wRCxJQUNJLEtBQUssQ0FBQyxDQUFtQjtRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRTtZQUFFLE9BQU87UUFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFD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SUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSTtZQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxHQUFHLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEdBQUc7WUFDdEIsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFqQmUsdUJBQVMsWUFpQnhCLENBQUE7SUFFRCxTQUFnQixXQUFXLENBQUMsSUFBVSxFQUFFLEdBQVMsRUFBRSxHQUFTO1FBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBSGUseUJBQVcsY0FHMUIsQ0FBQTtBQUNILENBQUMsRUFuQ2dCLGFBQWEsS0FBYixhQUFhLFFBbUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0aW1lRGF5LCB0aW1lTW9udGggfSBmcm9tICdkMy10aW1lJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF0ZS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0TGFiZWxDb21wb25lbnQgfSBmcm9tICcuLi9pbnB1dC1sYWJlbC9pbnB1dC1sYWJlbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtZGF0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZS5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRMYWJlbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIG1pbjogRGF0ZSA9IENhbGVuZGFyQ29tcG9uZW50LmRlZmF1bHRNaW47XG5cbiAgQElucHV0KClcbiAgbWF4OiBEYXRlID0gQ2FsZW5kYXJDb21wb25lbnQuZGVmYXVsdE1heDtcblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodjogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl92YWx1ZT8uZ2V0VGltZSgpID09PSB2Py5nZXRUaW1lKCkpIHJldHVybjtcbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgLy8gU2tpcCB0ZXh0IHN5bmMgd2hpbGUgdHlwaW5nIHNvIHdlIGRvbid0IHN0b21wIHRoZSB1c2VyJ3MgaW4tcHJvZ3Jlc3MgaW5wdXQuXG4gICAgaWYgKCF0aGlzLmhhc0ZvY3VzKSB0aGlzLmlucHV0VGV4dCA9IHYgPyB0aGlzLmZvcm1hdFZhbHVlKHYpIDogJyc7XG4gICAgaWYgKHYpIHRoaXMuc2V0QWN0aXZlTW9udGgodik7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBwcml2YXRlIF92YWx1ZT86IERhdGU7XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWxlY3QgZGF0ZSc7XG5cbiAgQElucHV0KClcbiAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzaXplOiBEYXRlQ29tcG9uZW50LlNpemUgPSAnbWVkaXVtJztcblxuICBASW5wdXQoKVxuICBzaG93Q2xlYXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dUb2RheUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJylcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICBhY3RpdmVZZWFyTW9udGggPSB0aW1lTW9udGguZmxvb3IobmV3IERhdGUoKSk7XG5cbiAgcmVhZG9ubHkgb3BlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgQElucHV0KClcbiAgc2V0IG9wZW4odjogYm9vbGVhbikge1xuICAgIHRoaXMub3BlbiQubmV4dCh2KTtcbiAgfVxuICBnZXQgb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlIHwgdW5kZWZpbmVkPigpO1xuXG4gIGlucHV0VGV4dDogc3RyaW5nID0gJyc7XG4gIHByZXZpZXdWYWx1ZT86IERhdGU7XG4gIHByaXZhdGUgaGFzRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLy8gVGhlIGNhbGxvdXQgcmVuZGVycyB3aXRoIGlzTW9kYWw9ZmFsc2UgKG5vIGZ1bGwtdmlld3BvcnQgc2NyaW0pIGFuZCBjYW4ndFxuICAvLyBzZWxmLWNsb3NlIG9uIG91dHNpZGUgY2xpY2tzLiBBbnkgb3ZlcmxheSBsYXllciDigJQgaW5jbHVkaW5nIHNpYmxpbmdcbiAgLy8gb3ZlcmxheXMgbGlrZSB0aGUgbW9udGgveWVhciBzZWxlY3RzIOKAlCBjb3VudHMgYXMgXCJpbnNpZGVcIiB0aGUgcGlja2VyLlxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudC50YXJnZXQnXSlcbiAgb25Eb2N1bWVudE1vdXNlRG93bih0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vcGVuJC5nZXRWYWx1ZSgpIHx8ICEodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuO1xuICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnLmNhbGxvdXQsIC5zY3JpbSwgLm92ZXJsYXktY29udGFpbmVyJykpIHJldHVybjtcbiAgICB0aGlzLm9wZW4kLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xlYXJWYWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1pdCh1bmRlZmluZWQpO1xuICAgIHRoaXMub3BlbiQubmV4dChmYWxzZSk7XG4gIH1cblxuICBzZWxlY3RUb2RheSgpOiB2b2lkIHtcbiAgICBjb25zdCB0b2RheSA9IHRpbWVEYXkuZmxvb3IobmV3IERhdGUoKSk7XG4gICAgaWYgKCFEYXRlQ29tcG9uZW50LmlzVmFsaWREYXRlKHRvZGF5LCB0aGlzLm1pbiwgdGhpcy5tYXgpKSByZXR1cm47XG4gICAgdGhpcy5jb21taXQodG9kYXkpO1xuICAgIHRoaXMub3BlbiQubmV4dChmYWxzZSk7XG4gIH1cblxuICBnZXQgaXNUb2RheVNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIERhdGVDb21wb25lbnQuaXNWYWxpZERhdGUoXG4gICAgICB0aW1lRGF5LmZsb29yKG5ldyBEYXRlKCkpLFxuICAgICAgdGhpcy5taW4sXG4gICAgICB0aGlzLm1heCxcbiAgICApO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFRleHQgPSB2YWx1ZTtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlSW5wdXQodmFsdWUpO1xuICAgIHRoaXMucHJldmlld1ZhbHVlID0gcGFyc2VkO1xuICAgIGlmIChwYXJzZWQpIHRoaXMuc2V0QWN0aXZlTW9udGgocGFyc2VkKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uSW5wdXRCbHVyKGV2ZW50PzogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRm9jdXMgPSBmYWxzZTtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlSW5wdXQodGhpcy5pbnB1dFRleHQpO1xuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHRoaXMuY29tbWl0KHBhcnNlZCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5pbnB1dFRleHQudHJpbSgpKSB7XG4gICAgICB0aGlzLmNvbW1pdCh1bmRlZmluZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbnZhbGlkIHRleHQg4oCUIHJldmVydCB0byB3aGF0ZXZlciB0aGUgY29tbWl0dGVkIHZhbHVlIHdhcy5cbiAgICAgIHRoaXMuaW5wdXRUZXh0ID0gdGhpcy5fdmFsdWUgPyB0aGlzLmZvcm1hdFZhbHVlKHRoaXMuX3ZhbHVlKSA6ICcnO1xuICAgIH1cbiAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAvLyBDbG9zZSBvbiBrZXlib2FyZC1kcml2ZW4gZm9jdXMgY2hhbmdlcyAoVGFiIG91dCkuIFN0YXkgb3BlbiBpZiBmb2N1c1xuICAgIC8vIG1vdmVkIGludG8gYSBuZXN0ZWQgb3ZlcmxheSAoZS5nLiB0aGUgY2FsZW5kYXIncyBtb250aC95ZWFyIHNlbGVjdCkuXG4gICAgLy8gTW91c2UgY2xpY2tzIGluc2lkZSB0aGUgY2FsZW5kYXIgcHJldmVudERlZmF1bHQgbW91c2Vkb3duIHNvIHRoaXNcbiAgICAvLyBoYW5kbGVyIG5ldmVyIHJ1bnMgZm9yIHRoZW0uXG4gICAgY29uc3QgbmV4dFRhcmdldCA9IGV2ZW50Py5yZWxhdGVkVGFyZ2V0O1xuICAgIGNvbnN0IHN0YXlPcGVuID1cbiAgICAgIG5leHRUYXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMobmV4dFRhcmdldCkgfHxcbiAgICAgICAgISFuZXh0VGFyZ2V0LmNsb3Nlc3QoJy5jYWxsb3V0LCAuc2NyaW0sIC5vdmVybGF5LWNvbnRhaW5lcicpKTtcbiAgICBpZiAoIXN0YXlPcGVuKSB0aGlzLm9wZW4kLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25EYXRlU2VsZWN0KGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1pdCh0aW1lRGF5LmZsb29yKGRhdGUpKTtcbiAgICB0aGlzLm9wZW4kLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRm9jdXMgPSB0cnVlO1xuICAgIHRoaXMub3BlbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHRvZ2dsZUNhbGVuZGFyKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiQubmV4dCghdGhpcy5vcGVuJC5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VmFsdWUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUlucHV0KHRleHQ6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlZCA9IERhdGVDb21wb25lbnQucGFyc2VEYXRlKHRleHQpO1xuICAgIHJldHVybiBwYXJzZWQgJiYgRGF0ZUNvbXBvbmVudC5pc1ZhbGlkRGF0ZShwYXJzZWQsIHRoaXMubWluLCB0aGlzLm1heClcbiAgICAgID8gdGltZURheS5mbG9vcihwYXJzZWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlTW9udGgoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IG1vbnRoID0gdGltZU1vbnRoLmZsb29yKGRhdGUpO1xuICAgIGlmIChtb250aC5nZXRUaW1lKCkgIT09IHRoaXMuYWN0aXZlWWVhck1vbnRoLmdldFRpbWUoKSkge1xuICAgICAgdGhpcy5hY3RpdmVZZWFyTW9udGggPSBtb250aDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdChuZXh0OiBEYXRlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgdW5jaGFuZ2VkID0gbmV4dD8uZ2V0VGltZSgpID09PSB0aGlzLl92YWx1ZT8uZ2V0VGltZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gbmV4dDtcbiAgICB0aGlzLmlucHV0VGV4dCA9IG5leHQgPyB0aGlzLmZvcm1hdFZhbHVlKG5leHQpIDogJyc7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgaWYgKG5leHQpIHRoaXMuc2V0QWN0aXZlTW9udGgobmV4dCk7XG4gICAgaWYgKCF1bmNoYW5nZWQpIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChuZXh0KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIERhdGVDb21wb25lbnQge1xuICBleHBvcnQgY29uc3QgU2l6ZXMgPSBbXG4gICAgJ3hzbWFsbCcsXG4gICAgJ3NtYWxsJyxcbiAgICAnbWVkaXVtJyxcbiAgICAnbGFyZ2UnLFxuICAgICd4bGFyZ2UnLFxuICBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBTaXplID0gKHR5cGVvZiBTaXplcylbbnVtYmVyXTtcblxuICAvLyBBY2NlcHRzIE1NL0REL1lZWVksIE0vRC9ZWSwgYW5kIFlZWVktTU0tREQgd2l0aCAvLCAtLCBvciAuIHNlcGFyYXRvcnMuXG4gIC8vIEEgNC1kaWdpdCBsZWFkaW5nIHNlZ21lbnQgaXMgdHJlYXRlZCBhcyB5ZWFyLlxuICBleHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGlucHV0OiBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJ0cyA9IGlucHV0LnRyaW0oKS5zcGxpdCgvWy8uLV0vKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbnVtcyA9IHBhcnRzLm1hcChwID0+IHBhcnNlSW50KHAsIDEwKSk7XG4gICAgaWYgKG51bXMuc29tZShpc05hTikpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgW3llYXIsIG1vbnRoLCBkYXldID1cbiAgICAgIHBhcnRzWzBdLmxlbmd0aCA9PT0gNCA/IG51bXMgOiBbbnVtc1syXSwgbnVtc1swXSwgbnVtc1sxXV07XG4gICAgaWYgKHBhcnRzWzBdLmxlbmd0aCAhPT0gNCAmJiB5ZWFyIDwgMTAwKSB5ZWFyICs9IHllYXIgPCA1MCA/IDIwMDAgOiAxOTAwO1xuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoIC0gMSAmJlxuICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGRheVxuICAgICAgPyBkYXRlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBEYXRlLCBtaW46IERhdGUsIG1heDogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRpbWUgPSBkYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gdGltZSA+PSBtaW4uZ2V0VGltZSgpICYmIHRpbWUgPD0gbWF4LmdldFRpbWUoKTtcbiAgfVxufVxuIiwiPHJpdi1pbnB1dC1sYWJlbFxuICBbbGFiZWxdPVwibGFiZWxcIlxuICBbaGVscF09XCJoZWxwXCJcbiAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgW3N0YXRlXT1cInN0YXRlXCJcbiAgW2Vycm9yTWVzc2FnZV09XCJlcnJvck1lc3NhZ2VcIlxuICBbbGFiZWxBY3Rpb25UZXh0XT1cImxhYmVsQWN0aW9uVGV4dFwiXG4gIChsYWJlbEFjdGlvbik9XCJsYWJlbEFjdGlvbi5lbWl0KCRldmVudClcIlxuPlxuICA8ZGl2XG4gICAgI3RyaWdnZXJcbiAgICBjbGFzcz1cInRyaWdnZXJcIlxuICAgIFtjbGFzcy54c21hbGxdPVwic2l6ZSA9PT0gJ3hzbWFsbCdcIlxuICAgIFtjbGFzcy5zbWFsbF09XCJzaXplID09PSAnc21hbGwnXCJcbiAgICBbY2xhc3MubGFyZ2VdPVwic2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgW2NsYXNzLnhsYXJnZV09XCJzaXplID09PSAneGxhcmdlJ1wiXG4gICAgW2NsYXNzLndhcm5pbmddPVwic3RhdGUgPT09ICd3YXJuaW5nJ1wiXG4gICAgW2NsYXNzLmVycm9yXT1cInN0YXRlID09PSAnZXJyb3InXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRcbiAgICAgIGNsYXNzPVwidmFsdWVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dFRleHRcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW4kIHwgYXN5bmNcIlxuICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCJcbiAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKGlucHV0LnZhbHVlKVwiXG4gICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJpbnB1dC5ibHVyKCk7IG9wZW4kLm5leHQoZmFsc2UpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAvPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiY2hldnJvblwiXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihvcGVuJCB8IGFzeW5jKSA/ICdDbG9zZSBjYWxlbmRhcicgOiAnT3BlbiBjYWxlbmRhcidcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICA+XG4gICAgICA8cml2LWljb24gW25hbWVdPVwiJ0NhbGVuZGFyJ1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3Jpdi1pbnB1dC1sYWJlbD5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVuJCB8IGFzeW5jXCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwidHJpZ2dlclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtzaG93Q2FyZXRdPVwiZmFsc2VcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAndG9wLWxlZnQnLFxuICAgICAgJ3RvcC1yaWdodCcsXG4gICAgICAnYm90dG9tLXJpZ2h0JyxcbiAgICAgICdib3R0b20tbGVmdCdcbiAgICBdXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgIChjbG9zZSk9XCJvcGVuJC5uZXh0KGZhbHNlKVwiXG4gID5cbiAgICA8ZGl2IChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgIDxoZWFkZXIgKm5nSWY9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPHJpdi1jYWxlbmRhclxuICAgICAgICAgIFthY3RpdmVZZWFyTW9udGhdPVwiYWN0aXZlWWVhck1vbnRoXCJcbiAgICAgICAgICAoYWN0aXZlWWVhck1vbnRoQ2hhbmdlKT1cImFjdGl2ZVllYXJNb250aCA9ICRldmVudFwiXG4gICAgICAgICAgW2Rpc3BsYXlNaW5dPVwibWluXCJcbiAgICAgICAgICBbZGlzcGxheU1heF09XCJtYXhcIlxuICAgICAgICAgIFtzZWxlY3RhYmxlTWluXT1cIm1pblwiXG4gICAgICAgICAgW3NlbGVjdGFibGVNYXhdPVwibWF4XCJcbiAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZV09XCJwcmV2aWV3VmFsdWUgPz8gdmFsdWVcIlxuICAgICAgICAgIChkYXRlU2VsZWN0KT1cIm9uRGF0ZVNlbGVjdCgkZXZlbnQpOyBpbnB1dC5ibHVyKClcIlxuICAgICAgICA+PC9yaXYtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb290ZXIgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b24gfHwgc2hvd1RvZGF5QnV0dG9uXCIgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoKTsgaW5wdXQuYmx1cigpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VG9kYXlCdXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9kYXlcIlxuICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNUb2RheVNlbGVjdGFibGVcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpOyBpbnB1dC5ibHVyKClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgVG9kYXlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Zvb3Rlcj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuIl19
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9pbnB1dC9kYXRlL2RhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvaW5wdXQvZGF0ZS9kYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7OztBQVEzRSxNQUFNLE9BQU8sYUFBYyxTQUFRLG1CQUFtQjtJQU9wRCxJQUNJLEtBQUssQ0FBQyxDQUFtQjtRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRTtZQUFFLE9BQU87UUFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFD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QyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUV2QyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FDdEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU87WUFDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDdkQsS0FBSztZQUNMLEdBQUc7U0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQWdCLFdBQVcsQ0FBQyxJQUFVLEVBQUUsR0FBUyxFQUFFLEdBQVM7UUFDMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFIZSx5QkFBVyxjQUcxQixDQUFBO0FBQ0gsQ0FBQyxFQXBFZ0IsYUFBYSxLQUFiLGFBQWEsUUFvRTdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRpbWVEYXksIHRpbWVNb250aCB9IGZyb20gJ2QzLXRpbWUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJy4uLy4uL2Zvcm1hdC9waXBlcy9kYXRlLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDb21wb25lbnQgfSBmcm9tICcuLi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2lucHV0LWxhYmVsL2lucHV0LWxhYmVsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1kYXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRlLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhdGVDb21wb25lbnQgZXh0ZW5kcyBJbnB1dExhYmVsQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgbWluOiBEYXRlID0gQ2FsZW5kYXJDb21wb25lbnQuZGVmYXVsdE1pbjtcblxuICBASW5wdXQoKVxuICBtYXg6IERhdGUgPSBDYWxlbmRhckNvbXBvbmVudC5kZWZhdWx0TWF4O1xuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2OiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX3ZhbHVlPy5nZXRUaW1lKCkgPT09IHY/LmdldFRpbWUoKSkgcmV0dXJuO1xuICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAvLyBTa2lwIHRleHQgc3luYyB3aGlsZSB0eXBpbmcgc28gd2UgZG9uJ3Qgc3RvbXAgdGhlIHVzZXIncyBpbi1wcm9ncmVzcyBpbnB1dC5cbiAgICBpZiAoIXRoaXMuaGFzRm9jdXMpIHRoaXMuaW5wdXRUZXh0ID0gdiA/IHRoaXMuZm9ybWF0VmFsdWUodikgOiAnJztcbiAgICBpZiAodikgdGhpcy5zZXRBY3RpdmVNb250aCh2KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBnZXQgdmFsdWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHByaXZhdGUgX3ZhbHVlPzogRGF0ZTtcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBkYXRlJztcblxuICBASW5wdXQoKVxuICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNpemU6IERhdGVDb21wb25lbnQuU2l6ZSA9ICdtZWRpdW0nO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dDbGVhckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd1RvZGF5QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICBAQ29udGVudENoaWxkKCdoZWFkZXInKVxuICBoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIGFjdGl2ZVllYXJNb250aCA9IHRpbWVNb250aC5mbG9vcihuZXcgRGF0ZSgpKTtcblxuICByZWFkb25seSBvcGVuJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBASW5wdXQoKVxuICBzZXQgb3Blbih2OiBib29sZWFuKSB7XG4gICAgdGhpcy5vcGVuJC5uZXh0KHYpO1xuICB9XG4gIGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW4kLmdldFZhbHVlKCk7XG4gIH1cblxuICBAT3V0cHV0KClcbiAgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCB1bmRlZmluZWQ+KCk7XG5cbiAgaW5wdXRUZXh0OiBzdHJpbmcgPSAnJztcbiAgcHJldmlld1ZhbHVlPzogRGF0ZTtcbiAgcHJpdmF0ZSBoYXNGb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGVQaXBlID0gbmV3IERhdGVQaXBlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvLyBUaGUgY2FsbG91dCByZW5kZXJzIHdpdGggaXNNb2RhbD1mYWxzZSAobm8gZnVsbC12aWV3cG9ydCBzY3JpbSkgYW5kIGNhbid0XG4gIC8vIHNlbGYtY2xvc2Ugb24gb3V0c2lkZSBjbGlja3MuIEFueSBvdmVybGF5IGxheWVyIOKAlCBpbmNsdWRpbmcgc2libGluZ1xuICAvLyBvdmVybGF5cyBsaWtlIHRoZSBtb250aC95ZWFyIHNlbGVjdHMg4oCUIGNvdW50cyBhcyBcImluc2lkZVwiIHRoZSBwaWNrZXIuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBvbkRvY3VtZW50TW91c2VEb3duKHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9wZW4kLmdldFZhbHVlKCkgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSByZXR1cm47XG4gICAgaWYgKHRhcmdldC5jbG9zZXN0KCcuY2FsbG91dCwgLnNjcmltLCAub3ZlcmxheS1jb250YWluZXInKSkgcmV0dXJuO1xuICAgIHRoaXMub3BlbiQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjbGVhclZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5vcGVuJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHRvZGF5ID0gdGltZURheS5mbG9vcihuZXcgRGF0ZSgpKTtcbiAgICBpZiAoIURhdGVDb21wb25lbnQuaXNWYWxpZERhdGUodG9kYXksIHRoaXMubWluLCB0aGlzLm1heCkpIHJldHVybjtcbiAgICB0aGlzLmNvbW1pdCh0b2RheSk7XG4gICAgdGhpcy5vcGVuJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIGdldCBpc1RvZGF5U2VsZWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRGF0ZUNvbXBvbmVudC5pc1ZhbGlkRGF0ZShcbiAgICAgIHRpbWVEYXkuZmxvb3IobmV3IERhdGUoKSksXG4gICAgICB0aGlzLm1pbixcbiAgICAgIHRoaXMubWF4LFxuICAgICk7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0VGV4dCA9IHZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VJbnB1dCh2YWx1ZSk7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBwYXJzZWQ7XG4gICAgaWYgKHBhcnNlZCkgdGhpcy5zZXRBY3RpdmVNb250aChwYXJzZWQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25JbnB1dEJsdXIoZXZlbnQ/OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5oYXNGb2N1cyA9IGZhbHNlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VJbnB1dCh0aGlzLmlucHV0VGV4dCk7XG4gICAgaWYgKHBhcnNlZCkge1xuICAgICAgdGhpcy5jb21taXQocGFyc2VkKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlucHV0VGV4dC50cmltKCkpIHtcbiAgICAgIHRoaXMuY29tbWl0KHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEludmFsaWQgdGV4dCDigJQgcmV2ZXJ0IHRvIHdoYXRldmVyIHRoZSBjb21taXR0ZWQgdmFsdWUgd2FzLlxuICAgICAgdGhpcy5pbnB1dFRleHQgPSB0aGlzLl92YWx1ZSA/IHRoaXMuZm9ybWF0VmFsdWUodGhpcy5fdmFsdWUpIDogJyc7XG4gICAgfVxuICAgIHRoaXMucHJldmlld1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIC8vIENsb3NlIG9uIGtleWJvYXJkLWRyaXZlbiBmb2N1cyBjaGFuZ2VzIChUYWIgb3V0KS4gU3RheSBvcGVuIGlmIGZvY3VzXG4gICAgLy8gbW92ZWQgaW50byBhIG5lc3RlZCBvdmVybGF5IChlLmcuIHRoZSBjYWxlbmRhcidzIG1vbnRoL3llYXIgc2VsZWN0KS5cbiAgICAvLyBNb3VzZSBjbGlja3MgaW5zaWRlIHRoZSBjYWxlbmRhciBwcmV2ZW50RGVmYXVsdCBtb3VzZWRvd24gc28gdGhpc1xuICAgIC8vIGhhbmRsZXIgbmV2ZXIgcnVucyBmb3IgdGhlbS5cbiAgICBjb25zdCBuZXh0VGFyZ2V0ID0gZXZlbnQ/LnJlbGF0ZWRUYXJnZXQ7XG4gICAgY29uc3Qgc3RheU9wZW4gPVxuICAgICAgbmV4dFRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICh0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jb250YWlucyhuZXh0VGFyZ2V0KSB8fFxuICAgICAgICAhIW5leHRUYXJnZXQuY2xvc2VzdCgnLmNhbGxvdXQsIC5zY3JpbSwgLm92ZXJsYXktY29udGFpbmVyJykpO1xuICAgIGlmICghc3RheU9wZW4pIHRoaXMub3BlbiQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkRhdGVTZWxlY3QoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0KHRpbWVEYXkuZmxvb3IoZGF0ZSkpO1xuICAgIHRoaXMub3BlbiQubmV4dChmYWxzZSk7XG4gIH1cblxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNGb2N1cyA9IHRydWU7XG4gICAgdGhpcy5vcGVuJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuJC5uZXh0KCF0aGlzLm9wZW4kLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5wdXQodGV4dDogc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VkID0gRGF0ZUNvbXBvbmVudC5wYXJzZURhdGUodGV4dCk7XG4gICAgcmV0dXJuIHBhcnNlZCAmJiBEYXRlQ29tcG9uZW50LmlzVmFsaWREYXRlKHBhcnNlZCwgdGhpcy5taW4sIHRoaXMubWF4KVxuICAgICAgPyB0aW1lRGF5LmZsb29yKHBhcnNlZClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmVNb250aChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgbW9udGggPSB0aW1lTW9udGguZmxvb3IoZGF0ZSk7XG4gICAgaWYgKG1vbnRoLmdldFRpbWUoKSAhPT0gdGhpcy5hY3RpdmVZZWFyTW9udGguZ2V0VGltZSgpKSB7XG4gICAgICB0aGlzLmFjdGl2ZVllYXJNb250aCA9IG1vbnRoO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0KG5leHQ6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCB1bmNoYW5nZWQgPSBuZXh0Py5nZXRUaW1lKCkgPT09IHRoaXMuX3ZhbHVlPy5nZXRUaW1lKCk7XG4gICAgdGhpcy5fdmFsdWUgPSBuZXh0O1xuICAgIHRoaXMuaW5wdXRUZXh0ID0gbmV4dCA/IHRoaXMuZm9ybWF0VmFsdWUobmV4dCkgOiAnJztcbiAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAobmV4dCkgdGhpcy5zZXRBY3RpdmVNb250aChuZXh0KTtcbiAgICBpZiAoIXVuY2hhbmdlZCkgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG5leHQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRGF0ZUNvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBTaXplcyA9IFtcbiAgICAneHNtYWxsJyxcbiAgICAnc21hbGwnLFxuICAgICdtZWRpdW0nLFxuICAgICdsYXJnZScsXG4gICAgJ3hsYXJnZScsXG4gIF0gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIFNpemUgPSAodHlwZW9mIFNpemVzKVtudW1iZXJdO1xuXG4gIC8vIEFjY2VwdHMgTU0vREQvWVlZWSwgTS9EL1lZLCBhbmQgWVlZWS1NTS1ERCB3aXRoIC8sIC0sIG9yIC4gc2VwYXJhdG9ycywgYXNcbiAgLy8gd2VsbCBhcyBzZXBhcmF0b3ItbGVzcyBkaWdpdCBydW5zIChNTUREWVlZWSBvciBNTUREWVkpLiBBIDQtZGlnaXQgbGVhZGluZ1xuICAvLyBzZWdtZW50IGluIHRoZSBzZXBhcmF0ZWQgZm9ybSBpcyB0cmVhdGVkIGFzIGFuIElTTyB5ZWFyOyAyLWRpZ2l0IHllYXJzXG4gIC8vIHBpdm90IGF0IDUwICg8NTAg4oaSIDIwMDBzLCA+PTUwIOKGkiAxOTAwcykuXG4gIGV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGUoaW5wdXQ6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgeW1kID0gL15cXGQrJC8udGVzdCh0cmltbWVkKVxuICAgICAgPyBwYXJzZURpZ2l0cyh0cmltbWVkKVxuICAgICAgOiBwYXJzZVNlcGFyYXRlZCh0cmltbWVkKTtcbiAgICBpZiAoIXltZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHltZDtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpO1xuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGggLSAxICYmXG4gICAgICBkYXRlLmdldERhdGUoKSA9PT0gZGF5XG4gICAgICA/IGRhdGVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwYW5kVHdvRGlnaXRZZWFyKHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHllYXIgPCAxMDAgPyB5ZWFyICsgKHllYXIgPCA1MCA/IDIwMDAgOiAxOTAwKSA6IHllYXI7XG4gIH1cblxuICAvLyBBIHJ1biBvZiBkaWdpdHMgd2l0aCBubyBzZXBhcmF0b3JzOiA4IOKGkiBNTUREWVlZWSAobGl0ZXJhbCB5ZWFyKSwgNiDihpIgTU1ERFlZXG4gIC8vICgyLWRpZ2l0IHllYXIgcGl2b3RlZCBhdCA1MCkuXG4gIGZ1bmN0aW9uIHBhcnNlRGlnaXRzKGRpZ2l0czogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCAhPT0gOCAmJiBkaWdpdHMubGVuZ3RoICE9PSA2KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkaWdpdHMuc2xpY2UoNCksIDEwKTtcbiAgICByZXR1cm4gW1xuICAgICAgZGlnaXRzLmxlbmd0aCA9PT0gNiA/IGV4cGFuZFR3b0RpZ2l0WWVhcih5ZWFyKSA6IHllYXIsXG4gICAgICBwYXJzZUludChkaWdpdHMuc2xpY2UoMCwgMiksIDEwKSxcbiAgICAgIHBhcnNlSW50KGRpZ2l0cy5zbGljZSgyLCA0KSwgMTApLFxuICAgIF07XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVNlcGFyYXRlZChpbnB1dDogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJ0cyA9IGlucHV0LnNwbGl0KC9bLy4tXS8pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBudW1zID0gcGFydHMubWFwKHAgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICBpZiAobnVtcy5zb21lKGlzTmFOKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9XG4gICAgICBwYXJ0c1swXS5sZW5ndGggPT09IDQgPyBudW1zIDogW251bXNbMl0sIG51bXNbMF0sIG51bXNbMV1dO1xuICAgIHJldHVybiBbXG4gICAgICBwYXJ0c1swXS5sZW5ndGggPT09IDQgPyB5ZWFyIDogZXhwYW5kVHdvRGlnaXRZZWFyKHllYXIpLFxuICAgICAgbW9udGgsXG4gICAgICBkYXksXG4gICAgXTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRGF0ZShkYXRlOiBEYXRlLCBtaW46IERhdGUsIG1heDogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRpbWUgPSBkYXRlLmdldFRpbWUoKTtcbiAgICByZXR1cm4gdGltZSA+PSBtaW4uZ2V0VGltZSgpICYmIHRpbWUgPD0gbWF4LmdldFRpbWUoKTtcbiAgfVxufVxuIiwiPHJpdi1pbnB1dC1sYWJlbFxuICBbbGFiZWxdPVwibGFiZWxcIlxuICBbaGVscF09XCJoZWxwXCJcbiAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgW3N0YXRlXT1cInN0YXRlXCJcbiAgW2Vycm9yTWVzc2FnZV09XCJlcnJvck1lc3NhZ2VcIlxuICBbbGFiZWxBY3Rpb25UZXh0XT1cImxhYmVsQWN0aW9uVGV4dFwiXG4gIChsYWJlbEFjdGlvbik9XCJsYWJlbEFjdGlvbi5lbWl0KCRldmVudClcIlxuPlxuICA8ZGl2XG4gICAgI3RyaWdnZXJcbiAgICBjbGFzcz1cInRyaWdnZXJcIlxuICAgIFtjbGFzcy54c21hbGxdPVwic2l6ZSA9PT0gJ3hzbWFsbCdcIlxuICAgIFtjbGFzcy5zbWFsbF09XCJzaXplID09PSAnc21hbGwnXCJcbiAgICBbY2xhc3MubGFyZ2VdPVwic2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgW2NsYXNzLnhsYXJnZV09XCJzaXplID09PSAneGxhcmdlJ1wiXG4gICAgW2NsYXNzLndhcm5pbmddPVwic3RhdGUgPT09ICd3YXJuaW5nJ1wiXG4gICAgW2NsYXNzLmVycm9yXT1cInN0YXRlID09PSAnZXJyb3InXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICAjaW5wdXRcbiAgICAgIGNsYXNzPVwidmFsdWVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgIFt2YWx1ZV09XCJpbnB1dFRleHRcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWwgfHwgbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm9wZW4kIHwgYXN5bmNcIlxuICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIlxuICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJub25lXCJcbiAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKGlucHV0LnZhbHVlKVwiXG4gICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJpbnB1dC5ibHVyKCk7IG9wZW4kLm5leHQoZmFsc2UpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAvPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiY2hldnJvblwiXG4gICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihvcGVuJCB8IGFzeW5jKSA/ICdDbG9zZSBjYWxlbmRhcicgOiAnT3BlbiBjYWxlbmRhcidcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICA+XG4gICAgICA8cml2LWljb24gW25hbWVdPVwiJ0NhbGVuZGFyJ1wiIFtzaXplXT1cIjE2XCI+PC9yaXYtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L3Jpdi1pbnB1dC1sYWJlbD5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJvcGVuJCB8IGFzeW5jXCI+XG4gIDxyaXYtY2FsbG91dFxuICAgICpyaXYtb3ZlcmxheVxuICAgIFthbmNob3JdPVwidHJpZ2dlclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtzaG93Q2FyZXRdPVwiZmFsc2VcIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICBbYWxsb3dlZFBvc2l0aW9uc109XCJbXG4gICAgICAndG9wLWxlZnQnLFxuICAgICAgJ3RvcC1yaWdodCcsXG4gICAgICAnYm90dG9tLXJpZ2h0JyxcbiAgICAgICdib3R0b20tbGVmdCdcbiAgICBdXCJcbiAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgIChjbG9zZSk9XCJvcGVuJC5uZXh0KGZhbHNlKVwiXG4gID5cbiAgICA8ZGl2IChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cbiAgICAgIDxoZWFkZXIgKm5nSWY9XCJoZWFkZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvaGVhZGVyPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPHJpdi1jYWxlbmRhclxuICAgICAgICAgIFthY3RpdmVZZWFyTW9udGhdPVwiYWN0aXZlWWVhck1vbnRoXCJcbiAgICAgICAgICAoYWN0aXZlWWVhck1vbnRoQ2hhbmdlKT1cImFjdGl2ZVllYXJNb250aCA9ICRldmVudFwiXG4gICAgICAgICAgW2Rpc3BsYXlNaW5dPVwibWluXCJcbiAgICAgICAgICBbZGlzcGxheU1heF09XCJtYXhcIlxuICAgICAgICAgIFtzZWxlY3RhYmxlTWluXT1cIm1pblwiXG4gICAgICAgICAgW3NlbGVjdGFibGVNYXhdPVwibWF4XCJcbiAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZV09XCJwcmV2aWV3VmFsdWUgPz8gdmFsdWVcIlxuICAgICAgICAgIChkYXRlU2VsZWN0KT1cIm9uRGF0ZVNlbGVjdCgkZXZlbnQpOyBpbnB1dC5ibHVyKClcIlxuICAgICAgICA+PC9yaXYtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxmb290ZXIgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b24gfHwgc2hvd1RvZGF5QnV0dG9uXCIgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoKTsgaW5wdXQuYmx1cigpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIENsZWFyXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJzaG93VG9kYXlCdXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwidG9kYXlcIlxuICAgICAgICAgIHJpdkJ1dHRvblxuICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNUb2RheVNlbGVjdGFibGVcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpOyBpbnB1dC5ibHVyKClcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgVG9kYXlcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Zvb3Rlcj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -1,8 +1,9 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  import * as i2 from "../../input/button/button.component";
5
- import * as i3 from "../../format/truncate/truncate.component";
5
+ import * as i3 from "../../input/text-field/text-field.component";
6
+ import * as i4 from "../../format/truncate/truncate.component";
6
7
  /**
7
8
  * A borderless heading with a click-to-edit title and an optional
8
9
  * click-to-edit description, plus a projected slot for actions.
@@ -21,12 +22,10 @@ import * as i3 from "../../format/truncate/truncate.component";
21
22
  * "commit" framing over "change" is deliberate: consumers that persist on
22
23
  * commit (analytics, PATCH) treat the gesture itself as the event; those
23
24
  * that only care about diffs can compare `next === current` in the handler.
24
- * There is no cancel path.
25
25
  *
26
- * Outside-click commits (rather than cancels) to match the established DS
27
- * interaction pattern in `riv-date` and `riv-select`. If a future consumer
28
- * needs an abandon path, the soft first step is Escape-to-cancel rather
29
- * than changing outside-click's meaning.
26
+ * Escape cancels: reverts the draft back to the current value and drops out
27
+ * of edit mode WITHOUT emitting a change. Outside-click still commits (to
28
+ * match `riv-date` / `riv-select`); Escape is the deliberate abandon path.
30
29
  *
31
30
  * Value handling follows the same convention as `riv-text-field`: `[title]`
32
31
  * and `[description]` are treated as suggestions, not authoritative state.
@@ -35,6 +34,12 @@ import * as i3 from "../../format/truncate/truncate.component";
35
34
  * a different value. That lets the component demo out of the box (e.g. in
36
35
  * Storybook) without requiring a round trip through the parent.
37
36
  *
37
+ * Programmatic entry into edit mode is available via `startEditingTitle()`
38
+ * and `startEditingDescription()` — obtain a reference with
39
+ * `@ViewChild(EditableHeadingComponent)`. Use these for secondary entry
40
+ * points like a kebab-menu "Rename" item, or to auto-open rename after
41
+ * creating a new entity.
42
+ *
38
43
  * The component owns no border, background, or card chrome — consumers who
39
44
  * want a bordered container should wrap it.
40
45
  *
@@ -71,6 +76,15 @@ export class EditableHeadingComponent {
71
76
  get description() {
72
77
  return this._description;
73
78
  }
79
+ set disabled(v) {
80
+ this._disabled = v;
81
+ if (v && this.mode !== 'view')
82
+ this.cancel();
83
+ this.cdr.markForCheck();
84
+ }
85
+ get disabled() {
86
+ return this._disabled;
87
+ }
74
88
  constructor(cdr, host) {
75
89
  this.cdr = cdr;
76
90
  this.host = host;
@@ -79,6 +93,13 @@ export class EditableHeadingComponent {
79
93
  this._description = '';
80
94
  this.titleMaxLength = 100;
81
95
  this.descriptionMaxLength = 300;
96
+ /**
97
+ * When true, the title and description are not clickable and cannot be
98
+ * edited. Any in-progress edit is dropped without emitting. Imperative
99
+ * `startEditing*` calls no-op. Useful for consumers that need to gate
100
+ * editing on a permission or a broader "actions disabled" state.
101
+ */
102
+ this._disabled = false;
82
103
  this.titleChange = new EventEmitter();
83
104
  this.descriptionChange = new EventEmitter();
84
105
  this.mode = 'view';
@@ -88,15 +109,38 @@ export class EditableHeadingComponent {
88
109
  get isEditing() {
89
110
  return this.mode !== 'view';
90
111
  }
112
+ /**
113
+ * Enter title-edit mode programmatically. Same behavior as clicking the
114
+ * title — populates the edit buffer from the current value, focuses the
115
+ * input with the caret at the end, and hides the actions slot. No-op if
116
+ * already in an editing mode or when the component is disabled.
117
+ *
118
+ * Intended for consumers that offer a secondary entry point to renaming
119
+ * (e.g. a kebab menu item), or that want to auto-open rename after
120
+ * creating a new entity. Bind via `@ViewChild(EditableHeadingComponent)`.
121
+ */
91
122
  startEditingTitle() {
123
+ if (this.disabled || this.mode !== 'view')
124
+ return;
92
125
  this.draftTitle = this.title;
93
126
  this.mode = 'editingTitle';
127
+ // `markForCheck` so consumers can call this from outside Angular's zone
128
+ // (e.g. an async callback) without having to trigger CD themselves.
129
+ this.cdr.markForCheck();
94
130
  // Defer focus until Angular has rendered the input into the DOM.
95
131
  setTimeout(() => this.focusEnd(this.titleInputRef), 0);
96
132
  }
133
+ /**
134
+ * Enter description-edit mode programmatically. Same behavior as clicking
135
+ * the description (or the "+ Add description" button). No-op if already
136
+ * in an editing mode or when the component is disabled.
137
+ */
97
138
  startEditingDescription() {
139
+ if (this.disabled || this.mode !== 'view')
140
+ return;
98
141
  this.draftDescription = this.description;
99
142
  this.mode = 'editingDescription';
143
+ this.cdr.markForCheck();
100
144
  setTimeout(() => this.focusEnd(this.descriptionInputRef), 0);
101
145
  }
102
146
  commitTitle() {
@@ -122,6 +166,18 @@ export class EditableHeadingComponent {
122
166
  this.mode = 'view';
123
167
  this.descriptionChange.emit(value);
124
168
  }
169
+ /**
170
+ * Abandon the current edit and return to view mode. No change is emitted.
171
+ * Wired to the Escape key on both edit inputs; also called internally
172
+ * when `disabled` flips to true mid-edit.
173
+ */
174
+ cancel() {
175
+ if (this.mode === 'view')
176
+ return;
177
+ this.draftTitle = this._title;
178
+ this.draftDescription = this._description;
179
+ this.mode = 'view';
180
+ }
125
181
  // Listens on `mousedown` (not `click`) so the check runs before Angular
126
182
  // re-renders the trigger element out of the DOM — otherwise
127
183
  // `host.contains(target)` returns false for a click that landed on the
@@ -139,23 +195,24 @@ export class EditableHeadingComponent {
139
195
  this.commitDescription();
140
196
  }
141
197
  }
142
- // Focus with caret at end (rather than selecting all) so the user can
143
- // continue typing where the previous value left off.
198
+ // Position caret at end (rather than selecting all) so the user can continue
199
+ // typing where the previous value left off. `riv-text-field` handles the
200
+ // focus itself via `[autoFocus]`; we just fix up the selection range on the
201
+ // descendant `<input>`.
144
202
  focusEnd(ref) {
145
- const el = ref?.nativeElement;
146
- if (!el)
203
+ const input = ref?.nativeElement.querySelector('input');
204
+ if (!input)
147
205
  return;
148
- el.focus();
149
- const len = el.value.length;
150
- el.setSelectionRange(len, len);
206
+ const len = input.value.length;
207
+ input.setSelectionRange(len, len);
151
208
  this.cdr.markForCheck();
152
209
  }
153
210
  }
154
211
  EditableHeadingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditableHeadingComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
155
- EditableHeadingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditableHeadingComponent, selector: "riv-editable-heading", inputs: { title: "title", description: "description", titleMaxLength: "titleMaxLength", descriptionMaxLength: "descriptionMaxLength" }, outputs: { titleChange: "titleChange", descriptionChange: "descriptionChange" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event.target)" }, properties: { "class.editing": "this.isEditing" } }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true }, { propertyName: "descriptionInputRef", first: true, predicate: ["descriptionInput"], descendants: true }], ngImport: i0, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Editing title -->\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <input\n #titleInput\n class=\"title-input\"\n type=\"text\"\n aria-label=\"Title\"\n [value]=\"draftTitle\"\n [attr.maxlength]=\"titleMaxLength\"\n (input)=\"draftTitle = titleInput.value\"\n (keydown.enter)=\"commitTitle()\"\n />\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <input\n #descriptionInput\n class=\"description-input\"\n type=\"text\"\n aria-label=\"Description\"\n [value]=\"draftDescription\"\n [attr.maxlength]=\"descriptionMaxLength\"\n placeholder=\"Add a description\"\n (input)=\"draftDescription = descriptionInput.value\"\n (keydown.enter)=\"commitDescription()\"\n />\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);padding:var(--size-small) var(--size-medium);color:var(--type-light-high-contrast);outline:none;min-width:0}.title-input{font:var(--stat-xsmall);flex:1 1 auto}.description-input{font:var(--input-small);flex:1 1 auto}.title-input:focus,.description-input:focus{border-color:var(--purp-60)}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i3.TruncateComponent, selector: "[rivTruncate]", inputs: ["maxTooltipWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
212
+ EditableHeadingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EditableHeadingComponent, selector: "riv-editable-heading", inputs: { title: "title", description: "description", titleMaxLength: "titleMaxLength", descriptionMaxLength: "descriptionMaxLength", disabled: "disabled" }, outputs: { titleChange: "titleChange", descriptionChange: "descriptionChange" }, host: { listeners: { "document:mousedown": "onDocumentMouseDown($event.target)" }, properties: { "class.editing": "this.isEditing" } }, viewQueries: [{ propertyName: "titleInputRef", first: true, predicate: ["titleInput"], descendants: true, read: ElementRef }, { propertyName: "descriptionInputRef", first: true, predicate: ["descriptionInput"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\" *ngIf=\"!disabled\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <riv-text-field\n #titleInput\n class=\"title-input\"\n [value]=\"draftTitle\"\n [maxLength]=\"titleMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftTitle = $event\"\n (keydown.enter)=\"commitTitle()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <riv-text-field\n #descriptionInput\n class=\"description-input\"\n placeholder=\"Add a description\"\n [value]=\"draftDescription\"\n [maxLength]=\"descriptionMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftDescription = $event\"\n (keydown.enter)=\"commitDescription()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title:disabled,.description:disabled{cursor:default}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{flex:1 1 auto;min-width:0}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i3.TextFieldComponent, selector: "riv-text-field", inputs: ["disabled", "readonly", "placeholder", "casing", "type", "size", "autoFocus", "name", "minLength", "maxLength", "value"], outputs: ["valueChange", "blur"] }, { kind: "component", type: i4.TruncateComponent, selector: "[rivTruncate]", inputs: ["maxTooltipWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
156
213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EditableHeadingComponent, decorators: [{
157
214
  type: Component,
158
- args: [{ selector: 'riv-editable-heading', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Editing title -->\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <input\n #titleInput\n class=\"title-input\"\n type=\"text\"\n aria-label=\"Title\"\n [value]=\"draftTitle\"\n [attr.maxlength]=\"titleMaxLength\"\n (input)=\"draftTitle = titleInput.value\"\n (keydown.enter)=\"commitTitle()\"\n />\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <input\n #descriptionInput\n class=\"description-input\"\n type=\"text\"\n aria-label=\"Description\"\n [value]=\"draftDescription\"\n [attr.maxlength]=\"descriptionMaxLength\"\n placeholder=\"Add a description\"\n (input)=\"draftDescription = descriptionInput.value\"\n (keydown.enter)=\"commitDescription()\"\n />\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-small);padding:var(--size-small) var(--size-medium);color:var(--type-light-high-contrast);outline:none;min-width:0}.title-input{font:var(--stat-xsmall);flex:1 1 auto}.description-input{font:var(--input-small);flex:1 1 auto}.title-input:focus,.description-input:focus{border-color:var(--purp-60)}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"] }]
215
+ args: [{ selector: 'riv-editable-heading', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"leading\">\n <ng-container [ngSwitch]=\"mode\">\n <!-- View mode -->\n <ng-container *ngSwitchDefault>\n <button\n type=\"button\"\n class=\"title\"\n [class.has-description]=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Rename\"\n (click)=\"startEditingTitle()\"\n >\n {{ title || 'Untitled' }}\n </button>\n\n <div class=\"divider\"></div>\n\n <button\n *ngIf=\"description; else addDescription\"\n type=\"button\"\n class=\"description\"\n [disabled]=\"disabled\"\n rivTruncate\n aria-label=\"Edit description\"\n (click)=\"startEditingDescription()\"\n >\n {{ description }}\n </button>\n\n <ng-template #addDescription>\n <div class=\"add-description-wrap\" *ngIf=\"!disabled\">\n <button\n rivButton\n [variant]=\"'ghost'\"\n [size]=\"'xsmall'\"\n [icon]=\"'Plus'\"\n [iconPosition]=\"'first'\"\n type=\"button\"\n (click)=\"startEditingDescription()\"\n >\n Add description\n </button>\n </div>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'editingTitle'\">\n <riv-text-field\n #titleInput\n class=\"title-input\"\n [value]=\"draftTitle\"\n [maxLength]=\"titleMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftTitle = $event\"\n (keydown.enter)=\"commitTitle()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n [disabled]=\"!draftTitle\"\n (click)=\"commitTitle()\"\n aria-label=\"Save title\"\n ></button>\n </ng-container>\n\n <!-- Editing description -->\n <ng-container *ngSwitchCase=\"'editingDescription'\">\n <riv-text-field\n #descriptionInput\n class=\"description-input\"\n placeholder=\"Add a description\"\n [value]=\"draftDescription\"\n [maxLength]=\"descriptionMaxLength\"\n [autoFocus]=\"true\"\n (valueChange)=\"draftDescription = $event\"\n (keydown.enter)=\"commitDescription()\"\n (keydown.escape)=\"cancel()\"\n ></riv-text-field>\n <button\n rivButton\n type=\"button\"\n class=\"commit\"\n [variant]=\"'primary'\"\n [icon]=\"'Check'\"\n (click)=\"commitDescription()\"\n aria-label=\"Save description\"\n ></button>\n </ng-container>\n </ng-container>\n</div>\n\n<div class=\"actions\" *ngIf=\"!isEditing\">\n <ng-content select=\"[actions]\"></ng-content>\n</div>\n", styles: [":host{display:flex;align-items:stretch;gap:var(--size-large);min-height:calc(var(--base-grid-size) * 8);font:var(--body-medium)}.leading{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:var(--size-small)}.title,.description{padding:0;border:none;background:none;text-align:left;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.title:disabled,.description:disabled{cursor:default}.title{font:var(--stat-xsmall);line-height:calc(var(--base-grid-size) * 4.5);color:var(--type-light-high-contrast);max-width:100%}.title.has-description{width:-moz-fit-content;width:fit-content;max-width:50%;flex-shrink:0}.description{font:var(--input-small);line-height:calc(var(--base-grid-size) * 3.5);color:var(--type-light-low-contrast);flex:1 1 auto}.divider{align-self:stretch;border-right:var(--border-width) solid var(--border-light);margin:0 var(--base-grid-size) 0 0;flex-shrink:0}.add-description-wrap{flex-shrink:0}.title-input,.description-input{flex:1 1 auto;min-width:0}.commit{flex-shrink:0}.actions{display:flex;align-items:center;gap:var(--size-small);flex-shrink:0}\n"] }]
159
216
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { title: [{
160
217
  type: Input
161
218
  }], description: [{
@@ -164,16 +221,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
164
221
  type: Input
165
222
  }], descriptionMaxLength: [{
166
223
  type: Input
224
+ }], disabled: [{
225
+ type: Input
167
226
  }], titleChange: [{
168
227
  type: Output
169
228
  }], descriptionChange: [{
170
229
  type: Output
171
230
  }], titleInputRef: [{
172
231
  type: ViewChild,
173
- args: ['titleInput']
232
+ args: ['titleInput', { read: ElementRef }]
174
233
  }], descriptionInputRef: [{
175
234
  type: ViewChild,
176
- args: ['descriptionInput']
235
+ args: ['descriptionInput', { read: ElementRef }]
177
236
  }], isEditing: [{
178
237
  type: HostBinding,
179
238
  args: ['class.editing']
@@ -181,4 +240,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
181
240
  type: HostListener,
182
241
  args: ['document:mousedown', ['$event.target']]
183
242
  }] } });
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFFdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFPSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLElBQ0ksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxJQUNJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBd0JELFlBQ21CLEdBQXNCLEVBQ3RCLElBQTZCO1FBRDdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFNBQUks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RSxxREFBcUQ7SUFDN0MsUUFBUSxDQUFDLEdBQWtDO1FBQ2pELE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxhQUFhLENBQUM7UUFDOUIsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ2hCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOztzSEFqSFUsd0JBQXdCOzBHQUF4Qix3QkFBd0Isb25CQ3hFckMsNHJGQWtHQTs0RkQxQmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHNCQUFzQixtQkFHZix1QkFBdUIsQ0FBQyxNQUFNO2lJQU0zQyxLQUFLO3NCQURSLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVNOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJQyxhQUFhO3NCQURwQixTQUFTO3VCQUFDLFlBQVk7Z0JBSWYsbUJBQW1CO3NCQUQxQixTQUFTO3VCQUFDLGtCQUFrQjtnQkFhekIsU0FBUztzQkFEWixXQUFXO3VCQUFDLGVBQWU7Z0JBK0NsQixtQkFBbUI7c0JBRDVCLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEEgYm9yZGVybGVzcyBoZWFkaW5nIHdpdGggYSBjbGljay10by1lZGl0IHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICogY2xpY2stdG8tZWRpdCBkZXNjcmlwdGlvbiwgcGx1cyBhIHByb2plY3RlZCBzbG90IGZvciBhY3Rpb25zLlxuICpcbiAqIExheW91dDogYFt0aXRsZV0gfCBbZGVzY3JpcHRpb25dICBbYWN0aW9uc11gXG4gKlxuICogLSBDbGljayB0aGUgdGl0bGUgdG8gcmVuYW1lOyBjbGljayB0aGUgZGVzY3JpcHRpb24gKG9yIHRoZSBnaG9zdFxuICogICBcIisgQWRkIGRlc2NyaXB0aW9uXCIgYnV0dG9uIHdoZW4gZW1wdHkpIHRvIGVkaXQgaXQuXG4gKiAtIE9ubHkgb25lIG9mIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGNhbiBiZSBlZGl0ZWQgYXQgYSB0aW1lLlxuICogLSBXaGlsZSBlaXRoZXIgaXMgYmVpbmcgZWRpdGVkLCB0aGUgYFthY3Rpb25zXWAgc2xvdCBpcyBoaWRkZW4gc29cbiAqICAgcHJvamVjdGVkIGNvbnRyb2xzIGRvbid0IGNvbXBldGUgd2l0aCB0aGUgZWRpdCBhZmZvcmRhbmNlLlxuICpcbiAqIENvbW1pdCBzZW1hbnRpY3M6IGB0aXRsZUNoYW5nZWAgLyBgZGVzY3JpcHRpb25DaGFuZ2VgIGZpcmUgd2hlbiB0aGUgdXNlclxuICogY29tbWl0cyDigJQgRW50ZXIsIG91dHNpZGUgY2xpY2ssIG9yIHRoZSBDaGVjayBidXR0b24g4oCUIG5vdCBvbiBldmVyeVxuICoga2V5c3Ryb2tlLCBhbmQgYWx3YXlzIG9uIGNvbW1pdCAoZXZlbiB3aGVuIHRoZSB2YWx1ZSBpcyB1bmNoYW5nZWQpLiBUaGVcbiAqIFwiY29tbWl0XCIgZnJhbWluZyBvdmVyIFwiY2hhbmdlXCIgaXMgZGVsaWJlcmF0ZTogY29uc3VtZXJzIHRoYXQgcGVyc2lzdCBvblxuICogY29tbWl0IChhbmFseXRpY3MsIFBBVENIKSB0cmVhdCB0aGUgZ2VzdHVyZSBpdHNlbGYgYXMgdGhlIGV2ZW50OyB0aG9zZVxuICogdGhhdCBvbmx5IGNhcmUgYWJvdXQgZGlmZnMgY2FuIGNvbXBhcmUgYG5leHQgPT09IGN1cnJlbnRgIGluIHRoZSBoYW5kbGVyLlxuICogVGhlcmUgaXMgbm8gY2FuY2VsIHBhdGguXG4gKlxuICogT3V0c2lkZS1jbGljayBjb21taXRzIChyYXRoZXIgdGhhbiBjYW5jZWxzKSB0byBtYXRjaCB0aGUgZXN0YWJsaXNoZWQgRFNcbiAqIGludGVyYWN0aW9uIHBhdHRlcm4gaW4gYHJpdi1kYXRlYCBhbmQgYHJpdi1zZWxlY3RgLiBJZiBhIGZ1dHVyZSBjb25zdW1lclxuICogbmVlZHMgYW4gYWJhbmRvbiBwYXRoLCB0aGUgc29mdCBmaXJzdCBzdGVwIGlzIEVzY2FwZS10by1jYW5jZWwgcmF0aGVyXG4gKiB0aGFuIGNoYW5naW5nIG91dHNpZGUtY2xpY2sncyBtZWFuaW5nLlxuICpcbiAqIFZhbHVlIGhhbmRsaW5nIGZvbGxvd3MgdGhlIHNhbWUgY29udmVudGlvbiBhcyBgcml2LXRleHQtZmllbGRgOiBgW3RpdGxlXWBcbiAqIGFuZCBgW2Rlc2NyaXB0aW9uXWAgYXJlIHRyZWF0ZWQgYXMgc3VnZ2VzdGlvbnMsIG5vdCBhdXRob3JpdGF0aXZlIHN0YXRlLlxuICogT24gY29tbWl0LCB0aGUgY29tcG9uZW50IGtlZXBzIGRpc3BsYXlpbmcgdGhlIHVzZXIncyBjb21taXR0ZWQgdmFsdWUsXG4gKiBhbmQgb25seSBvdmVyd3JpdGVzIGl0cyBpbnRlcm5hbCBzdGF0ZSB3aGVuIHRoZSBwYXJlbnQgZXhwbGljaXRseSBzZW5kc1xuICogYSBkaWZmZXJlbnQgdmFsdWUuIFRoYXQgbGV0cyB0aGUgY29tcG9uZW50IGRlbW8gb3V0IG9mIHRoZSBib3ggKGUuZy4gaW5cbiAqIFN0b3J5Ym9vaykgd2l0aG91dCByZXF1aXJpbmcgYSByb3VuZCB0cmlwIHRocm91Z2ggdGhlIHBhcmVudC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IG93bnMgbm8gYm9yZGVyLCBiYWNrZ3JvdW5kLCBvciBjYXJkIGNocm9tZSDigJQgY29uc3VtZXJzIHdob1xuICogd2FudCBhIGJvcmRlcmVkIGNvbnRhaW5lciBzaG91bGQgd3JhcCBpdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8cml2LWVkaXRhYmxlLWhlYWRpbmdcbiAqICAgW3RpdGxlXT1cInJlcG9ydC50aXRsZVwiXG4gKiAgIFtkZXNjcmlwdGlvbl09XCJyZXBvcnQuZGVzY3JpcHRpb25cIlxuICogICAodGl0bGVDaGFuZ2UpPVwib25UaXRsZUNvbW1pdCgkZXZlbnQpXCJcbiAqICAgKGRlc2NyaXB0aW9uQ2hhbmdlKT1cIm9uRGVzY3JpcHRpb25Db21taXQoJGV2ZW50KVwiXG4gKiA+XG4gKiAgIDxyaXYtbWVudSBhY3Rpb25zPlxuICogICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlcj5cbiAqICAgICAgIDxidXR0b24gcml2QnV0dG9uIFtpY29uXT1cIidNb3JlVmVydGljYWwnXCIgW3ZhcmlhbnRdPVwiJ2dob3N0J1wiPjwvYnV0dG9uPlxuICogICAgIDwvbmctdGVtcGxhdGU+XG4gKiAgICAgPGJ1dHRvbiByaXYtbWVudS1pdGVtPlJlbmFtZTwvYnV0dG9uPlxuICogICAgIDxidXR0b24gcml2LW1lbnUtaXRlbT5EdXBsaWNhdGU8L2J1dHRvbj5cbiAqICAgPC9yaXYtbWVudT5cbiAqICAgPGJ1dHRvbiByaXZCdXR0b24gYWN0aW9ucyBbdmFyaWFudF09XCIncHJpbWFyeSdcIj5TYXZlPC9idXR0b24+XG4gKiA8L3Jpdi1lZGl0YWJsZS1oZWFkaW5nPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1lZGl0YWJsZS1oZWFkaW5nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRhYmxlLWhlYWRpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1oZWFkaW5nLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudCB7XG4gIC8vIFNlZSB0aGUgXCJWYWx1ZSBoYW5kbGluZ1wiIHNlY3Rpb24gb2YgdGhlIGNsYXNzLWxldmVsIGRvYy5cbiAgcHJvdGVjdGVkIF90aXRsZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHNldCB0aXRsZSh2OiBzdHJpbmcpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fdGl0bGUpIHRoaXMuX3RpdGxlID0gdjtcbiAgfVxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Rlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgc2V0IGRlc2NyaXB0aW9uKHY6IHN0cmluZykge1xuICAgIGlmICh2ICE9PSB0aGlzLl9kZXNjcmlwdGlvbikgdGhpcy5fZGVzY3JpcHRpb24gPSB2O1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHRpdGxlTWF4TGVuZ3RoOiBudW1iZXIgPSAxMDA7XG5cbiAgQElucHV0KClcbiAgZGVzY3JpcHRpb25NYXhMZW5ndGg6IG51bWJlciA9IDMwMDtcblxuICBAT3V0cHV0KClcbiAgdGl0bGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KClcbiAgZGVzY3JpcHRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCd0aXRsZUlucHV0JylcbiAgcHJpdmF0ZSB0aXRsZUlucHV0UmVmPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdkZXNjcmlwdGlvbklucHV0JylcbiAgcHJpdmF0ZSBkZXNjcmlwdGlvbklucHV0UmVmPzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcm90ZWN0ZWQgbW9kZTogJ3ZpZXcnIHwgJ2VkaXRpbmdUaXRsZScgfCAnZWRpdGluZ0Rlc2NyaXB0aW9uJyA9ICd2aWV3JztcbiAgcHJvdGVjdGVkIGRyYWZ0VGl0bGU6IHN0cmluZyA9ICcnO1xuICBwcm90ZWN0ZWQgZHJhZnREZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICkge31cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmVkaXRpbmcnKVxuICBnZXQgaXNFZGl0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgIT09ICd2aWV3JztcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFydEVkaXRpbmdUaXRsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWZ0VGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIHRoaXMubW9kZSA9ICdlZGl0aW5nVGl0bGUnO1xuICAgIC8vIERlZmVyIGZvY3VzIHVudGlsIEFuZ3VsYXIgaGFzIHJlbmRlcmVkIHRoZSBpbnB1dCBpbnRvIHRoZSBET00uXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRW5kKHRoaXMudGl0bGVJbnB1dFJlZiksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZnREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5tb2RlID0gJ2VkaXRpbmdEZXNjcmlwdGlvbic7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzRW5kKHRoaXMuZGVzY3JpcHRpb25JbnB1dFJlZiksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbW1pdFRpdGxlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgIT09ICdlZGl0aW5nVGl0bGUnKSByZXR1cm47XG4gICAgLy8gVGl0bGUgY2Fubm90IGJlIGNvbW1pdHRlZCBlbXB0eS4gVGhlIENoZWNrIGJ1dHRvbiBpcyBkaXNhYmxlZCBpbiB0aGF0XG4gICAgLy8gc3RhdGU7IGZvciBFbnRlciBhbmQgb3V0c2lkZS1jbGljayB3ZSByZXZlcnQgdG8gdGhlIGN1cnJlbnQgdGl0bGUgc29cbiAgICAvLyB0aGUgdXNlciBpcyBuZXZlciBzdHVjayBpbiBlZGl0IG1vZGUgd2l0aCBhIHJlamVjdGVkIHZhbHVlLlxuICAgIGlmICghdGhpcy5kcmFmdFRpdGxlKSB7XG4gICAgICB0aGlzLm1vZGUgPSAndmlldyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kcmFmdFRpdGxlO1xuICAgIHRoaXMuX3RpdGxlID0gdmFsdWU7XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICAgIHRoaXMudGl0bGVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tbWl0RGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2VkaXRpbmdEZXNjcmlwdGlvbicpIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZHJhZnREZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICAgIHRoaXMubW9kZSA9ICd2aWV3JztcbiAgICB0aGlzLmRlc2NyaXB0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLy8gTGlzdGVucyBvbiBgbW91c2Vkb3duYCAobm90IGBjbGlja2ApIHNvIHRoZSBjaGVjayBydW5zIGJlZm9yZSBBbmd1bGFyXG4gIC8vIHJlLXJlbmRlcnMgdGhlIHRyaWdnZXIgZWxlbWVudCBvdXQgb2YgdGhlIERPTSDigJQgb3RoZXJ3aXNlXG4gIC8vIGBob3N0LmNvbnRhaW5zKHRhcmdldClgIHJldHVybnMgZmFsc2UgZm9yIGEgY2xpY2sgdGhhdCBsYW5kZWQgb24gdGhlXG4gIC8vIG5vdy1yZW1vdmVkIGAudGl0bGVgIC8gYC5kZXNjcmlwdGlvbmAgZWxlbWVudC4gU2FtZSBwYXR0ZXJuIGFzXG4gIC8vIGByaXYtZGF0ZWAuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudE1vdXNlRG93bih0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd2aWV3JyB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ1RpdGxlJykge1xuICAgICAgdGhpcy5jb21taXRUaXRsZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykge1xuICAgICAgdGhpcy5jb21taXREZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvY3VzIHdpdGggY2FyZXQgYXQgZW5kIChyYXRoZXIgdGhhbiBzZWxlY3RpbmcgYWxsKSBzbyB0aGUgdXNlciBjYW5cbiAgLy8gY29udGludWUgdHlwaW5nIHdoZXJlIHRoZSBwcmV2aW91cyB2YWx1ZSBsZWZ0IG9mZi5cbiAgcHJpdmF0ZSBmb2N1c0VuZChyZWY/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSByZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLmZvY3VzKCk7XG4gICAgY29uc3QgbGVuID0gZWwudmFsdWUubGVuZ3RoO1xuICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKGxlbiwgbGVuKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxlYWRpbmdcIj5cbiAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibW9kZVwiPlxuICAgIDwhLS0gVmlldyBtb2RlIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwidGl0bGVcIlxuICAgICAgICBbY2xhc3MuaGFzLWRlc2NyaXB0aW9uXT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgcml2VHJ1bmNhdGVcbiAgICAgICAgYXJpYS1sYWJlbD1cIlJlbmFtZVwiXG4gICAgICAgIChjbGljayk9XCJzdGFydEVkaXRpbmdUaXRsZSgpXCJcbiAgICAgID5cbiAgICAgICAge3sgdGl0bGUgfHwgJ1VudGl0bGVkJyB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nSWY9XCJkZXNjcmlwdGlvbjsgZWxzZSBhZGREZXNjcmlwdGlvblwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgcml2VHJ1bmNhdGVcbiAgICAgICAgYXJpYS1sYWJlbD1cIkVkaXQgZGVzY3JpcHRpb25cIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGRlc2NyaXB0aW9uIH19XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNhZGREZXNjcmlwdGlvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkZC1kZXNjcmlwdGlvbi13cmFwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIid4c21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidQbHVzJ1wiXG4gICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIidmaXJzdCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIGRlc2NyaXB0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRWRpdGluZyB0aXRsZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZWRpdGluZ1RpdGxlJ1wiPlxuICAgICAgPGlucHV0XG4gICAgICAgICN0aXRsZUlucHV0XG4gICAgICAgIGNsYXNzPVwidGl0bGUtaW5wdXRcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJUaXRsZVwiXG4gICAgICAgIFt2YWx1ZV09XCJkcmFmdFRpdGxlXCJcbiAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpdGxlTWF4TGVuZ3RoXCJcbiAgICAgICAgKGlucHV0KT1cImRyYWZ0VGl0bGUgPSB0aXRsZUlucHV0LnZhbHVlXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZHJhZnRUaXRsZVwiXG4gICAgICAgIChjbGljayk9XCJjb21taXRUaXRsZSgpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgdGl0bGVcIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFZGl0aW5nIGRlc2NyaXB0aW9uIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlZGl0aW5nRGVzY3JpcHRpb24nXCI+XG4gICAgICA8aW5wdXRcbiAgICAgICAgI2Rlc2NyaXB0aW9uSW5wdXRcbiAgICAgICAgY2xhc3M9XCJkZXNjcmlwdGlvbi1pbnB1dFwiXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkRlc2NyaXB0aW9uXCJcbiAgICAgICAgW3ZhbHVlXT1cImRyYWZ0RGVzY3JpcHRpb25cIlxuICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwiZGVzY3JpcHRpb25NYXhMZW5ndGhcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhIGRlc2NyaXB0aW9uXCJcbiAgICAgICAgKGlucHV0KT1cImRyYWZ0RGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbklucHV0LnZhbHVlXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0RGVzY3JpcHRpb24oKVwiXG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIChjbGljayk9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgZGVzY3JpcHRpb25cIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwiIWlzRWRpdGluZ1wiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi9uYXZpZ2F0aW9uL2VkaXRhYmxlLWhlYWRpbmcvZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3REc7QUFPSCxNQUFNLE9BQU8sd0JBQXdCO0lBR25DLElBQ0ksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFHRCxJQUNJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBZUQsSUFDSSxRQUFRLENBQUMsQ0FBVTtRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLENB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QUM7UUFDMUUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDOztzSEF0S1Usd0JBQXdCOzBHQUF4Qix3QkFBd0IsMmdCQW1ERixVQUFVLGtIQUdKLFVBQVUsNkJDbEluRCwweUZBbUdBOzRGRHZCYSx3QkFBd0I7a0JBTnBDLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU07aUlBTTNDLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBU04sY0FBYztzQkFEYixLQUFLO2dCQUlOLG9CQUFvQjtzQkFEbkIsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBV04sV0FBVztzQkFEVixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFNQyxhQUFhO3NCQURwQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSXJDLG1CQUFtQjtzQkFEMUIsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBYS9DLFNBQVM7c0JBRFosV0FBVzt1QkFBQyxlQUFlO2dCQWdGbEIsbUJBQW1CO3NCQUQ1QixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBBIGJvcmRlcmxlc3MgaGVhZGluZyB3aXRoIGEgY2xpY2stdG8tZWRpdCB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAqIGNsaWNrLXRvLWVkaXQgZGVzY3JpcHRpb24sIHBsdXMgYSBwcm9qZWN0ZWQgc2xvdCBmb3IgYWN0aW9ucy5cbiAqXG4gKiBMYXlvdXQ6IGBbdGl0bGVdIHwgW2Rlc2NyaXB0aW9uXSAgW2FjdGlvbnNdYFxuICpcbiAqIC0gQ2xpY2sgdGhlIHRpdGxlIHRvIHJlbmFtZTsgY2xpY2sgdGhlIGRlc2NyaXB0aW9uIChvciB0aGUgZ2hvc3RcbiAqICAgXCIrIEFkZCBkZXNjcmlwdGlvblwiIGJ1dHRvbiB3aGVuIGVtcHR5KSB0byBlZGl0IGl0LlxuICogLSBPbmx5IG9uZSBvZiB0aXRsZSBvciBkZXNjcmlwdGlvbiBjYW4gYmUgZWRpdGVkIGF0IGEgdGltZS5cbiAqIC0gV2hpbGUgZWl0aGVyIGlzIGJlaW5nIGVkaXRlZCwgdGhlIGBbYWN0aW9uc11gIHNsb3QgaXMgaGlkZGVuIHNvXG4gKiAgIHByb2plY3RlZCBjb250cm9scyBkb24ndCBjb21wZXRlIHdpdGggdGhlIGVkaXQgYWZmb3JkYW5jZS5cbiAqXG4gKiBDb21taXQgc2VtYW50aWNzOiBgdGl0bGVDaGFuZ2VgIC8gYGRlc2NyaXB0aW9uQ2hhbmdlYCBmaXJlIHdoZW4gdGhlIHVzZXJcbiAqIGNvbW1pdHMg4oCUIEVudGVyLCBvdXRzaWRlIGNsaWNrLCBvciB0aGUgQ2hlY2sgYnV0dG9uIOKAlCBub3Qgb24gZXZlcnlcbiAqIGtleXN0cm9rZSwgYW5kIGFsd2F5cyBvbiBjb21taXQgKGV2ZW4gd2hlbiB0aGUgdmFsdWUgaXMgdW5jaGFuZ2VkKS4gVGhlXG4gKiBcImNvbW1pdFwiIGZyYW1pbmcgb3ZlciBcImNoYW5nZVwiIGlzIGRlbGliZXJhdGU6IGNvbnN1bWVycyB0aGF0IHBlcnNpc3Qgb25cbiAqIGNvbW1pdCAoYW5hbHl0aWNzLCBQQVRDSCkgdHJlYXQgdGhlIGdlc3R1cmUgaXRzZWxmIGFzIHRoZSBldmVudDsgdGhvc2VcbiAqIHRoYXQgb25seSBjYXJlIGFib3V0IGRpZmZzIGNhbiBjb21wYXJlIGBuZXh0ID09PSBjdXJyZW50YCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBFc2NhcGUgY2FuY2VsczogcmV2ZXJ0cyB0aGUgZHJhZnQgYmFjayB0byB0aGUgY3VycmVudCB2YWx1ZSBhbmQgZHJvcHMgb3V0XG4gKiBvZiBlZGl0IG1vZGUgV0lUSE9VVCBlbWl0dGluZyBhIGNoYW5nZS4gT3V0c2lkZS1jbGljayBzdGlsbCBjb21taXRzICh0b1xuICogbWF0Y2ggYHJpdi1kYXRlYCAvIGByaXYtc2VsZWN0YCk7IEVzY2FwZSBpcyB0aGUgZGVsaWJlcmF0ZSBhYmFuZG9uIHBhdGguXG4gKlxuICogVmFsdWUgaGFuZGxpbmcgZm9sbG93cyB0aGUgc2FtZSBjb252ZW50aW9uIGFzIGByaXYtdGV4dC1maWVsZGA6IGBbdGl0bGVdYFxuICogYW5kIGBbZGVzY3JpcHRpb25dYCBhcmUgdHJlYXRlZCBhcyBzdWdnZXN0aW9ucywgbm90IGF1dGhvcml0YXRpdmUgc3RhdGUuXG4gKiBPbiBjb21taXQsIHRoZSBjb21wb25lbnQga2VlcHMgZGlzcGxheWluZyB0aGUgdXNlcidzIGNvbW1pdHRlZCB2YWx1ZSxcbiAqIGFuZCBvbmx5IG92ZXJ3cml0ZXMgaXRzIGludGVybmFsIHN0YXRlIHdoZW4gdGhlIHBhcmVudCBleHBsaWNpdGx5IHNlbmRzXG4gKiBhIGRpZmZlcmVudCB2YWx1ZS4gVGhhdCBsZXRzIHRoZSBjb21wb25lbnQgZGVtbyBvdXQgb2YgdGhlIGJveCAoZS5nLiBpblxuICogU3Rvcnlib29rKSB3aXRob3V0IHJlcXVpcmluZyBhIHJvdW5kIHRyaXAgdGhyb3VnaCB0aGUgcGFyZW50LlxuICpcbiAqIFByb2dyYW1tYXRpYyBlbnRyeSBpbnRvIGVkaXQgbW9kZSBpcyBhdmFpbGFibGUgdmlhIGBzdGFydEVkaXRpbmdUaXRsZSgpYFxuICogYW5kIGBzdGFydEVkaXRpbmdEZXNjcmlwdGlvbigpYCDigJQgb2J0YWluIGEgcmVmZXJlbmNlIHdpdGhcbiAqIGBAVmlld0NoaWxkKEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudClgLiBVc2UgdGhlc2UgZm9yIHNlY29uZGFyeSBlbnRyeVxuICogcG9pbnRzIGxpa2UgYSBrZWJhYi1tZW51IFwiUmVuYW1lXCIgaXRlbSwgb3IgdG8gYXV0by1vcGVuIHJlbmFtZSBhZnRlclxuICogY3JlYXRpbmcgYSBuZXcgZW50aXR5LlxuICpcbiAqIFRoZSBjb21wb25lbnQgb3ducyBubyBib3JkZXIsIGJhY2tncm91bmQsIG9yIGNhcmQgY2hyb21lIOKAlCBjb25zdW1lcnMgd2hvXG4gKiB3YW50IGEgYm9yZGVyZWQgY29udGFpbmVyIHNob3VsZCB3cmFwIGl0LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxyaXYtZWRpdGFibGUtaGVhZGluZ1xuICogICBbdGl0bGVdPVwicmVwb3J0LnRpdGxlXCJcbiAqICAgW2Rlc2NyaXB0aW9uXT1cInJlcG9ydC5kZXNjcmlwdGlvblwiXG4gKiAgICh0aXRsZUNoYW5nZSk9XCJvblRpdGxlQ29tbWl0KCRldmVudClcIlxuICogICAoZGVzY3JpcHRpb25DaGFuZ2UpPVwib25EZXNjcmlwdGlvbkNvbW1pdCgkZXZlbnQpXCJcbiAqID5cbiAqICAgPHJpdi1tZW51IGFjdGlvbnM+XG4gKiAgICAgPG5nLXRlbXBsYXRlICN0cmlnZ2VyPlxuICogICAgICAgPGJ1dHRvbiByaXZCdXR0b24gW2ljb25dPVwiJ01vcmVWZXJ0aWNhbCdcIiBbdmFyaWFudF09XCInZ2hvc3QnXCI+PC9idXR0b24+XG4gKiAgICAgPC9uZy10ZW1wbGF0ZT5cbiAqICAgICA8YnV0dG9uIHJpdi1tZW51LWl0ZW0+UmVuYW1lPC9idXR0b24+XG4gKiAgICAgPGJ1dHRvbiByaXYtbWVudS1pdGVtPkR1cGxpY2F0ZTwvYnV0dG9uPlxuICogICA8L3Jpdi1tZW51PlxuICogICA8YnV0dG9uIHJpdkJ1dHRvbiBhY3Rpb25zIFt2YXJpYW50XT1cIidwcmltYXJ5J1wiPlNhdmU8L2J1dHRvbj5cbiAqIDwvcml2LWVkaXRhYmxlLWhlYWRpbmc+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWVkaXRhYmxlLWhlYWRpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdGFibGUtaGVhZGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRhYmxlLWhlYWRpbmcuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRWRpdGFibGVIZWFkaW5nQ29tcG9uZW50IHtcbiAgLy8gU2VlIHRoZSBcIlZhbHVlIGhhbmRsaW5nXCIgc2VjdGlvbiBvZiB0aGUgY2xhc3MtbGV2ZWwgZG9jLlxuICBwcm90ZWN0ZWQgX3RpdGxlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgc2V0IHRpdGxlKHY6IHN0cmluZykge1xuICAgIGlmICh2ICE9PSB0aGlzLl90aXRsZSkgdGhpcy5fdGl0bGUgPSB2O1xuICB9XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90aXRsZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICBzZXQgZGVzY3JpcHRpb24odjogc3RyaW5nKSB7XG4gICAgaWYgKHYgIT09IHRoaXMuX2Rlc2NyaXB0aW9uKSB0aGlzLl9kZXNjcmlwdGlvbiA9IHY7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgQElucHV0KClcbiAgdGl0bGVNYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcblxuICBASW5wdXQoKVxuICBkZXNjcmlwdGlvbk1heExlbmd0aDogbnVtYmVyID0gMzAwO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24gYXJlIG5vdCBjbGlja2FibGUgYW5kIGNhbm5vdCBiZVxuICAgKiBlZGl0ZWQuIEFueSBpbi1wcm9ncmVzcyBlZGl0IGlzIGRyb3BwZWQgd2l0aG91dCBlbWl0dGluZy4gSW1wZXJhdGl2ZVxuICAgKiBgc3RhcnRFZGl0aW5nKmAgY2FsbHMgbm8tb3AuIFVzZWZ1bCBmb3IgY29uc3VtZXJzIHRoYXQgbmVlZCB0byBnYXRlXG4gICAqIGVkaXRpbmcgb24gYSBwZXJtaXNzaW9uIG9yIGEgYnJvYWRlciBcImFjdGlvbnMgZGlzYWJsZWRcIiBzdGF0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHY7XG4gICAgaWYgKHYgJiYgdGhpcy5tb2RlICE9PSAndmlldycpIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICB0aXRsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPdXRwdXQoKVxuICBkZXNjcmlwdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8vIGByZWFkOiBFbGVtZW50UmVmYCBnZXRzIHRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGA8cml2LXRleHQtZmllbGQ+YCwgZnJvbVxuICAvLyB3aGljaCB3ZSBjYW4gcmVhY2ggdGhlIGFjdHVhbCBgPGlucHV0PmAgZm9yIGNhcmV0LWF0LWVuZCBwb3NpdGlvbmluZy5cbiAgQFZpZXdDaGlsZCgndGl0bGVJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIHRpdGxlSW5wdXRSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdkZXNjcmlwdGlvbklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgZGVzY3JpcHRpb25JbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHByb3RlY3RlZCBtb2RlOiAndmlldycgfCAnZWRpdGluZ1RpdGxlJyB8ICdlZGl0aW5nRGVzY3JpcHRpb24nID0gJ3ZpZXcnO1xuICBwcm90ZWN0ZWQgZHJhZnRUaXRsZTogc3RyaW5nID0gJyc7XG4gIHByb3RlY3RlZCBkcmFmdERlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgKSB7fVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZWRpdGluZycpXG4gIGdldCBpc0VkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSAhPT0gJ3ZpZXcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHRpdGxlLWVkaXQgbW9kZSBwcm9ncmFtbWF0aWNhbGx5LiBTYW1lIGJlaGF2aW9yIGFzIGNsaWNraW5nIHRoZVxuICAgKiB0aXRsZSDigJQgcG9wdWxhdGVzIHRoZSBlZGl0IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLCBmb2N1c2VzIHRoZVxuICAgKiBpbnB1dCB3aXRoIHRoZSBjYXJldCBhdCB0aGUgZW5kLCBhbmQgaGlkZXMgdGhlIGFjdGlvbnMgc2xvdC4gTm8tb3AgaWZcbiAgICogYWxyZWFkeSBpbiBhbiBlZGl0aW5nIG1vZGUgb3Igd2hlbiB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBJbnRlbmRlZCBmb3IgY29uc3VtZXJzIHRoYXQgb2ZmZXIgYSBzZWNvbmRhcnkgZW50cnkgcG9pbnQgdG8gcmVuYW1pbmdcbiAgICogKGUuZy4gYSBrZWJhYiBtZW51IGl0ZW0pLCBvciB0aGF0IHdhbnQgdG8gYXV0by1vcGVuIHJlbmFtZSBhZnRlclxuICAgKiBjcmVhdGluZyBhIG5ldyBlbnRpdHkuIEJpbmQgdmlhIGBAVmlld0NoaWxkKEVkaXRhYmxlSGVhZGluZ0NvbXBvbmVudClgLlxuICAgKi9cbiAgc3RhcnRFZGl0aW5nVGl0bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5tb2RlICE9PSAndmlldycpIHJldHVybjtcbiAgICB0aGlzLmRyYWZ0VGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIHRoaXMubW9kZSA9ICdlZGl0aW5nVGl0bGUnO1xuICAgIC8vIGBtYXJrRm9yQ2hlY2tgIHNvIGNvbnN1bWVycyBjYW4gY2FsbCB0aGlzIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZVxuICAgIC8vIChlLmcuIGFuIGFzeW5jIGNhbGxiYWNrKSB3aXRob3V0IGhhdmluZyB0byB0cmlnZ2VyIENEIHRoZW1zZWx2ZXMuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgLy8gRGVmZXIgZm9jdXMgdW50aWwgQW5ndWxhciBoYXMgcmVuZGVyZWQgdGhlIGlucHV0IGludG8gdGhlIERPTS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNFbmQodGhpcy50aXRsZUlucHV0UmVmKSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgZGVzY3JpcHRpb24tZWRpdCBtb2RlIHByb2dyYW1tYXRpY2FsbHkuIFNhbWUgYmVoYXZpb3IgYXMgY2xpY2tpbmdcbiAgICogdGhlIGRlc2NyaXB0aW9uIChvciB0aGUgXCIrIEFkZCBkZXNjcmlwdGlvblwiIGJ1dHRvbikuIE5vLW9wIGlmIGFscmVhZHlcbiAgICogaW4gYW4gZWRpdGluZyBtb2RlIG9yIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIHN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMubW9kZSAhPT0gJ3ZpZXcnKSByZXR1cm47XG4gICAgdGhpcy5kcmFmdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLm1vZGUgPSAnZWRpdGluZ0Rlc2NyaXB0aW9uJztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNFbmQodGhpcy5kZXNjcmlwdGlvbklucHV0UmVmKSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tbWl0VGl0bGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2VkaXRpbmdUaXRsZScpIHJldHVybjtcbiAgICAvLyBUaXRsZSBjYW5ub3QgYmUgY29tbWl0dGVkIGVtcHR5LiBUaGUgQ2hlY2sgYnV0dG9uIGlzIGRpc2FibGVkIGluIHRoYXRcbiAgICAvLyBzdGF0ZTsgZm9yIEVudGVyIGFuZCBvdXRzaWRlLWNsaWNrIHdlIHJldmVydCB0byB0aGUgY3VycmVudCB0aXRsZSBzb1xuICAgIC8vIHRoZSB1c2VyIGlzIG5ldmVyIHN0dWNrIGluIGVkaXQgbW9kZSB3aXRoIGEgcmVqZWN0ZWQgdmFsdWUuXG4gICAgaWYgKCF0aGlzLmRyYWZ0VGl0bGUpIHtcbiAgICAgIHRoaXMubW9kZSA9ICd2aWV3JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmRyYWZ0VGl0bGU7XG4gICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB0aGlzLm1vZGUgPSAndmlldyc7XG4gICAgdGhpcy50aXRsZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21taXREZXNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlICE9PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykgcmV0dXJuO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kcmFmdERlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICAgIHRoaXMuZGVzY3JpcHRpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWJhbmRvbiB0aGUgY3VycmVudCBlZGl0IGFuZCByZXR1cm4gdG8gdmlldyBtb2RlLiBObyBjaGFuZ2UgaXMgZW1pdHRlZC5cbiAgICogV2lyZWQgdG8gdGhlIEVzY2FwZSBrZXkgb24gYm90aCBlZGl0IGlucHV0czsgYWxzbyBjYWxsZWQgaW50ZXJuYWxseVxuICAgKiB3aGVuIGBkaXNhYmxlZGAgZmxpcHMgdG8gdHJ1ZSBtaWQtZWRpdC5cbiAgICovXG4gIHByb3RlY3RlZCBjYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3ZpZXcnKSByZXR1cm47XG4gICAgdGhpcy5kcmFmdFRpdGxlID0gdGhpcy5fdGl0bGU7XG4gICAgdGhpcy5kcmFmdERlc2NyaXB0aW9uID0gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5tb2RlID0gJ3ZpZXcnO1xuICB9XG5cbiAgLy8gTGlzdGVucyBvbiBgbW91c2Vkb3duYCAobm90IGBjbGlja2ApIHNvIHRoZSBjaGVjayBydW5zIGJlZm9yZSBBbmd1bGFyXG4gIC8vIHJlLXJlbmRlcnMgdGhlIHRyaWdnZXIgZWxlbWVudCBvdXQgb2YgdGhlIERPTSDigJQgb3RoZXJ3aXNlXG4gIC8vIGBob3N0LmNvbnRhaW5zKHRhcmdldClgIHJldHVybnMgZmFsc2UgZm9yIGEgY2xpY2sgdGhhdCBsYW5kZWQgb24gdGhlXG4gIC8vIG5vdy1yZW1vdmVkIGAudGl0bGVgIC8gYC5kZXNjcmlwdGlvbmAgZWxlbWVudC4gU2FtZSBwYXR0ZXJuIGFzXG4gIC8vIGByaXYtZGF0ZWAuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKVxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudE1vdXNlRG93bih0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICd2aWV3JyB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ1RpdGxlJykge1xuICAgICAgdGhpcy5jb21taXRUaXRsZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZWRpdGluZ0Rlc2NyaXB0aW9uJykge1xuICAgICAgdGhpcy5jb21taXREZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBvc2l0aW9uIGNhcmV0IGF0IGVuZCAocmF0aGVyIHRoYW4gc2VsZWN0aW5nIGFsbCkgc28gdGhlIHVzZXIgY2FuIGNvbnRpbnVlXG4gIC8vIHR5cGluZyB3aGVyZSB0aGUgcHJldmlvdXMgdmFsdWUgbGVmdCBvZmYuIGByaXYtdGV4dC1maWVsZGAgaGFuZGxlcyB0aGVcbiAgLy8gZm9jdXMgaXRzZWxmIHZpYSBgW2F1dG9Gb2N1c11gOyB3ZSBqdXN0IGZpeCB1cCB0aGUgc2VsZWN0aW9uIHJhbmdlIG9uIHRoZVxuICAvLyBkZXNjZW5kYW50IGA8aW5wdXQ+YC5cbiAgcHJpdmF0ZSBmb2N1c0VuZChyZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gcmVmPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShsZW4sIGxlbik7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsZWFkaW5nXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm1vZGVcIj5cbiAgICA8IS0tIFZpZXcgbW9kZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInRpdGxlXCJcbiAgICAgICAgW2NsYXNzLmhhcy1kZXNjcmlwdGlvbl09XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHJpdlRydW5jYXRlXG4gICAgICAgIGFyaWEtbGFiZWw9XCJSZW5hbWVcIlxuICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nVGl0bGUoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRpdGxlIHx8ICdVbnRpdGxlZCcgfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGVzY3JpcHRpb247IGVsc2UgYWRkRGVzY3JpcHRpb25cIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHJpdlRydW5jYXRlXG4gICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0IGRlc2NyaXB0aW9uXCJcbiAgICAgICAgKGNsaWNrKT1cInN0YXJ0RWRpdGluZ0Rlc2NyaXB0aW9uKClcIlxuICAgICAgPlxuICAgICAgICB7eyBkZXNjcmlwdGlvbiB9fVxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWRkRGVzY3JpcHRpb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtZGVzY3JpcHRpb24td3JhcFwiICpuZ0lmPVwiIWRpc2FibGVkXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInZ2hvc3QnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIid4c21hbGwnXCJcbiAgICAgICAgICAgIFtpY29uXT1cIidQbHVzJ1wiXG4gICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIidmaXJzdCdcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRFZGl0aW5nRGVzY3JpcHRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIGRlc2NyaXB0aW9uXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlZGl0aW5nVGl0bGUnXCI+XG4gICAgICA8cml2LXRleHQtZmllbGRcbiAgICAgICAgI3RpdGxlSW5wdXRcbiAgICAgICAgY2xhc3M9XCJ0aXRsZS1pbnB1dFwiXG4gICAgICAgIFt2YWx1ZV09XCJkcmFmdFRpdGxlXCJcbiAgICAgICAgW21heExlbmd0aF09XCJ0aXRsZU1heExlbmd0aFwiXG4gICAgICAgIFthdXRvRm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkcmFmdFRpdGxlID0gJGV2ZW50XCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJjYW5jZWwoKVwiXG4gICAgICA+PC9yaXYtdGV4dC1maWVsZD5cbiAgICAgIDxidXR0b25cbiAgICAgICAgcml2QnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNvbW1pdFwiXG4gICAgICAgIFt2YXJpYW50XT1cIidwcmltYXJ5J1wiXG4gICAgICAgIFtpY29uXT1cIidDaGVjaydcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiIWRyYWZ0VGl0bGVcIlxuICAgICAgICAoY2xpY2spPVwiY29tbWl0VGl0bGUoKVwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJTYXZlIHRpdGxlXCJcbiAgICAgID48L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRWRpdGluZyBkZXNjcmlwdGlvbiAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZWRpdGluZ0Rlc2NyaXB0aW9uJ1wiPlxuICAgICAgPHJpdi10ZXh0LWZpZWxkXG4gICAgICAgICNkZXNjcmlwdGlvbklucHV0XG4gICAgICAgIGNsYXNzPVwiZGVzY3JpcHRpb24taW5wdXRcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBhIGRlc2NyaXB0aW9uXCJcbiAgICAgICAgW3ZhbHVlXT1cImRyYWZ0RGVzY3JpcHRpb25cIlxuICAgICAgICBbbWF4TGVuZ3RoXT1cImRlc2NyaXB0aW9uTWF4TGVuZ3RoXCJcbiAgICAgICAgW2F1dG9Gb2N1c109XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRyYWZ0RGVzY3JpcHRpb24gPSAkZXZlbnRcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImNhbmNlbCgpXCJcbiAgICAgID48L3Jpdi10ZXh0LWZpZWxkPlxuICAgICAgPGJ1dHRvblxuICAgICAgICByaXZCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiY29tbWl0XCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2ljb25dPVwiJ0NoZWNrJ1wiXG4gICAgICAgIChjbGljayk9XCJjb21taXREZXNjcmlwdGlvbigpXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlNhdmUgZGVzY3JpcHRpb25cIlxuICAgICAgPjwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWN0aW9uc1wiICpuZ0lmPVwiIWlzRWRpdGluZ1wiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==