@sinequa/assistant 3.7.1 → 3.7.2
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/chat/chat-message/chat-message.component.d.ts +4 -8
- package/chat/chat.component.d.ts +38 -14
- package/chat/chat.service.d.ts +11 -5
- package/chat/rest-chat.service.d.ts +1 -0
- package/chat/styles/assistant.scss +2 -0
- package/chat/types.d.ts +4 -131
- package/chat/websocket-chat.service.d.ts +3 -1
- package/esm2020/chat/chat-message/chat-message.component.mjs +3 -10
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +3 -3
- package/esm2020/chat/chat.component.mjs +106 -36
- package/esm2020/chat/chat.service.mjs +15 -13
- package/esm2020/chat/rest-chat.service.mjs +27 -23
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +4 -4
- package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +4 -4
- package/esm2020/chat/types.mjs +2 -9
- package/esm2020/chat/websocket-chat.service.mjs +70 -50
- package/fesm2015/sinequa-assistant-chat.mjs +219 -138
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +226 -145
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -35,7 +35,6 @@ export class ChatMessageComponent {
|
|
|
35
35
|
this.openDocument = new EventEmitter();
|
|
36
36
|
this.openPreview = new EventEmitter();
|
|
37
37
|
this.suggestAction = new EventEmitter();
|
|
38
|
-
this.chatStarterClicked = new EventEmitter();
|
|
39
38
|
this.edit = new EventEmitter();
|
|
40
39
|
this.copy = new EventEmitter();
|
|
41
40
|
this.regenerate = new EventEmitter();
|
|
@@ -46,8 +45,6 @@ export class ChatMessageComponent {
|
|
|
46
45
|
this.referenceMap = new Map();
|
|
47
46
|
this.showReferences = true;
|
|
48
47
|
this.iconSize = 24;
|
|
49
|
-
this.liked = false;
|
|
50
|
-
this.disliked = false;
|
|
51
48
|
this.hiddenTooltip = false;
|
|
52
49
|
/**
|
|
53
50
|
* This Unified plugin looks a text nodes and replaces any reference in the
|
|
@@ -211,19 +208,17 @@ export class ChatMessageComponent {
|
|
|
211
208
|
}
|
|
212
209
|
}
|
|
213
210
|
ChatMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, deps: [{ token: i1.SearchService }, { token: i2.UIService }, { token: i3.PrincipalWebService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
214
|
-
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", chatStarters: "chatStarters", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", connectionErrorMessageIcon: "connectionErrorMessageIcon", searchWarningMessageIcon: "searchWarningMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy", canDebug: "canDebug", canLike: "canLike", canDislike: "canDislike" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", chatStarterClicked: "chatStarterClicked", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike", debug: "debug" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <ng-container [ngSwitch]=\"message?.role\">\n <!-- For 'assistant' -->\n <i *ngSwitchCase=\"'assistant'\" [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <!-- For 'user' -->\n <ng-container *ngSwitchCase=\"'user'\">\n <i *ngIf=\"!!userMessageIcon; else initialsAvatar\" [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n <!-- For 'connection-error' -->\n <ng-container *ngSwitchCase=\"'connection-error'\">\n <i *ngIf=\"!!connectionErrorMessageIcon; else defaultErrorIcon\" [ngClass]=\"connectionErrorMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultErrorIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"connection-error\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zM256 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n <!-- For 'search-warning' -->\n <ng-container *ngSwitchCase=\"'search-warning'\">\n <i *ngIf=\"!!searchWarningMessageIcon; else defaultWarningIcon\" [ngClass]=\"searchWarningMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultWarningIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"search-warning\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\" d=\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zm0-448c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM160 288a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n </ng-container>\n\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <!-- Progress steps -->\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-spinner fa-pulse step-ongoing\" *ngIf=\"!step.done && streaming\"></i>\n <i class=\"fa-solid fa-ban step-error\" *ngIf=\"!step.done && !streaming\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\" [innerHTML]=\"': ' + step.content\"></span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <!-- Message content -->\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <!-- This section is responsible for customizing the template nodes used in the application.\n Template nodes are predefined structures that serve as blueprints for creating/customizing dynamic content -->\n <remark *ngIf=\"(message?.role === 'assistant' && message.messageType === 'MARKDOWN') || message?.role === 'connection-error' || message?.role === 'search-warning'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <!-- Common action buttons for \"user\" & \"assistant\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy text\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <!-- Action buttons for \"user\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <!-- Action buttons for \"assistant\" message -->\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n\n <!-- List of chat starters, if any -->\n <div *ngIf=\"chatStarters?.length\" class=\"mt-2 message-suggestion chat-starter\" [style.bottom.rem]=\"-(3.5*chatStarters!.length)\">\n <div class=\"suggested-action\" *ngFor=\"let chatStarter of chatStarters\" (click)=\"chatStarterClicked.emit(chatStarter)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{chatStarter.text}}</p>\n </div>\n </div>\n </div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-connection-error .message-content{background:var(--ast-error-bg, rgba(249, 58, 55, .2))}.message-search-warning .message-content{background:var(--ast-warning-bg, #fff1b8);color:var(--ast-message-reference-color, inherit)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{display:flex;cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.chat-starter{position:absolute}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem;color:var(--ast-action-buttons-color, #212529)}.sq-chat-message-actions button:hover{color:var(--ast-action-buttons-hover-color, var(--ast-primary-color, #005DA7))}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.connection-error{height:var(--sq-size);width:var(--sq-size);color:var(--ast-error-color, rgba(249, 58, 55, .7))}.search-warning{height:var(--sq-size);width:var(--sq-size);color:var(--ast-warning-color, #fed86f)}.step-success{color:var(--ast-primary-color, #005DA7)}.step-ongoing{color:var(--ast-secondary-color, #FF732E)}.step-error{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }, { kind: "component", type: ChartComponent, selector: "sq-assistant-chart", inputs: ["rawChartData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
211
|
+
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", connectionErrorMessageIcon: "connectionErrorMessageIcon", searchWarningMessageIcon: "searchWarningMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy", canDebug: "canDebug", canLike: "canLike", canDislike: "canDislike" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike", debug: "debug" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <ng-container [ngSwitch]=\"message?.role\">\n <!-- For 'assistant' -->\n <i *ngSwitchCase=\"'assistant'\" [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <!-- For 'user' -->\n <ng-container *ngSwitchCase=\"'user'\">\n <i *ngIf=\"!!userMessageIcon; else initialsAvatar\" [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n <!-- For 'connection-error' -->\n <ng-container *ngSwitchCase=\"'connection-error'\">\n <i *ngIf=\"!!connectionErrorMessageIcon; else defaultErrorIcon\" [ngClass]=\"connectionErrorMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultErrorIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"connection-error\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zM256 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n <!-- For 'search-warning' -->\n <ng-container *ngSwitchCase=\"'search-warning'\">\n <i *ngIf=\"!!searchWarningMessageIcon; else defaultWarningIcon\" [ngClass]=\"searchWarningMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultWarningIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"search-warning\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\" d=\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zm0-448c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM160 288a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n </ng-container>\n\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <!-- Progress steps -->\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-spinner fa-pulse step-ongoing\" *ngIf=\"!step.done && streaming\"></i>\n <i class=\"fa-solid fa-ban step-error\" *ngIf=\"!step.done && !streaming\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\" [innerHTML]=\"': ' + step.content\"></span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <!-- Message content -->\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <!-- This section is responsible for customizing the template nodes used in the application.\n Template nodes are predefined structures that serve as blueprints for creating/customizing dynamic content -->\n <remark *ngIf=\"(message?.role === 'assistant' && message.messageType === 'MARKDOWN') || message?.role === 'connection-error' || message?.role === 'search-warning'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <!-- Common action buttons for \"user\" & \"assistant\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy text\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <!-- Action buttons for \"user\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <!-- Action buttons for \"assistant\" message -->\n <button class=\"btn btn-sm\" [class.bounce]=\"message.additionalProperties.$liked === true\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit()\">\n <i class=\"fa-thumbs-up {{message.additionalProperties.$liked === true ? 'fas' : 'far'}}\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"message.additionalProperties.$disliked === true\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit()\">\n <i class=\"fa-thumbs-down {{message.additionalProperties.$disliked === true ? 'fas' : 'far'}}\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-connection-error .message-content{background:var(--ast-error-bg, rgba(249, 58, 55, .2))}.message-search-warning .message-content{background:var(--ast-warning-bg, #fff1b8);color:var(--ast-message-reference-color, inherit)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem;color:var(--ast-action-buttons-color, #212529)}.sq-chat-message-actions button:hover{color:var(--ast-action-buttons-hover-color, var(--ast-primary-color, #005DA7))}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.connection-error{height:var(--sq-size);width:var(--sq-size);color:var(--ast-error-color, rgba(249, 58, 55, .7))}.search-warning{height:var(--sq-size);width:var(--sq-size);color:var(--ast-warning-color, #fed86f)}.step-success{color:var(--ast-primary-color, #005DA7)}.step-ongoing{color:var(--ast-secondary-color, #FF732E)}.step-error{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }, { kind: "component", type: ChartComponent, selector: "sq-assistant-chart", inputs: ["rawChartData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
215
212
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, decorators: [{
|
|
216
213
|
type: Component,
|
|
217
214
|
args: [{ selector: "sq-chat-message", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UtilsModule, CollapseModule, RemarkModule,
|
|
218
|
-
InitialsAvatarComponent, ChatReferenceComponent, ChartComponent], template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <ng-container [ngSwitch]=\"message?.role\">\n <!-- For 'assistant' -->\n <i *ngSwitchCase=\"'assistant'\" [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <!-- For 'user' -->\n <ng-container *ngSwitchCase=\"'user'\">\n <i *ngIf=\"!!userMessageIcon; else initialsAvatar\" [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n <!-- For 'connection-error' -->\n <ng-container *ngSwitchCase=\"'connection-error'\">\n <i *ngIf=\"!!connectionErrorMessageIcon; else defaultErrorIcon\" [ngClass]=\"connectionErrorMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultErrorIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"connection-error\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zM256 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n <!-- For 'search-warning' -->\n <ng-container *ngSwitchCase=\"'search-warning'\">\n <i *ngIf=\"!!searchWarningMessageIcon; else defaultWarningIcon\" [ngClass]=\"searchWarningMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultWarningIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"search-warning\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\" d=\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zm0-448c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM160 288a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n </ng-container>\n\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <!-- Progress steps -->\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-spinner fa-pulse step-ongoing\" *ngIf=\"!step.done && streaming\"></i>\n <i class=\"fa-solid fa-ban step-error\" *ngIf=\"!step.done && !streaming\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\" [innerHTML]=\"': ' + step.content\"></span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <!-- Message content -->\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <!-- This section is responsible for customizing the template nodes used in the application.\n Template nodes are predefined structures that serve as blueprints for creating/customizing dynamic content -->\n <remark *ngIf=\"(message?.role === 'assistant' && message.messageType === 'MARKDOWN') || message?.role === 'connection-error' || message?.role === 'search-warning'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <!-- Common action buttons for \"user\" & \"assistant\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy text\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <!-- Action buttons for \"user\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <!-- Action buttons for \"assistant\" message -->\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n\n <!-- List of chat starters, if any -->\n <div *ngIf=\"chatStarters?.length\" class=\"mt-2 message-suggestion chat-starter\" [style.bottom.rem]=\"-(3.5*chatStarters!.length)\">\n <div class=\"suggested-action\" *ngFor=\"let chatStarter of chatStarters\" (click)=\"chatStarterClicked.emit(chatStarter)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{chatStarter.text}}</p>\n </div>\n </div>\n </div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-connection-error .message-content{background:var(--ast-error-bg, rgba(249, 58, 55, .2))}.message-search-warning .message-content{background:var(--ast-warning-bg, #fff1b8);color:var(--ast-message-reference-color, inherit)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{display:flex;cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.chat-starter{position:absolute}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem;color:var(--ast-action-buttons-color, #212529)}.sq-chat-message-actions button:hover{color:var(--ast-action-buttons-hover-color, var(--ast-primary-color, #005DA7))}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.connection-error{height:var(--sq-size);width:var(--sq-size);color:var(--ast-error-color, rgba(249, 58, 55, .7))}.search-warning{height:var(--sq-size);width:var(--sq-size);color:var(--ast-warning-color, #fed86f)}.step-success{color:var(--ast-primary-color, #005DA7)}.step-ongoing{color:var(--ast-secondary-color, #FF732E)}.step-error{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
215
|
+
InitialsAvatarComponent, ChatReferenceComponent, ChartComponent], template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <ng-container [ngSwitch]=\"message?.role\">\n <!-- For 'assistant' -->\n <i *ngSwitchCase=\"'assistant'\" [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <!-- For 'user' -->\n <ng-container *ngSwitchCase=\"'user'\">\n <i *ngIf=\"!!userMessageIcon; else initialsAvatar\" [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n <!-- For 'connection-error' -->\n <ng-container *ngSwitchCase=\"'connection-error'\">\n <i *ngIf=\"!!connectionErrorMessageIcon; else defaultErrorIcon\" [ngClass]=\"connectionErrorMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultErrorIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"connection-error\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zM256 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n <!-- For 'search-warning' -->\n <ng-container *ngSwitchCase=\"'search-warning'\">\n <i *ngIf=\"!!searchWarningMessageIcon; else defaultWarningIcon\" [ngClass]=\"searchWarningMessageIcon\" [style.--sq-size.px]=\"iconSize\"></i>\n <ng-template #defaultWarningIcon>\n <svg [style.--sq-size.px]=\"iconSize\" class=\"search-warning\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path fill=\"currentColor\" d=\"M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zm0-448c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM160 288a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z\"/>\n </svg>\n </ng-template>\n </ng-container>\n </ng-container>\n\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <!-- Progress steps -->\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-spinner fa-pulse step-ongoing\" *ngIf=\"!step.done && streaming\"></i>\n <i class=\"fa-solid fa-ban step-error\" *ngIf=\"!step.done && !streaming\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\" [innerHTML]=\"': ' + step.content\"></span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <!-- Message content -->\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <!-- This section is responsible for customizing the template nodes used in the application.\n Template nodes are predefined structures that serve as blueprints for creating/customizing dynamic content -->\n <remark *ngIf=\"(message?.role === 'assistant' && message.messageType === 'MARKDOWN') || message?.role === 'connection-error' || message?.role === 'search-warning'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <!-- Common action buttons for \"user\" & \"assistant\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy text\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <!-- Action buttons for \"user\" message -->\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <!-- Action buttons for \"assistant\" message -->\n <button class=\"btn btn-sm\" [class.bounce]=\"message.additionalProperties.$liked === true\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit()\">\n <i class=\"fa-thumbs-up {{message.additionalProperties.$liked === true ? 'fas' : 'far'}}\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"message.additionalProperties.$disliked === true\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit()\">\n <i class=\"fa-thumbs-down {{message.additionalProperties.$disliked === true ? 'fas' : 'far'}}\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-icon\" [style.width.px]=\"iconSize\"></div>\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-connection-error .message-content{background:var(--ast-error-bg, rgba(249, 58, 55, .2))}.message-search-warning .message-content{background:var(--ast-warning-bg, #fff1b8);color:var(--ast-message-reference-color, inherit)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem;color:var(--ast-action-buttons-color, #212529)}.sq-chat-message-actions button:hover{color:var(--ast-action-buttons-hover-color, var(--ast-primary-color, #005DA7))}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.connection-error{height:var(--sq-size);width:var(--sq-size);color:var(--ast-error-color, rgba(249, 58, 55, .7))}.search-warning{height:var(--sq-size);width:var(--sq-size);color:var(--ast-warning-color, #fed86f)}.step-success{color:var(--ast-primary-color, #005DA7)}.step-ongoing{color:var(--ast-secondary-color, #FF732E)}.step-error{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
219
216
|
}], ctorParameters: function () { return [{ type: i1.SearchService }, { type: i2.UIService }, { type: i3.PrincipalWebService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { message: [{
|
|
220
217
|
type: Input
|
|
221
218
|
}], conversation: [{
|
|
222
219
|
type: Input
|
|
223
220
|
}], suggestedActions: [{
|
|
224
221
|
type: Input
|
|
225
|
-
}], chatStarters: [{
|
|
226
|
-
type: Input
|
|
227
222
|
}], assistantMessageIcon: [{
|
|
228
223
|
type: Input
|
|
229
224
|
}], userMessageIcon: [{
|
|
@@ -252,8 +247,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
252
247
|
type: Output
|
|
253
248
|
}], suggestAction: [{
|
|
254
249
|
type: Output
|
|
255
|
-
}], chatStarterClicked: [{
|
|
256
|
-
type: Output
|
|
257
250
|
}], edit: [{
|
|
258
251
|
type: Output
|
|
259
252
|
}], copy: [{
|
|
@@ -267,4 +260,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
267
260
|
}], debug: [{
|
|
268
261
|
type: Output
|
|
269
262
|
}] } });
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7OztBQWVqRSxNQUFNLE9BQU8sb0JBQW9CO0lBdUMvQixZQUNT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QkFBeEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5pbXBvcnQgeyBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENoYXRNZXNzYWdlLCBDaGF0U3RhcnRlciwgU3VnZ2VzdGVkQWN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IHVuaWZpZWQsIFByb2Nlc3NvciB9IGZyb20gXCJ1bmlmaWVkXCI7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSBcInJlbWFyay1wYXJzZVwiO1xuaW1wb3J0IHsgdmlzaXQsIENPTlRJTlVFLCBFWElUIH0gZnJvbSBcInVuaXN0LXV0aWwtdmlzaXRcIjtcbmltcG9ydCB7IFRleHQsIFBhcmVudCwgQ29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCJ1bmlzdFwiO1xuaW1wb3J0IHsgVUlTZXJ2aWNlLCBVdGlsc01vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzXCI7XG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gXCJyZW1hcmstZ2ZtXCI7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBDb2xsYXBzZU1vZHVsZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL2NvbGxhcHNlXCI7XG5pbXBvcnQgeyBSZW1hcmtNb2R1bGUgfSBmcm9tIFwibmd4LXJlbWFya1wiO1xuaW1wb3J0IHsgSW5pdGlhbHNBdmF0YXJDb21wb25lbnQgfSBmcm9tIFwiLi4vaW5pdGlhbHMtYXZhdGFyL2luaXRpYWxzLWF2YXRhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IENoYXRSZWZlcmVuY2VDb21wb25lbnQgfSBmcm9tIFwiLi4vY2hhdC1yZWZlcmVuY2UvY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50XCI7XG5cbmltcG9ydCBcInByaXNtanMtY29tcG9uZW50cy1pbXBvcnRlci9lc21cIjtcbmltcG9ydCAncHJpc21qcy9wbHVnaW5zL2F1dG9sb2FkZXIvcHJpc20tYXV0b2xvYWRlcic7XG5pbXBvcnQgeyBDaGFydENvbXBvbmVudCB9IGZyb20gXCIuLi9jaGFydHMvY2hhcnQvY2hhcnQuY29tcG9uZW50XCI7XG5cbmRlY2xhcmUgbW9kdWxlIFByaXNtIHtcbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsVW5kZXIoZWw6IEhUTUxFbGVtZW50KTogdm9pZDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNxLWNoYXQtbWVzc2FnZVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVXRpbHNNb2R1bGUsIENvbGxhcHNlTW9kdWxlLCBSZW1hcmtNb2R1bGUsXG4gICAgSW5pdGlhbHNBdmF0YXJDb21wb25lbnQsIENoYXRSZWZlcmVuY2VDb21wb25lbnQsIENoYXJ0Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIG1lc3NhZ2U6IENoYXRNZXNzYWdlO1xuICBASW5wdXQoKSBjb252ZXJzYXRpb246IENoYXRNZXNzYWdlW107XG4gIEBJbnB1dCgpIHN1Z2dlc3RlZEFjdGlvbnM6IFN1Z2dlc3RlZEFjdGlvbltdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjaGF0U3RhcnRlcnM6IENoYXRTdGFydGVyW10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzZWFyY2hXYXJuaW5nTWVzc2FnZUljb246IHN0cmluZztcbiAgQElucHV0KCkgc3RyZWFtaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5FZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhblJlZ2VuZXJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuQ29weTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5EZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5MaWtlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkRpc2xpa2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIG9wZW5Eb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e3JlZmVyZW5jZTogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXJ9PigpO1xuICBAT3V0cHV0KCkgb3BlblByZXZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPHtyZWZlcmVuY2U6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyfT4oKTtcbiAgQE91dHB1dCgpIHN1Z2dlc3RBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3RlZEFjdGlvbj4oKTtcbiAgQE91dHB1dCgpIGNoYXRTdGFydGVyQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdFN0YXJ0ZXI+KCk7XG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGNvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgcmVnZW5lcmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBsaWtlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGRpc2xpa2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgZGVidWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuXG4gIHByb2Nlc3NvcjogUHJvY2Vzc29yO1xuXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIHNob3dSZWZlcmVuY2VzOiBib29sZWFuID0gdHJ1ZTtcbiAgY29sbGFwc2VQcm9ncmVzczogYm9vbGVhbjtcbiAgaWNvblNpemUgPSAyNDtcblxuICBsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBoaWRkZW5Ub29sdGlwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgcHVibGljIHByaW5jaXBhbFNlcnZpY2U6IFByaW5jaXBhbFdlYlNlcnZpY2UsXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnN0cmVhbWluZykge1xuICAgICAgdGhpcy5jb2xsYXBzZVByb2dyZXNzID0gIXRoaXMuc3RyZWFtaW5nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlcyA9IFtdO1xuICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuY2xlYXIoKTtcbiAgICAgIGZvciAobGV0IG0gb2YgdGhpcy5jb252ZXJzYXRpb24pIHtcbiAgICAgICAgaWYgKG0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgbS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KCcnICsgYXR0YWNobWVudC5jb250ZXh0SWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0cz8uWzBdPy5wYXJ0SWQgfSk7XG4gICAgICAgICAgICBpZiAoISFhdHRhY2htZW50LnBhcnRzICYmIGF0dGFjaG1lbnQucGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGFjaG1lbnQucGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJZCA9IGAke2F0dGFjaG1lbnQuY29udGV4dElkfS4ke2F0dGFjaG1lbnQucGFydHNbaV0ucGFydElkfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KHJlZklkLCB7IC4uLmF0dGFjaG1lbnQsICRwYXJ0SWQ6IGF0dGFjaG1lbnQucGFydHM/LltpXT8ucGFydElkIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobS5jb250ZW50LnN0YXJ0c1dpdGgoXCI8Y2hhcnRqcz5cIikpe1xuICAgICAgICAgIG0ubWVzc2FnZVR5cGUgPSBcIkNIQVJUXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBtLm1lc3NhZ2VUeXBlID0gXCJNQVJLRE9XTlwiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgICAgIC51c2UocmVtYXJrUGFyc2UpXG4gICAgICAgIC51c2UocmVtYXJrR2ZtKVxuICAgICAgICAudXNlKCgpID0+IHRoaXMucmVmZXJlbmNlUGx1Z2luKTtcblxuICAgICAgaWYgKHRoaXMuc3RyZWFtaW5nKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3IudXNlKCgpID0+IHRoaXMucGxhY2Vob2xkZXJQbHVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBQcmlzbT8uaGlnaGxpZ2h0QWxsVW5kZXI/Lih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gIXRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwgPyAnJ1xuICAgICAgOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsWydmdWxsTmFtZSddIGFzIHN0cmluZyB8fCB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsLm5hbWU7XG4gIH1cblxuICBnZXQgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbD8uaXNBZG1pbmlzdHJhdG9yIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgVW5pZmllZCBwbHVnaW4gbG9va3MgYSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlcyBhbnkgcmVmZXJlbmNlIGluIHRoZVxuICAgKiBmb3JtIFsxXSwgWzIuM10sIGV0Yy4gd2l0aCBjdXN0b20gbm9kZXMgb2YgdHlwZSBcImNoYXQtcmVmZXJlbmNlXCIuXG4gICAqL1xuICByZWZlcmVuY2VQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgLy8gVmlzaXQgYWxsIHRleHQgbm9kZXNcbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XG4gICAgICBsZXQgdGV4dCA9IG5vZGUudmFsdWU7XG5cbiAgICAgIHRleHQgPSB0aGlzLnJlZm9ybWF0UmVmZXJlbmNlcyh0ZXh0KTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLmdldFJlZmVyZW5jZU1hdGNoZXModGV4dCk7XG5cbiAgICAgIC8vIFF1aXQgaWYgbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kXG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlczogKENvbnRlbnQgJiB7IGVuZDogbnVtYmVyIH0pW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCByZWZJZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgW3JlZl0gPSByZWZJZC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIFdlIGZpbmQgYSB2YWxpZCByZWZlcmVuY2UgaW4gdGhlIHRleHRcbiAgICAgICAgaWYgKCFpc05hTigrcmVmKSkge1xuICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKCtyZWYpOyAvLyBBZGQgaXQgdG8gdGhlIHNldCBvZiB1c2VkIHJlZmVyZW5jZXNcblxuICAgICAgICAgIC8vIElmIG5lZWRlZCwgaW5zZXJ0IGEgdGV4dCBub2RlIGJlZm9yZSB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG5vZGVzLmF0KC0xKSA/PyB7IGVuZDogMCB9O1xuICAgICAgICAgIGlmIChtYXRjaC5pbmRleCEgPiBjdXJyZW50LmVuZCkge1xuICAgICAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZTogdGV4dC5zdWJzdHJpbmcoY3VycmVudC5lbmQsIG1hdGNoLmluZGV4ISksIGVuZDogbWF0Y2guaW5kZXghIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBhIGN1c3RvbSByZWZlcmVuY2Ugbm9kZVxuICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcImNoYXQtcmVmZXJlbmNlXCIsIHJlZklkLCBlbmQ6IG1hdGNoLmluZGV4ISArIG1hdGNoWzBdLmxlbmd0aCB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUXVpdCBpZiBubyByZWZlcmVuY2VzIHdlcmUgZm91bmRcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZXMuYXQoLTEpIS5lbmQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICBub2Rlcy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHZhbHVlOiB0ZXh0LnN1YnN0cmluZyhub2Rlcy5hdCgtMSkhLmVuZCwgdGV4dC5sZW5ndGgpLCBlbmQ6IHRleHQubGVuZ3RoIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGN1cnJlbnQgdGV4dCBub2RlIGZyb20gdGhlIHBhcmVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgbm9kZXNcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEsIC4uLm5vZGVzKTtcblxuICAgICAgcmV0dXJuIGluZGV4ICsgbm9kZXMubGVuZ3RoOyAvLyBWaXNpdCB0aGUgbmV4dCBub2RlIGFmdGVyIHRoZSBpbnNlcnRlZCBvbmVzXG4gICAgfSk7XG5cbiAgICBpZiAocmVmZXJlbmNlcy5zaXplID4gMCkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gQXJyYXkuZnJvbShyZWZlcmVuY2VzLnZhbHVlcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAgIC5tYXAociA9PiAnJyArIHIpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgcGxhY2Vob2xkZXJQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgdmlzaXQodHJlZSwgXCJ0ZXh0XCIsIChub2RlOiBUZXh0LCBpbmRleDogbnVtYmVyLCBwYXJlbnQ6IFBhcmVudCkgPT4ge1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goeyB0eXBlOiBcInN0cmVhbWluZy1wbGFjZWhvbGRlclwiIH0gYXMgYW55KTtcbiAgICAgIHJldHVybiBFWElUO1xuICAgIH0sIHRydWUpO1xuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRMaW5rVGV4dChub2RlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgIHJldHVybiBub2RlLnRleHQ7IC8vIFJldHVybiBkaXJlY3RseSBpZiB0ZXh0IGlzIHByb3ZpZGVkIGluIG5vZGUudGV4dCAoW0V4YW1wbGUgbGlua10oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGZvciB0ZXh0IGNvbnRlbnQgaW4gY2hpbGQgbm9kZXNcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmIGNoaWxkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLnZhbHVlOyAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCB0ZXh0IG5vZGUgZm91bmQgKFsqKkVtcGhhc2l6ZWQgTGluayBUZXh0KipdKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMuZ2V0TGlua1RleHQoY2hpbGQpOyAvLyBSZWN1cnNpdmVseSBzZWFyY2ggY2hpbGQgbm9kZXMgKFshW0V4YW1wbGUgaW1hZ2VdKGh0dHBzOi8vZXhhbXBsZS5jb20vaW1hZ2UucG5nKV0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQ7IC8vIFJldHVybiB0ZXh0IGNvbnRlbnQgaWYgZm91bmRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdsaW5rJzsgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBubyB0ZXh0IGNvbnRlbnQgaXMgZm91bmRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZvcm1hdCBbaWRzOiAxMi4yLCA0Mi41XSB0byBbMTIuMl1bNDIuNV1cbiAgICovXG4gIHJlZm9ybWF0UmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9cXFsoPzppZHM/Oj9cXHMqKT8oPzpkb2N1bWVudHM/Oj9cXHMqKT8oXFxzKig/Oiw/XFxzKlxcZCsoPzpcXC5cXGQrKT8oPzpcXC5wYXJ0KT9cXHMqKSspXFxdL2csXG4gICAgICAoc3RyLCBtYXRjaDogc3RyaW5nKSA9PiBgWyR7bWF0Y2gucmVwbGFjZSgvXFwucGFydC9nLCBcIlwiKS5zcGxpdCgnLCcpLmpvaW4oXCJdIFtcIil9XWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoIGFsbCByZWZlcmVuY2VzIGluIGEgZ2l2ZW4gbWVzc2FnZVxuICAgKi9cbiAgZ2V0UmVmZXJlbmNlTWF0Y2hlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb250ZW50Lm1hdGNoQWxsKC9cXFsoXFxzKlxcZCsoPzpcXC5cXGQrKT9cXHMqKVxcXS9nKSk7XG4gIH1cblxuICBwcml2YXRlIF9jb3B5VG9DbGlwYm9hcmQoY29udGVudDogc3RyaW5nKSB7XG4gICAgdGhpcy51aS5jb3B5VG9DbGlwYm9hcmQoY29udGVudCk7XG5cbiAgfVxuXG4gIGNvcHlNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XG4gICAgY29uc3QgY29udGVudCA9IG1lc3NhZ2UuY29udGVudC5yZXBsYWNlQWxsKC9cXHMrXFxbLis/XFxdL2csIFwiXCIpXG4gICAgdGhpcy5fY29weVRvQ2xpcGJvYXJkKGNvbnRlbnQpO1xuICAgIHRoaXMuY29weS5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgY29weUNvZGUoY29kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29weVRvQ2xpcGJvYXJkKGNvZGUpO1xuICB9XG5cbiAgb3BlbkF0dGFjaG1lbnRQcmV2aWV3KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgfVxuXG4gIG9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoYXR0YWNobWVudDogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXIpIHtcbiAgICB0aGlzLm9wZW5Eb2N1bWVudC5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgfVxuXG4gIGhpZGVUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuaGlkZGVuVG9vbHRpcCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGRlblRvb2x0aXAgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPCEtLSBNZXNzYWdlIGljb24gLS0+XG48c3BhbiBjbGFzcz1cIm1lc3NhZ2UtaWNvblwiIFt0aXRsZV09XCJtZXNzYWdlPy5yb2xlXCI+XG4gIDxpIGNsYXNzPVwiZC1ibG9ja1wiIFtzdHlsZS53aWR0aC5weF09XCJpY29uU2l6ZVwiICpuZ0lmPVwiIW1lc3NhZ2VcIj48L2k+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm1lc3NhZ2U/LnJvbGVcIj5cbiAgICA8IS0tIEZvciAnYXNzaXN0YW50JyAtLT5cbiAgICA8aSAqbmdTd2l0Y2hDYXNlPVwiJ2Fzc2lzdGFudCdcIiBbbmdDbGFzc109XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIj48L2k+XG4gICAgPCEtLSBGb3IgJ3VzZXInIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid1c2VyJ1wiPlxuICAgICAgPGkgKm5nSWY9XCIhIXVzZXJNZXNzYWdlSWNvbjsgZWxzZSBpbml0aWFsc0F2YXRhclwiIFtuZ0NsYXNzXT1cInVzZXJNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIj48L2k+XG4gICAgICA8bmctdGVtcGxhdGUgI2luaXRpYWxzQXZhdGFyPlxuICAgICAgICA8c3EtaW5pdGlhbHMtYXZhdGFyIFtmdWxsTmFtZV09XCJuYW1lXCI+PC9zcS1pbml0aWFscy1hdmF0YXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gRm9yICdjb25uZWN0aW9uLWVycm9yJyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29ubmVjdGlvbi1lcnJvcidcIj5cbiAgICAgIDxpICpuZ0lmPVwiISFjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvbjsgZWxzZSBkZWZhdWx0RXJyb3JJY29uXCIgW25nQ2xhc3NdPVwiY29ubmVjdGlvbkVycm9yTWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCI+PC9pPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RXJyb3JJY29uPlxuICAgICAgICA8c3ZnIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiBjbGFzcz1cImNvbm5lY3Rpb24tZXJyb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+XG4gICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTcuMSAyOTJjLTEyLjktMjIuMy0xMi45LTQ5LjcgMC03MkwxMDUuNCA2Ny4xYzEyLjktMjIuMyAzNi42LTM2IDYyLjQtMzZsMTc2LjYgMGMyNS43IDAgNDkuNSAxMy43IDYyLjQgMzZMNDk0LjkgMjIwYzEyLjkgMjIuMyAxMi45IDQ5LjcgMCA3Mkw0MDYuNiA0NDQuOWMtMTIuOSAyMi4zLTM2LjYgMzYtNjIuNCAzNmwtMTc2LjYgMGMtMjUuNyAwLTQ5LjUtMTMuNy02Mi40LTM2TDE3LjEgMjkyek0yNTYgMTI4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0em0zMiAyMjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIEZvciAnc2VhcmNoLXdhcm5pbmcnIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWFyY2gtd2FybmluZydcIj5cbiAgICAgIDxpICpuZ0lmPVwiISFzZWFyY2hXYXJuaW5nTWVzc2FnZUljb247IGVsc2UgZGVmYXVsdFdhcm5pbmdJY29uXCIgW25nQ2xhc3NdPVwic2VhcmNoV2FybmluZ01lc3NhZ2VJY29uXCIgW3N0eWxlLi0tc3Etc2l6ZS5weF09XCJpY29uU2l6ZVwiPjwvaT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdhcm5pbmdJY29uPlxuICAgICAgICA8c3ZnIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiBjbGFzcz1cInNlYXJjaC13YXJuaW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzg0IDUxMlwiPlxuICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTI3MiAzODRjOS42LTMxLjkgMjkuNS01OS4xIDQ5LjItODYuMmMwIDAgMCAwIDAgMGM1LjItNy4xIDEwLjQtMTQuMiAxNS40LTIxLjRjMTkuOC0yOC41IDMxLjQtNjMgMzEuNC0xMDAuM0MzNjggNzguOCAyODkuMiAwIDE5MiAwUzE2IDc4LjggMTYgMTc2YzAgMzcuMyAxMS42IDcxLjkgMzEuNCAxMDAuM2M1IDcuMiAxMC4yIDE0LjMgMTUuNCAyMS40YzAgMCAwIDAgMCAwYzE5LjggMjcuMSAzOS43IDU0LjQgNDkuMiA4Ni4ybDE2MCAwek0xOTIgNTEyYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtMTYtMTYwIDAgMCAxNmMwIDQ0LjIgMzUuOCA4MCA4MCA4MHptMC00NDhjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxMTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMTJjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTE2MCAyODhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvc3Bhbj5cblxuPCEtLSBNZXNzYWdlIGJvZHkgLS0+XG48ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogMDtcIiBbbmdDbGFzc109XCInbWVzc2FnZS0nK21lc3NhZ2Uucm9sZVwiPlxuXG4gIDwhLS0gUHJvZ3Jlc3Mgc3RlcHMgLS0+XG4gIDxkaXYgKm5nSWY9XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyBhcyBwcm9ncmVzc1wiIGNsYXNzPVwic21hbGwgbXMtMyBtYi0yXCI+XG4gICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiY29sbGFwc2VQcm9ncmVzcyA9ICFjb2xsYXBzZVByb2dyZXNzOyBmYWxzZVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgVmlldyBwcm9ncmVzc1xuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi17e2NvbGxhcHNlUHJvZ3Jlc3M/ICdyaWdodCcgOiAnZG93bid9fVwiPjwvaT5cbiAgICA8L2E+XG4gICAgPHNxLWNvbGxhcHNlIFtjb2xsYXBzZWRdPVwiY29sbGFwc2VQcm9ncmVzc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdGVwIG9mIHByb2dyZXNzXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1mdyBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiAqbmdJZj1cInN0ZXAuZG9uZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtcHVsc2Ugc3RlcC1vbmdvaW5nXCIgKm5nSWY9XCIhc3RlcC5kb25lICYmIHN0cmVhbWluZ1wiPjwvaT5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtYmFuIHN0ZXAtZXJyb3JcIiAqbmdJZj1cIiFzdGVwLmRvbmUgJiYgIXN0cmVhbWluZ1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMiBmdy1ib2xkXCI+e3tzdGVwLnRpdGxlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN0ZXAuY29udGVudFwiIFtpbm5lckhUTUxdPVwiJzogJyArIHN0ZXAuY29udGVudFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NxLWNvbGxhcHNlPlxuICA8L2Rpdj5cblxuICA8IS0tIE1lc3NhZ2UgY29udGVudCAtLT5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgbWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ0NIQVJUJ1wiPlxuICAgICAgPHNxLWFzc2lzdGFudC1jaGFydCBbcmF3Q2hhcnREYXRhXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvc3EtYXNzaXN0YW50LWNoYXJ0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUaGlzIHNlY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGN1c3RvbWl6aW5nIHRoZSB0ZW1wbGF0ZSBub2RlcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgICAgVGVtcGxhdGUgbm9kZXMgYXJlIHByZWRlZmluZWQgc3RydWN0dXJlcyB0aGF0IHNlcnZlIGFzIGJsdWVwcmludHMgZm9yIGNyZWF0aW5nL2N1c3RvbWl6aW5nIGR5bmFtaWMgY29udGVudCAtLT5cbiAgICA8cmVtYXJrICpuZ0lmPVwiKG1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNQVJLRE9XTicpIHx8IG1lc3NhZ2U/LnJvbGUgPT09ICdjb25uZWN0aW9uLWVycm9yJyB8fCBtZXNzYWdlPy5yb2xlID09PSAnc2VhcmNoLXdhcm5pbmcnXCIgW21hcmtkb3duXT1cIm1lc3NhZ2UuY29udGVudFwiIFtwcm9jZXNzb3JdPVwicHJvY2Vzc29yXCI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cImNoYXQtcmVmZXJlbmNlXCIgbGV0LXJlZj5cblxuICAgICAgICA8YSAqbmdJZj1cInJlZmVyZW5jZU1hcC5nZXQocmVmLnJlZklkKSBhcyBhdHRhY2htZW50OyBlbHNlIHN0YXRpY1JlZlRwbFwiXG4gICAgICAgICAgY2xhc3M9XCJyZWZlcmVuY2VcIlxuICAgICAgICAgIFtzcVRvb2x0aXBdPVwiYXR0YWNobWVudFwiXG4gICAgICAgICAgW3NxVG9vbHRpcFRlbXBsYXRlXT1cInRvb2x0aXBUcGxcIlxuICAgICAgICAgIFtob3ZlcmFibGVUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgID57e3JlZi5yZWZJZH19XG4gICAgICAgIDwvYT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3N0YXRpY1JlZlRwbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlZmVyZW5jZVwiPnt7cmVmLnJlZklkfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cInN0cmVhbWluZy1wbGFjZWhvbGRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsYWNlaG9sZGVyLWdsb3dcIiAqbmdJZj1cInN0cmVhbWluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXIgbXMtMVwiPjwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwiY29kZVwiIGxldC1ub2RlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtYi0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7bm9kZS5sYW5nfX08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiAoY2xpY2spPVwiY29weUNvZGUobm9kZS52YWx1ZSlcIj48aSBjbGFzcz1cImZhciBmYS1mdyBmYS1jbGlwYm9hcmRcIj48L2k+IENvcHkgY29kZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319IG15LTAgcm91bmRlZC0wIHJvdW5kZWQtYm90dG9tXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319XCI+e3tub2RlLnZhbHVlfX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwibGlua1wiIGxldC1ub2RlPlxuICAgICAgICA8YSBbaHJlZl09XCJub2RlLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57e2dldExpbmtUZXh0KG5vZGUpfX08L2E+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9yZW1hcms+XG5cbiAgICA8cCAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICd1c2VyJ1wiPnt7bWVzc2FnZS5jb250ZW50fX08L3A+XG5cbiAgICA8IS0tIExpc3Qgb2YgcmVmZXJlbmNlLCBpZiBhbnkgLS0+XG4gICAgPGRpdiAqbmdJZj1cInJlZmVyZW5jZXM/Lmxlbmd0aFwiIGNsYXNzPVwicmVmZXJlbmNlc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWZlcmVuY2VzLXRpdGxlXCI+UmVmZXJlbmNlczwvc3Bhbj4gPGkgY2xhc3M9XCJmYXMgcmVmZXJlbmNlcy1jb2xsYXBzZVwiIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwic2hvd1JlZmVyZW5jZXNcIiBbY2xhc3MuZmEtY2hldnJvbi1yaWdodF09XCIhc2hvd1JlZmVyZW5jZXNcIiAoY2xpY2spPVwic2hvd1JlZmVyZW5jZXM9IXNob3dSZWZlcmVuY2VzXCI+PC9pPlxuICAgICAgPHNxLWNvbGxhcHNlIFtjb2xsYXBzZWRdPVwiIXNob3dSZWZlcmVuY2VzXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlc1wiPlxuICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJyZWZlcmVuY2VNYXAuZ2V0KHJlZmVyZW5jZSkgYXMgYXR0YWNobWVudFwiICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3EtY2hhdC1yZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJhdHRhY2htZW50LiRleHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0YWNobWVudF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VdPVwicmVmZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9zcS1jb2xsYXBzZT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICAgIDwhLS0gRWRpdCAvIFJlZ2VuZXJhdGUgZmxvYXRpbmcgYWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cInNxLWNoYXQtbWVzc2FnZS1hY3Rpb25zXCIgKm5nSWY9XCJtZXNzYWdlXCI+XG4gICAgPCEtLSBDb21tb24gYWN0aW9uIGJ1dHRvbnMgZm9yIFwidXNlclwiICYgXCJhc3Npc3RhbnRcIiBtZXNzYWdlIC0tPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5Db3B5XCIgc3FUb29sdGlwPVwiQ29weSB0ZXh0XCIgKGNsaWNrKT1cImNvcHlNZXNzYWdlKG1lc3NhZ2UpXCI+XG4gICAgICA8aSBjbGFzcz1cImZhciBmYS1jbGlwYm9hcmRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBBY3Rpb24gYnV0dG9ucyBmb3IgXCJ1c2VyXCIgbWVzc2FnZSAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuRWRpdFwiIHNxVG9vbHRpcD1cIkVkaXQgbWVzc2FnZVwiIChjbGljayk9XCJlZGl0LmVtaXQobWVzc2FnZSlcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBBY3Rpb24gYnV0dG9ucyBmb3IgXCJhc3Npc3RhbnRcIiBtZXNzYWdlIC0tPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgW2NsYXNzLmJvdW5jZV09XCJsaWtlZFwiICpuZ0lmPVwiY2FuTGlrZVwiIHNxVG9vbHRpcD1cIkxpa2UgdGhlIGFuc3dlclwiIChjbGljayk9XCJsaWtlLmVtaXQobWVzc2FnZSk7IGxpa2VkID0gdHJ1ZTtcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRodW1icy11cFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBib3VuY2VcIiAgW2NsYXNzLmJvdW5jZV09XCJkaXNsaWtlZFwiICpuZ0lmPVwiY2FuRGlzbGlrZVwiIHNxVG9vbHRpcD1cIlJlcG9ydCBhbiBpc3N1ZVwiIChjbGljayk9XCJkaXNsaWtlLmVtaXQobWVzc2FnZSk7IGRpc2xpa2VkID0gdHJ1ZTtcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLXRodW1icy1kb3duXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5SZWdlbmVyYXRlXCIgc3FUb29sdGlwPVwiUmVnZW5lcmF0ZSBtZXNzYWdlXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGUuZW1pdChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkRlYnVnXCIgc3FUb29sdGlwPVwiU2hvdyBMb2cgSW5mb3JtYXRpb25cIiAoY2xpY2spPVwiZGVidWcuZW1pdChtZXNzYWdlKTtcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWxpc3QtYWx0XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIExpc3Qgb2Ygc3VnZ2VzdGVkIGFjdGlvbnMsIGlmIGFueSAtLT5cbiAgPGRpdiAqbmdJZj1cInN1Z2dlc3RlZEFjdGlvbnNcIiBjbGFzcz1cIm10LTIgbWVzc2FnZS1zdWdnZXN0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3RlZC1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkQWN0aW9uIG9mIHN1Z2dlc3RlZEFjdGlvbnNcIiAoY2xpY2spPVwic3VnZ2VzdEFjdGlvbi5lbWl0KHN1Z2dlc3RlZEFjdGlvbilcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbc3R5bGUud2lkdGgucHhdPVwiaWNvblNpemVcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgPHA+PGkgY2xhc3M9XCJmYXMgZmEtY2xpcGJvYXJkLXF1ZXN0aW9uXCI+PC9pPiB7e3N1Z2dlc3RlZEFjdGlvbi5jb250ZW50fX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlICN0b29sdGlwVHBsIGxldC1yZWY+XG4gICAgPHNxLWNoYXQtcmVmZXJlbmNlXG4gICAgICAqbmdJZj1cIiFoaWRkZW5Ub29sdGlwXCJcbiAgICAgIGNsYXNzPVwiZXhwYW5kZWRcIlxuICAgICAgW2F0dGFjaG1lbnRdPVwicmVmXCJcbiAgICAgIFtyZWZlcmVuY2VdPVwicmVmLmNvbnRleHRJZFwiXG4gICAgICBbcGFydElkXT1cInJlZi4kcGFydElkXCJcbiAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50LCByZWYuJHBhcnRJZClcIlxuICAgICAgKG9wZW5Eb2N1bWVudCk9XCJvcGVuT3JpZ2luYWxBdHRhY2htZW50KCRldmVudCwgcmVmLiRwYXJ0SWQpXCI+XG4gICAgPC9zcS1jaGF0LXJlZmVyZW5jZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPC9kaXY+XG5cbiAgPCEtLSBMaXN0IG9mIGNoYXQgc3RhcnRlcnMsIGlmIGFueSAtLT5cbiAgPGRpdiAqbmdJZj1cImNoYXRTdGFydGVycz8ubGVuZ3RoXCIgY2xhc3M9XCJtdC0yIG1lc3NhZ2Utc3VnZ2VzdGlvbiBjaGF0LXN0YXJ0ZXJcIiBbc3R5bGUuYm90dG9tLnJlbV09XCItKDMuNSpjaGF0U3RhcnRlcnMhLmxlbmd0aClcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvblwiICpuZ0Zvcj1cImxldCBjaGF0U3RhcnRlciBvZiBjaGF0U3RhcnRlcnNcIiAoY2xpY2spPVwiY2hhdFN0YXJ0ZXJDbGlja2VkLmVtaXQoY2hhdFN0YXJ0ZXIpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1pY29uXCIgW3N0eWxlLndpZHRoLnB4XT1cImljb25TaXplXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1jb250ZW50XCI+XG4gICAgICAgIDxwPjxpIGNsYXNzPVwiZmFzIGZhLWNsaXBib2FyZC1xdWVzdGlvblwiPjwvaT4ge3tjaGF0U3RhcnRlci50ZXh0fX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4iXX0=
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7OztBQWVqRSxNQUFNLE9BQU8sb0JBQW9CO0lBbUMvQixZQUNT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d0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5pbXBvcnQgeyBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENoYXRNZXNzYWdlLCBTdWdnZXN0ZWRBY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgdW5pZmllZCwgUHJvY2Vzc29yIH0gZnJvbSBcInVuaWZpZWRcIjtcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCI7XG5pbXBvcnQgeyB2aXNpdCwgQ09OVElOVUUsIEVYSVQgfSBmcm9tIFwidW5pc3QtdXRpbC12aXNpdFwiO1xuaW1wb3J0IHsgVGV4dCwgUGFyZW50LCBDb250ZW50IH0gZnJvbSBcIm1kYXN0XCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcInVuaXN0XCI7XG5pbXBvcnQgeyBVSVNlcnZpY2UsIFV0aWxzTW9kdWxlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvdXRpbHNcIjtcbmltcG9ydCByZW1hcmtHZm0gZnJvbSBcInJlbWFyay1nZm1cIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbGxhcHNlTW9kdWxlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvY29sbGFwc2VcIjtcbmltcG9ydCB7IFJlbWFya01vZHVsZSB9IGZyb20gXCJuZ3gtcmVtYXJrXCI7XG5pbXBvcnQgeyBJbml0aWFsc0F2YXRhckNvbXBvbmVudCB9IGZyb20gXCIuLi9pbml0aWFscy1hdmF0YXIvaW5pdGlhbHMtYXZhdGFyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudCB9IGZyb20gXCIuLi9jaGF0LXJlZmVyZW5jZS9jaGF0LXJlZmVyZW5jZS5jb21wb25lbnRcIjtcblxuaW1wb3J0IFwicHJpc21qcy1jb21wb25lbnRzLWltcG9ydGVyL2VzbVwiO1xuaW1wb3J0ICdwcmlzbWpzL3BsdWdpbnMvYXV0b2xvYWRlci9wcmlzbS1hdXRvbG9hZGVyJztcbmltcG9ydCB7IENoYXJ0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXJ0cy9jaGFydC9jaGFydC5jb21wb25lbnRcIjtcblxuZGVjbGFyZSBtb2R1bGUgUHJpc20ge1xuICBmdW5jdGlvbiBoaWdobGlnaHRBbGxVbmRlcihlbDogSFRNTEVsZW1lbnQpOiB2b2lkO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3EtY2hhdC1tZXNzYWdlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBVdGlsc01vZHVsZSwgQ29sbGFwc2VNb2R1bGUsIFJlbWFya01vZHVsZSxcbiAgICBJbml0aWFsc0F2YXRhckNvbXBvbmVudCwgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudCwgQ2hhcnRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbjogQ2hhdE1lc3NhZ2VbXTtcbiAgQElucHV0KCkgc3VnZ2VzdGVkQWN0aW9uczogU3VnZ2VzdGVkQWN0aW9uW10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzZWFyY2hXYXJuaW5nTWVzc2FnZUljb246IHN0cmluZztcbiAgQElucHV0KCkgc3RyZWFtaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5FZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhblJlZ2VuZXJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuQ29weTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5EZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5MaWtlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkRpc2xpa2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIG9wZW5Eb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e3JlZmVyZW5jZTogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXJ9PigpO1xuICBAT3V0cHV0KCkgb3BlblByZXZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPHtyZWZlcmVuY2U6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyfT4oKTtcbiAgQE91dHB1dCgpIHN1Z2dlc3RBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3RlZEFjdGlvbj4oKTtcbiAgQE91dHB1dCgpIGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgY29weSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSByZWdlbmVyYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGxpa2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkaXNsaWtlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZGVidWcgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuXG4gIHByb2Nlc3NvcjogUHJvY2Vzc29yO1xuXG4gIHJlZmVyZW5jZXM6IHN0cmluZ1tdID0gW107XG4gIHJlZmVyZW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIHNob3dSZWZlcmVuY2VzOiBib29sZWFuID0gdHJ1ZTtcbiAgY29sbGFwc2VQcm9ncmVzczogYm9vbGVhbjtcbiAgaWNvblNpemUgPSAyNDtcblxuICBoaWRkZW5Ub29sdGlwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHNlYXJjaFNlcnZpY2U6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHVibGljIHVpOiBVSVNlcnZpY2UsXG4gICAgcHVibGljIHByaW5jaXBhbFNlcnZpY2U6IFByaW5jaXBhbFdlYlNlcnZpY2UsXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIGVsOiBFbGVtZW50UmVmXG4gICkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnN0cmVhbWluZykge1xuICAgICAgdGhpcy5jb2xsYXBzZVByb2dyZXNzID0gIXRoaXMuc3RyZWFtaW5nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlcyA9IFtdO1xuICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuY2xlYXIoKTtcbiAgICAgIGZvciAobGV0IG0gb2YgdGhpcy5jb252ZXJzYXRpb24pIHtcbiAgICAgICAgaWYgKG0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnQgb2YgbS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCkge1xuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KCcnICsgYXR0YWNobWVudC5jb250ZXh0SWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0cz8uWzBdPy5wYXJ0SWQgfSk7XG4gICAgICAgICAgICBpZiAoISFhdHRhY2htZW50LnBhcnRzICYmIGF0dGFjaG1lbnQucGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGFjaG1lbnQucGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJZCA9IGAke2F0dGFjaG1lbnQuY29udGV4dElkfS4ke2F0dGFjaG1lbnQucGFydHNbaV0ucGFydElkfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KHJlZklkLCB7IC4uLmF0dGFjaG1lbnQsICRwYXJ0SWQ6IGF0dGFjaG1lbnQucGFydHM/LltpXT8ucGFydElkIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobS5jb250ZW50LnN0YXJ0c1dpdGgoXCI8Y2hhcnRqcz5cIikpe1xuICAgICAgICAgIG0ubWVzc2FnZVR5cGUgPSBcIkNIQVJUXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBtLm1lc3NhZ2VUeXBlID0gXCJNQVJLRE9XTlwiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvY2Vzc29yID0gdW5pZmllZCgpXG4gICAgICAgIC51c2UocmVtYXJrUGFyc2UpXG4gICAgICAgIC51c2UocmVtYXJrR2ZtKVxuICAgICAgICAudXNlKCgpID0+IHRoaXMucmVmZXJlbmNlUGx1Z2luKTtcblxuICAgICAgaWYgKHRoaXMuc3RyZWFtaW5nKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3IudXNlKCgpID0+IHRoaXMucGxhY2Vob2xkZXJQbHVnaW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBQcmlzbT8uaGlnaGxpZ2h0QWxsVW5kZXI/Lih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gIXRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwgPyAnJ1xuICAgICAgOiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsWydmdWxsTmFtZSddIGFzIHN0cmluZyB8fCB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsLm5hbWU7XG4gIH1cblxuICBnZXQgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbD8uaXNBZG1pbmlzdHJhdG9yIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgVW5pZmllZCBwbHVnaW4gbG9va3MgYSB0ZXh0IG5vZGVzIGFuZCByZXBsYWNlcyBhbnkgcmVmZXJlbmNlIGluIHRoZVxuICAgKiBmb3JtIFsxXSwgWzIuM10sIGV0Yy4gd2l0aCBjdXN0b20gbm9kZXMgb2YgdHlwZSBcImNoYXQtcmVmZXJlbmNlXCIuXG4gICAqL1xuICByZWZlcmVuY2VQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gICAgLy8gVmlzaXQgYWxsIHRleHQgbm9kZXNcbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XG4gICAgICBsZXQgdGV4dCA9IG5vZGUudmFsdWU7XG5cbiAgICAgIHRleHQgPSB0aGlzLnJlZm9ybWF0UmVmZXJlbmNlcyh0ZXh0KTtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLmdldFJlZmVyZW5jZU1hdGNoZXModGV4dCk7XG5cbiAgICAgIC8vIFF1aXQgaWYgbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kXG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlczogKENvbnRlbnQgJiB7IGVuZDogbnVtYmVyIH0pW10gPSBbXTtcblxuICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICBjb25zdCByZWZJZCA9IG1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgW3JlZl0gPSByZWZJZC5zcGxpdChcIi5cIik7XG4gICAgICAgIC8vIFdlIGZpbmQgYSB2YWxpZCByZWZlcmVuY2UgaW4gdGhlIHRleHRcbiAgICAgICAgaWYgKCFpc05hTigrcmVmKSkge1xuICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKCtyZWYpOyAvLyBBZGQgaXQgdG8gdGhlIHNldCBvZiB1c2VkIHJlZmVyZW5jZXNcblxuICAgICAgICAgIC8vIElmIG5lZWRlZCwgaW5zZXJ0IGEgdGV4dCBub2RlIGJlZm9yZSB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG5vZGVzLmF0KC0xKSA/PyB7IGVuZDogMCB9O1xuICAgICAgICAgIGlmIChtYXRjaC5pbmRleCEgPiBjdXJyZW50LmVuZCkge1xuICAgICAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6IFwidGV4dFwiLCB2YWx1ZTogdGV4dC5zdWJzdHJpbmcoY3VycmVudC5lbmQsIG1hdGNoLmluZGV4ISksIGVuZDogbWF0Y2guaW5kZXghIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFkZCBhIGN1c3RvbSByZWZlcmVuY2Ugbm9kZVxuICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcImNoYXQtcmVmZXJlbmNlXCIsIHJlZklkLCBlbmQ6IG1hdGNoLmluZGV4ISArIG1hdGNoWzBdLmxlbmd0aCB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUXVpdCBpZiBubyByZWZlcmVuY2VzIHdlcmUgZm91bmRcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZXMuYXQoLTEpIS5lbmQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICBub2Rlcy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHZhbHVlOiB0ZXh0LnN1YnN0cmluZyhub2Rlcy5hdCgtMSkhLmVuZCwgdGV4dC5sZW5ndGgpLCBlbmQ6IHRleHQubGVuZ3RoIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhlIGN1cnJlbnQgdGV4dCBub2RlIGZyb20gdGhlIHBhcmVudCBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgbm9kZXNcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEsIC4uLm5vZGVzKTtcblxuICAgICAgcmV0dXJuIGluZGV4ICsgbm9kZXMubGVuZ3RoOyAvLyBWaXNpdCB0aGUgbmV4dCBub2RlIGFmdGVyIHRoZSBpbnNlcnRlZCBvbmVzXG4gICAgfSk7XG5cbiAgICBpZiAocmVmZXJlbmNlcy5zaXplID4gMCkge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gQXJyYXkuZnJvbShyZWZlcmVuY2VzLnZhbHVlcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAgIC5tYXAociA9PiAnJyArIHIpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHJldHVybiB0cmVlO1xuICB9XG5cbiAgcGxhY2Vob2xkZXJQbHVnaW4gPSAodHJlZTogTm9kZSkgPT4ge1xuXG4gICAgdmlzaXQodHJlZSwgXCJ0ZXh0XCIsIChub2RlOiBUZXh0LCBpbmRleDogbnVtYmVyLCBwYXJlbnQ6IFBhcmVudCkgPT4ge1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2goeyB0eXBlOiBcInN0cmVhbWluZy1wbGFjZWhvbGRlclwiIH0gYXMgYW55KTtcbiAgICAgIHJldHVybiBFWElUO1xuICAgIH0sIHRydWUpO1xuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBnZXRMaW5rVGV4dChub2RlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgIHJldHVybiBub2RlLnRleHQ7IC8vIFJldHVybiBkaXJlY3RseSBpZiB0ZXh0IGlzIHByb3ZpZGVkIGluIG5vZGUudGV4dCAoW0V4YW1wbGUgbGlua10oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGZvciB0ZXh0IGNvbnRlbnQgaW4gY2hpbGQgbm9kZXNcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmIGNoaWxkLnZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLnZhbHVlOyAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCB0ZXh0IG5vZGUgZm91bmQgKFsqKkVtcGhhc2l6ZWQgTGluayBUZXh0KipdKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMuZ2V0TGlua1RleHQoY2hpbGQpOyAvLyBSZWN1cnNpdmVseSBzZWFyY2ggY2hpbGQgbm9kZXMgKFshW0V4YW1wbGUgaW1hZ2VdKGh0dHBzOi8vZXhhbXBsZS5jb20vaW1hZ2UucG5nKV0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgICAgICAgaWYgKHRleHRDb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dENvbnRlbnQ7IC8vIFJldHVybiB0ZXh0IGNvbnRlbnQgaWYgZm91bmRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdsaW5rJzsgLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBubyB0ZXh0IGNvbnRlbnQgaXMgZm91bmRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZvcm1hdCBbaWRzOiAxMi4yLCA0Mi41XSB0byBbMTIuMl1bNDIuNV1cbiAgICovXG4gIHJlZm9ybWF0UmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9cXFsoPzppZHM/Oj9cXHMqKT8oPzpkb2N1bWVudHM/Oj9cXHMqKT8oXFxzKig/Oiw/XFxzKlxcZCsoPzpcXC5cXGQrKT8oPzpcXC5wYXJ0KT9cXHMqKSspXFxdL2csXG4gICAgICAoc3RyLCBtYXRjaDogc3RyaW5nKSA9PiBgWyR7bWF0Y2gucmVwbGFjZSgvXFwucGFydC9nLCBcIlwiKS5zcGxpdCgnLCcpLmpvaW4oXCJdIFtcIil9XWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoIGFsbCByZWZlcmVuY2VzIGluIGEgZ2l2ZW4gbWVzc2FnZVxuICAgKi9cbiAgZ2V0UmVmZXJlbmNlTWF0Y2hlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb250ZW50Lm1hdGNoQWxsKC9cXFsoXFxzKlxcZCsoPzpcXC5cXGQrKT9cXHMqKVxcXS9nKSk7XG4gIH1cblxuICBwcml2YXRlIF9jb3B5VG9DbGlwYm9hcmQoY29udGVudDogc3RyaW5nKSB7XG4gICAgdGhpcy51aS5jb3B5VG9DbGlwYm9hcmQoY29udGVudCk7XG5cbiAgfVxuXG4gIGNvcHlNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XG4gICAgY29uc3QgY29udGVudCA9IG1lc3NhZ2UuY29udGVudC5yZXBsYWNlQWxsKC9cXHMrXFxbLis/XFxdL2csIFwiXCIpXG4gICAgdGhpcy5fY29weVRvQ2xpcGJvYXJkKGNvbnRlbnQpO1xuICAgIHRoaXMuY29weS5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgY29weUNvZGUoY29kZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29weVRvQ2xpcGJvYXJkKGNvZGUpO1xuICB9XG5cbiAgb3BlbkF0dGFjaG1lbnRQcmV2aWV3KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgfVxuXG4gIG9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoYXR0YWNobWVudDogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXIpIHtcbiAgICB0aGlzLm9wZW5Eb2N1bWVudC5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcbiAgfVxuXG4gIGhpZGVUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuaGlkZGVuVG9vbHRpcCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGRlblRvb2x0aXAgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPCEtLSBNZXNzYWdlIGljb24gLS0+XG48c3BhbiBjbGFzcz1cIm1lc3NhZ2UtaWNvblwiIFt0aXRsZV09XCJtZXNzYWdlPy5yb2xlXCI+XG4gIDxpIGNsYXNzPVwiZC1ibG9ja1wiIFtzdHlsZS53aWR0aC5weF09XCJpY29uU2l6ZVwiICpuZ0lmPVwiIW1lc3NhZ2VcIj48L2k+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIm1lc3NhZ2U/LnJvbGVcIj5cbiAgICA8IS0tIEZvciAnYXNzaXN0YW50JyAtLT5cbiAgICA8aSAqbmdTd2l0Y2hDYXNlPVwiJ2Fzc2lzdGFudCdcIiBbbmdDbGFzc109XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIj48L2k+XG4gICAgPCEtLSBGb3IgJ3VzZXInIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid1c2VyJ1wiPlxuICAgICAgPGkgKm5nSWY9XCIhIXVzZXJNZXNzYWdlSWNvbjsgZWxzZSBpbml0aWFsc0F2YXRhclwiIFtuZ0NsYXNzXT1cInVzZXJNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIj48L2k+XG4gICAgICA8bmctdGVtcGxhdGUgI2luaXRpYWxzQXZhdGFyPlxuICAgICAgICA8c3EtaW5pdGlhbHMtYXZhdGFyIFtmdWxsTmFtZV09XCJuYW1lXCI+PC9zcS1pbml0aWFscy1hdmF0YXI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gRm9yICdjb25uZWN0aW9uLWVycm9yJyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY29ubmVjdGlvbi1lcnJvcidcIj5cbiAgICAgIDxpICpuZ0lmPVwiISFjb25uZWN0aW9uRXJyb3JNZXNzYWdlSWNvbjsgZWxzZSBkZWZhdWx0RXJyb3JJY29uXCIgW25nQ2xhc3NdPVwiY29ubmVjdGlvbkVycm9yTWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCI+PC9pPlxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RXJyb3JJY29uPlxuICAgICAgICA8c3ZnIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiBjbGFzcz1cImNvbm5lY3Rpb24tZXJyb3JcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCA1MTIgNTEyXCI+XG4gICAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTcuMSAyOTJjLTEyLjktMjIuMy0xMi45LTQ5LjcgMC03MkwxMDUuNCA2Ny4xYzEyLjktMjIuMyAzNi42LTM2IDYyLjQtMzZsMTc2LjYgMGMyNS43IDAgNDkuNSAxMy43IDYyLjQgMzZMNDk0LjkgMjIwYzEyLjkgMjIuMyAxMi45IDQ5LjcgMCA3Mkw0MDYuNiA0NDQuOWMtMTIuOSAyMi4zLTM2LjYgMzYtNjIuNCAzNmwtMTc2LjYgMGMtMjUuNyAwLTQ5LjUtMTMuNy02Mi40LTM2TDE3LjEgMjkyek0yNTYgMTI4Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNGwwIDExMmMwIDEzLjMgMTAuNyAyNCAyNCAyNHMyNC0xMC43IDI0LTI0bDAtMTEyYzAtMTMuMy0xMC43LTI0LTI0LTI0em0zMiAyMjRhMzIgMzIgMCAxIDAgLTY0IDAgMzIgMzIgMCAxIDAgNjQgMHpcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIEZvciAnc2VhcmNoLXdhcm5pbmcnIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZWFyY2gtd2FybmluZydcIj5cbiAgICAgIDxpICpuZ0lmPVwiISFzZWFyY2hXYXJuaW5nTWVzc2FnZUljb247IGVsc2UgZGVmYXVsdFdhcm5pbmdJY29uXCIgW25nQ2xhc3NdPVwic2VhcmNoV2FybmluZ01lc3NhZ2VJY29uXCIgW3N0eWxlLi0tc3Etc2l6ZS5weF09XCJpY29uU2l6ZVwiPjwvaT5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFdhcm5pbmdJY29uPlxuICAgICAgICA8c3ZnIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiBjbGFzcz1cInNlYXJjaC13YXJuaW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMzg0IDUxMlwiPlxuICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTI3MiAzODRjOS42LTMxLjkgMjkuNS01OS4xIDQ5LjItODYuMmMwIDAgMCAwIDAgMGM1LjItNy4xIDEwLjQtMTQuMiAxNS40LTIxLjRjMTkuOC0yOC41IDMxLjQtNjMgMzEuNC0xMDAuM0MzNjggNzguOCAyODkuMiAwIDE5MiAwUzE2IDc4LjggMTYgMTc2YzAgMzcuMyAxMS42IDcxLjkgMzEuNCAxMDAuM2M1IDcuMiAxMC4yIDE0LjMgMTUuNCAyMS40YzAgMCAwIDAgMCAwYzE5LjggMjcuMSAzOS43IDU0LjQgNDkuMiA4Ni4ybDE2MCAwek0xOTIgNTEyYzQ0LjIgMCA4MC0zNS44IDgwLTgwbDAtMTYtMTYwIDAgMCAxNmMwIDQ0LjIgMzUuOCA4MCA4MCA4MHptMC00NDhjMTMuMyAwIDI0IDEwLjcgMjQgMjRsMCAxMTJjMCAxMy4zLTEwLjcgMjQtMjQgMjRzLTI0LTEwLjctMjQtMjRsMC0xMTJjMC0xMy4zIDEwLjctMjQgMjQtMjR6TTE2MCAyODhhMzIgMzIgMCAxIDEgNjQgMCAzMiAzMiAwIDEgMSAtNjQgMHpcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvc3Bhbj5cblxuPCEtLSBNZXNzYWdlIGJvZHkgLS0+XG48ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIiBzdHlsZT1cIm1pbi13aWR0aDogMDtcIiBbbmdDbGFzc109XCInbWVzc2FnZS0nK21lc3NhZ2Uucm9sZVwiPlxuXG4gIDwhLS0gUHJvZ3Jlc3Mgc3RlcHMgLS0+XG4gIDxkaXYgKm5nSWY9XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyBhcyBwcm9ncmVzc1wiIGNsYXNzPVwic21hbGwgbXMtMyBtYi0yXCI+XG4gICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiY29sbGFwc2VQcm9ncmVzcyA9ICFjb2xsYXBzZVByb2dyZXNzOyBmYWxzZVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgVmlldyBwcm9ncmVzc1xuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi17e2NvbGxhcHNlUHJvZ3Jlc3M/ICdyaWdodCcgOiAnZG93bid9fVwiPjwvaT5cbiAgICA8L2E+XG4gICAgPHNxLWNvbGxhcHNlIFtjb2xsYXBzZWRdPVwiY29sbGFwc2VQcm9ncmVzc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkXCI+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBzdGVwIG9mIHByb2dyZXNzXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1mdyBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiAqbmdJZj1cInN0ZXAuZG9uZVwiPjwvaT5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtcHVsc2Ugc3RlcC1vbmdvaW5nXCIgKm5nSWY9XCIhc3RlcC5kb25lICYmIHN0cmVhbWluZ1wiPjwvaT5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtYmFuIHN0ZXAtZXJyb3JcIiAqbmdJZj1cIiFzdGVwLmRvbmUgJiYgIXN0cmVhbWluZ1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMiBmdy1ib2xkXCI+e3tzdGVwLnRpdGxlfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN0ZXAuY29udGVudFwiIFtpbm5lckhUTUxdPVwiJzogJyArIHN0ZXAuY29udGVudFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NxLWNvbGxhcHNlPlxuICA8L2Rpdj5cblxuICA8IS0tIE1lc3NhZ2UgY29udGVudCAtLT5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgbWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ0NIQVJUJ1wiPlxuICAgICAgPHNxLWFzc2lzdGFudC1jaGFydCBbcmF3Q2hhcnREYXRhXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvc3EtYXNzaXN0YW50LWNoYXJ0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUaGlzIHNlY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGN1c3RvbWl6aW5nIHRoZSB0ZW1wbGF0ZSBub2RlcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgICAgVGVtcGxhdGUgbm9kZXMgYXJlIHByZWRlZmluZWQgc3RydWN0dXJlcyB0aGF0IHNlcnZlIGFzIGJsdWVwcmludHMgZm9yIGNyZWF0aW5nL2N1c3RvbWl6aW5nIGR5bmFtaWMgY29udGVudCAtLT5cbiAgICA8cmVtYXJrICpuZ0lmPVwiKG1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNQVJLRE9XTicpIHx8IG1lc3NhZ2U/LnJvbGUgPT09ICdjb25uZWN0aW9uLWVycm9yJyB8fCBtZXNzYWdlPy5yb2xlID09PSAnc2VhcmNoLXdhcm5pbmcnXCIgW21hcmtkb3duXT1cIm1lc3NhZ2UuY29udGVudFwiIFtwcm9jZXNzb3JdPVwicHJvY2Vzc29yXCI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cImNoYXQtcmVmZXJlbmNlXCIgbGV0LXJlZj5cblxuICAgICAgICA8YSAqbmdJZj1cInJlZmVyZW5jZU1hcC5nZXQocmVmLnJlZklkKSBhcyBhdHRhY2htZW50OyBlbHNlIHN0YXRpY1JlZlRwbFwiXG4gICAgICAgICAgY2xhc3M9XCJyZWZlcmVuY2VcIlxuICAgICAgICAgIFtzcVRvb2x0aXBdPVwiYXR0YWNobWVudFwiXG4gICAgICAgICAgW3NxVG9vbHRpcFRlbXBsYXRlXT1cInRvb2x0aXBUcGxcIlxuICAgICAgICAgIFtob3ZlcmFibGVUb29sdGlwXT1cInRydWVcIlxuICAgICAgICAgID57e3JlZi5yZWZJZH19XG4gICAgICAgIDwvYT5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3N0YXRpY1JlZlRwbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlZmVyZW5jZVwiPnt7cmVmLnJlZklkfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cInN0cmVhbWluZy1wbGFjZWhvbGRlclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsYWNlaG9sZGVyLWdsb3dcIiAqbmdJZj1cInN0cmVhbWluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXIgbXMtMVwiPjwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwiY29kZVwiIGxldC1ub2RlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtYi0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7bm9kZS5sYW5nfX08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc21cIiAoY2xpY2spPVwiY29weUNvZGUobm9kZS52YWx1ZSlcIj48aSBjbGFzcz1cImZhciBmYS1mdyBmYS1jbGlwYm9hcmRcIj48L2k+IENvcHkgY29kZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwcmUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319IG15LTAgcm91bmRlZC0wIHJvdW5kZWQtYm90dG9tXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS17e25vZGUubGFuZ319XCI+e3tub2RlLnZhbHVlfX08L2NvZGU+PC9wcmU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwibGlua1wiIGxldC1ub2RlPlxuICAgICAgICA8YSBbaHJlZl09XCJub2RlLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57e2dldExpbmtUZXh0KG5vZGUpfX08L2E+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9yZW1hcms+XG5cbiAgICA8cCAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICd1c2VyJ1wiPnt7bWVzc2FnZS5jb250ZW50fX08L3A+XG5cbiAgICA8IS0tIExpc3Qgb2YgcmVmZXJlbmNlLCBpZiBhbnkgLS0+XG4gICAgPGRpdiAqbmdJZj1cInJlZmVyZW5jZXM/Lmxlbmd0aFwiIGNsYXNzPVwicmVmZXJlbmNlc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWZlcmVuY2VzLXRpdGxlXCI+UmVmZXJlbmNlczwvc3Bhbj4gPGkgY2xhc3M9XCJmYXMgcmVmZXJlbmNlcy1jb2xsYXBzZVwiIFtjbGFzcy5mYS1jaGV2cm9uLWRvd25dPVwic2hvd1JlZmVyZW5jZXNcIiBbY2xhc3MuZmEtY2hldnJvbi1yaWdodF09XCIhc2hvd1JlZmVyZW5jZXNcIiAoY2xpY2spPVwic2hvd1JlZmVyZW5jZXM9IXNob3dSZWZlcmVuY2VzXCI+PC9pPlxuICAgICAgPHNxLWNvbGxhcHNlIFtjb2xsYXBzZWRdPVwiIXNob3dSZWZlcmVuY2VzXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlc1wiPlxuICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJyZWZlcmVuY2VNYXAuZ2V0KHJlZmVyZW5jZSkgYXMgYXR0YWNobWVudFwiICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3EtY2hhdC1yZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJhdHRhY2htZW50LiRleHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICBbYXR0YWNobWVudF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VdPVwicmVmZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9zcS1jb2xsYXBzZT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICAgIDwhLS0gRWRpdCAvIFJlZ2VuZXJhdGUgZmxvYXRpbmcgYWN0aW9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cInNxLWNoYXQtbWVzc2FnZS1hY3Rpb25zXCIgKm5nSWY9XCJtZXNzYWdlXCI+XG4gICAgPCEtLSBDb21tb24gYWN0aW9uIGJ1dHRvbnMgZm9yIFwidXNlclwiICYgXCJhc3Npc3RhbnRcIiBtZXNzYWdlIC0tPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5Db3B5XCIgc3FUb29sdGlwPVwiQ29weSB0ZXh0XCIgKGNsaWNrKT1cImNvcHlNZXNzYWdlKG1lc3NhZ2UpXCI+XG4gICAgICA8aSBjbGFzcz1cImZhciBmYS1jbGlwYm9hcmRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBBY3Rpb24gYnV0dG9ucyBmb3IgXCJ1c2VyXCIgbWVzc2FnZSAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuRWRpdFwiIHNxVG9vbHRpcD1cIkVkaXQgbWVzc2FnZVwiIChjbGljayk9XCJlZGl0LmVtaXQobWVzc2FnZSlcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBBY3Rpb24gYnV0dG9ucyBmb3IgXCJhc3Npc3RhbnRcIiBtZXNzYWdlIC0tPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgW2NsYXNzLmJvdW5jZV09XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRsaWtlZCA9PT0gdHJ1ZVwiICpuZ0lmPVwiY2FuTGlrZVwiIHNxVG9vbHRpcD1cIkxpa2UgdGhlIGFuc3dlclwiIChjbGljayk9XCJsaWtlLmVtaXQoKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYS10aHVtYnMtdXAge3ttZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRsaWtlZCA9PT0gdHJ1ZSA/ICdmYXMnIDogJ2Zhcid9fVwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBib3VuY2VcIiAgW2NsYXNzLmJvdW5jZV09XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRkaXNsaWtlZCA9PT0gdHJ1ZVwiICpuZ0lmPVwiY2FuRGlzbGlrZVwiIHNxVG9vbHRpcD1cIlJlcG9ydCBhbiBpc3N1ZVwiIChjbGljayk9XCJkaXNsaWtlLmVtaXQoKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYS10aHVtYnMtZG93biB7e21lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGRpc2xpa2VkID09PSB0cnVlID8gJ2ZhcycgOiAnZmFyJ319XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5SZWdlbmVyYXRlXCIgc3FUb29sdGlwPVwiUmVnZW5lcmF0ZSBtZXNzYWdlXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGUuZW1pdChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkRlYnVnXCIgc3FUb29sdGlwPVwiU2hvdyBMb2cgSW5mb3JtYXRpb25cIiAoY2xpY2spPVwiZGVidWcuZW1pdChtZXNzYWdlKTtcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWxpc3QtYWx0XCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIExpc3Qgb2Ygc3VnZ2VzdGVkIGFjdGlvbnMsIGlmIGFueSAtLT5cbiAgPGRpdiAqbmdJZj1cInN1Z2dlc3RlZEFjdGlvbnNcIiBjbGFzcz1cIm10LTIgbWVzc2FnZS1zdWdnZXN0aW9uXCI+XG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3RlZC1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgc3VnZ2VzdGVkQWN0aW9uIG9mIHN1Z2dlc3RlZEFjdGlvbnNcIiAoY2xpY2spPVwic3VnZ2VzdEFjdGlvbi5lbWl0KHN1Z2dlc3RlZEFjdGlvbilcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbc3R5bGUud2lkdGgucHhdPVwiaWNvblNpemVcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgPHA+PGkgY2xhc3M9XCJmYXMgZmEtY2xpcGJvYXJkLXF1ZXN0aW9uXCI+PC9pPiB7e3N1Z2dlc3RlZEFjdGlvbi5jb250ZW50fX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlICN0b29sdGlwVHBsIGxldC1yZWY+XG4gICAgPHNxLWNoYXQtcmVmZXJlbmNlXG4gICAgICAqbmdJZj1cIiFoaWRkZW5Ub29sdGlwXCJcbiAgICAgIGNsYXNzPVwiZXhwYW5kZWRcIlxuICAgICAgW2F0dGFjaG1lbnRdPVwicmVmXCJcbiAgICAgIFtyZWZlcmVuY2VdPVwicmVmLmNvbnRleHRJZFwiXG4gICAgICBbcGFydElkXT1cInJlZi4kcGFydElkXCJcbiAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50LCByZWYuJHBhcnRJZClcIlxuICAgICAgKG9wZW5Eb2N1bWVudCk9XCJvcGVuT3JpZ2luYWxBdHRhY2htZW50KCRldmVudCwgcmVmLiRwYXJ0SWQpXCI+XG4gICAgPC9zcS1jaGF0LXJlZmVyZW5jZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPC9kaXY+XG4iXX0=
|
|
@@ -22,10 +22,10 @@ export class ChatReferenceComponent {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
ChatReferenceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatReferenceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
25
|
-
ChatReferenceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatReferenceComponent, isStandalone: true, selector: "sq-chat-reference", inputs: { reference: "reference", attachment: "attachment", partId: "partId" }, outputs: { openDocument: "openDocument", openPreview: "openPreview" }, ngImport: i0, template: "<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\" (click)=\"expandAttachment()\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"$event.stopPropagation(); openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"$event.stopPropagation(); openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span class=\"w-100 pe-2\" [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{display:block}:host.expanded,:host:hover{background-color:var(--ast-reference-expanded-hover-bg, white)}.reference-data{display:flex;flex-direction:row;align-items:baseline;padding:var(--ast-size-1, .25rem);cursor:pointer}.reference-data a{color:var(--ast-secondary-color, #FF732E);flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:var(--font-weight-bold, 500);cursor:pointer}.reference-data i{padding:var(--ast-size-1, .25rem);margin-left:var(--ast-size-1, .25rem);cursor:pointer;color:var(--ast-reference-icon-color, black)}.reference-data i.active{color:var(--ast-reference-icon-active-color, white);background-color:var(--ast-secondary-color, #FF732E)}.reference-data:not(.expanded) i{opacity:0}.reference-data:not(.expanded):hover i{opacity:1}.reference-passages{white-space:normal;font-style:italic;font-weight:400;padding:1rem 0;color:var(--ast-reference-passages-color, black)}.reference-passages .reference-passage{display:flex;align-items:baseline;padding-left:2.5rem;padding-right:1rem;word-wrap:break-word}.reference-passages .reference-passage+.reference-passage{padding-top:1rem}.reference-passages .reference-passage .reference{white-space:nowrap;margin-right:var(--ast-size-2, .5rem)}sq-format-icon{margin-left:var(--ast-size-1, .25rem);margin-right:var(--ast-size-2, .5rem);color:var(--ast-secondary-color, #FF732E)}.reference-tooltip{max-width:600px!important;box-shadow:0 .5rem 1rem #00000026;padding:.5rem;font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: FormatIconComponent, selector: "sq-format-icon", inputs: ["extension"] }] });
|
|
25
|
+
ChatReferenceComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatReferenceComponent, isStandalone: true, selector: "sq-chat-reference", inputs: { reference: "reference", attachment: "attachment", partId: "partId" }, outputs: { openDocument: "openDocument", openPreview: "openPreview" }, ngImport: i0, template: "<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\" (click)=\"expandAttachment()\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"$event.stopPropagation(); openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"$event.stopPropagation(); openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span class=\"w-100 pe-2\" [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{display:block}:host.expanded,:host:hover{background-color:var(--ast-reference-expanded-hover-bg, white)}.reference-data{display:flex;flex-direction:row;align-items:baseline;padding:var(--ast-size-1, .25rem);cursor:pointer}.reference-data a{color:var(--ast-secondary-color, #FF732E);flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:var(--font-weight-bold, 500);cursor:pointer}.reference-data i{padding:var(--ast-size-1, .25rem);margin-left:var(--ast-size-1, .25rem);cursor:pointer;color:var(--ast-reference-icon-color, black)}.reference-data i.active{color:var(--ast-reference-icon-active-color, white);background-color:var(--ast-secondary-color, #FF732E)}.reference-data:not(.expanded) i{opacity:0}.reference-data:not(.expanded):hover i{opacity:1}.reference-passages{white-space:normal;font-style:italic;font-weight:400;padding:1rem 0;color:var(--ast-reference-passages-color, black)}.reference-passages .reference-passage{display:flex;align-items:baseline;padding-left:2.5rem;padding-right:1rem;word-wrap:break-word}.reference-passages .reference-passage+.reference-passage{padding-top:1rem}.reference-passages .reference-passage .reference{white-space:nowrap;margin-right:var(--ast-size-2, .5rem)}sq-format-icon{margin-left:var(--ast-size-1, .25rem);margin-right:var(--ast-size-2, .5rem);color:var(--ast-secondary-color, #FF732E)}.reference-tooltip{max-width:600px!important;box-shadow:0 .5rem 1rem #00000026;padding:.5rem;font-size:.875rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "component", type: FormatIconComponent, selector: "sq-format-icon", inputs: ["extension"] }] });
|
|
26
26
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatReferenceComponent, decorators: [{
|
|
27
27
|
type: Component,
|
|
28
|
-
args: [{ selector: 'sq-chat-reference', standalone: true, imports: [CommonModule, UtilsModule, FormatIconComponent], template: "<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\" (click)=\"expandAttachment()\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"$event.stopPropagation(); openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"$event.stopPropagation(); openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span class=\"w-100 pe-2\" [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{display:block}:host.expanded,:host:hover{background-color:var(--ast-reference-expanded-hover-bg, white)}.reference-data{display:flex;flex-direction:row;align-items:baseline;padding:var(--ast-size-1, .25rem);cursor:pointer}.reference-data a{color:var(--ast-secondary-color, #FF732E);flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:var(--font-weight-bold, 500);cursor:pointer}.reference-data i{padding:var(--ast-size-1, .25rem);margin-left:var(--ast-size-1, .25rem);cursor:pointer;color:var(--ast-reference-icon-color, black)}.reference-data i.active{color:var(--ast-reference-icon-active-color, white);background-color:var(--ast-secondary-color, #FF732E)}.reference-data:not(.expanded) i{opacity:0}.reference-data:not(.expanded):hover i{opacity:1}.reference-passages{white-space:normal;font-style:italic;font-weight:400;padding:1rem 0;color:var(--ast-reference-passages-color, black)}.reference-passages .reference-passage{display:flex;align-items:baseline;padding-left:2.5rem;padding-right:1rem;word-wrap:break-word}.reference-passages .reference-passage+.reference-passage{padding-top:1rem}.reference-passages .reference-passage .reference{white-space:nowrap;margin-right:var(--ast-size-2, .5rem)}sq-format-icon{margin-left:var(--ast-size-1, .25rem);margin-right:var(--ast-size-2, .5rem);color:var(--ast-secondary-color, #FF732E)}.reference-tooltip{max-width:600px!important;box-shadow:0 .5rem 1rem #00000026;padding:.5rem;font-size:.875rem}\n"] }]
|
|
28
|
+
args: [{ selector: 'sq-chat-reference', standalone: true, imports: [CommonModule, UtilsModule, FormatIconComponent], template: "<div [class.reference-tooltip]=\"!!partId\">\n <div class=\"reference-data\" [class.expanded]=\"attachment['$expanded'] || !!partId\" (click)=\"expandAttachment()\">\n <span class=\"reference me-1\">{{reference}}</span>\n <sq-format-icon [extension]=\"attachment.record.fileext\"></sq-format-icon>\n <a [id]=\"'attachment-'+attachment.recordId\">\n {{attachment.record.title}}\n </a>\n <i class=\"fas fa-eye\" (click)=\"$event.stopPropagation(); openPreview.emit(attachment)\" [sqTooltip]=\"!partId ? 'Preview document' : ''\"></i>\n <i class=\"fas fa-arrow-up-right-from-square\" *ngIf=\"attachment.record.url1 || attachment.record.originalUrl\"\n (click)=\"$event.stopPropagation(); openDocument.emit(attachment)\" [sqTooltip]=\"!partId ? 'Open document' : ''\">\n </i>\n </div>\n <div class=\"reference-passages\" *ngIf=\"!!partId || (attachment['$expanded']) && parts.length\">\n <div class=\"reference-passage\" *ngFor=\"let part of parts\">\n <span class=\"reference me-1\">{{reference}}.{{part.partId}}</span>\n <span class=\"w-100 pe-2\" [innerHTML]=\"part.text\"></span>\n </div>\n </div>\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-error{background-color:var(--ast-error-bg, rgba(249, 58, 55, .2));color:var(--ast-action-buttons-color, inherit)}.ast-error:hover{color:var(--ast-error-color, rgba(249, 58, 55, .7))}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black;--ast-action-buttons-color: white;--ast-action-buttons-hover-color: #6dbee6;--ast-report-bg: #070707}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference,:host ::ng-deep .attachment .reference{position:relative;bottom:var(--ast-reference-bottom, .3em);font-weight:var(--ast-reference-font-weight, bold);padding:var(--ast-reference-padding, 0 .2em);margin:var(--ast-reference-margin, 0 .1em);border-radius:var(--ast-reference-border-radius, .2em);background-color:var(--ast-reference-background-color, lightblue);color:var(--ast-reference-color, black)}:host ::ng-deep .reference,:host ::ng-deep .message-content .reference{font-size:var(--ast-reference-message-font-size, .7em)}:host ::ng-deep .attachment .reference{font-size:var(--ast-reference-attachment-font-size, 13px)}:host{display:block}:host.expanded,:host:hover{background-color:var(--ast-reference-expanded-hover-bg, white)}.reference-data{display:flex;flex-direction:row;align-items:baseline;padding:var(--ast-size-1, .25rem);cursor:pointer}.reference-data a{color:var(--ast-secondary-color, #FF732E);flex-grow:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:var(--font-weight-bold, 500);cursor:pointer}.reference-data i{padding:var(--ast-size-1, .25rem);margin-left:var(--ast-size-1, .25rem);cursor:pointer;color:var(--ast-reference-icon-color, black)}.reference-data i.active{color:var(--ast-reference-icon-active-color, white);background-color:var(--ast-secondary-color, #FF732E)}.reference-data:not(.expanded) i{opacity:0}.reference-data:not(.expanded):hover i{opacity:1}.reference-passages{white-space:normal;font-style:italic;font-weight:400;padding:1rem 0;color:var(--ast-reference-passages-color, black)}.reference-passages .reference-passage{display:flex;align-items:baseline;padding-left:2.5rem;padding-right:1rem;word-wrap:break-word}.reference-passages .reference-passage+.reference-passage{padding-top:1rem}.reference-passages .reference-passage .reference{white-space:nowrap;margin-right:var(--ast-size-2, .5rem)}sq-format-icon{margin-left:var(--ast-size-1, .25rem);margin-right:var(--ast-size-2, .5rem);color:var(--ast-secondary-color, #FF732E)}.reference-tooltip{max-width:600px!important;box-shadow:0 .5rem 1rem #00000026;padding:.5rem;font-size:.875rem}\n"] }]
|
|
29
29
|
}], propDecorators: { reference: [{
|
|
30
30
|
type: Input
|
|
31
31
|
}], attachment: [{
|
|
@@ -37,4 +37,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
37
37
|
}], openPreview: [{
|
|
38
38
|
type: Output
|
|
39
39
|
}] } });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1yZWZlcmVuY2UvY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1yZWZlcmVuY2UvY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7O0FBVTNFLE1BQU0sT0FBTyxzQkFBc0I7SUFQbkM7UUFhWSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQ3pELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7S0FXbkU7SUFUQyxJQUFJLEtBQUs7UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9ELENBQUM7O21IQWpCVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixvT0NibkMsNHNDQW1CQSxvK0dEUlksWUFBWSwrUEFBRSxXQUFXLHVQQUFFLG1CQUFtQjsyRkFFN0Msc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLG1CQUFtQixjQUdqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDOzhCQUloRCxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXRpbHNNb2R1bGUgfSBmcm9tICdAc2luZXF1YS9jb21wb25lbnRzL3V0aWxzJztcbmltcG9ydCB7IEZvcm1hdEljb25Db21wb25lbnQgfSBmcm9tICcuLi9mb3JtYXQtaWNvbi9mb3JtYXQtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ2hhdENvbnRleHRBdHRhY2htZW50LCBEb2N1bWVudFBhcnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NxLWNoYXQtcmVmZXJlbmNlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtcmVmZXJlbmNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC1yZWZlcmVuY2UuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVXRpbHNNb2R1bGUsIEZvcm1hdEljb25Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRSZWZlcmVuY2VDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIHJlZmVyZW5jZTogc3RyaW5nO1xuICBASW5wdXQoKSBhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQ7XG4gIEBJbnB1dCgpIHBhcnRJZD86IG51bWJlcjtcblxuICBAT3V0cHV0KCkgb3BlbkRvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XG4gIEBPdXRwdXQoKSBvcGVuUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdENvbnRleHRBdHRhY2htZW50PigpO1xuXG4gIGdldCBwYXJ0cygpOiBEb2N1bWVudFBhcnRbXSB7XG4gICAgaWYgKCF0aGlzLmF0dGFjaG1lbnQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5hdHRhY2htZW50LnBhcnRzLmZpbHRlcihwYXJ0ID0+ICghdGhpcy5wYXJ0SWQgfHwgcGFydC5wYXJ0SWQgPT09IHRoaXMucGFydElkKSAmJiAhIXBhcnQudGV4dCk7XG4gIH1cblxuICBleHBhbmRBdHRhY2htZW50KCkge1xuICAgIGlmICh0aGlzLnBhcnRJZCkgcmV0dXJuO1xuICAgIHRoaXMuYXR0YWNobWVudFsnJGV4cGFuZGVkJ10gPSAhdGhpcy5hdHRhY2htZW50WyckZXhwYW5kZWQnXTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3MucmVmZXJlbmNlLXRvb2x0aXBdPVwiISFwYXJ0SWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicmVmZXJlbmNlLWRhdGFcIiBbY2xhc3MuZXhwYW5kZWRdPVwiYXR0YWNobWVudFsnJGV4cGFuZGVkJ10gfHwgISFwYXJ0SWRcIiAoY2xpY2spPVwiZXhwYW5kQXR0YWNobWVudCgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVmZXJlbmNlIG1lLTFcIj57e3JlZmVyZW5jZX19PC9zcGFuPlxuICAgICAgICA8c3EtZm9ybWF0LWljb24gW2V4dGVuc2lvbl09XCJhdHRhY2htZW50LnJlY29yZC5maWxlZXh0XCI+PC9zcS1mb3JtYXQtaWNvbj5cbiAgICAgICAgPGEgW2lkXT1cIidhdHRhY2htZW50LScrYXR0YWNobWVudC5yZWNvcmRJZFwiPlxuICAgICAgICAgICAge3thdHRhY2htZW50LnJlY29yZC50aXRsZX19XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZXllXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb3BlblByZXZpZXcuZW1pdChhdHRhY2htZW50KVwiIFtzcVRvb2x0aXBdPVwiIXBhcnRJZCA/ICdQcmV2aWV3IGRvY3VtZW50JyA6ICcnXCI+PC9pPlxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hcnJvdy11cC1yaWdodC1mcm9tLXNxdWFyZVwiICpuZ0lmPVwiYXR0YWNobWVudC5yZWNvcmQudXJsMSB8fCBhdHRhY2htZW50LnJlY29yZC5vcmlnaW5hbFVybFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvcGVuRG9jdW1lbnQuZW1pdChhdHRhY2htZW50KVwiIFtzcVRvb2x0aXBdPVwiIXBhcnRJZCA/ICdPcGVuIGRvY3VtZW50JyA6ICcnXCI+XG4gICAgICAgIDwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicmVmZXJlbmNlLXBhc3NhZ2VzXCIgKm5nSWY9XCIhIXBhcnRJZCB8fCAoYXR0YWNobWVudFsnJGV4cGFuZGVkJ10pICYmIHBhcnRzLmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVmZXJlbmNlLXBhc3NhZ2VcIiAqbmdGb3I9XCJsZXQgcGFydCBvZiBwYXJ0c1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWZlcmVuY2UgbWUtMVwiPnt7cmVmZXJlbmNlfX0ue3twYXJ0LnBhcnRJZH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3LTEwMCBwZS0yXCIgW2lubmVySFRNTF09XCJwYXJ0LnRleHRcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|