@gravitee/ui-particles-angular 15.10.2 → 15.10.3-apim-9967-471bf98

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,6 +20,7 @@ import { MatInput } from '@angular/material/input';
20
20
  import { MatButton } from '@angular/material/button';
21
21
  import { MatProgressBarModule } from '@angular/material/progress-bar';
22
22
  import { MatTooltipModule } from '@angular/material/tooltip';
23
+ import { MatIconButton } from '@angular/material/button';
23
24
  import { GioElService } from '../gio-el.service';
24
25
  import { isPromptError, isPromptSuccess } from '../models/ElAiPromptState';
25
26
  import { GioIconsModule } from '../../gio-icons/gio-icons.module';
@@ -29,17 +30,19 @@ import * as i0 from "@angular/core";
29
30
  import * as i1 from "@angular/forms";
30
31
  import * as i2 from "@angular/material/input";
31
32
  import * as i3 from "@angular/material/progress-bar";
32
- import * as i4 from "@angular/material/icon";
33
- import * as i5 from "../../gio-banner/gio-banner.component";
34
- import * as i6 from "../../gio-clipboard/gio-clipboard-copy-wrapper.component";
33
+ import * as i4 from "@angular/material/tooltip";
34
+ import * as i5 from "@angular/material/icon";
35
+ import * as i6 from "../../gio-banner/gio-banner.component";
36
+ import * as i7 from "../../gio-clipboard/gio-clipboard-copy-wrapper.component";
35
37
  export class GioElPromptComponent {
36
38
  constructor() {
37
39
  this.maxPromptSize = 256;
38
40
  this.aiRequestFormGroup = new FormGroup({
39
- prompt: new FormControl('', [Validators.required, Validators.max(this.maxPromptSize)]),
41
+ prompt: new FormControl('', [Validators.required, Validators.maxLength(this.maxPromptSize)]),
40
42
  });
41
43
  this.elService = inject(GioElService);
42
44
  this.responseState = signal(null);
45
+ this.feedbackState = signal(null);
43
46
  this.el = computed(() => {
44
47
  const state = this.responseState();
45
48
  return isPromptSuccess(state) ? state.el : null;
@@ -48,6 +51,14 @@ export class GioElPromptComponent {
48
51
  const state = this.responseState();
49
52
  return isPromptError(state) ? state.message : null;
50
53
  });
54
+ this.showFeedback = computed(() => {
55
+ const state = this.responseState();
56
+ const feedback = this.feedbackState();
57
+ return isPromptSuccess(state) && feedback === null;
58
+ });
59
+ }
60
+ get prompt() {
61
+ return this.aiRequestFormGroup.get('prompt');
51
62
  }
52
63
  ngAfterViewInit() {
53
64
  setTimeout(() => {
@@ -60,10 +71,18 @@ export class GioElPromptComponent {
60
71
  return;
61
72
  }
62
73
  this.responseState.set('loading');
74
+ this.feedbackState.set(null); // Reset feedback when sending new prompt
63
75
  this.elService.prompt(prompt).subscribe(reply => this.responseState.set(reply));
64
76
  }
77
+ submitFeedback(feedback) {
78
+ this.feedbackState.set(feedback);
79
+ const expression = this.el();
80
+ if (expression) {
81
+ this.elService.submitFeedback(feedback, expression).subscribe();
82
+ }
83
+ }
65
84
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
66
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ aiRequestFormGroup.get('prompt')?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i5.GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: i5.GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: i5.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: i6.GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
85
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i6.GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: i6.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: i6.GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: i6.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: i7.GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
86
  }
68
87
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, decorators: [{
69
88
  type: Component,
@@ -74,14 +93,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
74
93
  MatButton,
75
94
  MatProgressBarModule,
76
95
  MatTooltipModule,
96
+ MatIconButton,
77
97
  GioIconsModule,
78
98
  GioBannerModule,
79
99
  GioClipboardModule,
80
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ aiRequestFormGroup.get('prompt')?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}\n"] }]
100
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"] }]
81
101
  }], propDecorators: { responseState: [{
82
102
  type: Input
83
103
  }], myInput: [{
84
104
  type: ViewChild,
85
105
  args: ['promptArea']
86
106
  }] } });
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLXByb21wdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwtcHJvbXB0L2dpby1lbC1wcm9tcHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZWwvZ2lvLWVsLXByb21wdC9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQXFCOUUsTUFBTSxPQUFPLG9CQUFvQjtJQWpCakM7UUFrQmtCLGtCQUFhLEdBQUcsR0FBRyxDQUFDO1FBQzdCLHVCQUFrQixHQUVwQixJQUFJLFNBQVMsQ0FBQztZQUNqQixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3ZGLENBQUMsQ0FBQztRQUNJLGNBQVMsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRy9DLGtCQUFhLEdBQXVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUdqRSxPQUFFLEdBQTBCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSSxpQkFBWSxHQUEwQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0tBZ0JKO0lBZFEsZUFBZTtRQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7OEdBbkNVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDROQzVEakMsMHdEQWdEQSwybEJEQUksbUJBQW1CLG0yQkFDbkIsa0JBQWtCLG1ZQUNsQixRQUFRLHdWQUNSLFNBQVMsZ0xBQ1Qsb0JBQW9CLHdOQUNwQixnQkFBZ0IsOEJBQ2hCLGNBQWMsbUxBQ2QsZUFBZSxxU0FDZixrQkFBa0I7OzJGQUlULG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQjt3QkFDUCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixTQUFTO3dCQUNULG9CQUFvQjt3QkFDcEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2Ysa0JBQWtCO3FCQUNuQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFZeEMsYUFBYTtzQkFEbkIsS0FBSztnQkFFMEIsT0FBTztzQkFBdEMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEdpb0VsU2VydmljZSB9IGZyb20gJy4uL2dpby1lbC5zZXJ2aWNlJztcbmltcG9ydCB7IEVsQWlQcm9tcHRTdGF0ZSwgaXNQcm9tcHRFcnJvciwgaXNQcm9tcHRTdWNjZXNzIH0gZnJvbSAnLi4vbW9kZWxzL0VsQWlQcm9tcHRTdGF0ZSc7XG5pbXBvcnQgeyBHaW9JY29uc01vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1pY29ucy9naW8taWNvbnMubW9kdWxlJztcbmltcG9ydCB7IEdpb0Jhbm5lck1vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1iYW5uZXIvZ2lvLWJhbm5lci5tb2R1bGUnO1xuaW1wb3J0IHsgR2lvQ2xpcGJvYXJkTW9kdWxlIH0gZnJvbSAnLi4vLi4vZ2lvLWNsaXBib2FyZC9naW8tY2xpcGJvYXJkLm1vZHVsZSc7XG5cbnR5cGUgUHJvbXB0U3RhdGUgPSAnbG9hZGluZycgfCBFbEFpUHJvbXB0U3RhdGU7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpby1lbC1wcm9tcHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLWVsLXByb21wdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5zY3NzJyxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0LFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIEdpb0ljb25zTW9kdWxlLFxuICAgIEdpb0Jhbm5lck1vZHVsZSxcbiAgICBHaW9DbGlwYm9hcmRNb2R1bGUsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHaW9FbFByb21wdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4UHJvbXB0U2l6ZSA9IDI1NjtcbiAgcHVibGljIGFpUmVxdWVzdEZvcm1Hcm91cDogRm9ybUdyb3VwPHtcbiAgICBwcm9tcHQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHByb21wdDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXhQcm9tcHRTaXplKV0pLFxuICB9KTtcbiAgcHVibGljIGVsU2VydmljZTogR2lvRWxTZXJ2aWNlID0gaW5qZWN0KEdpb0VsU2VydmljZSk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHJlc3BvbnNlU3RhdGU6IFdyaXRhYmxlU2lnbmFsPFByb21wdFN0YXRlIHwgbnVsbD4gPSBzaWduYWwobnVsbCk7XG4gIEBWaWV3Q2hpbGQoJ3Byb21wdEFyZWEnKSBwdWJsaWMgbXlJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcHVibGljIGVsOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICByZXR1cm4gaXNQcm9tcHRTdWNjZXNzKHN0YXRlKSA/IHN0YXRlLmVsIDogbnVsbDtcbiAgfSk7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IFNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzcG9uc2VTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdEVycm9yKHN0YXRlKSA/IHN0YXRlLm1lc3NhZ2UgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kUHJvbXB0VG9JQSgpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmFpUmVxdWVzdEZvcm1Hcm91cC5nZXQoJ3Byb21wdCcpPy52YWx1ZTtcbiAgICBpZiAoIXByb21wdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3BvbnNlU3RhdGUuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5lbFNlcnZpY2UucHJvbXB0KHByb21wdCkuc3Vic2NyaWJlKHJlcGx5ID0+IHRoaXMucmVzcG9uc2VTdGF0ZS5zZXQocmVwbHkpKTtcbiAgfVxufVxuIiwiPCEtLVxuXG4gICAgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuLS0+XG48aDU+RUwgSUEgQXNzaXN0YW50PC9oNT5cblxuPGRpdiBjbGFzcz1cImFpUmVxdWVzdEZvcm1cIiBbZm9ybUdyb3VwXT1cImFpUmVxdWVzdEZvcm1Hcm91cFwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cbiAgICA8bWF0LWxhYmVsPkRlc2NyaWJlIHRoZSBFTCB5b3Ugd2FudCB0byBnZW5lcmF0ZTwvbWF0LWxhYmVsPlxuICAgIDx0ZXh0YXJlYSAjcHJvbXB0QXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDxtYXQtaGludCBbYWxpZ25dPVwiJ2VuZCdcIj57eyBhaVJlcXVlc3RGb3JtR3JvdXAuZ2V0KCdwcm9tcHQnKT8udmFsdWU/Lmxlbmd0aCB8fCAwIH19L3t7IG1heFByb21wdFNpemUgfX08L21hdC1oaW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImFpUmVxdWVzdEZvcm1Hcm91cC5pbnZhbGlkXCIgKGNsaWNrKT1cInNlbmRQcm9tcHRUb0lBKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptYWdpYy13YW5kXCIgLz5cbiAgICBBc2sgTmV3dCBBSVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWktY2FyZF9fY29udGVudF9fcmVzcG9uc2VcIj5cbiAgQGlmIChyZXNwb25zZVN0YXRlKCkgPT09ICdsb2FkaW5nJykge1xuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgY2xhc3M9XCJsb2FkaW5nXCIgLz5cbiAgfVxuICBAaWYgKGVsKCk7IGFzIGV4cHJlc3Npb24pIHtcbiAgICA8Z2lvLWJhbm5lci1zdWNjZXNzPlxuICAgICAgPGNvZGUgZ2lvQ2xpcGJvYXJkQ29weVdyYXBwZXIgW2NvbnRlbnRUb0NvcHldPVwiZXhwcmVzc2lvblwiIFthbHdheXNWaXNpYmxlXT1cInRydWVcIj57eyBleHByZXNzaW9uIH19PC9jb2RlPlxuICAgIDwvZ2lvLWJhbm5lci1zdWNjZXNzPlxuICB9XG4gIEBpZiAoZXJyb3JNZXNzYWdlKCk7IGFzIG1lc3NhZ2UpIHtcbiAgICA8Z2lvLWJhbm5lci1lcnJvcj5cbiAgICAgIEVycm9yXG4gICAgICA8c3BhbiBnaW9CYW5uZXJCb2R5PiB7eyBtZXNzYWdlIH19IDwvc3Bhbj5cbiAgICA8L2dpby1iYW5uZXItZXJyb3I+XG4gIH1cbjwvZGl2PlxuIl19
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLXByb21wdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwtcHJvbXB0L2dpby1lbC1wcm9tcHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZWwvZ2lvLWVsLXByb21wdC9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFtQixhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7O0FBdUI5RSxNQUFNLE9BQU8sb0JBQW9CO0lBbEJqQztRQW1Ca0Isa0JBQWEsR0FBRyxHQUFHLENBQUM7UUFDN0IsdUJBQWtCLEdBRXBCLElBQUksU0FBUyxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBQ0ksY0FBUyxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFHL0Msa0JBQWEsR0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR2pFLGtCQUFhLEdBQWtDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUs1RCxPQUFFLEdBQTBCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSSxpQkFBWSxHQUEwQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUksaUJBQVksR0FBb0IsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7S0F5Qko7SUF6Q0MsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFnQk0sZUFBZTtRQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFTSxjQUFjLENBQUMsUUFBbUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7OEdBdkRVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDROQy9EakMseXRGQTBFQSxpOUJEeEJJLG1CQUFtQixtMkJBQ25CLGtCQUFrQixtWUFDbEIsUUFBUSx3VkFDUixTQUFTLGdMQUNULG9CQUFvQix3TkFDcEIsZ0JBQWdCLDZUQUNoQixhQUFhLDRGQUNiLGNBQWMsbUxBQ2QsZUFBZSwwWEFDZixrQkFBa0I7OzJGQUlULG9CQUFvQjtrQkFsQmhDLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQjt3QkFDUCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixTQUFTO3dCQUNULG9CQUFvQjt3QkFDcEIsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixrQkFBa0I7cUJBQ25CLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQVl4QyxhQUFhO3NCQURuQixLQUFLO2dCQUUwQixPQUFPO3NCQUF0QyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIFNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuXG5pbXBvcnQgeyBHaW9FbFNlcnZpY2UgfSBmcm9tICcuLi9naW8tZWwuc2VydmljZSc7XG5pbXBvcnQgeyBFbEFpUHJvbXB0U3RhdGUsIGlzUHJvbXB0RXJyb3IsIGlzUHJvbXB0U3VjY2VzcyB9IGZyb20gJy4uL21vZGVscy9FbEFpUHJvbXB0U3RhdGUnO1xuaW1wb3J0IHsgR2lvSWNvbnNNb2R1bGUgfSBmcm9tICcuLi8uLi9naW8taWNvbnMvZ2lvLWljb25zLm1vZHVsZSc7XG5pbXBvcnQgeyBHaW9CYW5uZXJNb2R1bGUgfSBmcm9tICcuLi8uLi9naW8tYmFubmVyL2dpby1iYW5uZXIubW9kdWxlJztcbmltcG9ydCB7IEdpb0NsaXBib2FyZE1vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1jbGlwYm9hcmQvZ2lvLWNsaXBib2FyZC5tb2R1bGUnO1xuXG50eXBlIFByb21wdFN0YXRlID0gJ2xvYWRpbmcnIHwgRWxBaVByb21wdFN0YXRlO1xudHlwZSBGZWVkYmFja1N0YXRlID0gJ2hlbHBmdWwnIHwgJ25vdC1oZWxwZnVsJyB8IG51bGw7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpby1lbC1wcm9tcHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLWVsLXByb21wdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5zY3NzJyxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0LFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgR2lvSWNvbnNNb2R1bGUsXG4gICAgR2lvQmFubmVyTW9kdWxlLFxuICAgIEdpb0NsaXBib2FyZE1vZHVsZSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEdpb0VsUHJvbXB0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHB1YmxpYyByZWFkb25seSBtYXhQcm9tcHRTaXplID0gMjU2O1xuICBwdWJsaWMgYWlSZXF1ZXN0Rm9ybUdyb3VwOiBGb3JtR3JvdXA8e1xuICAgIHByb21wdDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XG4gIH0+ID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgcHJvbXB0OiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heFByb21wdFNpemUpXSksXG4gIH0pO1xuICBwdWJsaWMgZWxTZXJ2aWNlOiBHaW9FbFNlcnZpY2UgPSBpbmplY3QoR2lvRWxTZXJ2aWNlKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgcmVzcG9uc2VTdGF0ZTogV3JpdGFibGVTaWduYWw8UHJvbXB0U3RhdGUgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgQFZpZXdDaGlsZCgncHJvbXB0QXJlYScpIHB1YmxpYyBteUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwdWJsaWMgZmVlZGJhY2tTdGF0ZTogV3JpdGFibGVTaWduYWw8RmVlZGJhY2tTdGF0ZT4gPSBzaWduYWwobnVsbCk7XG5cbiAgcHVibGljIGdldCBwcm9tcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWlSZXF1ZXN0Rm9ybUdyb3VwLmdldCgncHJvbXB0Jyk7XG4gIH1cbiAgcHVibGljIGVsOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICByZXR1cm4gaXNQcm9tcHRTdWNjZXNzKHN0YXRlKSA/IHN0YXRlLmVsIDogbnVsbDtcbiAgfSk7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IFNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzcG9uc2VTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdEVycm9yKHN0YXRlKSA/IHN0YXRlLm1lc3NhZ2UgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgc2hvd0ZlZWRiYWNrOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICBjb25zdCBmZWVkYmFjayA9IHRoaXMuZmVlZGJhY2tTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdFN1Y2Nlc3Moc3RhdGUpICYmIGZlZWRiYWNrID09PSBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kUHJvbXB0VG9JQSgpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmFpUmVxdWVzdEZvcm1Hcm91cC5nZXQoJ3Byb21wdCcpPy52YWx1ZTtcbiAgICBpZiAoIXByb21wdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3BvbnNlU3RhdGUuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5mZWVkYmFja1N0YXRlLnNldChudWxsKTsgLy8gUmVzZXQgZmVlZGJhY2sgd2hlbiBzZW5kaW5nIG5ldyBwcm9tcHRcbiAgICB0aGlzLmVsU2VydmljZS5wcm9tcHQocHJvbXB0KS5zdWJzY3JpYmUocmVwbHkgPT4gdGhpcy5yZXNwb25zZVN0YXRlLnNldChyZXBseSkpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZlZWRiYWNrKGZlZWRiYWNrOiAnaGVscGZ1bCcgfCAnbm90LWhlbHBmdWwnKSB7XG4gICAgdGhpcy5mZWVkYmFja1N0YXRlLnNldChmZWVkYmFjayk7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZWwoKTtcbiAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgdGhpcy5lbFNlcnZpY2Uuc3VibWl0RmVlZGJhY2soZmVlZGJhY2ssIGV4cHJlc3Npb24pLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuXG4gICAgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuLS0+XG48aDU+RUwgSUEgQXNzaXN0YW50PC9oNT5cblxuPGRpdiBjbGFzcz1cImFpUmVxdWVzdEZvcm1cIiBbZm9ybUdyb3VwXT1cImFpUmVxdWVzdEZvcm1Hcm91cFwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cbiAgICA8bWF0LWxhYmVsPkRlc2NyaWJlIHRoZSBFTCB5b3Ugd2FudCB0byBnZW5lcmF0ZTwvbWF0LWxhYmVsPlxuICAgIDx0ZXh0YXJlYSAjcHJvbXB0QXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDxtYXQtaGludCBbYWxpZ25dPVwiJ2VuZCdcIj57eyBwcm9tcHQ/LnZhbHVlPy5sZW5ndGggfHwgMCB9fS97eyBtYXhQcm9tcHRTaXplIH19PC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICBAaWYgKHByb21wdD8udG91Y2hlZCAmJiBwcm9tcHQ/Lmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgIDxnaW8tYmFubmVyLWVycm9yPiBZb3VyIHByb21wdCBpcyB0b28gbG9uZy4gSXQgc2hvdWxkIGJlIGxlc3MgdGhhbiB7eyBtYXhQcm9tcHRTaXplIH19IGNoYXJhY3RlcnMuIDwvZ2lvLWJhbm5lci1lcnJvcj5cbiAgfVxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImFpUmVxdWVzdEZvcm1Hcm91cC5pbnZhbGlkXCIgKGNsaWNrKT1cInNlbmRQcm9tcHRUb0lBKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptYWdpYy13YW5kXCIgLz5cbiAgICBBc2sgTmV3dCBBSVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWktY2FyZF9fY29udGVudF9fcmVzcG9uc2VcIj5cbiAgQGlmIChyZXNwb25zZVN0YXRlKCkgPT09ICdsb2FkaW5nJykge1xuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgY2xhc3M9XCJsb2FkaW5nXCIgLz5cbiAgfVxuICBAaWYgKGVsKCk7IGFzIGV4cHJlc3Npb24pIHtcbiAgICA8Z2lvLWJhbm5lci1zdWNjZXNzPlxuICAgICAgPGNvZGUgZ2lvQ2xpcGJvYXJkQ29weVdyYXBwZXIgW2NvbnRlbnRUb0NvcHldPVwiZXhwcmVzc2lvblwiIFthbHdheXNWaXNpYmxlXT1cInRydWVcIj57eyBleHByZXNzaW9uIH19PC9jb2RlPlxuICAgIDwvZ2lvLWJhbm5lci1zdWNjZXNzPlxuICAgIEBpZiAoc2hvd0ZlZWRiYWNrKCkpIHtcbiAgICAgIDxnaW8tYmFubmVyLWluZm8+XG4gICAgICAgIFdhcyB0aGUgYW5zd2VyIGhlbHBmdWw/XG4gICAgICAgIDxzcGFuIGdpb0Jhbm5lckJvZHkgY2xhc3M9XCJmZWVkYmFjay1idXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic3VibWl0RmVlZGJhY2soJ2hlbHBmdWwnKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiWWVzLCB0aGlzIHdhcyBoZWxwZnVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGZlZWRiYWNrLWJ1dHRvbi0taGVscGZ1bFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86dGh1bWJzLXVwXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGZWVkYmFjaygnbm90LWhlbHBmdWwnKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTm8sIHRoaXMgd2FzIG5vdCBoZWxwZnVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGZlZWRiYWNrLWJ1dHRvbi0tbm90LWhlbHBmdWxcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnRodW1icy1kb3duXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9naW8tYmFubmVyLWluZm8+XG4gICAgfVxuICB9XG4gIEBpZiAoZXJyb3JNZXNzYWdlKCk7IGFzIG1lc3NhZ2UpIHtcbiAgICA8Z2lvLWJhbm5lci1lcnJvcj5cbiAgICAgIEVycm9yXG4gICAgICA8c3BhbiBnaW9CYW5uZXJCb2R5PiB7eyBtZXNzYWdlIH19IDwvc3Bhbj5cbiAgICA8L2dpby1iYW5uZXItZXJyb3I+XG4gIH1cbjwvZGl2PlxuIl19
@@ -19,18 +19,30 @@ import * as i0 from "@angular/core";
19
19
  export class GioElService {
20
20
  constructor() {
21
21
  this._promptCallback = undefined;
22
+ this._feedbackCallback = undefined;
22
23
  }
23
24
  prompt(prompt) {
24
25
  if (this._promptCallback === undefined) {
25
26
  return of({
26
- message: `Error: no handler given (input prompt: ${prompt})`,
27
+ el: 'Some fancy EL prompt',
27
28
  });
28
29
  }
29
30
  return this._promptCallback(prompt);
30
31
  }
32
+ submitFeedback(feedback, expression) {
33
+ if (this._feedbackCallback === undefined) {
34
+ // For now, just log the feedback - in a real implementation, this would send to backend
35
+ console.log('Feedback submitted:', { feedback, expression });
36
+ return of(undefined);
37
+ }
38
+ return this._feedbackCallback(feedback, expression);
39
+ }
31
40
  set promptCallback(value) {
32
41
  this._promptCallback = value;
33
42
  }
43
+ set feedbackCallback(value) {
44
+ this._feedbackCallback = value;
45
+ }
34
46
  isEnabled() {
35
47
  return this._promptCallback !== undefined;
36
48
  }
@@ -43,4 +55,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
43
55
  providedIn: 'root',
44
56
  }]
45
57
  }] });
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFPdEMsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJVSxvQkFBZSxHQUFxRCxTQUFTLENBQUM7S0FrQnZGO0lBaEJRLE1BQU0sQ0FBQyxNQUFjO1FBQzFCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQztnQkFDUixPQUFPLEVBQUUsMENBQTBDLE1BQU0sR0FBRzthQUM3RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFXLGNBQWMsQ0FBQyxLQUFzRDtRQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRU0sU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUM7SUFDNUMsQ0FBQzs4R0FsQlUsWUFBWTtrSEFBWixZQUFZLGNBRlgsTUFBTTs7MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWxBaVByb21wdFN0YXRlIH0gZnJvbSAnLi9tb2RlbHMvRWxBaVByb21wdFN0YXRlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEdpb0VsU2VydmljZSB7XG4gIHByaXZhdGUgX3Byb21wdENhbGxiYWNrPzogKHByb21wdDogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEVsQWlQcm9tcHRTdGF0ZT4gPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHByb21wdChwcm9tcHQ6IHN0cmluZyk6IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPiB7XG4gICAgaWYgKHRoaXMuX3Byb21wdENhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvZih7XG4gICAgICAgIG1lc3NhZ2U6IGBFcnJvcjogbm8gaGFuZGxlciBnaXZlbiAoaW5wdXQgcHJvbXB0OiAke3Byb21wdH0pYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJvbXB0Q2FsbGJhY2socHJvbXB0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcHJvbXB0Q2FsbGJhY2sodmFsdWU6IChwcm9tcHQ6IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxFbEFpUHJvbXB0U3RhdGU+KSB7XG4gICAgdGhpcy5fcHJvbXB0Q2FsbGJhY2sgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21wdENhbGxiYWNrICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFTdEMsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJVSxvQkFBZSxHQUFxRCxTQUFTLENBQUM7UUFDOUUsc0JBQWlCLEdBQXNFLFNBQVMsQ0FBQztLQStCMUc7SUE3QlEsTUFBTSxDQUFDLE1BQWM7UUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxDQUFDO2dCQUNSLEVBQUUsRUFBRSxzQkFBc0I7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQXNCLEVBQUUsVUFBa0I7UUFDOUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsd0ZBQXdGO1lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFXLGNBQWMsQ0FBQyxLQUFzRDtRQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxnQkFBZ0IsQ0FBQyxLQUF1RTtRQUNqRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQztJQUM1QyxDQUFDOzhHQWhDVSxZQUFZO2tIQUFaLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBFbEFpUHJvbXB0U3RhdGUgfSBmcm9tICcuL21vZGVscy9FbEFpUHJvbXB0U3RhdGUnO1xuXG5leHBvcnQgdHlwZSBGZWVkYmFja1R5cGUgPSAnaGVscGZ1bCcgfCAnbm90LWhlbHBmdWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgR2lvRWxTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfcHJvbXB0Q2FsbGJhY2s/OiAocHJvbXB0OiBzdHJpbmcpID0+IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZmVlZGJhY2tDYWxsYmFjaz86IChmZWVkYmFjazogRmVlZGJhY2tUeXBlLCBleHByZXNzaW9uOiBzdHJpbmcpID0+IE9ic2VydmFibGU8dm9pZD4gPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHByb21wdChwcm9tcHQ6IHN0cmluZyk6IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPiB7XG4gICAgaWYgKHRoaXMuX3Byb21wdENhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvZih7XG4gICAgICAgIGVsOiAnU29tZSBmYW5jeSBFTCBwcm9tcHQnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9tcHRDYWxsYmFjayhwcm9tcHQpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZlZWRiYWNrKGZlZWRiYWNrOiBGZWVkYmFja1R5cGUsIGV4cHJlc3Npb246IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9mZWVkYmFja0NhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZvciBub3csIGp1c3QgbG9nIHRoZSBmZWVkYmFjayAtIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzZW5kIHRvIGJhY2tlbmRcbiAgICAgIGNvbnNvbGUubG9nKCdGZWVkYmFjayBzdWJtaXR0ZWQ6JywgeyBmZWVkYmFjaywgZXhwcmVzc2lvbiB9KTtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmVlZGJhY2tDYWxsYmFjayhmZWVkYmFjaywgZXhwcmVzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgc2V0IHByb21wdENhbGxiYWNrKHZhbHVlOiAocHJvbXB0OiBzdHJpbmcpID0+IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPikge1xuICAgIHRoaXMuX3Byb21wdENhbGxiYWNrID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZlZWRiYWNrQ2FsbGJhY2sodmFsdWU6IChmZWVkYmFjazogRmVlZGJhY2tUeXBlLCBleHByZXNzaW9uOiBzdHJpbmcpID0+IE9ic2VydmFibGU8dm9pZD4pIHtcbiAgICB0aGlzLl9mZWVkYmFja0NhbGxiYWNrID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9tcHRDYWxsYmFjayAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -8,7 +8,7 @@ import { CommonModule } from '@angular/common';
8
8
  import * as i2 from '@angular/material/card';
9
9
  import { MatCardModule } from '@angular/material/card';
10
10
  import * as i3 from '@angular/material/button';
11
- import { MatButtonModule, MatButton } from '@angular/material/button';
11
+ import { MatButtonModule, MatButton, MatIconButton } from '@angular/material/button';
12
12
  import { ComponentHarness, HarnessPredicate, parallel, TestKey } from '@angular/cdk/testing';
13
13
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
14
14
  import { MatFormFieldControl, MatFormFieldModule, MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
@@ -1213,18 +1213,30 @@ class GioConfirmAndValidateDialogHarness extends ComponentHarness {
1213
1213
  class GioElService {
1214
1214
  constructor() {
1215
1215
  this._promptCallback = undefined;
1216
+ this._feedbackCallback = undefined;
1216
1217
  }
1217
1218
  prompt(prompt) {
1218
1219
  if (this._promptCallback === undefined) {
1219
1220
  return of({
1220
- message: `Error: no handler given (input prompt: ${prompt})`,
1221
+ el: 'Some fancy EL prompt',
1221
1222
  });
1222
1223
  }
1223
1224
  return this._promptCallback(prompt);
1224
1225
  }
1226
+ submitFeedback(feedback, expression) {
1227
+ if (this._feedbackCallback === undefined) {
1228
+ // For now, just log the feedback - in a real implementation, this would send to backend
1229
+ console.log('Feedback submitted:', { feedback, expression });
1230
+ return of(undefined);
1231
+ }
1232
+ return this._feedbackCallback(feedback, expression);
1233
+ }
1225
1234
  set promptCallback(value) {
1226
1235
  this._promptCallback = value;
1227
1236
  }
1237
+ set feedbackCallback(value) {
1238
+ this._feedbackCallback = value;
1239
+ }
1228
1240
  isEnabled() {
1229
1241
  return this._promptCallback !== undefined;
1230
1242
  }
@@ -1493,10 +1505,11 @@ class GioElPromptComponent {
1493
1505
  constructor() {
1494
1506
  this.maxPromptSize = 256;
1495
1507
  this.aiRequestFormGroup = new FormGroup({
1496
- prompt: new FormControl('', [Validators.required, Validators.max(this.maxPromptSize)]),
1508
+ prompt: new FormControl('', [Validators.required, Validators.maxLength(this.maxPromptSize)]),
1497
1509
  });
1498
1510
  this.elService = inject(GioElService);
1499
1511
  this.responseState = signal(null);
1512
+ this.feedbackState = signal(null);
1500
1513
  this.el = computed(() => {
1501
1514
  const state = this.responseState();
1502
1515
  return isPromptSuccess(state) ? state.el : null;
@@ -1505,6 +1518,14 @@ class GioElPromptComponent {
1505
1518
  const state = this.responseState();
1506
1519
  return isPromptError(state) ? state.message : null;
1507
1520
  });
1521
+ this.showFeedback = computed(() => {
1522
+ const state = this.responseState();
1523
+ const feedback = this.feedbackState();
1524
+ return isPromptSuccess(state) && feedback === null;
1525
+ });
1526
+ }
1527
+ get prompt() {
1528
+ return this.aiRequestFormGroup.get('prompt');
1508
1529
  }
1509
1530
  ngAfterViewInit() {
1510
1531
  setTimeout(() => {
@@ -1517,10 +1538,18 @@ class GioElPromptComponent {
1517
1538
  return;
1518
1539
  }
1519
1540
  this.responseState.set('loading');
1541
+ this.feedbackState.set(null); // Reset feedback when sending new prompt
1520
1542
  this.elService.prompt(prompt).subscribe(reply => this.responseState.set(reply));
1521
1543
  }
1544
+ submitFeedback(feedback) {
1545
+ this.feedbackState.set(feedback);
1546
+ const expression = this.el();
1547
+ if (expression) {
1548
+ this.elService.submitFeedback(feedback, expression).subscribe();
1549
+ }
1550
+ }
1522
1551
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1523
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ aiRequestFormGroup.get('prompt')?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3$2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1552
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3$2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1524
1553
  }
1525
1554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, decorators: [{
1526
1555
  type: Component,
@@ -1531,10 +1560,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
1531
1560
  MatButton,
1532
1561
  MatProgressBarModule,
1533
1562
  MatTooltipModule,
1563
+ MatIconButton,
1534
1564
  GioIconsModule,
1535
1565
  GioBannerModule,
1536
1566
  GioClipboardModule,
1537
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ aiRequestFormGroup.get('prompt')?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}\n"] }]
1567
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"] }]
1538
1568
  }], propDecorators: { responseState: [{
1539
1569
  type: Input
1540
1570
  }], myInput: [{