@cqa-lib/cqa-ui 1.1.121 → 1.1.123
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.
- package/esm2020/lib/error-modal/error-modal.component.mjs +71 -0
- package/esm2020/lib/live-conversation/live-conversation.component.mjs +181 -0
- package/esm2020/lib/ui-kit.module.mjs +15 -5
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +271 -18
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +268 -18
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/error-modal/error-modal.component.d.ts +32 -0
- package/lib/live-conversation/live-conversation.component.d.ts +68 -0
- package/lib/ui-kit.module.d.ts +24 -22
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/icon";
|
|
4
|
+
import * as i2 from "../button/button.component";
|
|
5
|
+
import * as i3 from "@angular/common";
|
|
6
|
+
export class ErrorModalComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.isOpen = false;
|
|
9
|
+
this.title = 'Error';
|
|
10
|
+
this.errorMessage = '';
|
|
11
|
+
this.totalSteps = 0;
|
|
12
|
+
this.completedSteps = 0;
|
|
13
|
+
this.totalTime = '';
|
|
14
|
+
this.appTime = '';
|
|
15
|
+
this.toolTime = '';
|
|
16
|
+
this.buttons = [];
|
|
17
|
+
this.buttonClick = new EventEmitter();
|
|
18
|
+
this.closeModal = new EventEmitter();
|
|
19
|
+
}
|
|
20
|
+
onBackdropClick(event) {
|
|
21
|
+
const target = event.target;
|
|
22
|
+
const currentTarget = event.currentTarget;
|
|
23
|
+
if (target === currentTarget || target.classList.contains('modal-backdrop')) {
|
|
24
|
+
this.onClose();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
onButtonClick(button) {
|
|
28
|
+
this.buttonClick.emit(button.action);
|
|
29
|
+
}
|
|
30
|
+
onClose() {
|
|
31
|
+
this.closeModal.emit();
|
|
32
|
+
}
|
|
33
|
+
get stepsBackgroundClass() {
|
|
34
|
+
return 'cqa-bg-[#EE3F3F1A]';
|
|
35
|
+
}
|
|
36
|
+
get stepsBorderClass() {
|
|
37
|
+
return '#FECACA';
|
|
38
|
+
}
|
|
39
|
+
get hasTimingData() {
|
|
40
|
+
return !!(this.totalSteps || this.totalTime || this.appTime || this.toolTime);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
ErrorModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
44
|
+
ErrorModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ErrorModalComponent, selector: "cqa-error-modal", inputs: { isOpen: "isOpen", title: "title", errorMessage: "errorMessage", totalSteps: "totalSteps", completedSteps: "completedSteps", totalTime: "totalTime", appTime: "appTime", toolTime: "toolTime", buttons: "buttons" }, outputs: { buttonClick: "buttonClick", closeModal: "closeModal" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[93px] cqa-h-[93px] cqa-rounded-full cqa-bg-[#F9BFBF]\" style=\"border: 8px solid #FCD9D9;\">\n <mat-icon class=\"cqa-text-[#EE3F3F]\" style=\"font-size: 48px; width: 48px; height: 48px;\">\n error\n </mat-icon>\n </div>\n\n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n </div>\n\n <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-[17px] cqa-rounded-[10px] cqa-bg-[#FEF2F2]\"\n style=\"border: 1px solid #FECACA;\">\n <div class=\"cqa-text-[12px] cqa-text-[#B91C1C] cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Buttons -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <ng-container *ngFor=\"let button of buttons; let i = index\">\n <cqa-button [variant]=\"button.variant\" [text]=\"button.label\" [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\" [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ErrorModalComponent, decorators: [{
|
|
46
|
+
type: Component,
|
|
47
|
+
args: [{ selector: 'cqa-error-modal', template: "<div *ngIf=\"isOpen\"\n class=\"modal-backdrop cqa-fixed cqa-inset-0 cqa-bg-black cqa-bg-opacity-50 cqa-z-50 cqa-flex cqa-items-center cqa-justify-center cqa-p-4\"\n (click)=\"onBackdropClick($event)\">\n <div\n class=\"cqa-rounded-lg cqa-bg-white cqa-shadow-xl cqa-w-full cqa-max-w-[500px] cqa-overflow-hidden cqa-p-6 cqa-flex cqa-flex-col cqa-gap-2\"\n style=\"box-shadow: 0px 8px 8px -4px #10182808;\" (click)=\"$event.stopPropagation()\">\n\n <div class=\"cqa-flex cqa-flex-col cqa-items-center\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-[93px] cqa-h-[93px] cqa-rounded-full cqa-bg-[#F9BFBF]\" style=\"border: 8px solid #FCD9D9;\">\n <mat-icon class=\"cqa-text-[#EE3F3F]\" style=\"font-size: 48px; width: 48px; height: 48px;\">\n error\n </mat-icon>\n </div>\n\n <h2 class=\"cqa-text-[22px] cqa-font-semibold cqa-text-[#0B0B0C] cqa-mt-[20px] cqa-leading-[28px]\">\n {{ title }}\n </h2>\n </div>\n\n <div *ngIf=\"hasTimingData\" class=\"cqa-rounded-lg cqa-border cqa-p-[17px] cqa-my-4\" [ngClass]=\"stepsBackgroundClass\"\n style=\"border: 1px solid;\" [style.border-color]=\"stepsBorderClass\">\n <div\n class=\"cqa-grid sm:cqa-flex sm:cqa-justify-between sm:cqa-items-center cqa-grid-cols-2 sm:cqa-grid-cols-4 cqa-gap-4 sm:cqa-gap-2\">\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalSteps\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Steps</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ completedSteps }} / {{ totalSteps }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"totalTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Total Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ totalTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"appTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">App Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ appTime }}\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-flex-col\" *ngIf=\"toolTime\">\n <span class=\"cqa-text-xs cqa-text-[#4A5565] cqa-mb-1\">Tool Time</span>\n <span class=\"cqa-text-[18px] cqa-font-medium cqa-text-[#101828]\">\n {{ toolTime }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Error Message -->\n <div *ngIf=\"errorMessage\" class=\"cqa-my-4 cqa-p-[17px] cqa-rounded-[10px] cqa-bg-[#FEF2F2]\"\n style=\"border: 1px solid #FECACA;\">\n <div class=\"cqa-text-[12px] cqa-text-[#B91C1C] cqa-whitespace-normal cqa-break-anywhere\"\n style=\"word-break: break-word; white-space: pre-line;\">\n {{ errorMessage }}\n </div>\n </div>\n\n <!-- Buttons -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-[20px]\">\n <ng-container *ngFor=\"let button of buttons; let i = index\">\n <cqa-button [variant]=\"button.variant\" [text]=\"button.label\" [icon]=\"button.icon\"\n [btnSize]=\"button.btnSize || 'lg'\" [fullWidth]=\"button.fullWidth !== undefined ? button.fullWidth : true\"\n (clicked)=\"onButtonClick(button)\">\n </cqa-button>\n </ng-container>\n </div>\n </div>\n</div>", styles: [] }]
|
|
48
|
+
}], propDecorators: { isOpen: [{
|
|
49
|
+
type: Input
|
|
50
|
+
}], title: [{
|
|
51
|
+
type: Input
|
|
52
|
+
}], errorMessage: [{
|
|
53
|
+
type: Input
|
|
54
|
+
}], totalSteps: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], completedSteps: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], totalTime: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}], appTime: [{
|
|
61
|
+
type: Input
|
|
62
|
+
}], toolTime: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], buttons: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], buttonClick: [{
|
|
67
|
+
type: Output
|
|
68
|
+
}], closeModal: [{
|
|
69
|
+
type: Output
|
|
70
|
+
}] } });
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lcnJvci1tb2RhbC9lcnJvci1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Vycm9yLW1vZGFsL2Vycm9yLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7O0FBaUJ2RSxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBTVcsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUN4QixVQUFLLEdBQVcsT0FBTyxDQUFDO1FBQ3hCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDM0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsWUFBTyxHQUF1QixFQUFFLENBQUM7UUFFaEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBOEJqRDtJQTVCQyxlQUFlLENBQUMsS0FBaUI7UUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQTRCLENBQUM7UUFFekQsSUFBSSxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDM0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEYsQ0FBQzs7Z0hBekNVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdWQ2pCaEMsKzRHQXdFTTsyRkR2RE8sbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGlCQUFpQjs4QkFLbEIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1vZGFsQnV0dG9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFyaWFudDogQnV0dG9uVmFyaWFudDtcbiAgaWNvbj86IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIGJ0blNpemU/OiAnc20nIHwgJ21kJyB8ICdsZyc7XG4gIGZ1bGxXaWR0aD86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1lcnJvci1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lcnJvci1tb2RhbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRXJyb3JNb2RhbENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0Vycm9yJztcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdG90YWxTdGVwczogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgY29tcGxldGVkU3RlcHM6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHRvdGFsVGltZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGFwcFRpbWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSB0b29sVGltZTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGJ1dHRvbnM6IEVycm9yTW9kYWxCdXR0b25bXSA9IFtdO1xuXG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBvbkJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgXG4gICAgaWYgKHRhcmdldCA9PT0gY3VycmVudFRhcmdldCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbC1iYWNrZHJvcCcpKSB7XG4gICAgICB0aGlzLm9uQ2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogRXJyb3JNb2RhbEJ1dHRvbik6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdChidXR0b24uYWN0aW9uKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZU1vZGFsLmVtaXQoKTtcbiAgfVxuXG4gIGdldCBzdGVwc0JhY2tncm91bmRDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY3FhLWJnLVsjRUUzRjNGMUFdJztcbiAgfVxuXG4gIGdldCBzdGVwc0JvcmRlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcjRkVDQUNBJztcbiAgfVxuXG4gIGdldCBoYXNUaW1pbmdEYXRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnRvdGFsU3RlcHMgfHwgdGhpcy50b3RhbFRpbWUgfHwgdGhpcy5hcHBUaW1lIHx8IHRoaXMudG9vbFRpbWUpO1xuICB9XG59XG5cbiIsIjxkaXYgKm5nSWY9XCJpc09wZW5cIlxuICBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wIGNxYS1maXhlZCBjcWEtaW5zZXQtMCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLXotNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiXG4gIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soJGV2ZW50KVwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcWEtcm91bmRlZC1sZyBjcWEtYmctd2hpdGUgY3FhLXNoYWRvdy14bCBjcWEtdy1mdWxsIGNxYS1tYXgtdy1bNTAwcHhdIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yXCJcbiAgICBzdHlsZT1cImJveC1zaGFkb3c6IDBweCA4cHggOHB4IC00cHggIzEwMTgyODA4O1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LVs5M3B4XSBjcWEtaC1bOTNweF0gY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGOUJGQkZdXCIgc3R5bGU9XCJib3JkZXI6IDhweCBzb2xpZCAjRkNEOUQ5O1wiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1bI0VFM0YzRl1cIiBzdHlsZT1cImZvbnQtc2l6ZTogNDhweDsgd2lkdGg6IDQ4cHg7IGhlaWdodDogNDhweDtcIj5cbiAgICAgICAgICBlcnJvclxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxoMiBjbGFzcz1cImNxYS10ZXh0LVsyMnB4XSBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1bIzBCMEIwQ10gY3FhLW10LVsyMHB4XSBjcWEtbGVhZGluZy1bMjhweF1cIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzVGltaW5nRGF0YVwiIGNsYXNzPVwiY3FhLXJvdW5kZWQtbGcgY3FhLWJvcmRlciBjcWEtcC1bMTdweF0gY3FhLW15LTRcIiBbbmdDbGFzc109XCJzdGVwc0JhY2tncm91bmRDbGFzc1wiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkO1wiIFtzdHlsZS5ib3JkZXItY29sb3JdPVwic3RlcHNCb3JkZXJDbGFzc1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNxYS1ncmlkIHNtOmNxYS1mbGV4IHNtOmNxYS1qdXN0aWZ5LWJldHdlZW4gc206Y3FhLWl0ZW1zLWNlbnRlciBjcWEtZ3JpZC1jb2xzLTIgc206Y3FhLWdyaWQtY29scy00IGNxYS1nYXAtNCBzbTpjcWEtZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiICpuZ0lmPVwidG90YWxTdGVwc1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG90YWwgU3RlcHM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgY29tcGxldGVkU3RlcHMgfX0gLyB7eyB0b3RhbFN0ZXBzIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b3RhbFRpbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LVsjNEE1NTY1XSBjcWEtbWItMVwiPlRvdGFsIFRpbWU8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTAxODI4XVwiPlxuICAgICAgICAgICAge3sgdG90YWxUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJhcHBUaW1lXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzRBNTU2NV0gY3FhLW1iLTFcIj5BcHAgVGltZTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMxMDE4MjhdXCI+XG4gICAgICAgICAgICB7eyBhcHBUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgKm5nSWY9XCJ0b29sVGltZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyM0QTU1NjVdIGNxYS1tYi0xXCI+VG9vbCBUaW1lPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzEwMTgyOF1cIj5cbiAgICAgICAgICAgIHt7IHRvb2xUaW1lIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFcnJvciBNZXNzYWdlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIiBjbGFzcz1cImNxYS1teS00IGNxYS1wLVsxN3B4XSBjcWEtcm91bmRlZC1bMTBweF0gY3FhLWJnLVsjRkVGMkYyXVwiXG4gICAgICBzdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkICNGRUNBQ0E7XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjQjkxQzFDXSBjcWEtd2hpdGVzcGFjZS1ub3JtYWwgY3FhLWJyZWFrLWFueXdoZXJlXCJcbiAgICAgICAgc3R5bGU9XCJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyB3aGl0ZS1zcGFjZTogcHJlLWxpbmU7XCI+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLVsyMHB4XVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPGNxYS1idXR0b24gW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnRcIiBbdGV4dF09XCJidXR0b24ubGFiZWxcIiBbaWNvbl09XCJidXR0b24uaWNvblwiXG4gICAgICAgICAgW2J0blNpemVdPVwiYnV0dG9uLmJ0blNpemUgfHwgJ2xnJ1wiIFtmdWxsV2lkdGhdPVwiYnV0dG9uLmZ1bGxXaWR0aCAhPT0gdW5kZWZpbmVkID8gYnV0dG9uLmZ1bGxXaWR0aCA6IHRydWVcIlxuICAgICAgICAgIChjbGlja2VkKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
export class LiveConversationComponent {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.conversation = null;
|
|
9
|
+
this.executionStatus = '';
|
|
10
|
+
this.stepFrom = '';
|
|
11
|
+
this.mode = 'step-regular';
|
|
12
|
+
this.message = '';
|
|
13
|
+
this.circleCircumference = 2 * Math.PI * 52;
|
|
14
|
+
this.showUserInputField = false;
|
|
15
|
+
this.showUserInputFieldinDebug = false;
|
|
16
|
+
this.messageChange = new EventEmitter();
|
|
17
|
+
this.sendMessage = new EventEmitter();
|
|
18
|
+
this.stopAgent = new EventEmitter();
|
|
19
|
+
this.stepAction = new EventEmitter();
|
|
20
|
+
this.updateStepData = new EventEmitter();
|
|
21
|
+
this.redirectToCE = new EventEmitter();
|
|
22
|
+
this.showUserInputFieldChange = new EventEmitter();
|
|
23
|
+
this.showUserInputFieldinDebugChange = new EventEmitter();
|
|
24
|
+
this.internalRemainingTime$ = new BehaviorSubject(0);
|
|
25
|
+
this.timerSubscription = null;
|
|
26
|
+
}
|
|
27
|
+
ngOnInit() {
|
|
28
|
+
if (!this.remainingTime$) {
|
|
29
|
+
this.remainingTime$ = this.internalRemainingTime$;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
ngOnDestroy() {
|
|
33
|
+
this.stopTimer();
|
|
34
|
+
}
|
|
35
|
+
onMessageChange(value) {
|
|
36
|
+
this.message = value;
|
|
37
|
+
this.messageChange.emit(value);
|
|
38
|
+
}
|
|
39
|
+
onSendMessage() {
|
|
40
|
+
// For test case group mode with timeout
|
|
41
|
+
if (this.isTestCaseGroupMode && this.isTimeout && this.message) {
|
|
42
|
+
const timeValue = parseInt(this.message, 10);
|
|
43
|
+
if (!isNaN(timeValue)) {
|
|
44
|
+
this.sendMessage.emit({
|
|
45
|
+
type: 'test_case_time_add',
|
|
46
|
+
data: { time: timeValue }
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Default
|
|
52
|
+
this.sendMessage.emit();
|
|
53
|
+
}
|
|
54
|
+
onStopAgent() {
|
|
55
|
+
this.stopAgent.emit();
|
|
56
|
+
}
|
|
57
|
+
onStepAction(action) {
|
|
58
|
+
if (this.stepId) {
|
|
59
|
+
this.stepAction.emit({ action, stepId: this.stepId });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
onUpdateStepData(action, type) {
|
|
63
|
+
if (this.stepId) {
|
|
64
|
+
this.updateStepData.emit({ action, type, stepId: this.stepId });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
onRedirectToCE() {
|
|
68
|
+
this.redirectToCE.emit();
|
|
69
|
+
}
|
|
70
|
+
onShowUserInputFieldChange(value) {
|
|
71
|
+
this.showUserInputFieldChange.emit(value);
|
|
72
|
+
}
|
|
73
|
+
onShowUserInputFieldinDebugChange(value) {
|
|
74
|
+
this.showUserInputFieldinDebugChange.emit(value);
|
|
75
|
+
}
|
|
76
|
+
formatTime(seconds) {
|
|
77
|
+
const minutes = Math.floor(seconds / 60);
|
|
78
|
+
const remainingSeconds = seconds % 60;
|
|
79
|
+
return `${minutes}:${remainingSeconds.toString().padStart(2, "0")}`;
|
|
80
|
+
}
|
|
81
|
+
getDashOffset(remainingTime) {
|
|
82
|
+
const progress = 1 - remainingTime / (2 * 60);
|
|
83
|
+
return this.circleCircumference * progress;
|
|
84
|
+
}
|
|
85
|
+
stopTimer() {
|
|
86
|
+
if (this.timerSubscription) {
|
|
87
|
+
this.timerSubscription.unsubscribe();
|
|
88
|
+
this.timerSubscription = null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Helper getters for template
|
|
92
|
+
get isStepRegularMode() {
|
|
93
|
+
return this.mode === 'step-regular';
|
|
94
|
+
}
|
|
95
|
+
get isStepDebugMode() {
|
|
96
|
+
return this.mode === 'step-debug';
|
|
97
|
+
}
|
|
98
|
+
get isTestCaseGroupMode() {
|
|
99
|
+
return this.mode === 'test-case-group';
|
|
100
|
+
}
|
|
101
|
+
get shouldShowStepRegular() {
|
|
102
|
+
return !!(this.isStepRegularMode &&
|
|
103
|
+
this.conversation &&
|
|
104
|
+
this.conversation.id === this.stepId &&
|
|
105
|
+
this.conversation.stepStatus === 'CONVERSATION' &&
|
|
106
|
+
this.stepFrom !== 'DEBUGGE_WITH_AI');
|
|
107
|
+
}
|
|
108
|
+
get shouldShowStepDebug() {
|
|
109
|
+
return !!(this.isStepDebugMode &&
|
|
110
|
+
this.conversation &&
|
|
111
|
+
this.conversation.id === this.stepId &&
|
|
112
|
+
this.conversation.stepStatus === 'CONVERSATION' &&
|
|
113
|
+
this.stepFrom === 'DEBUGGE_WITH_AI');
|
|
114
|
+
}
|
|
115
|
+
get shouldShowTestCaseGroup() {
|
|
116
|
+
return !!(this.isTestCaseGroupMode &&
|
|
117
|
+
this.conversation &&
|
|
118
|
+
this.executionStatus !== 'COMPLETED');
|
|
119
|
+
}
|
|
120
|
+
get isLocatorNotDetect() {
|
|
121
|
+
return this.conversation?.stepStatus === 'LOCATOR_NOT_DETECT';
|
|
122
|
+
}
|
|
123
|
+
get isTimeout() {
|
|
124
|
+
return this.conversation?.stepStatus === 'TIMEOUT';
|
|
125
|
+
}
|
|
126
|
+
get inputPlaceholder() {
|
|
127
|
+
return this.isTimeout ? 'Enter Timeout in sec' : 'Enter Input';
|
|
128
|
+
}
|
|
129
|
+
get inputType() {
|
|
130
|
+
return this.isTimeout ? 'number' : 'text';
|
|
131
|
+
}
|
|
132
|
+
get isInputDisabled() {
|
|
133
|
+
return !this.conversation || !this.conversation?.replyBack_id;
|
|
134
|
+
}
|
|
135
|
+
get isResumeDisabled() {
|
|
136
|
+
return !this.isLocatorNotDetect && (!this.message || this.message.trim() === '');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
LiveConversationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LiveConversationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
140
|
+
LiveConversationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LiveConversationComponent, selector: "cqa-live-conversation", inputs: { conversation: "conversation", executionStatus: "executionStatus", stepFrom: "stepFrom", mode: "mode", stepId: "stepId", message: "message", remainingTime$: "remainingTime$", circleCircumference: "circleCircumference", showUserInputField: "showUserInputField", showUserInputFieldinDebug: "showUserInputFieldinDebug" }, outputs: { messageChange: "messageChange", sendMessage: "sendMessage", stopAgent: "stopAgent", stepAction: "stepAction", updateStepData: "updateStepData", redirectToCE: "redirectToCE", showUserInputFieldChange: "showUserInputFieldChange", showUserInputFieldinDebugChange: "showUserInputFieldinDebugChange" }, ngImport: i0, template: "<div class=\"cqa-ui-root\">\n <!-- Step Regular Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepRegular\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputField\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStopAgent()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Stop\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputField\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n <button\n class=\"send-button\"\n [disabled]=\"!message\"\n (click)=\"onSendMessage()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer;\"\n >\n Send\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Step Debug Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepDebug\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputFieldinDebug\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldinDebugChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Skip Step\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip_delete')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Delete Step\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputFieldinDebug\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n </div>\n <div class=\"prompt-actions d-flex gap-2 mb-2\">\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('reRun', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Update and Rerun\n </button>\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('aiAgent', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Add New Steps and Rerun\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldinDebugChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Test Case Group Level Conversation Input Section -->\n <div\n *ngIf=\"shouldShowTestCaseGroup\"\n class=\"conversation-input-section mt-3 p-3\"\n style=\"background-color: #EFF6FF; border-radius: 8px; border: 1px solid #BEDBFF;\"\n>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div\n *ngIf=\"remainingTime$ | async as remainingTime\"\n class=\"mini-timer-container\"\n >\n <svg class=\"mini-progress-ring\" width=\"44\" height=\"44\">\n <circle\n class=\"mini-progress-ring__circle\"\n stroke=\"#3e98c7\"\n stroke-width=\"4\"\n fill=\"transparent\"\n r=\"20\"\n cx=\"22\"\n cy=\"22\"\n [style.strokeDasharray]=\"circleCircumference\"\n [style.strokeDashoffset.px]=\"getDashOffset(remainingTime)\"\n />\n </svg>\n <div class=\"mini-timer-text\" style=\"color: #374151; font-size: 12px; font-weight: 500;\">\n <span class=\"mini-time\">{{\n formatTime(remainingTime)\n }}</span>\n </div>\n </div>\n <input\n *ngIf=\"!isLocatorNotDetect\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n [disabled]=\"isInputDisabled\"\n [type]=\"inputType\"\n class=\"form-control\"\n style=\"\n height: 36px;\n flex: 1;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #0A0A0A;\n font-size: 14px;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n outline: none;\n \"\n [style.border-color]=\"isInputDisabled ? '#E5E7EB' : '#D1D5DB'\"\n [style.background-color]=\"isInputDisabled ? '#F9FAFB' : '#FFFFFF'\"\n [style.color]=\"isInputDisabled ? '#9CA3AF' : '#0A0A0A'\"\n [style.cursor]=\"isInputDisabled ? 'not-allowed' : 'text'\"\n [placeholder]=\"inputPlaceholder\"\n onfocus=\"if (!this.disabled) { this.style.borderColor='#1447E6'; this.style.boxShadow='0 0 0 3px rgba(63, 67, 238, 0.1)'; }\"\n onblur=\"this.style.borderColor='#D1D5DB'; this.style.boxShadow='none';\"\n />\n <div\n *ngIf=\"isLocatorNotDetect\"\n (click)=\"onRedirectToCE()\"\n style=\"cursor: pointer;\"\n >\n <button\n class=\"btn\"\n style=\"\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #374151;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n onmouseover=\"this.style.backgroundColor='#F9FAFB'\"\n onmouseout=\"this.style.backgroundColor='#FFFFFF'\"\n >\n Record\n </button>\n </div>\n <button\n [disabled]=\"isResumeDisabled\"\n class=\"btn\"\n (click)=\"onSendMessage()\"\n style=\"\n height: 36px;\n padding: 8px 16px;\n border-radius: 8px;\n border: none;\n background-color: #1447E6;\n color: #FFFFFF;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n [style.background-color]=\"isResumeDisabled ? '#E2E2E3' : '#1447E6'\"\n [style.color]=\"isResumeDisabled ? '#9CA3AF' : '#FFFFFF'\"\n [style.cursor]=\"isResumeDisabled ? 'not-allowed' : 'pointer'\"\n onmouseover=\"if (!this.disabled) this.style.backgroundColor='#0F3CBA'\"\n onmouseout=\"if (!this.disabled) this.style.backgroundColor='#1447E6'\"\n >\n Resume\n </button>\n </div>\n</div>\n</div>", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "async": i1.AsyncPipe } });
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LiveConversationComponent, decorators: [{
|
|
142
|
+
type: Component,
|
|
143
|
+
args: [{ selector: 'cqa-live-conversation', template: "<div class=\"cqa-ui-root\">\n <!-- Step Regular Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepRegular\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputField\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStopAgent()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Stop\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputField\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n <button\n class=\"send-button\"\n [disabled]=\"!message\"\n (click)=\"onSendMessage()\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer;\"\n >\n Send\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Step Debug Mode Conversation Section -->\n <div\n *ngIf=\"shouldShowStepDebug\"\n class=\"conversation-section mt-2 p-3\"\n style=\"background-color: #FEF3C7; border-radius: 8px; border: 1px solid #FCD34D;\"\n >\n <div class=\"user-action-prompt\" *ngIf=\"!showUserInputFieldinDebug\">\n <div class=\"prompt-header d-flex align-items-center gap-2 mb-2\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 11V8\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 5H8.01\" stroke=\"#92400E\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span style=\"font-weight: 600; color: #92400E;\">User input required to proceed</span>\n </div>\n <div class=\"prompt-actions d-flex gap-2\">\n <button\n class=\"action-btn primary\"\n (click)=\"onShowUserInputFieldinDebugChange(true)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Enter more details\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Skip Step\n </button>\n <button\n class=\"action-btn secondary\"\n (click)=\"onStepAction('skip_delete')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Delete Step\n </button>\n </div>\n </div>\n\n <div class=\"user-input-section\" *ngIf=\"showUserInputFieldinDebug\">\n <div class=\"input-container d-flex gap-2 mb-2\">\n <textarea\n class=\"input-field\"\n placeholder=\"Type your response...\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n (keyup.enter)=\"onSendMessage()\"\n rows=\"2\"\n autofocus\n style=\"flex: 1; padding: 8px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: #FFFFFF; color: #0A0A0A; resize: none;\"\n ></textarea>\n </div>\n <div class=\"prompt-actions d-flex gap-2 mb-2\">\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('reRun', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Update and Rerun\n </button>\n <button\n class=\"action-btn primary\"\n [disabled]=\"!message\"\n (click)=\"onUpdateStepData('aiAgent', 'metadata')\"\n style=\"padding: 8px 16px; border-radius: 6px; border: none; background-color: #3F43EE; color: white; cursor: pointer; font-size: 14px;\"\n >\n Add New Steps and Rerun\n </button>\n </div>\n <button\n class=\"cancel-button\"\n (click)=\"onShowUserInputFieldinDebugChange(false)\"\n style=\"padding: 8px 16px; border-radius: 6px; border: 1px solid #D1D5DB; background-color: white; cursor: pointer; font-size: 14px;\"\n >\n Back\n </button>\n </div>\n </div>\n\n <!-- Test Case Group Level Conversation Input Section -->\n <div\n *ngIf=\"shouldShowTestCaseGroup\"\n class=\"conversation-input-section mt-3 p-3\"\n style=\"background-color: #EFF6FF; border-radius: 8px; border: 1px solid #BEDBFF;\"\n>\n <div class=\"d-flex justify-content-between align-items-center gap-2\">\n <div\n *ngIf=\"remainingTime$ | async as remainingTime\"\n class=\"mini-timer-container\"\n >\n <svg class=\"mini-progress-ring\" width=\"44\" height=\"44\">\n <circle\n class=\"mini-progress-ring__circle\"\n stroke=\"#3e98c7\"\n stroke-width=\"4\"\n fill=\"transparent\"\n r=\"20\"\n cx=\"22\"\n cy=\"22\"\n [style.strokeDasharray]=\"circleCircumference\"\n [style.strokeDashoffset.px]=\"getDashOffset(remainingTime)\"\n />\n </svg>\n <div class=\"mini-timer-text\" style=\"color: #374151; font-size: 12px; font-weight: 500;\">\n <span class=\"mini-time\">{{\n formatTime(remainingTime)\n }}</span>\n </div>\n </div>\n <input\n *ngIf=\"!isLocatorNotDetect\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageChange($event)\"\n [disabled]=\"isInputDisabled\"\n [type]=\"inputType\"\n class=\"form-control\"\n style=\"\n height: 36px;\n flex: 1;\n padding: 8px 12px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #0A0A0A;\n font-size: 14px;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n outline: none;\n \"\n [style.border-color]=\"isInputDisabled ? '#E5E7EB' : '#D1D5DB'\"\n [style.background-color]=\"isInputDisabled ? '#F9FAFB' : '#FFFFFF'\"\n [style.color]=\"isInputDisabled ? '#9CA3AF' : '#0A0A0A'\"\n [style.cursor]=\"isInputDisabled ? 'not-allowed' : 'text'\"\n [placeholder]=\"inputPlaceholder\"\n onfocus=\"if (!this.disabled) { this.style.borderColor='#1447E6'; this.style.boxShadow='0 0 0 3px rgba(63, 67, 238, 0.1)'; }\"\n onblur=\"this.style.borderColor='#D1D5DB'; this.style.boxShadow='none';\"\n />\n <div\n *ngIf=\"isLocatorNotDetect\"\n (click)=\"onRedirectToCE()\"\n style=\"cursor: pointer;\"\n >\n <button\n class=\"btn\"\n style=\"\n padding: 8px 16px;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n background-color: #FFFFFF;\n color: #374151;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n onmouseover=\"this.style.backgroundColor='#F9FAFB'\"\n onmouseout=\"this.style.backgroundColor='#FFFFFF'\"\n >\n Record\n </button>\n </div>\n <button\n [disabled]=\"isResumeDisabled\"\n class=\"btn\"\n (click)=\"onSendMessage()\"\n style=\"\n height: 36px;\n padding: 8px 16px;\n border-radius: 8px;\n border: none;\n background-color: #1447E6;\n color: #FFFFFF;\n cursor: pointer;\n font-weight: 500;\n font-size: 14px;\n transition: background-color 0.2s ease;\n \"\n [style.background-color]=\"isResumeDisabled ? '#E2E2E3' : '#1447E6'\"\n [style.color]=\"isResumeDisabled ? '#9CA3AF' : '#FFFFFF'\"\n [style.cursor]=\"isResumeDisabled ? 'not-allowed' : 'pointer'\"\n onmouseover=\"if (!this.disabled) this.style.backgroundColor='#0F3CBA'\"\n onmouseout=\"if (!this.disabled) this.style.backgroundColor='#1447E6'\"\n >\n Resume\n </button>\n </div>\n</div>\n</div>", styles: [] }]
|
|
144
|
+
}], propDecorators: { conversation: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], executionStatus: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], stepFrom: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], mode: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], stepId: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], message: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], remainingTime$: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], circleCircumference: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], showUserInputField: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], showUserInputFieldinDebug: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], messageChange: [{
|
|
165
|
+
type: Output
|
|
166
|
+
}], sendMessage: [{
|
|
167
|
+
type: Output
|
|
168
|
+
}], stopAgent: [{
|
|
169
|
+
type: Output
|
|
170
|
+
}], stepAction: [{
|
|
171
|
+
type: Output
|
|
172
|
+
}], updateStepData: [{
|
|
173
|
+
type: Output
|
|
174
|
+
}], redirectToCE: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}], showUserInputFieldChange: [{
|
|
177
|
+
type: Output
|
|
178
|
+
}], showUserInputFieldinDebugChange: [{
|
|
179
|
+
type: Output
|
|
180
|
+
}] } });
|
|
181
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1jb252ZXJzYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9saXZlLWNvbnZlcnNhdGlvbi9saXZlLWNvbnZlcnNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2xpdmUtY29udmVyc2F0aW9uL2xpdmUtY29udmVyc2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBYyxlQUFlLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBZWpFLE1BQU0sT0FBTyx5QkFBeUI7SUFMdEM7UUFNVyxpQkFBWSxHQUE0QixJQUFJLENBQUM7UUFDN0Msb0JBQWUsR0FBVyxFQUFFLENBQUM7UUFDN0IsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixTQUFJLEdBQXFCLGNBQWMsQ0FBQztRQUV4QyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBRXJCLHdCQUFtQixHQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUMvQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBQ2hFLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUM3RSxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUE2RSxDQUFDO1FBQy9HLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN4Qyw2QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFB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QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRywrQkFBK0I7c0JBQXhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2F0aW9uRGF0YSB7XG4gIGlkPzogbnVtYmVyIHwgc3RyaW5nO1xuICByZXBseUJhY2tfaWQ/OiBzdHJpbmc7XG4gIHN0ZXBTdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbk1vZGUgPSAnc3RlcC1yZWd1bGFyJyB8ICdzdGVwLWRlYnVnJyB8ICd0ZXN0LWNhc2UtZ3JvdXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbGl2ZS1jb252ZXJzYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vbGl2ZS1jb252ZXJzYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuZXhwb3J0IGNsYXNzIExpdmVDb252ZXJzYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uRGF0YSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBleGVjdXRpb25TdGF0dXM6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzdGVwRnJvbTogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG1vZGU6IENvbnZlcnNhdGlvbk1vZGUgPSAnc3RlcC1yZWd1bGFyJztcbiAgQElucHV0KCkgc3RlcElkPzogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcmVtYWluaW5nVGltZSQ/OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIEBJbnB1dCgpIGNpcmNsZUNpcmN1bWZlcmVuY2U6IG51bWJlciA9IDIgKiBNYXRoLlBJICogNTI7XG4gIEBJbnB1dCgpIHNob3dVc2VySW5wdXRGaWVsZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93VXNlcklucHV0RmllbGRpbkRlYnVnOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIG1lc3NhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHNlbmRNZXNzYWdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU/OiBzdHJpbmc7IGRhdGE/OiBhbnkgfT4oKTtcbiAgQE91dHB1dCgpIHN0b3BBZ2VudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHN0ZXBBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgYWN0aW9uOiBzdHJpbmc7IHN0ZXBJZDogbnVtYmVyIHwgc3RyaW5nIH0+KCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVTdGVwRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IHN0cmluZzsgdHlwZTogJ2xvY2F0b3InIHwgJ21ldGFkYXRhJzsgc3RlcElkOiBudW1iZXIgfCBzdHJpbmcgfT4oKTtcbiAgQE91dHB1dCgpIHJlZGlyZWN0VG9DRSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHNob3dVc2VySW5wdXRGaWVsZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNob3dVc2VySW5wdXRGaWVsZGluRGVidWdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgaW50ZXJuYWxSZW1haW5pbmdUaW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSB0aW1lclN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbWFpbmluZ1RpbWUkKSB7XG4gICAgICB0aGlzLnJlbWFpbmluZ1RpbWUkID0gdGhpcy5pbnRlcm5hbFJlbWFpbmluZ1RpbWUkO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gIH1cblxuICBvbk1lc3NhZ2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgIHRoaXMubWVzc2FnZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU2VuZE1lc3NhZ2UoKTogdm9pZCB7XG4gICAgLy8gRm9yIHRlc3QgY2FzZSBncm91cCBtb2RlIHdpdGggdGltZW91dFxuICAgIGlmICh0aGlzLmlzVGVzdENhc2VHcm91cE1vZGUgJiYgdGhpcy5pc1RpbWVvdXQgJiYgdGhpcy5tZXNzYWdlKSB7XG4gICAgICBjb25zdCB0aW1lVmFsdWUgPSBwYXJzZUludCh0aGlzLm1lc3NhZ2UsIDEwKTtcbiAgICAgIGlmICghaXNOYU4odGltZVZhbHVlKSkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlLmVtaXQoe1xuICAgICAgICAgIHR5cGU6ICd0ZXN0X2Nhc2VfdGltZV9hZGQnLFxuICAgICAgICAgIGRhdGE6IHsgdGltZTogdGltZVZhbHVlIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVmYXVsdFxuICAgIHRoaXMuc2VuZE1lc3NhZ2UuZW1pdCgpO1xuICB9XG5cbiAgb25TdG9wQWdlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQWdlbnQuZW1pdCgpO1xuICB9XG5cbiAgb25TdGVwQWN0aW9uKGFjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcElkKSB7XG4gICAgICB0aGlzLnN0ZXBBY3Rpb24uZW1pdCh7IGFjdGlvbiwgc3RlcElkOiB0aGlzLnN0ZXBJZCB9KTtcbiAgICB9XG4gIH1cblxuICBvblVwZGF0ZVN0ZXBEYXRhKGFjdGlvbjogc3RyaW5nLCB0eXBlOiAnbG9jYXRvcicgfCAnbWV0YWRhdGEnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RlcElkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0ZXBEYXRhLmVtaXQoeyBhY3Rpb24sIHR5cGUsIHN0ZXBJZDogdGhpcy5zdGVwSWQgfSk7XG4gICAgfVxuICB9XG5cbiAgb25SZWRpcmVjdFRvQ0UoKTogdm9pZCB7XG4gICAgdGhpcy5yZWRpcmVjdFRvQ0UuZW1pdCgpO1xuICB9XG5cbiAgb25TaG93VXNlcklucHV0RmllbGRDaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNob3dVc2VySW5wdXRGaWVsZENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uU2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z0NoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGZvcm1hdFRpbWUoc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzICUgNjA7XG4gICAgcmV0dXJuIGAke21pbnV0ZXN9OiR7cmVtYWluaW5nU2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX1gO1xuICB9XG5cbiAgZ2V0RGFzaE9mZnNldChyZW1haW5pbmdUaW1lOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2dyZXNzID0gMSAtIHJlbWFpbmluZ1RpbWUgLyAoMiAqIDYwKTtcbiAgICByZXR1cm4gdGhpcy5jaXJjbGVDaXJjdW1mZXJlbmNlICogcHJvZ3Jlc3M7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy50aW1lclN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIGdldHRlcnMgZm9yIHRlbXBsYXRlXG4gIGdldCBpc1N0ZXBSZWd1bGFyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc3RlcC1yZWd1bGFyJztcbiAgfVxuXG4gIGdldCBpc1N0ZXBEZWJ1Z01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3N0ZXAtZGVidWcnO1xuICB9XG5cbiAgZ2V0IGlzVGVzdENhc2VHcm91cE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ3Rlc3QtY2FzZS1ncm91cCc7XG4gIH1cblxuICBnZXQgc2hvdWxkU2hvd1N0ZXBSZWd1bGFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmlzU3RlcFJlZ3VsYXJNb2RlICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbiAmJlxuICAgICAgdGhpcy5jb252ZXJzYXRpb24uaWQgPT09IHRoaXMuc3RlcElkICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbi5zdGVwU3RhdHVzID09PSAnQ09OVkVSU0FUSU9OJyAmJlxuICAgICAgdGhpcy5zdGVwRnJvbSAhPT0gJ0RFQlVHR0VfV0lUSF9BSScpO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dTdGVwRGVidWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuaXNTdGVwRGVidWdNb2RlICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbiAmJlxuICAgICAgdGhpcy5jb252ZXJzYXRpb24uaWQgPT09IHRoaXMuc3RlcElkICYmXG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbi5zdGVwU3RhdHVzID09PSAnQ09OVkVSU0FUSU9OJyAmJlxuICAgICAgdGhpcy5zdGVwRnJvbSA9PT0gJ0RFQlVHR0VfV0lUSF9BSScpO1xuICB9XG5cbiAgZ2V0IHNob3VsZFNob3dUZXN0Q2FzZUdyb3VwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmlzVGVzdENhc2VHcm91cE1vZGUgJiZcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uICYmXG4gICAgICB0aGlzLmV4ZWN1dGlvblN0YXR1cyAhPT0gJ0NPTVBMRVRFRCcpO1xuICB9XG5cbiAgZ2V0IGlzTG9jYXRvck5vdERldGVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb24/LnN0ZXBTdGF0dXMgPT09ICdMT0NBVE9SX05PVF9ERVRFQ1QnO1xuICB9XG5cbiAgZ2V0IGlzVGltZW91dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb24/LnN0ZXBTdGF0dXMgPT09ICdUSU1FT1VUJztcbiAgfVxuXG4gIGdldCBpbnB1dFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lb3V0ID8gJ0VudGVyIFRpbWVvdXQgaW4gc2VjJyA6ICdFbnRlciBJbnB1dCc7XG4gIH1cblxuICBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNUaW1lb3V0ID8gJ251bWJlcicgOiAndGV4dCc7XG4gIH1cblxuICBnZXQgaXNJbnB1dERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5jb252ZXJzYXRpb24gfHwgIXRoaXMuY29udmVyc2F0aW9uPy5yZXBseUJhY2tfaWQ7XG4gIH1cblxuICBnZXQgaXNSZXN1bWVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNMb2NhdG9yTm90RGV0ZWN0ICYmICghdGhpcy5tZXNzYWdlIHx8IHRoaXMubWVzc2FnZS50cmltKCkgPT09ICcnKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCI+XG4gIDwhLS0gU3RlcCBSZWd1bGFyIE1vZGUgQ29udmVyc2F0aW9uIFNlY3Rpb24gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3VsZFNob3dTdGVwUmVndWxhclwiXG4gICAgY2xhc3M9XCJjb252ZXJzYXRpb24tc2VjdGlvbiBtdC0yIHAtM1wiXG4gICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRkVGM0M3OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICNGQ0QzNEQ7XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWFjdGlvbi1wcm9tcHRcIiAqbmdJZj1cIiFzaG93VXNlcklucHV0RmllbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtaGVhZGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWItMlwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTggMTRBNiA2IDAgMSAwIDggMmE2IDYgMCAwIDAgMCAxMnpcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCAxMVY4XCIgc3Ryb2tlPVwiIzkyNDAwRVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTggNUg4LjAxXCIgc3Ryb2tlPVwiIzkyNDAwRVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICM5MjQwMEU7XCI+VXNlciBpbnB1dCByZXF1aXJlZCB0byBwcm9jZWVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvbXB0LWFjdGlvbnMgZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImFjdGlvbi1idG4gcHJpbWFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2hvd1VzZXJJbnB1dEZpZWxkQ2hhbmdlKHRydWUpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzNGNDNFRTsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgRW50ZXIgbW9yZSBkZXRhaWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RvcEFnZW50KClcIlxuICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxNHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICBTdG9wXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dC1zZWN0aW9uXCIgKm5nSWY9XCJzaG93VXNlcklucHV0RmllbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZC1mbGV4IGdhcC0yIG1iLTJcIj5cbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1maWVsZFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHlvdXIgcmVzcG9uc2UuLi5cIlxuICAgICAgICAgIFtuZ01vZGVsXT1cIm1lc3NhZ2VcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVzc2FnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25TZW5kTWVzc2FnZSgpXCJcbiAgICAgICAgICByb3dzPVwiMlwiXG4gICAgICAgICAgYXV0b2ZvY3VzXG4gICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsgY29sb3I6ICMwQTBBMEE7IHJlc2l6ZTogbm9uZTtcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwic2VuZC1idXR0b25cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VuZE1lc3NhZ2UoKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICMzRjQzRUU7IGNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyO1wiXG4gICAgICAgID5cbiAgICAgICAgICBTZW5kXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNob3dVc2VySW5wdXRGaWVsZENoYW5nZShmYWxzZSlcIlxuICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgPlxuICAgICAgICBCYWNrXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTdGVwIERlYnVnIE1vZGUgQ29udmVyc2F0aW9uIFNlY3Rpb24gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3VsZFNob3dTdGVwRGVidWdcIlxuICAgIGNsYXNzPVwiY29udmVyc2F0aW9uLXNlY3Rpb24gbXQtMiBwLTNcIlxuICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0ZFRjNDNzsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCAjRkNEMzREO1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1hY3Rpb24tcHJvbXB0XCIgKm5nSWY9XCIhc2hvd1VzZXJJbnB1dEZpZWxkaW5EZWJ1Z1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInByb21wdC1oZWFkZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCAxNEE2IDYgMCAxIDAgOCAyYTYgNiAwIDAgMCAwIDEyelwiIHN0cm9rZT1cIiM5MjQwMEVcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk04IDExVjhcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCA1SDguMDFcIiBzdHJva2U9XCIjOTI0MDBFXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzkyNDAwRTtcIj5Vc2VyIGlucHV0IHJlcXVpcmVkIHRvIHByb2NlZWQ8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtYWN0aW9ucyBkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0biBwcmltYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwib25TaG93VXNlcklucHV0RmllbGRpbkRlYnVnQ2hhbmdlKHRydWUpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogIzNGNDNFRTsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgRW50ZXIgbW9yZSBkZXRhaWxzXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RlcEFjdGlvbignc2tpcCcpXCJcbiAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDhweCAxNnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMTRweDtcIlxuICAgICAgICA+XG4gICAgICAgICAgU2tpcCBTdGVwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHNlY29uZGFyeVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU3RlcEFjdGlvbignc2tpcF9kZWxldGUnKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCAjRDFENURCOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIERlbGV0ZSBTdGVwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwidXNlci1pbnB1dC1zZWN0aW9uXCIgKm5nSWY9XCJzaG93VXNlcklucHV0RmllbGRpbkRlYnVnXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyIGQtZmxleCBnYXAtMiBtYi0yXCI+XG4gICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGRcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVHlwZSB5b3VyIHJlc3BvbnNlLi4uXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJtZXNzYWdlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1lc3NhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXVwLmVudGVyKT1cIm9uU2VuZE1lc3NhZ2UoKVwiXG4gICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgIGF1dG9mb2N1c1xuICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkICNEMUQ1REI7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IGNvbG9yOiAjMEEwQTBBOyByZXNpemU6IG5vbmU7XCJcbiAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9tcHQtYWN0aW9ucyBkLWZsZXggZ2FwLTIgbWItMlwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlU3RlcERhdGEoJ3JlUnVuJywgJ21ldGFkYXRhJylcIlxuICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiBub25lOyBiYWNrZ3JvdW5kLWNvbG9yOiAjM0Y0M0VFOyBjb2xvcjogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAxNHB4O1wiXG4gICAgICAgID5cbiAgICAgICAgICBVcGRhdGUgYW5kIFJlcnVuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIHByaW1hcnlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVXBkYXRlU3RlcERhdGEoJ2FpQWdlbnQnLCAnbWV0YWRhdGEnKVwiXG4gICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IG5vbmU7IGJhY2tncm91bmQtY29sb3I6ICMzRjQzRUU7IGNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgICAgPlxuICAgICAgICAgIEFkZCBOZXcgU3RlcHMgYW5kIFJlcnVuXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJvblNob3dVc2VySW5wdXRGaWVsZGluRGVidWdDaGFuZ2UoZmFsc2UpXCJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCAjRDFENURCOyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDE0cHg7XCJcbiAgICAgID5cbiAgICAgICAgQmFja1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVGVzdCBDYXNlIEdyb3VwIExldmVsIENvbnZlcnNhdGlvbiBJbnB1dCBTZWN0aW9uIC0tPlxuICA8ZGl2XG4gICpuZ0lmPVwic2hvdWxkU2hvd1Rlc3RDYXNlR3JvdXBcIlxuICBjbGFzcz1cImNvbnZlcnNhdGlvbi1pbnB1dC1zZWN0aW9uIG10LTMgcC0zXCJcbiAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRUZGNkZGOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICNCRURCRkY7XCJcbj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInJlbWFpbmluZ1RpbWUkIHwgYXN5bmMgYXMgcmVtYWluaW5nVGltZVwiXG4gICAgICBjbGFzcz1cIm1pbmktdGltZXItY29udGFpbmVyXCJcbiAgICA+XG4gICAgICA8c3ZnIGNsYXNzPVwibWluaS1wcm9ncmVzcy1yaW5nXCIgd2lkdGg9XCI0NFwiIGhlaWdodD1cIjQ0XCI+XG4gICAgICAgIDxjaXJjbGVcbiAgICAgICAgICBjbGFzcz1cIm1pbmktcHJvZ3Jlc3MtcmluZ19fY2lyY2xlXCJcbiAgICAgICAgICBzdHJva2U9XCIjM2U5OGM3XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCJcbiAgICAgICAgICBmaWxsPVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgIHI9XCIyMFwiXG4gICAgICAgICAgY3g9XCIyMlwiXG4gICAgICAgICAgY3k9XCIyMlwiXG4gICAgICAgICAgW3N0eWxlLnN0cm9rZURhc2hhcnJheV09XCJjaXJjbGVDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICBbc3R5bGUuc3Ryb2tlRGFzaG9mZnNldC5weF09XCJnZXREYXNoT2Zmc2V0KHJlbWFpbmluZ1RpbWUpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3ZnPlxuICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGltZXItdGV4dFwiIHN0eWxlPVwiY29sb3I6ICMzNzQxNTE7IGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtaW5pLXRpbWVcIj57e1xuICAgICAgICAgIGZvcm1hdFRpbWUocmVtYWluaW5nVGltZSlcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8aW5wdXRcbiAgICAgICpuZ0lmPVwiIWlzTG9jYXRvck5vdERldGVjdFwiXG4gICAgICBbbmdNb2RlbF09XCJtZXNzYWdlXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWVzc2FnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWRcIlxuICAgICAgW3R5cGVdPVwiaW5wdXRUeXBlXCJcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgIHN0eWxlPVwiXG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcbiAgICAgICAgY29sb3I6ICMwQTBBMEE7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnMgZWFzZSwgYm94LXNoYWRvdyAwLjJzIGVhc2U7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBcIlxuICAgICAgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnI0U1RTdFQicgOiAnI0QxRDVEQidcIlxuICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXNJbnB1dERpc2FibGVkID8gJyNGOUZBRkInIDogJyNGRkZGRkYnXCJcbiAgICAgIFtzdHlsZS5jb2xvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnIzlDQTNBRicgOiAnIzBBMEEwQSdcIlxuICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc0lucHV0RGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3RleHQnXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJpbnB1dFBsYWNlaG9sZGVyXCJcbiAgICAgIG9uZm9jdXM9XCJpZiAoIXRoaXMuZGlzYWJsZWQpIHsgdGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0nIzE0NDdFNic7IHRoaXMuc3R5bGUuYm94U2hhZG93PScwIDAgMCAzcHggcmdiYSg2MywgNjcsIDIzOCwgMC4xKSc7IH1cIlxuICAgICAgb25ibHVyPVwidGhpcy5zdHlsZS5ib3JkZXJDb2xvcj0nI0QxRDVEQic7IHRoaXMuc3R5bGUuYm94U2hhZG93PSdub25lJztcIlxuICAgIC8+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJpc0xvY2F0b3JOb3REZXRlY3RcIlxuICAgICAgKGNsaWNrKT1cIm9uUmVkaXJlY3RUb0NFKClcIlxuICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcbiAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuXCJcbiAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI0QxRDVEQjtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xuICAgICAgICAgIGNvbG9yOiAjMzc0MTUxO1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnMgZWFzZTtcbiAgICAgICAgXCJcbiAgICAgICAgb25tb3VzZW92ZXI9XCJ0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcj0nI0Y5RkFGQidcIlxuICAgICAgICBvbm1vdXNlb3V0PVwidGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9JyNGRkZGRkYnXCJcbiAgICAgID5cbiAgICAgICAgUmVjb3JkXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPVwiaXNSZXN1bWVEaXNhYmxlZFwiXG4gICAgICBjbGFzcz1cImJ0blwiXG4gICAgICAoY2xpY2spPVwib25TZW5kTWVzc2FnZSgpXCJcbiAgICAgIHN0eWxlPVwiXG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ0N0U2O1xuICAgICAgICBjb2xvcjogI0ZGRkZGRjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlO1xuICAgICAgXCJcbiAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImlzUmVzdW1lRGlzYWJsZWQgPyAnI0UyRTJFMycgOiAnIzE0NDdFNidcIlxuICAgICAgW3N0eWxlLmNvbG9yXT1cImlzUmVzdW1lRGlzYWJsZWQgPyAnIzlDQTNBRicgOiAnI0ZGRkZGRidcIlxuICAgICAgW3N0eWxlLmN1cnNvcl09XCJpc1Jlc3VtZURpc2FibGVkID8gJ25vdC1hbGxvd2VkJyA6ICdwb2ludGVyJ1wiXG4gICAgICBvbm1vdXNlb3Zlcj1cImlmICghdGhpcy5kaXNhYmxlZCkgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9JyMwRjNDQkEnXCJcbiAgICAgIG9ubW91c2VvdXQ9XCJpZiAoIXRoaXMuZGlzYWJsZWQpIHRoaXMuc3R5bGUuYmFja2dyb3VuZENvbG9yPScjMTQ0N0U2J1wiXG4gICAgPlxuICAgICAgUmVzdW1lXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG48L2Rpdj4iXX0=
|