@sebgroup/green-angular 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,7 +20,6 @@ export class NggDatepickerComponent {
20
20
  to: this.dp.state?.maxDate?.getFullYear(),
21
21
  });
22
22
  }
23
- this.onTouchedFn && this.onTouchedFn();
24
23
  if (data) {
25
24
  // only emit change event if date has changed
26
25
  if (this.data?.selectedDate !== data.selectedDate) {
@@ -29,9 +28,7 @@ export class NggDatepickerComponent {
29
28
  }
30
29
  this.data = data;
31
30
  }
32
- if (data || state) {
33
- this._cdr.markForCheck();
34
- }
31
+ this._cdr.detectChanges();
35
32
  };
36
33
  }
37
34
  get months() {
@@ -115,6 +112,14 @@ export class NggDatepickerComponent {
115
112
  throw 'Missing one or more elements...';
116
113
  }
117
114
  }
115
+ blurInput() {
116
+ this.onTouchedFn && this.onTouchedFn();
117
+ }
118
+ focusoutDialog(event) {
119
+ if (!this.datepickerDialogElRef?.nativeElement.contains(event.relatedTarget)) {
120
+ this.onTouchedFn && this.onTouchedFn();
121
+ }
122
+ }
118
123
  }
119
124
  NggDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
120
125
  NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDatepickerComponent, selector: "ngg-datepicker", inputs: { options: "options", value: "value", id: "id", label: "label", isValid: "isValid" }, outputs: { valueChange: "valueChange" }, providers: [
@@ -123,7 +128,7 @@ NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
123
128
  useExisting: NggDatepickerComponent,
124
129
  multi: true,
125
130
  },
126
- ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\"><i></i>Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: i1.NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "useValue", "label", "options", "valid", "invalid", "compareWith", "searchFilter", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
131
+ ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n (blur)=\"blurInput()\"\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n (focusout)=\"focusoutDialog($event)\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">\n <i></i>Close\n </button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: i1.NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "useValue", "label", "options", "valid", "invalid", "compareWith", "searchFilter", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
127
132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, decorators: [{
128
133
  type: Component,
129
134
  args: [{ selector: 'ngg-datepicker', providers: [
@@ -132,7 +137,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
132
137
  useExisting: NggDatepickerComponent,
133
138
  multi: true,
134
139
  },
135
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\"><i></i>Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n" }]
140
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n (blur)=\"blurInput()\"\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n (focusout)=\"focusoutDialog($event)\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">\n <i></i>Close\n </button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n" }]
136
141
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { options: [{
137
142
  type: Input
138
143
  }], value: [{
@@ -190,4 +195,4 @@ export function dateValidator(dates) {
190
195
  return null;
191
196
  };
192
197
  }
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEdBR2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFHTCxpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QixPQUFPLEVBTUwsZ0JBQWdCLEVBR2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxHQUVULE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7Ozs7QUFjL0MsTUFBTSxPQUFPLHNCQUFzQjtJQTJEakMsWUFBb0IsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUEzQmxDLE9BQUUsR0FBWSxRQUFRLEVBQUUsQ0FBQTtRQUV4QixZQUFPLEdBQW1CLElBQUksQ0FBQTtRQUNwQixnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFBO1FBaUJuRSxZQUFPLEdBQTBCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQXdDbkQsYUFBUSxHQUFHLENBQ1QsSUFBZ0MsRUFDaEMsS0FBa0MsRUFDbEMsRUFBRTtZQUNGLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUs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QUFJLEVBQUUsQ0FBQTtTQUMzQjtRQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDekUsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUV2RSxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0IsT0FBTztnQkFDTCxTQUFTLEVBQUU7b0JBQ1QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUM5QixVQUFVLEVBQUUsT0FBTztpQkFDcEI7YUFDRixDQUFBO1NBQ0Y7UUFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0IsT0FBTztnQkFDTCxTQUFTLEVBQUU7b0JBQ1QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUM1QixVQUFVLEVBQUUsT0FBTztpQkFDcEI7YUFDRixDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge1xuICBBYnN0cmFjdERyb3Bkb3duLFxuICBEcm9wZG93bkhhbmRsZXIsXG4gIEVsZW1lbnRQcm9wcyxcbiAgRGF0ZXBpY2tlckRhdGEsXG4gIERhdGVwaWNrZXIsXG4gIGNyZWF0ZURhdGVwaWNrZXIsXG4gIERhdGVwaWNrZXJTdGF0ZSxcbiAgRHJvcGRvd25PcHRpb24sXG4gIG1vbnRocyxcbiAgeWVhcnMsXG4gIHJhbmRvbUlkLFxuICBEYXRlcGlja2VyT3B0aW9ucyxcbn0gZnJvbSAnQHNlYmdyb3VwL2V4dHJhY3QnXG5pbXBvcnQgeyBlbmRPZkRheSwgc3RhcnRPZkRheSB9IGZyb20gJ2RhdGUtZm5zJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2ctZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5nZ0RhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdnRGF0ZXBpY2tlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXNcbntcbiAgZ2V0IG1vbnRocygpOiBBcnJheTxEcm9wZG93bk9wdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9tb250aHNcbiAgfVxuXG4gIHNldCBtb250aHModmFsdWU6IEFycmF5PERyb3Bkb3duT3B0aW9uPikge1xuICAgIHRoaXMuX21vbnRocyA9IHZhbHVlXG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG9wdGlvbnMoKTogRGF0ZXBpY2tlck9wdGlvbnMge1xuICAgIHJldHVybiA8RGF0ZXBpY2tlck9wdGlvbnM+dGhpcy5fb3B0aW9uc1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiBEYXRlcGlja2VyT3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZVxuICAgIGlmICh2YWx1ZS5sb2NhbGUpIHtcbiAgICAgIHRoaXMubW9udGhzID0gbW9udGhzKHsgbG9jYWxlOiB0aGlzLm9wdGlvbnM/LmxvY2FsZSB9KVxuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlXG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZVxuICAgICAgaWYgKHRoaXMuX3ZhbHVlICYmIHRoaXMuZHApIHtcbiAgICAgICAgdGhpcy5kcC5zZWxlY3QodGhpcy5fdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nID0gcmFuZG9tSWQoKVxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZ1xuICBASW5wdXQoKSBpc1ZhbGlkOiBib29sZWFuIHwgbnVsbCA9IG51bGxcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJEaWFsb2dFbFJlZicpXG4gIHB1YmxpYyBkYXRlcGlja2VyRGlhbG9nRWxSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXRFbFJlZicpXG4gIHB1YmxpYyBkYXRlSW5wdXRFbFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD5cbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckVsUmVmJykgcHVibGljIGRhdGVwaWNrZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJUcmlnZ2VyRWxSZWYnKVxuICBwdWJsaWMgZGF0ZXBpY2tlclRyaWdnZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+XG5cbiAgb25DaGFuZ2VGbj86ICh2YWx1ZTogYW55KSA9PiB2b2lkXG4gIG9uVG91Y2hlZEZuPzogYW55XG5cbiAgZHJvcGRvd24/OiBBYnN0cmFjdERyb3Bkb3duXG4gIGhhbmRsZXI/OiBEcm9wZG93bkhhbmRsZXJcbiAgdG9nZ2xlcj86IFBhcnRpYWw8RWxlbWVudFByb3BzPlxuICBsaXN0Ym94PzogUGFydGlhbDxFbGVtZW50UHJvcHM+XG4gIF92YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZFxuICBwcml2YXRlIF9tb250aHM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IG1vbnRocyh7fSlcbiAgeWVhcnM/OiBBcnJheTxEcm9wZG93bk9wdGlvbj5cbiAgcHJpdmF0ZSBfb3B0aW9ucz86IERhdGVwaWNrZXJPcHRpb25zXG5cbiAgZHA6IERhdGVwaWNrZXIgfCB1bmRlZmluZWRcbiAgcHJpdmF0ZSBfZGF0YTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm5cbiAgfVxuXG4gIGdldCBkYXRhKCk6IERhdGVwaWNrZXJEYXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVxuICB9XG5cbiAgc2V0IGRhdGEodmFsdWU6IERhdGVwaWNrZXJEYXRhIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlXG4gIH1cblxuICBvbkRhdGVDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAvLyBPbmx5IHBhc3MgdmFsaWQgZGF0ZSB0byBkYXRlIHBpY2tlclxuICAgIGlmICghaXNOYU4obmV3RGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aGlzLmRwPy5zZWxlY3QodmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSlcbiAgICAgIHRoaXMub25DaGFuZ2VGbiAmJiB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpXG4gICAgfVxuICB9XG5cbiAgbGlzdGVuZXIgPSAoXG4gICAgZGF0YTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IERhdGVwaWNrZXJTdGF0ZSB8IHVuZGVmaW5lZFxuICApID0+IHtcbiAgICBpZiAodGhpcy5kcCAmJiBzdGF0ZSkge1xuICAgICAgdGhpcy5kcC5zdGF0ZSA9IHsgLi4uc3RhdGUgfVxuICAgICAgdGhpcy55ZWFycyA9IHllYXJzKHtcbiAgICAgICAgZnJvbTogdGhpcy5kcC5zdGF0ZT8ubWluRGF0ZT8uZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgdG86IHRoaXMuZHAuc3RhdGU/Lm1heERhdGU/LmdldEZ1bGxZZWFyKCksXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMub25Ub3VjaGVkRm4gJiYgdGhpcy5vblRvdWNoZWRGbigpXG5cbiAgICBpZiAoZGF0YSkge1xuICAgICAgLy8gb25seSBlbWl0IGNoYW5nZSBldmVudCBpZiBkYXRlIGhhcyBjaGFuZ2VkXG4gICAgICBpZiAodGhpcy5kYXRhPy5zZWxlY3RlZERhdGUgIT09IGRhdGEuc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkYXRhLnNlbGVjdGVkRGF0ZSlcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuICYmIHRoaXMub25DaGFuZ2VGbihkYXRhLnNlbGVjdGVkRGF0ZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB9XG5cbiAgICBpZiAoZGF0YSB8fCBzdGF0ZSkge1xuICAgICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpXG4gICAgfVxuICB9XG4gIHRyYWNrV2VlayhpbmRleDogYW55LCB3ZWVrOiBhbnkpIHtcbiAgICByZXR1cm4gd2Vla1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vaWdub3JlIGNoYW5nZXMgdW50aWwgZGF0ZXBpY2tlciBoYXMgYmVlbiBpbml0aWFsaXNlZCBpbiBuZ0FmdGVyVmlld0luaXRcbiAgICBpZiAoIXRoaXMuZHApIHJldHVyblxuXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xuICAgICAgdGhpcy5fY3JlYXRlRGF0ZXBpY2tlcigpXG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NyZWF0ZURhdGVwaWNrZXIoKVxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURhdGVwaWNrZXIoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRlcGlja2VyRWxSZWYgJiZcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckRpYWxvZ0VsUmVmICYmXG4gICAgICB0aGlzLmRhdGVJbnB1dEVsUmVmICYmXG4gICAgICB0aGlzLmRhdGVwaWNrZXJUcmlnZ2VyRWxSZWZcbiAgICApIHtcbiAgICAgIHRoaXMuZHAgPSBjcmVhdGVEYXRlcGlja2VyKFxuICAgICAgICB0aGlzLmxpc3RlbmVyLFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICAgIHNlbGVjdGVkRGF0ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyRWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyRGlhbG9nRWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kYXRlSW5wdXRFbFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRhdGVwaWNrZXJUcmlnZ2VyRWxSZWYubmF0aXZlRWxlbWVudFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBvbmUgb3IgbW9yZSBlbGVtZW50cy4uLidcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVWYWxpZGF0b3IoZGF0ZXM/OiB7IG1pbj86IERhdGU7IG1heD86IERhdGUgfSk6IFZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICAgIGNvbnN0IGlzVmFsaWREYXRlID0gIWlzTmFOKG5ld0RhdGUuZ2V0VGltZSgpKVxuICAgIGlmICghaXNWYWxpZERhdGUpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkRGF0ZTogdHJ1ZSB9XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRNaW5EYXRlID0gZGF0ZXM/Lm1pbiA/IG5ld0RhdGUgPj0gc3RhcnRPZkRheShkYXRlcy5taW4pIDogdHJ1ZVxuICAgIGNvbnN0IHZhbGlkTWF4RGF0ZSA9IGRhdGVzPy5tYXggPyBuZXdEYXRlIDw9IGVuZE9mRGF5KGRhdGVzLm1heCkgOiB0cnVlXG5cbiAgICBpZiAoIXZhbGlkTWluRGF0ZSAmJiBkYXRlcz8ubWluKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZERhdGU6IHtcbiAgICAgICAgICBtaW5EYXRlOiBzdGFydE9mRGF5KGRhdGVzLm1pbiksXG4gICAgICAgICAgYWN0dWFsRGF0ZTogbmV3RGF0ZSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF2YWxpZE1heERhdGUgJiYgZGF0ZXM/Lm1heCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWREYXRlOiB7XG4gICAgICAgICAgbWF4RGF0ZTogZW5kT2ZEYXkoZGF0ZXMubWF4KSxcbiAgICAgICAgICBhY3R1YWxEYXRlOiBuZXdEYXRlLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZ3JvdXBcIlxuICAgICNkYXRlcGlja2VyRWxSZWZcbiAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNWYWxpZCA9PT0gZmFsc2VcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICBbYXR0ci5pZF09XCJpZFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIlxuICAgICAgICBmb3JtSW5mbz8uaW5uZXJUZXh0ICYmIGZvcm1JbmZvLmlubmVyVGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgPyBpZCArICdfaW5mbydcbiAgICAgICAgICA6IG51bGxcbiAgICAgIFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBwbGFjZWhvbGRlcj1cInl5eXktbW0tZGRcIlxuICAgICAgI2RhdGVJbnB1dEVsUmVmXG4gICAgICBbdmFsdWVdPVwiZGF0YT8uZm9ybWF0dGVkU2VsZWN0ZWREYXRlIHx8ICcnXCJcbiAgICAgIChjaGFuZ2UpPVwib25EYXRlQ2hhbmdlKGRhdGVJbnB1dEVsUmVmLnZhbHVlKVwiXG4gICAgLz5cbiAgICA8YnV0dG9uXG4gICAgICAjZGF0ZXBpY2tlclRyaWdnZXJFbFJlZlxuICAgICAgKGNsaWNrKT1cImRwPy50b2dnbGUoKVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwicHJpbWFyeVwiXG4gICAgPlxuICAgICAgPGkgY2xhc3M9XCJzZy1pY29uIHNnLWljb24tY2FsZW5kYXJcIj5TZWxlY3QgZGF0ZTwvaT5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxzcGFuIGNsYXNzPVwiZm9ybS1pbmZvXCIgI2Zvcm1JbmZvIFthdHRyLmlkXT1cImlkICsgJ19pbmZvJ1wiXG4gICAgPjxuZy1jb250ZW50IHNlbGVjdD1cIltkYXRhLWZvcm0taW5mb11cIj48L25nLWNvbnRlbnRcbiAgPjwvc3Bhbj5cbjwvZGl2PlxuPCEtLSBUT0RPOiBnZXQgb3Igc2V0IGF0dHJpYnV0ZXMgZnJvbSB3aXRoaW4gZGF0ZXBpY2tlciBpbnN0YW5jZSAoZHApIC0tPlxuPGRpdlxuICAjZGF0ZXBpY2tlckRpYWxvZ0VsUmVmXG4gIGNsYXNzPVwicG9wb3ZlciBwb3BvdmVyLWRhdGVwaWNrZXJcIlxuICBbY2xhc3MuYWN0aXZlXT1cImRwPy5zdGF0ZT8uaXNBY3RpdmVcIlxuICByb2xlPVwiZGlhbG9nXCJcbiAgYXJpYS1tb2RhbD1cInRydWVcIlxuICBhcmlhLWxhYmVsPVwiQ2hvb3NlIERhdGVcIlxuPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgKGNsaWNrKT1cImRwPy5jbG9zZSgpXCI+PGk+PC9pPkNsb3NlPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJzZy1kYXRlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGlua1wiIChjbGljayk9XCJkcD8uc3ViKDEsICdtb250aHMnKVwiPlxuICAgICAgICA8aSBjbGFzcz1cInNnLWljb24gc2ctaWNvbi1wcmV2aW91c1wiPlByZXZpb3VzIG1vbnRoPC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmdnLWRyb3Bkb3duXG4gICAgICAgIFtvcHRpb25zXT1cIm1vbnRoc1wiXG4gICAgICAgIGRpc3BsYXk9XCJrZXlcIlxuICAgICAgICB0ZXh0PVwiU2VsZWN0XCJcbiAgICAgICAgW3ZhbHVlXT1cImRhdGE/Lm1vbnRoXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRwPy5zZXRNb250aCgkZXZlbnQpXCJcbiAgICAgID48L25nZy1kcm9wZG93bj5cbiAgICAgIDxuZ2ctZHJvcGRvd25cbiAgICAgICAgKm5nSWY9XCJ5ZWFyc1wiXG4gICAgICAgIFtvcHRpb25zXT1cInllYXJzXCJcbiAgICAgICAgZGlzcGxheT1cImtleVwiXG4gICAgICAgIHRleHQ9XCJTZWxlY3RcIlxuICAgICAgICBbdmFsdWVdPVwiZGF0YT8ueWVhclwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkcD8uc2V0WWVhcigkZXZlbnQpXCJcbiAgICAgID48L25nZy1kcm9wZG93bj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGlua1wiIChjbGljayk9XCJkcD8uYWRkKDEsICdtb250aHMnKVwiPlxuICAgICAgICA8aSBjbGFzcz1cInNnLWljb24gc2ctaWNvbi1uZXh0XCI+TmV4dCBtb250aDwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvaGVhZGVyPlxuICAgIDxtYWluPlxuICAgICAgPHRhYmxlIHJvbGU9XCJncmlkXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGRhdGE/LmNhbGVuZGFyPy5oZWFkZXJzXCJcbiAgICAgICAgICAgICAgW2FiYnJdPVwiaGVhZGVyLmFiYnJcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2ctd2Vlay1oZWFkZXJdPVwiaGVhZGVyLnR5cGUgPT09ICd3ZWVrJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZy1kYXktaGVhZGVyXT1cImhlYWRlci50eXBlID09PSAnZGF5J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGhlYWRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IHdlZWsgb2YgZGF0YT8uY2FsZW5kYXI/LmNhbGVuZGFyR3JpZDtcbiAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tXZWVrO1xuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdJZj1cImRhdGE/LmNhbGVuZGFyPy53ZWVrTnVtYmVycyBhcyB3ZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ctd2Vlay1udW1iZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB3ZWVrTnVtYmVyc1tpXSB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRhdGVdPVwiZGF5LmZvcm1hdHRlZERhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cImRheS5zZWxlY3RlZCA/ICdncmlkY2VsbCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICBkYXkuc2VsZWN0ZWQgJiYgIWRhdGE/LmhpZ2hsaWdodGVkRGF0ZSA/IHRydWUgOiBudWxsXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkYXkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2ctZGF0ZS10b2RheV09XCJkYXkudG9kYXlcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZGF5LnRvZGF5ID8gJ1RvZGF5JyA6ICcnXCJcbiAgICAgICAgICAgICAgW3RhYkluZGV4XT1cIlxuICAgICAgICAgICAgICAgIGRheS5oaWdobGlnaHRlZCB8fFxuICAgICAgICAgICAgICAgIChkYXkuc2VsZWN0ZWQgJiYgIWRhdGE/LmhpZ2hsaWdodGVkRGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAoZGF5LnRvZGF5ICYmICFkYXRhPy5oaWdobGlnaHRlZERhdGUgJiYgIWRhdGE/LnNlbGVjdGVkRGF0ZSlcbiAgICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgICAgOiAtMVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGF5LmN1cnJlbnRNb250aCAmJiBkcD8uc2VsZWN0KGRheS5kYXRlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGRheS5kYXkgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9tYWluPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEdBR2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFHTCxpQkFBaUIsR0FHbEIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QixPQUFPLEVBTUwsZ0JBQWdCLEVBR2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxHQUVULE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7Ozs7QUFjL0MsTUFBTSxPQUFPLHNCQUFzQjtJQTJEakMsWUFBb0IsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUEzQmxDLE9BQUUsR0FBWSxRQUFRLEVBQUUsQ0FBQTtRQUV4QixZQUFPLEdBQW1CLElBQUksQ0FBQTtRQUNwQixnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFBO1FBaUJuRSxZQUFPLEdBQTBCLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQXdDbkQsYUFBUSxHQUFHLENBQ1QsSUFBZ0MsRUFDaEMsS0FBa0MsRUFDbEMsRUFBRTtZQUNGLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUs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QUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9CLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtTQUMzQjtRQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7UUFDekUsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUV2RSxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0IsT0FBTztnQkFDTCxTQUFTLEVBQUU7b0JBQ1QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUM5QixVQUFVLEVBQUUsT0FBTztpQkFDcEI7YUFDRixDQUFBO1NBQ0Y7UUFDRCxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDL0IsT0FBTztnQkFDTCxTQUFTLEVBQUU7b0JBQ1QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUM1QixVQUFVLEVBQUUsT0FBTztpQkFDcEI7YUFDRixDQUFBO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge1xuICBBYnN0cmFjdERyb3Bkb3duLFxuICBEcm9wZG93bkhhbmRsZXIsXG4gIEVsZW1lbnRQcm9wcyxcbiAgRGF0ZXBpY2tlckRhdGEsXG4gIERhdGVwaWNrZXIsXG4gIGNyZWF0ZURhdGVwaWNrZXIsXG4gIERhdGVwaWNrZXJTdGF0ZSxcbiAgRHJvcGRvd25PcHRpb24sXG4gIG1vbnRocyxcbiAgeWVhcnMsXG4gIHJhbmRvbUlkLFxuICBEYXRlcGlja2VyT3B0aW9ucyxcbn0gZnJvbSAnQHNlYmdyb3VwL2V4dHJhY3QnXG5pbXBvcnQgeyBlbmRPZkRheSwgc3RhcnRPZkRheSB9IGZyb20gJ2RhdGUtZm5zJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2ctZGF0ZXBpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5nZ0RhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdnRGF0ZXBpY2tlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXNcbntcbiAgZ2V0IG1vbnRocygpOiBBcnJheTxEcm9wZG93bk9wdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLl9tb250aHNcbiAgfVxuXG4gIHNldCBtb250aHModmFsdWU6IEFycmF5PERyb3Bkb3duT3B0aW9uPikge1xuICAgIHRoaXMuX21vbnRocyA9IHZhbHVlXG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IG9wdGlvbnMoKTogRGF0ZXBpY2tlck9wdGlvbnMge1xuICAgIHJldHVybiA8RGF0ZXBpY2tlck9wdGlvbnM+dGhpcy5fb3B0aW9uc1xuICB9XG4gIHNldCBvcHRpb25zKHZhbHVlOiBEYXRlcGlja2VyT3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZVxuICAgIGlmICh2YWx1ZS5sb2NhbGUpIHtcbiAgICAgIHRoaXMubW9udGhzID0gbW9udGhzKHsgbG9jYWxlOiB0aGlzLm9wdGlvbnM/LmxvY2FsZSB9KVxuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlXG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZVxuICAgICAgaWYgKHRoaXMuX3ZhbHVlICYmIHRoaXMuZHApIHtcbiAgICAgICAgdGhpcy5kcC5zZWxlY3QodGhpcy5fdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nID0gcmFuZG9tSWQoKVxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZ1xuICBASW5wdXQoKSBpc1ZhbGlkOiBib29sZWFuIHwgbnVsbCA9IG51bGxcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJEaWFsb2dFbFJlZicpXG4gIHB1YmxpYyBkYXRlcGlja2VyRGlhbG9nRWxSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXRFbFJlZicpXG4gIHB1YmxpYyBkYXRlSW5wdXRFbFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD5cbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckVsUmVmJykgcHVibGljIGRhdGVwaWNrZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJUcmlnZ2VyRWxSZWYnKVxuICBwdWJsaWMgZGF0ZXBpY2tlclRyaWdnZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+XG5cbiAgb25DaGFuZ2VGbj86ICh2YWx1ZTogYW55KSA9PiB2b2lkXG4gIG9uVG91Y2hlZEZuPzogYW55XG5cbiAgZHJvcGRvd24/OiBBYnN0cmFjdERyb3Bkb3duXG4gIGhhbmRsZXI/OiBEcm9wZG93bkhhbmRsZXJcbiAgdG9nZ2xlcj86IFBhcnRpYWw8RWxlbWVudFByb3BzPlxuICBsaXN0Ym94PzogUGFydGlhbDxFbGVtZW50UHJvcHM+XG4gIF92YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZFxuICBwcml2YXRlIF9tb250aHM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IG1vbnRocyh7fSlcbiAgeWVhcnM/OiBBcnJheTxEcm9wZG93bk9wdGlvbj5cbiAgcHJpdmF0ZSBfb3B0aW9ucz86IERhdGVwaWNrZXJPcHRpb25zXG5cbiAgZHA6IERhdGVwaWNrZXIgfCB1bmRlZmluZWRcbiAgcHJpdmF0ZSBfZGF0YTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm5cbiAgfVxuXG4gIGdldCBkYXRhKCk6IERhdGVwaWNrZXJEYXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVxuICB9XG5cbiAgc2V0IGRhdGEodmFsdWU6IERhdGVwaWNrZXJEYXRhIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlXG4gIH1cblxuICBvbkRhdGVDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAvLyBPbmx5IHBhc3MgdmFsaWQgZGF0ZSB0byBkYXRlIHBpY2tlclxuICAgIGlmICghaXNOYU4obmV3RGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aGlzLmRwPy5zZWxlY3QodmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSlcbiAgICAgIHRoaXMub25DaGFuZ2VGbiAmJiB0aGlzLm9uQ2hhbmdlRm4odmFsdWUpXG4gICAgfVxuICB9XG5cbiAgbGlzdGVuZXIgPSAoXG4gICAgZGF0YTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IERhdGVwaWNrZXJTdGF0ZSB8IHVuZGVmaW5lZFxuICApID0+IHtcbiAgICBpZiAodGhpcy5kcCAmJiBzdGF0ZSkge1xuICAgICAgdGhpcy5kcC5zdGF0ZSA9IHsgLi4uc3RhdGUgfVxuICAgICAgdGhpcy55ZWFycyA9IHllYXJzKHtcbiAgICAgICAgZnJvbTogdGhpcy5kcC5zdGF0ZT8ubWluRGF0ZT8uZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgdG86IHRoaXMuZHAuc3RhdGU/Lm1heERhdGU/LmdldEZ1bGxZZWFyKCksXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICAvLyBvbmx5IGVtaXQgY2hhbmdlIGV2ZW50IGlmIGRhdGUgaGFzIGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLmRhdGE/LnNlbGVjdGVkRGF0ZSAhPT0gZGF0YS5zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGRhdGEuc2VsZWN0ZWREYXRlKVxuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gJiYgdGhpcy5vbkNoYW5nZUZuKGRhdGEuc2VsZWN0ZWREYXRlKVxuICAgICAgfVxuICAgICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIH1cblxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICB0cmFja1dlZWsoaW5kZXg6IGFueSwgd2VlazogYW55KSB7XG4gICAgcmV0dXJuIHdlZWtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvL2lnbm9yZSBjaGFuZ2VzIHVudGlsIGRhdGVwaWNrZXIgaGFzIGJlZW4gaW5pdGlhbGlzZWQgaW4gbmdBZnRlclZpZXdJbml0XG4gICAgaWYgKCF0aGlzLmRwKSByZXR1cm5cblxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZURhdGVwaWNrZXIoKVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jcmVhdGVEYXRlcGlja2VyKClcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEYXRlcGlja2VyKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckVsUmVmICYmXG4gICAgICB0aGlzLmRhdGVwaWNrZXJEaWFsb2dFbFJlZiAmJlxuICAgICAgdGhpcy5kYXRlSW5wdXRFbFJlZiAmJlxuICAgICAgdGhpcy5kYXRlcGlja2VyVHJpZ2dlckVsUmVmXG4gICAgKSB7XG4gICAgICB0aGlzLmRwID0gY3JlYXRlRGF0ZXBpY2tlcihcbiAgICAgICAgdGhpcy5saXN0ZW5lcixcbiAgICAgICAge1xuICAgICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgICBzZWxlY3RlZERhdGU6IHRoaXMudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckVsUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckRpYWxvZ0VsUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuZGF0ZUlucHV0RWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyVHJpZ2dlckVsUmVmLm5hdGl2ZUVsZW1lbnRcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgJ01pc3Npbmcgb25lIG9yIG1vcmUgZWxlbWVudHMuLi4nXG4gICAgfVxuICB9XG5cbiAgYmx1cklucHV0KCkge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gJiYgdGhpcy5vblRvdWNoZWRGbigpXG4gIH1cblxuICBmb2N1c291dERpYWxvZyhldmVudDogYW55KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZGF0ZXBpY2tlckRpYWxvZ0VsUmVmPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZEZuICYmIHRoaXMub25Ub3VjaGVkRm4oKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVZhbGlkYXRvcihkYXRlcz86IHsgbWluPzogRGF0ZTsgbWF4PzogRGF0ZSB9KTogVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWVcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmFsdWUpXG4gICAgY29uc3QgaXNWYWxpZERhdGUgPSAhaXNOYU4obmV3RGF0ZS5nZXRUaW1lKCkpXG4gICAgaWYgKCFpc1ZhbGlkRGF0ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsaWREYXRlOiB0cnVlIH1cbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZE1pbkRhdGUgPSBkYXRlcz8ubWluID8gbmV3RGF0ZSA+PSBzdGFydE9mRGF5KGRhdGVzLm1pbikgOiB0cnVlXG4gICAgY29uc3QgdmFsaWRNYXhEYXRlID0gZGF0ZXM/Lm1heCA/IG5ld0RhdGUgPD0gZW5kT2ZEYXkoZGF0ZXMubWF4KSA6IHRydWVcblxuICAgIGlmICghdmFsaWRNaW5EYXRlICYmIGRhdGVzPy5taW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkRGF0ZToge1xuICAgICAgICAgIG1pbkRhdGU6IHN0YXJ0T2ZEYXkoZGF0ZXMubWluKSxcbiAgICAgICAgICBhY3R1YWxEYXRlOiBuZXdEYXRlLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXZhbGlkTWF4RGF0ZSAmJiBkYXRlcz8ubWF4KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZERhdGU6IHtcbiAgICAgICAgICBtYXhEYXRlOiBlbmRPZkRheShkYXRlcy5tYXgpLFxuICAgICAgICAgIGFjdHVhbERhdGU6IG5ld0RhdGUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJncm91cFwiXG4gICAgI2RhdGVwaWNrZXJFbFJlZlxuICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc1ZhbGlkID09PSBmYWxzZVwiXG4gID5cbiAgICA8aW5wdXRcbiAgICAgIChibHVyKT1cImJsdXJJbnB1dCgpXCJcbiAgICAgIFthdHRyLmlkXT1cImlkXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiXG4gICAgICAgIGZvcm1JbmZvPy5pbm5lclRleHQgJiYgZm9ybUluZm8uaW5uZXJUZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGlkICsgJ19pbmZvJ1xuICAgICAgICAgIDogbnVsbFxuICAgICAgXCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHBsYWNlaG9sZGVyPVwieXl5eS1tbS1kZFwiXG4gICAgICAjZGF0ZUlucHV0RWxSZWZcbiAgICAgIFt2YWx1ZV09XCJkYXRhPy5mb3JtYXR0ZWRTZWxlY3RlZERhdGUgfHwgJydcIlxuICAgICAgKGNoYW5nZSk9XCJvbkRhdGVDaGFuZ2UoZGF0ZUlucHV0RWxSZWYudmFsdWUpXCJcbiAgICAvPlxuICAgIDxidXR0b25cbiAgICAgICNkYXRlcGlja2VyVHJpZ2dlckVsUmVmXG4gICAgICAoY2xpY2spPVwiZHA/LnRvZ2dsZSgpXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJwcmltYXJ5XCJcbiAgICA+XG4gICAgICA8aSBjbGFzcz1cInNnLWljb24gc2ctaWNvbi1jYWxlbmRhclwiPlNlbGVjdCBkYXRlPC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPHNwYW4gY2xhc3M9XCJmb3JtLWluZm9cIiAjZm9ybUluZm8gW2F0dHIuaWRdPVwiaWQgKyAnX2luZm8nXCJcbiAgICA+PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtZm9ybS1pbmZvXVwiPjwvbmctY29udGVudFxuICA+PC9zcGFuPlxuPC9kaXY+XG48IS0tIFRPRE86IGdldCBvciBzZXQgYXR0cmlidXRlcyBmcm9tIHdpdGhpbiBkYXRlcGlja2VyIGluc3RhbmNlIChkcCkgLS0+XG48ZGl2XG4gICNkYXRlcGlja2VyRGlhbG9nRWxSZWZcbiAgY2xhc3M9XCJwb3BvdmVyIHBvcG92ZXItZGF0ZXBpY2tlclwiXG4gIFtjbGFzcy5hY3RpdmVdPVwiZHA/LnN0YXRlPy5pc0FjdGl2ZVwiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLW1vZGFsPVwidHJ1ZVwiXG4gIGFyaWEtbGFiZWw9XCJDaG9vc2UgRGF0ZVwiXG4gIChmb2N1c291dCk9XCJmb2N1c291dERpYWxvZygkZXZlbnQpXCJcbj5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIChjbGljayk9XCJkcD8uY2xvc2UoKVwiPlxuICAgIDxpPjwvaT5DbG9zZVxuICA8L2J1dHRvbj5cbiAgPGRpdiBjbGFzcz1cInNnLWRhdGVcIj5cbiAgICA8aGVhZGVyPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJsaW5rXCIgKGNsaWNrKT1cImRwPy5zdWIoMSwgJ21vbnRocycpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwic2ctaWNvbiBzZy1pY29uLXByZXZpb3VzXCI+UHJldmlvdXMgbW9udGg8L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZ2ctZHJvcGRvd25cbiAgICAgICAgW29wdGlvbnNdPVwibW9udGhzXCJcbiAgICAgICAgZGlzcGxheT1cImtleVwiXG4gICAgICAgIHRleHQ9XCJTZWxlY3RcIlxuICAgICAgICBbdmFsdWVdPVwiZGF0YT8ubW9udGhcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZHA/LnNldE1vbnRoKCRldmVudClcIlxuICAgICAgPjwvbmdnLWRyb3Bkb3duPlxuICAgICAgPG5nZy1kcm9wZG93blxuICAgICAgICAqbmdJZj1cInllYXJzXCJcbiAgICAgICAgW29wdGlvbnNdPVwieWVhcnNcIlxuICAgICAgICBkaXNwbGF5PVwia2V5XCJcbiAgICAgICAgdGV4dD1cIlNlbGVjdFwiXG4gICAgICAgIFt2YWx1ZV09XCJkYXRhPy55ZWFyXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRwPy5zZXRZZWFyKCRldmVudClcIlxuICAgICAgPjwvbmdnLWRyb3Bkb3duPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJsaW5rXCIgKGNsaWNrKT1cImRwPy5hZGQoMSwgJ21vbnRocycpXCI+XG4gICAgICAgIDxpIGNsYXNzPVwic2ctaWNvbiBzZy1pY29uLW5leHRcIj5OZXh0IG1vbnRoPC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9oZWFkZXI+XG4gICAgPG1haW4+XG4gICAgICA8dGFibGUgcm9sZT1cImdyaWRcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBoZWFkZXIgb2YgZGF0YT8uY2FsZW5kYXI/LmhlYWRlcnNcIlxuICAgICAgICAgICAgICBbYWJicl09XCJoZWFkZXIuYWJiclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZy13ZWVrLWhlYWRlcl09XCJoZWFkZXIudHlwZSA9PT0gJ3dlZWsnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNnLWRheS1oZWFkZXJdPVwiaGVhZGVyLnR5cGUgPT09ICdkYXknXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgaGVhZGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgd2VlayBvZiBkYXRhPy5jYWxlbmRhcj8uY2FsZW5kYXJHcmlkO1xuICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja1dlZWs7XG4gICAgICAgICAgICAgIGxldCBpID0gaW5kZXhcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGF0YT8uY2FsZW5kYXI/LndlZWtOdW1iZXJzIGFzIHdlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZy13ZWVrLW51bWJlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHdlZWtOdW1iZXJzW2ldIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla1wiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJkYXkuZm9ybWF0dGVkRGF0ZVwiXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiZGF5LnNlbGVjdGVkID8gJ2dyaWRjZWxsJyA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgIGRheS5zZWxlY3RlZCAmJiAhZGF0YT8uaGlnaGxpZ2h0ZWREYXRlID8gdHJ1ZSA6IG51bGxcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImRheS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZy1kYXRlLXRvZGF5XT1cImRheS50b2RheVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJkYXkudG9kYXkgPyAnVG9kYXknIDogJydcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiXG4gICAgICAgICAgICAgICAgZGF5LmhpZ2hsaWdodGVkIHx8XG4gICAgICAgICAgICAgICAgKGRheS5zZWxlY3RlZCAmJiAhZGF0YT8uaGlnaGxpZ2h0ZWREYXRlKSB8fFxuICAgICAgICAgICAgICAgIChkYXkudG9kYXkgJiYgIWRhdGE/LmhpZ2hsaWdodGVkRGF0ZSAmJiAhZGF0YT8uc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICA6IC0xXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkYXkuY3VycmVudE1vbnRoICYmIGRwPy5zZWxlY3QoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L21haW4+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -439,7 +439,6 @@ class NggDatepickerComponent {
439
439
  to: (_d = (_c = this.dp.state) === null || _c === void 0 ? void 0 : _c.maxDate) === null || _d === void 0 ? void 0 : _d.getFullYear(),
440
440
  });
441
441
  }
442
- this.onTouchedFn && this.onTouchedFn();
443
442
  if (data) {
444
443
  // only emit change event if date has changed
445
444
  if (((_e = this.data) === null || _e === void 0 ? void 0 : _e.selectedDate) !== data.selectedDate) {
@@ -448,9 +447,7 @@ class NggDatepickerComponent {
448
447
  }
449
448
  this.data = data;
450
449
  }
451
- if (data || state) {
452
- this._cdr.markForCheck();
453
- }
450
+ this._cdr.detectChanges();
454
451
  };
455
452
  }
456
453
  get months() {
@@ -533,6 +530,15 @@ class NggDatepickerComponent {
533
530
  throw 'Missing one or more elements...';
534
531
  }
535
532
  }
533
+ blurInput() {
534
+ this.onTouchedFn && this.onTouchedFn();
535
+ }
536
+ focusoutDialog(event) {
537
+ var _a;
538
+ if (!((_a = this.datepickerDialogElRef) === null || _a === void 0 ? void 0 : _a.nativeElement.contains(event.relatedTarget))) {
539
+ this.onTouchedFn && this.onTouchedFn();
540
+ }
541
+ }
536
542
  }
537
543
  NggDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
538
544
  NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: NggDatepickerComponent, selector: "ngg-datepicker", inputs: { options: "options", value: "value", id: "id", label: "label", isValid: "isValid" }, outputs: { valueChange: "valueChange" }, providers: [
@@ -541,7 +547,7 @@ NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
541
547
  useExisting: NggDatepickerComponent,
542
548
  multi: true,
543
549
  },
544
- ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\"><i></i>Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "useValue", "label", "options", "valid", "invalid", "compareWith", "searchFilter", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
550
+ ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n (blur)=\"blurInput()\"\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n (focusout)=\"focusoutDialog($event)\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">\n <i></i>Close\n </button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "texts", "loop", "display", "useValue", "label", "options", "valid", "invalid", "compareWith", "searchFilter", "multiSelect", "searchable", "value"], outputs: ["valueChange", "touched"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
545
551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: NggDatepickerComponent, decorators: [{
546
552
  type: Component,
547
553
  args: [{ selector: 'ngg-datepicker', providers: [
@@ -550,7 +556,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImpor
550
556
  useExisting: NggDatepickerComponent,
551
557
  multi: true,
552
558
  },
553
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\"><i></i>Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n" }]
559
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"isValid\"\n [class.is-invalid]=\"isValid === false\"\n >\n <input\n (blur)=\"blurInput()\"\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"onDateChange(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n (focusout)=\"focusoutDialog($event)\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">\n <i></i>Close\n </button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n *ngIf=\"years\"\n [options]=\"years\"\n display=\"key\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"day.disabled\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n" }]
554
560
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { options: [{
555
561
  type: Input
556
562
  }], value: [{