@copilotkitnext/angular 0.0.2 → 0.0.5
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/README.md +3 -3
- package/dist/README.md +3 -3
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/core/copilotkit.providers.d.ts +1 -1
- package/dist/core/copilotkit.service.d.ts +5 -5
- package/dist/core/copilotkit.types.d.ts +8 -10
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +1 -1
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +426 -0
- package/dist/esm2022/core/copilotkit.types.mjs +13 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +128 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +265 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +224 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +293 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +174 -187
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/utils/frontend-tool.utils.d.ts +1 -1
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -38
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/ng-package.json +0 -19
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { Component, Input, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, inject, ElementRef, ViewChild, } from "@angular/core";
|
|
2
|
+
import { CommonModule } from "@angular/common";
|
|
3
|
+
import { Marked } from "marked";
|
|
4
|
+
import hljs from "highlight.js";
|
|
5
|
+
import * as katex from "katex";
|
|
6
|
+
import { completePartialMarkdown } from "@copilotkitnext/core";
|
|
7
|
+
import { LucideAngularModule } from "lucide-angular";
|
|
8
|
+
import { CopilotChatConfigurationService } from "../../core/chat-configuration/chat-configuration.service";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class CopilotChatAssistantMessageRendererComponent {
|
|
11
|
+
_content = "";
|
|
12
|
+
set content(value) {
|
|
13
|
+
this._content = value;
|
|
14
|
+
this.contentSignal.set(value);
|
|
15
|
+
}
|
|
16
|
+
get content() {
|
|
17
|
+
return this._content;
|
|
18
|
+
}
|
|
19
|
+
inputClass;
|
|
20
|
+
contentSignal = signal("");
|
|
21
|
+
markdownContainer;
|
|
22
|
+
chatConfig = inject(CopilotChatConfigurationService);
|
|
23
|
+
elementRef = inject(ElementRef);
|
|
24
|
+
// Track copy states for code blocks
|
|
25
|
+
copyStates = new Map();
|
|
26
|
+
copyStateSignal = signal(new Map());
|
|
27
|
+
renderedHtml = computed(() => {
|
|
28
|
+
const currentContent = this.contentSignal();
|
|
29
|
+
const completedMarkdown = completePartialMarkdown(currentContent);
|
|
30
|
+
return this.renderMarkdown(completedMarkdown);
|
|
31
|
+
});
|
|
32
|
+
get labels() {
|
|
33
|
+
return this.chatConfig.labels();
|
|
34
|
+
}
|
|
35
|
+
ngOnChanges(changes) {
|
|
36
|
+
if (changes["content"]) {
|
|
37
|
+
// Reset copy states when content changes
|
|
38
|
+
this.copyStates.clear();
|
|
39
|
+
this.copyStateSignal.set(new Map());
|
|
40
|
+
// Update content if container exists
|
|
41
|
+
if (this.markdownContainer) {
|
|
42
|
+
this.updateContent();
|
|
43
|
+
this.renderMathEquations();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
ngAfterViewInit() {
|
|
48
|
+
this.updateContent();
|
|
49
|
+
this.renderMathEquations();
|
|
50
|
+
}
|
|
51
|
+
updateContent() {
|
|
52
|
+
if (!this.markdownContainer)
|
|
53
|
+
return;
|
|
54
|
+
const container = this.markdownContainer.nativeElement;
|
|
55
|
+
const html = this.renderedHtml();
|
|
56
|
+
container.innerHTML = html;
|
|
57
|
+
}
|
|
58
|
+
codeBlocksMap = new Map();
|
|
59
|
+
markedInstance = null;
|
|
60
|
+
initializeMarked() {
|
|
61
|
+
if (this.markedInstance)
|
|
62
|
+
return;
|
|
63
|
+
// Store highlighted code blocks temporarily
|
|
64
|
+
const highlightedBlocks = new Map();
|
|
65
|
+
// Create a new Marked instance
|
|
66
|
+
this.markedInstance = new Marked();
|
|
67
|
+
// Configure marked options
|
|
68
|
+
this.markedInstance.setOptions({
|
|
69
|
+
gfm: true,
|
|
70
|
+
breaks: true,
|
|
71
|
+
});
|
|
72
|
+
// Add a walkTokens function to process code tokens before rendering
|
|
73
|
+
this.markedInstance.use({
|
|
74
|
+
walkTokens: (token) => {
|
|
75
|
+
if (token.type === "code") {
|
|
76
|
+
const rawCode = token.text;
|
|
77
|
+
const lang = token.lang || "";
|
|
78
|
+
const blockId = this.generateBlockId(rawCode);
|
|
79
|
+
// Store the raw code in our map for copying
|
|
80
|
+
this.codeBlocksMap.set(blockId, rawCode);
|
|
81
|
+
const copied = this.copyStateSignal().get(blockId) || false;
|
|
82
|
+
const copyLabel = copied
|
|
83
|
+
? this.labels.assistantMessageToolbarCopyCodeCopiedLabel
|
|
84
|
+
: this.labels.assistantMessageToolbarCopyCodeLabel;
|
|
85
|
+
// Manually highlight the code
|
|
86
|
+
const language = hljs.getLanguage(lang) ? lang : "plaintext";
|
|
87
|
+
const highlighted = hljs.highlight(rawCode, { language }).value;
|
|
88
|
+
const codeClass = lang ? `hljs language-${lang}` : "hljs";
|
|
89
|
+
// Create the full HTML with header and highlighted code
|
|
90
|
+
const fullHtml = `
|
|
91
|
+
<div class="code-block-container">
|
|
92
|
+
<div class="code-block-header">
|
|
93
|
+
${lang ? `<span class="code-block-language">${lang}</span>` : "<span></span>"}
|
|
94
|
+
<button
|
|
95
|
+
class="code-block-copy-button"
|
|
96
|
+
data-code-block-id="${blockId}"
|
|
97
|
+
aria-label="${copyLabel} code">
|
|
98
|
+
${copied
|
|
99
|
+
? '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>'
|
|
100
|
+
: '<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.11 0-2-.9-2-2V4c0-1.11.89-2 2-2h10c1.11 0 2 .89 2 2"/></svg>'}
|
|
101
|
+
<span>${copyLabel}</span>
|
|
102
|
+
</button>
|
|
103
|
+
</div>
|
|
104
|
+
<pre><code class="${codeClass}">${highlighted}</code></pre>
|
|
105
|
+
</div>
|
|
106
|
+
`;
|
|
107
|
+
// Store the highlighted HTML
|
|
108
|
+
highlightedBlocks.set(blockId, fullHtml);
|
|
109
|
+
// Change the token to an html token to bypass marked's escaping
|
|
110
|
+
token.type = "html";
|
|
111
|
+
token.text = fullHtml;
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
renderMarkdown(content) {
|
|
117
|
+
// Initialize marked if not already done
|
|
118
|
+
this.initializeMarked();
|
|
119
|
+
// Clear the code blocks map for new render
|
|
120
|
+
this.codeBlocksMap.clear();
|
|
121
|
+
// Parse markdown
|
|
122
|
+
let html = this.markedInstance.parse(content);
|
|
123
|
+
// Process math equations
|
|
124
|
+
html = this.processMathEquations(html);
|
|
125
|
+
return html;
|
|
126
|
+
}
|
|
127
|
+
processMathEquations(html) {
|
|
128
|
+
// First, temporarily replace code blocks with placeholders to protect them from math processing
|
|
129
|
+
const codeBlocks = [];
|
|
130
|
+
const placeholder = "___CODE_BLOCK_PLACEHOLDER_";
|
|
131
|
+
// Store code blocks and replace with placeholders
|
|
132
|
+
html = html.replace(/<pre><code[\s\S]*?<\/code><\/pre>/g, (match) => {
|
|
133
|
+
const index = codeBlocks.length;
|
|
134
|
+
codeBlocks.push(match);
|
|
135
|
+
return `${placeholder}${index}___`;
|
|
136
|
+
});
|
|
137
|
+
// Also protect inline code
|
|
138
|
+
const inlineCode = [];
|
|
139
|
+
const inlinePlaceholder = "___INLINE_CODE_PLACEHOLDER_";
|
|
140
|
+
html = html.replace(/<code>[\s\S]*?<\/code>/g, (match) => {
|
|
141
|
+
const index = inlineCode.length;
|
|
142
|
+
inlineCode.push(match);
|
|
143
|
+
return `${inlinePlaceholder}${index}___`;
|
|
144
|
+
});
|
|
145
|
+
// Process display math $$ ... $$
|
|
146
|
+
html = html.replace(/\$\$([\s\S]*?)\$\$/g, (match, equation) => {
|
|
147
|
+
try {
|
|
148
|
+
return katex.renderToString(equation, {
|
|
149
|
+
displayMode: true,
|
|
150
|
+
throwOnError: false,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return match;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
// Process inline math $ ... $
|
|
158
|
+
html = html.replace(/\$([^\$]+)\$/g, (match, equation) => {
|
|
159
|
+
try {
|
|
160
|
+
return katex.renderToString(equation, {
|
|
161
|
+
displayMode: false,
|
|
162
|
+
throwOnError: false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return match;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// Restore code blocks
|
|
170
|
+
codeBlocks.forEach((block, index) => {
|
|
171
|
+
html = html.replace(`${placeholder}${index}___`, block);
|
|
172
|
+
});
|
|
173
|
+
// Restore inline code
|
|
174
|
+
inlineCode.forEach((code, index) => {
|
|
175
|
+
html = html.replace(`${inlinePlaceholder}${index}___`, code);
|
|
176
|
+
});
|
|
177
|
+
return html;
|
|
178
|
+
}
|
|
179
|
+
renderMathEquations() {
|
|
180
|
+
if (!this.markdownContainer)
|
|
181
|
+
return;
|
|
182
|
+
const container = this.markdownContainer.nativeElement;
|
|
183
|
+
// Find all math placeholders and render them
|
|
184
|
+
const mathElements = container.querySelectorAll(".math-placeholder");
|
|
185
|
+
mathElements.forEach((element) => {
|
|
186
|
+
const equation = element.getAttribute("data-equation");
|
|
187
|
+
const displayMode = element.getAttribute("data-display") === "true";
|
|
188
|
+
if (equation) {
|
|
189
|
+
try {
|
|
190
|
+
katex.render(equation, element, {
|
|
191
|
+
displayMode,
|
|
192
|
+
throwOnError: false,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.error("Failed to render math equation:", error);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
handleClick(event) {
|
|
202
|
+
const target = event.target;
|
|
203
|
+
// Check if clicked on copy button or its children
|
|
204
|
+
const copyButton = target.closest(".code-block-copy-button");
|
|
205
|
+
if (copyButton) {
|
|
206
|
+
event.preventDefault();
|
|
207
|
+
const blockId = copyButton.getAttribute("data-code-block-id");
|
|
208
|
+
if (blockId) {
|
|
209
|
+
// Get the raw code from our map instead of from DOM
|
|
210
|
+
const code = this.codeBlocksMap.get(blockId);
|
|
211
|
+
if (code) {
|
|
212
|
+
this.copyCodeBlock(blockId, code);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
copyCodeBlock(blockId, code) {
|
|
218
|
+
navigator.clipboard.writeText(code).then(() => {
|
|
219
|
+
// Update copy state
|
|
220
|
+
const newStates = new Map(this.copyStateSignal());
|
|
221
|
+
newStates.set(blockId, true);
|
|
222
|
+
this.copyStateSignal.set(newStates);
|
|
223
|
+
// Update the button in the DOM
|
|
224
|
+
const button = this.elementRef.nativeElement.querySelector(`[data-code-block-id="${blockId}"]`);
|
|
225
|
+
if (button) {
|
|
226
|
+
const originalHTML = button.innerHTML;
|
|
227
|
+
button.innerHTML = `
|
|
228
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>
|
|
229
|
+
<span>${this.labels.assistantMessageToolbarCopyCodeCopiedLabel}</span>
|
|
230
|
+
`;
|
|
231
|
+
button.setAttribute("aria-label", `${this.labels.assistantMessageToolbarCopyCodeCopiedLabel} code`);
|
|
232
|
+
// Reset after 2 seconds
|
|
233
|
+
setTimeout(() => {
|
|
234
|
+
const states = new Map(this.copyStateSignal());
|
|
235
|
+
states.set(blockId, false);
|
|
236
|
+
this.copyStateSignal.set(states);
|
|
237
|
+
button.innerHTML = originalHTML;
|
|
238
|
+
button.setAttribute("aria-label", `${this.labels.assistantMessageToolbarCopyCodeLabel} code`);
|
|
239
|
+
}, 2000);
|
|
240
|
+
}
|
|
241
|
+
}, (err) => {
|
|
242
|
+
console.error("Failed to copy code:", err);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
generateBlockId(code) {
|
|
246
|
+
// Simple hash function for generating unique IDs
|
|
247
|
+
let hash = 0;
|
|
248
|
+
for (let i = 0; i < code.length; i++) {
|
|
249
|
+
const char = code.charCodeAt(i);
|
|
250
|
+
hash = (hash << 5) - hash + char;
|
|
251
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
252
|
+
}
|
|
253
|
+
return `code-block-${hash}`;
|
|
254
|
+
}
|
|
255
|
+
escapeHtml(text) {
|
|
256
|
+
const div = document.createElement("div");
|
|
257
|
+
div.textContent = text;
|
|
258
|
+
return div.innerHTML;
|
|
259
|
+
}
|
|
260
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
261
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAssistantMessageRendererComponent, isStandalone: true, selector: "copilot-chat-assistant-message-renderer", inputs: { content: "content", inputClass: "inputClass" }, viewQueries: [{ propertyName: "markdownContainer", first: true, predicate: ["markdownContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
262
|
+
<div
|
|
263
|
+
#markdownContainer
|
|
264
|
+
[class]="inputClass"
|
|
265
|
+
(click)="handleClick($event)"
|
|
266
|
+
></div>
|
|
267
|
+
`, isInline: true, styles: ["copilot-chat-assistant-message-renderer{display:block;width:100%}copilot-chat-assistant-message-renderer code:not(pre code){padding:2.5px 4.8px;background-color:#ececec;border-radius:.25rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace;font-weight:500;color:#000}.dark copilot-chat-assistant-message-renderer code:not(pre code){background-color:#171717;color:#f8fafc}copilot-chat-assistant-message-renderer .code-block-container{position:relative;margin:.25rem 0;background-color:#f9f9f9;border-radius:1rem}.dark copilot-chat-assistant-message-renderer .code-block-container{background-color:#171717}copilot-chat-assistant-message-renderer .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;font-size:.75rem;background-color:transparent}copilot-chat-assistant-message-renderer .code-block-language{font-weight:400;color:#737373}.dark copilot-chat-assistant-message-renderer .code-block-language{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button{display:flex;align-items:center;gap:.125rem;padding:0 .5rem;font-size:.75rem;color:#737373;cursor:pointer;background:none;border:none;transition:opacity .2s}.dark copilot-chat-assistant-message-renderer .code-block-copy-button{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button:hover{opacity:.8}copilot-chat-assistant-message-renderer .code-block-copy-button svg{width:10px;height:10px}copilot-chat-assistant-message-renderer .code-block-copy-button span{font-size:11px}copilot-chat-assistant-message-renderer pre{margin:0;padding:0 1rem 1rem;overflow-x:auto;background-color:transparent;border-radius:1rem}.dark copilot-chat-assistant-message-renderer pre{background-color:transparent}copilot-chat-assistant-message-renderer pre code{background-color:transparent;padding:0;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#383a42}.dark copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#abb2bf}copilot-chat-assistant-message-renderer .katex-display{overflow-x:auto;overflow-y:hidden;padding:1rem 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
268
|
+
}
|
|
269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageRendererComponent, decorators: [{
|
|
270
|
+
type: Component,
|
|
271
|
+
args: [{ selector: "copilot-chat-assistant-message-renderer", standalone: true, imports: [CommonModule, LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
272
|
+
<div
|
|
273
|
+
#markdownContainer
|
|
274
|
+
[class]="inputClass"
|
|
275
|
+
(click)="handleClick($event)"
|
|
276
|
+
></div>
|
|
277
|
+
`, styles: ["copilot-chat-assistant-message-renderer{display:block;width:100%}copilot-chat-assistant-message-renderer code:not(pre code){padding:2.5px 4.8px;background-color:#ececec;border-radius:.25rem;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace;font-weight:500;color:#000}.dark copilot-chat-assistant-message-renderer code:not(pre code){background-color:#171717;color:#f8fafc}copilot-chat-assistant-message-renderer .code-block-container{position:relative;margin:.25rem 0;background-color:#f9f9f9;border-radius:1rem}.dark copilot-chat-assistant-message-renderer .code-block-container{background-color:#171717}copilot-chat-assistant-message-renderer .code-block-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;font-size:.75rem;background-color:transparent}copilot-chat-assistant-message-renderer .code-block-language{font-weight:400;color:#737373}.dark copilot-chat-assistant-message-renderer .code-block-language{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button{display:flex;align-items:center;gap:.125rem;padding:0 .5rem;font-size:.75rem;color:#737373;cursor:pointer;background:none;border:none;transition:opacity .2s}.dark copilot-chat-assistant-message-renderer .code-block-copy-button{color:#fff}copilot-chat-assistant-message-renderer .code-block-copy-button:hover{opacity:.8}copilot-chat-assistant-message-renderer .code-block-copy-button svg{width:10px;height:10px}copilot-chat-assistant-message-renderer .code-block-copy-button span{font-size:11px}copilot-chat-assistant-message-renderer pre{margin:0;padding:0 1rem 1rem;overflow-x:auto;background-color:transparent;border-radius:1rem}.dark copilot-chat-assistant-message-renderer pre{background-color:transparent}copilot-chat-assistant-message-renderer pre code{background-color:transparent;padding:0;font-size:.875rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Consolas,Liberation Mono,Menlo,monospace}copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#383a42}.dark copilot-chat-assistant-message-renderer .hljs{background:transparent;color:#abb2bf}copilot-chat-assistant-message-renderer .katex-display{overflow-x:auto;overflow-y:hidden;padding:1rem 0}\n"] }]
|
|
278
|
+
}], propDecorators: { content: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], inputClass: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], markdownContainer: [{
|
|
283
|
+
type: ViewChild,
|
|
284
|
+
args: ["markdownContainer", { static: false }]
|
|
285
|
+
}] } });
|
|
286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBR2pCLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFFVixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxJQUFJLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDOztBQTZJM0csTUFBTSxPQUFPLDRDQUE0QztJQUcvQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRVEsVUFBVSxDQUFVO0lBRXJCLGFBQWEsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7SUFHM0MsaUJBQWlCLENBQThCO0lBRXZDLFVBQVUsR0FBRyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNyRCxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhDLG9DQUFvQztJQUM1QixVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDeEMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBbUIsQ0FBQyxDQUFDO0lBRTdELFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzNCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1QyxNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2Qix5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDcEMscUNBQXFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtZQUFFLE9BQU87UUFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQztRQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDakMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVPLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMxQyxjQUFjLEdBQWtCLElBQUksQ0FBQztJQUVyQyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFaEMsNENBQTRDO1FBQzVDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFcEQsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUVuQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7WUFDN0IsR0FBRyxFQUFFLElBQUk7WUFDVCxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUMsQ0FBQztRQUVILG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUMxQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUMzQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDOUMsNENBQTRDO29CQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBRXpDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDO29CQUM1RCxNQUFNLFNBQVMsR0FBRyxNQUFNO3dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEM7d0JBQ3hELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUFDO29CQUVyRCw4QkFBOEI7b0JBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO29CQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUUxRCx3REFBd0Q7b0JBQ3hELE1BQU0sUUFBUSxHQUFHOzs7a0JBR1QsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQ0FBcUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWU7Ozt3Q0FHckQsT0FBTztnQ0FDZixTQUFTO29CQUVyQixNQUFNO3dCQUNKLENBQUMsQ0FBQyx3TkFBd047d0JBQzFOLENBQUMsQ0FBQyw2VEFDTjswQkFDUSxTQUFTOzs7a0NBR0QsU0FBUyxLQUFLLFdBQVc7O1dBRWhELENBQUM7b0JBRUYsNkJBQTZCO29CQUM3QixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUV6QyxnRUFBZ0U7b0JBQ2hFLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO29CQUNwQixLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFDeEIsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQWU7UUFDcEMsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhCLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTNCLGlCQUFpQjtRQUNqQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQVcsQ0FBQztRQUV6RCx5QkFBeUI7UUFDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUFZO1FBQ3ZDLGdHQUFnRztRQUNoRyxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUM7UUFFakQsa0RBQWtEO1FBQ2xELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNoQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxXQUFXLEdBQUcsS0FBSyxLQUFLLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLE1BQU0saUJBQWlCLEdBQUcsNkJBQTZCLENBQUM7UUFDeEQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsT0FBTyxHQUFHLGlCQUFpQixHQUFHLEtBQUssS0FBSyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUNBQWlDO1FBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzdELElBQUksQ0FBQztnQkFDSCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO29CQUNwQyxXQUFXLEVBQUUsSUFBSTtvQkFDakIsWUFBWSxFQUFFLEtBQUs7aUJBQ3BCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCw4QkFBOEI7UUFDOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQztnQkFDSCxPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO29CQUNwQyxXQUFXLEVBQUUsS0FBSztvQkFDbEIsWUFBWSxFQUFFLEtBQUs7aUJBQ3BCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxzQkFBc0I7UUFDdEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsR0FBRyxLQUFLLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUVILHNCQUFzQjtRQUN0QixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsaUJBQWlCLEdBQUcsS0FBSyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBRXBDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7UUFFdkQsNkNBQTZDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMvQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssTUFBTSxDQUFDO1lBRXBFLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDO29CQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQXNCLEVBQUU7d0JBQzdDLFdBQVc7d0JBQ1gsWUFBWSxFQUFFLEtBQUs7cUJBQ3BCLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBaUI7UUFDM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFFM0Msa0RBQWtEO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQy9CLHlCQUF5QixDQUNMLENBQUM7UUFDdkIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFFOUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWUsRUFBRSxJQUFZO1FBQ2pELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDdEMsR0FBRyxFQUFFO1lBQ0gsb0JBQW9CO1lBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXBDLCtCQUErQjtZQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQ3hELHdCQUF3QixPQUFPLElBQUksQ0FDcEMsQ0FBQztZQUNGLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLFNBQVMsR0FBRzs7b0JBRVQsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQ0FBMEM7V0FDL0QsQ0FBQztnQkFDRixNQUFNLENBQUMsWUFBWSxDQUNqQixZQUFZLEVBQ1osR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLDBDQUEwQyxPQUFPLENBQ2pFLENBQUM7Z0JBRUYsd0JBQXdCO2dCQUN4QixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO29CQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO29CQUNoQyxNQUFNLENBQUMsWUFBWSxDQUNqQixZQUFZLEVBQ1osR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxPQUFPLENBQzNELENBQUM7Z0JBQ0osQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBWTtRQUNsQyxpREFBaUQ7UUFDakQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsNEJBQTRCO1FBQ2xELENBQUM7UUFDRCxPQUFPLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFZO1FBQzdCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7d0dBclRVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLDBTQXJJN0M7Ozs7OztHQU1ULGl5RUFUUyxZQUFZLDhCQUFFLG1CQUFtQjs7NEZBd0loQyw0Q0FBNEM7a0JBM0l4RCxTQUFTOytCQUNFLHlDQUF5QyxjQUN2QyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsbUJBQzNCLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7OztHQU1UOzhCQW9JRyxPQUFPO3NCQURWLEtBQUs7Z0JBU0csVUFBVTtzQkFBbEIsS0FBSztnQkFLTixpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgTWFya2VkIH0gZnJvbSBcIm1hcmtlZFwiO1xuaW1wb3J0IGhsanMgZnJvbSBcImhpZ2hsaWdodC5qc1wiO1xuaW1wb3J0ICogYXMga2F0ZXggZnJvbSBcImthdGV4XCI7XG5pbXBvcnQgeyBjb21wbGV0ZVBhcnRpYWxNYXJrZG93biB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSwgQ29weSwgQ2hlY2sgfSBmcm9tIFwibHVjaWRlLWFuZ3VsYXJcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LWNvbmZpZ3VyYXRpb24vY2hhdC1jb25maWd1cmF0aW9uLnNlcnZpY2VcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlclwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMdWNpZGVBbmd1bGFyTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI21hcmtkb3duQ29udGFpbmVyXG4gICAgICBbY2xhc3NdPVwiaW5wdXRDbGFzc1wiXG4gICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXG4gICAgPjwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC8qIElubGluZSBjb2RlIHN0eWxpbmcgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgICAgICBwYWRkaW5nOiAyLjVweCA0LjhweDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNiwgMjM2LCAyMzYpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwLjI1cmVtO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBmb250LWZhbWlseTpcbiAgICAgICAgICB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBcIlNGIE1vbm9cIiwgQ29uc29sYXMsIFwiTGliZXJhdGlvbiBNb25vXCIsXG4gICAgICAgICAgTWVubG8sIG1vbm9zcGFjZTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgY29sb3I6ICMwMDAwMDA7XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBjb2RlOm5vdChwcmUgY29kZSkge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTcxNzE3OyAvKiBzYW1lIGFzIGNvZGUgYmxvY2tzICovXG4gICAgICAgIGNvbG9yOiByZ2IoMjQ4LCAyNTAsIDI1Mik7IC8qIHRleHQtZm9yZWdyb3VuZCBpbiBkYXJrIG1vZGUgKi9cbiAgICAgIH1cblxuICAgICAgLyogQ29kZSBibG9jayBjb250YWluZXIgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG1hcmdpbjogMC4yNXJlbSAwO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ5LCAyNDksIDI0OSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb250YWluZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTcxNzE3O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2staGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nOiAwLjc1cmVtIDFyZW0gMC43NXJlbSAxcmVtO1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stbGFuZ3VhZ2Uge1xuICAgICAgICBmb250LXdlaWdodDogNDAwO1xuICAgICAgICBjb2xvcjogcmdiYSgxMTUsIDExNSwgMTE1LCAxKTtcbiAgICAgIH1cblxuICAgICAgLmRhcmsgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIC5jb2RlLWJsb2NrLWxhbmd1YWdlIHtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDAuMTI1cmVtO1xuICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgICBjb2xvcjogcmdiYSgxMTUsIDExNSwgMTE1LCAxKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcbiAgICAgIH1cblxuICAgICAgLmRhcmsgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIC5jb2RlLWJsb2NrLWNvcHktYnV0dG9uIHtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b246aG92ZXIge1xuICAgICAgICBvcGFjaXR5OiAwLjg7XG4gICAgICB9XG5cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuY29kZS1ibG9jay1jb3B5LWJ1dHRvbiBzdmcge1xuICAgICAgICB3aWR0aDogMTBweDtcbiAgICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgfVxuXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmNvZGUtYmxvY2stY29weS1idXR0b24gc3BhbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIH1cblxuICAgICAgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIHByZSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMCAxcmVtIDFyZW0gMXJlbTtcbiAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFyZW07XG4gICAgICB9XG5cbiAgICAgIC5kYXJrIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciBwcmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXJlbmRlcmVyIHByZSBjb2RlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtZmFtaWx5OlxuICAgICAgICAgIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIFwiU0YgTW9ub1wiLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIixcbiAgICAgICAgICBNZW5sbywgbW9ub3NwYWNlO1xuICAgICAgfVxuXG4gICAgICAvKiBIaWdobGlnaHQuanMgdGhlbWUgYWRqdXN0bWVudHMgKi9cbiAgICAgIGNvcGlsb3QtY2hhdC1hc3Npc3RhbnQtbWVzc2FnZS1yZW5kZXJlciAuaGxqcyB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBjb2xvcjogcmdiKDU2LCA1OCwgNjYpO1xuICAgICAgfVxuXG4gICAgICAuZGFyayBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmhsanMge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6ICNhYmIyYmY7XG4gICAgICB9XG5cbiAgICAgIC8qIE1hdGggZXF1YXRpb25zICovXG4gICAgICBjb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtcmVuZGVyZXIgLmthdGV4LWRpc3BsYXkge1xuICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xuICAgICAgICBvdmVyZmxvdy15OiBoaWRkZW47XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gMDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdEFzc2lzdGFudE1lc3NhZ2VSZW5kZXJlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxue1xuICBwcml2YXRlIF9jb250ZW50ID0gXCJcIjtcbiAgQElucHV0KClcbiAgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcbiAgICB0aGlzLmNvbnRlbnRTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuICBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICB9XG5cbiAgQElucHV0KCkgaW5wdXRDbGFzcz86IHN0cmluZztcblxuICBwcml2YXRlIGNvbnRlbnRTaWduYWwgPSBzaWduYWw8c3RyaW5nPihcIlwiKTtcblxuICBAVmlld0NoaWxkKFwibWFya2Rvd25Db250YWluZXJcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIG1hcmtkb3duQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgcHJpdmF0ZSBjaGF0Q29uZmlnID0gaW5qZWN0KENvcGlsb3RDaGF0Q29uZmlndXJhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgLy8gVHJhY2sgY29weSBzdGF0ZXMgZm9yIGNvZGUgYmxvY2tzXG4gIHByaXZhdGUgY29weVN0YXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICBwcml2YXRlIGNvcHlTdGF0ZVNpZ25hbCA9IHNpZ25hbChuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKSk7XG5cbiAgcmVuZGVyZWRIdG1sID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5jb250ZW50U2lnbmFsKCk7XG4gICAgY29uc3QgY29tcGxldGVkTWFya2Rvd24gPSBjb21wbGV0ZVBhcnRpYWxNYXJrZG93bihjdXJyZW50Q29udGVudCk7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyTWFya2Rvd24oY29tcGxldGVkTWFya2Rvd24pO1xuICB9KTtcblxuICBnZXQgbGFiZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmNoYXRDb25maWcubGFiZWxzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJjb250ZW50XCJdKSB7XG4gICAgICAvLyBSZXNldCBjb3B5IHN0YXRlcyB3aGVuIGNvbnRlbnQgY2hhbmdlc1xuICAgICAgdGhpcy5jb3B5U3RhdGVzLmNsZWFyKCk7XG4gICAgICB0aGlzLmNvcHlTdGF0ZVNpZ25hbC5zZXQobmV3IE1hcCgpKTtcbiAgICAgIC8vIFVwZGF0ZSBjb250ZW50IGlmIGNvbnRhaW5lciBleGlzdHNcbiAgICAgIGlmICh0aGlzLm1hcmtkb3duQ29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLnJlbmRlck1hdGhFcXVhdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVDb250ZW50KCk7XG4gICAgdGhpcy5yZW5kZXJNYXRoRXF1YXRpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcmtkb3duQ29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5tYXJrZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLnJlbmRlcmVkSHRtbCgpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2RlQmxvY2tzTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBtYXJrZWRJbnN0YW5jZTogTWFya2VkIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplTWFya2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1hcmtlZEluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyBTdG9yZSBoaWdobGlnaHRlZCBjb2RlIGJsb2NrcyB0ZW1wb3JhcmlseVxuICAgIGNvbnN0IGhpZ2hsaWdodGVkQmxvY2tzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBNYXJrZWQgaW5zdGFuY2VcbiAgICB0aGlzLm1hcmtlZEluc3RhbmNlID0gbmV3IE1hcmtlZCgpO1xuXG4gICAgLy8gQ29uZmlndXJlIG1hcmtlZCBvcHRpb25zXG4gICAgdGhpcy5tYXJrZWRJbnN0YW5jZS5zZXRPcHRpb25zKHtcbiAgICAgIGdmbTogdHJ1ZSxcbiAgICAgIGJyZWFrczogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIEFkZCBhIHdhbGtUb2tlbnMgZnVuY3Rpb24gdG8gcHJvY2VzcyBjb2RlIHRva2VucyBiZWZvcmUgcmVuZGVyaW5nXG4gICAgdGhpcy5tYXJrZWRJbnN0YW5jZS51c2Uoe1xuICAgICAgd2Fsa1Rva2VuczogKHRva2VuOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IFwiY29kZVwiKSB7XG4gICAgICAgICAgY29uc3QgcmF3Q29kZSA9IHRva2VuLnRleHQ7XG4gICAgICAgICAgY29uc3QgbGFuZyA9IHRva2VuLmxhbmcgfHwgXCJcIjtcblxuICAgICAgICAgIGNvbnN0IGJsb2NrSWQgPSB0aGlzLmdlbmVyYXRlQmxvY2tJZChyYXdDb2RlKTtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgcmF3IGNvZGUgaW4gb3VyIG1hcCBmb3IgY29weWluZ1xuICAgICAgICAgIHRoaXMuY29kZUJsb2Nrc01hcC5zZXQoYmxvY2tJZCwgcmF3Q29kZSk7XG5cbiAgICAgICAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlTdGF0ZVNpZ25hbCgpLmdldChibG9ja0lkKSB8fCBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjb3B5TGFiZWwgPSBjb3BpZWRcbiAgICAgICAgICAgID8gdGhpcy5sYWJlbHMuYXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb3B5Q29kZUNvcGllZExhYmVsXG4gICAgICAgICAgICA6IHRoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVMYWJlbDtcblxuICAgICAgICAgIC8vIE1hbnVhbGx5IGhpZ2hsaWdodCB0aGUgY29kZVxuICAgICAgICAgIGNvbnN0IGxhbmd1YWdlID0gaGxqcy5nZXRMYW5ndWFnZShsYW5nKSA/IGxhbmcgOiBcInBsYWludGV4dFwiO1xuICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkID0gaGxqcy5oaWdobGlnaHQocmF3Q29kZSwgeyBsYW5ndWFnZSB9KS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjb2RlQ2xhc3MgPSBsYW5nID8gYGhsanMgbGFuZ3VhZ2UtJHtsYW5nfWAgOiBcImhsanNcIjtcblxuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBIVE1MIHdpdGggaGVhZGVyIGFuZCBoaWdobGlnaHRlZCBjb2RlXG4gICAgICAgICAgY29uc3QgZnVsbEh0bWwgPSBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29kZS1ibG9jay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvZGUtYmxvY2staGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgJHtsYW5nID8gYDxzcGFuIGNsYXNzPVwiY29kZS1ibG9jay1sYW5ndWFnZVwiPiR7bGFuZ308L3NwYW4+YCA6IFwiPHNwYW4+PC9zcGFuPlwifVxuICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvZGUtYmxvY2stY29weS1idXR0b25cIiBcbiAgICAgICAgICAgICAgICAgIGRhdGEtY29kZS1ibG9jay1pZD1cIiR7YmxvY2tJZH1cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7Y29weUxhYmVsfSBjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgICA/ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0yMCA2IDkgMTdsLTUtNVwiLz48L3N2Zz4nXG4gICAgICAgICAgICAgICAgICAgICAgOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHg9XCI4XCIgeT1cIjhcIiByeD1cIjJcIiByeT1cIjJcIi8+PHBhdGggZD1cIk00IDE2Yy0xLjExIDAtMi0uOS0yLTJWNGMwLTEuMTEuODktMiAyLTJoMTBjMS4xMSAwIDIgLjg5IDIgMlwiLz48L3N2Zz4nXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ke2NvcHlMYWJlbH08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8cHJlPjxjb2RlIGNsYXNzPVwiJHtjb2RlQ2xhc3N9XCI+JHtoaWdobGlnaHRlZH08L2NvZGU+PC9wcmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuXG4gICAgICAgICAgLy8gU3RvcmUgdGhlIGhpZ2hsaWdodGVkIEhUTUxcbiAgICAgICAgICBoaWdobGlnaHRlZEJsb2Nrcy5zZXQoYmxvY2tJZCwgZnVsbEh0bWwpO1xuXG4gICAgICAgICAgLy8gQ2hhbmdlIHRoZSB0b2tlbiB0byBhbiBodG1sIHRva2VuIHRvIGJ5cGFzcyBtYXJrZWQncyBlc2NhcGluZ1xuICAgICAgICAgIHRva2VuLnR5cGUgPSBcImh0bWxcIjtcbiAgICAgICAgICB0b2tlbi50ZXh0ID0gZnVsbEh0bWw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlck1hcmtkb3duKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gSW5pdGlhbGl6ZSBtYXJrZWQgaWYgbm90IGFscmVhZHkgZG9uZVxuICAgIHRoaXMuaW5pdGlhbGl6ZU1hcmtlZCgpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGNvZGUgYmxvY2tzIG1hcCBmb3IgbmV3IHJlbmRlclxuICAgIHRoaXMuY29kZUJsb2Nrc01hcC5jbGVhcigpO1xuXG4gICAgLy8gUGFyc2UgbWFya2Rvd25cbiAgICBsZXQgaHRtbCA9IHRoaXMubWFya2VkSW5zdGFuY2UhLnBhcnNlKGNvbnRlbnQpIGFzIHN0cmluZztcblxuICAgIC8vIFByb2Nlc3MgbWF0aCBlcXVhdGlvbnNcbiAgICBodG1sID0gdGhpcy5wcm9jZXNzTWF0aEVxdWF0aW9ucyhodG1sKTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTWF0aEVxdWF0aW9ucyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEZpcnN0LCB0ZW1wb3JhcmlseSByZXBsYWNlIGNvZGUgYmxvY2tzIHdpdGggcGxhY2Vob2xkZXJzIHRvIHByb3RlY3QgdGhlbSBmcm9tIG1hdGggcHJvY2Vzc2luZ1xuICAgIGNvbnN0IGNvZGVCbG9ja3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBcIl9fX0NPREVfQkxPQ0tfUExBQ0VIT0xERVJfXCI7XG5cbiAgICAvLyBTdG9yZSBjb2RlIGJsb2NrcyBhbmQgcmVwbGFjZSB3aXRoIHBsYWNlaG9sZGVyc1xuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoLzxwcmU+PGNvZGVbXFxzXFxTXSo/PFxcL2NvZGU+PFxcL3ByZT4vZywgKG1hdGNoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGNvZGVCbG9ja3MubGVuZ3RoO1xuICAgICAgY29kZUJsb2Nrcy5wdXNoKG1hdGNoKTtcbiAgICAgIHJldHVybiBgJHtwbGFjZWhvbGRlcn0ke2luZGV4fV9fX2A7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIHByb3RlY3QgaW5saW5lIGNvZGVcbiAgICBjb25zdCBpbmxpbmVDb2RlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGlubGluZVBsYWNlaG9sZGVyID0gXCJfX19JTkxJTkVfQ09ERV9QTEFDRUhPTERFUl9cIjtcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKC88Y29kZT5bXFxzXFxTXSo/PFxcL2NvZGU+L2csIChtYXRjaCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBpbmxpbmVDb2RlLmxlbmd0aDtcbiAgICAgIGlubGluZUNvZGUucHVzaChtYXRjaCk7XG4gICAgICByZXR1cm4gYCR7aW5saW5lUGxhY2Vob2xkZXJ9JHtpbmRleH1fX19gO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBkaXNwbGF5IG1hdGggJCQgLi4uICQkXG4gICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFwkXFwkKFtcXHNcXFNdKj8pXFwkXFwkL2csIChtYXRjaCwgZXF1YXRpb24pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBrYXRleC5yZW5kZXJUb1N0cmluZyhlcXVhdGlvbiwge1xuICAgICAgICAgIGRpc3BsYXlNb2RlOiB0cnVlLFxuICAgICAgICAgIHRocm93T25FcnJvcjogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByb2Nlc3MgaW5saW5lIG1hdGggJCAuLi4gJFxuICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcJChbXlxcJF0rKVxcJC9nLCAobWF0Y2gsIGVxdWF0aW9uKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4ga2F0ZXgucmVuZGVyVG9TdHJpbmcoZXF1YXRpb24sIHtcbiAgICAgICAgICBkaXNwbGF5TW9kZTogZmFsc2UsXG4gICAgICAgICAgdGhyb3dPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBjb2RlIGJsb2Nrc1xuICAgIGNvZGVCbG9ja3MuZm9yRWFjaCgoYmxvY2ssIGluZGV4KSA9PiB7XG4gICAgICBodG1sID0gaHRtbC5yZXBsYWNlKGAke3BsYWNlaG9sZGVyfSR7aW5kZXh9X19fYCwgYmxvY2spO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzdG9yZSBpbmxpbmUgY29kZVxuICAgIGlubGluZUNvZGUuZm9yRWFjaCgoY29kZSwgaW5kZXgpID0+IHtcbiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoYCR7aW5saW5lUGxhY2Vob2xkZXJ9JHtpbmRleH1fX19gLCBjb2RlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBodG1sO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJNYXRoRXF1YXRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXJrZG93bkNvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5tYXJrZG93bkNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgLy8gRmluZCBhbGwgbWF0aCBwbGFjZWhvbGRlcnMgYW5kIHJlbmRlciB0aGVtXG4gICAgY29uc3QgbWF0aEVsZW1lbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCIubWF0aC1wbGFjZWhvbGRlclwiKTtcbiAgICBtYXRoRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgZXF1YXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtZXF1YXRpb25cIik7XG4gICAgICBjb25zdCBkaXNwbGF5TW9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1kaXNwbGF5XCIpID09PSBcInRydWVcIjtcblxuICAgICAgaWYgKGVxdWF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAga2F0ZXgucmVuZGVyKGVxdWF0aW9uLCBlbGVtZW50IGFzIEhUTUxFbGVtZW50LCB7XG4gICAgICAgICAgICBkaXNwbGF5TW9kZSxcbiAgICAgICAgICAgIHRocm93T25FcnJvcjogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byByZW5kZXIgbWF0aCBlcXVhdGlvbjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIC8vIENoZWNrIGlmIGNsaWNrZWQgb24gY29weSBidXR0b24gb3IgaXRzIGNoaWxkcmVuXG4gICAgY29uc3QgY29weUJ1dHRvbiA9IHRhcmdldC5jbG9zZXN0KFxuICAgICAgXCIuY29kZS1ibG9jay1jb3B5LWJ1dHRvblwiXG4gICAgKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBpZiAoY29weUJ1dHRvbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGJsb2NrSWQgPSBjb3B5QnV0dG9uLmdldEF0dHJpYnV0ZShcImRhdGEtY29kZS1ibG9jay1pZFwiKTtcblxuICAgICAgaWYgKGJsb2NrSWQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSByYXcgY29kZSBmcm9tIG91ciBtYXAgaW5zdGVhZCBvZiBmcm9tIERPTVxuICAgICAgICBjb25zdCBjb2RlID0gdGhpcy5jb2RlQmxvY2tzTWFwLmdldChibG9ja0lkKTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICB0aGlzLmNvcHlDb2RlQmxvY2soYmxvY2tJZCwgY29kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvcHlDb2RlQmxvY2soYmxvY2tJZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChjb2RlKS50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgY29weSBzdGF0ZVxuICAgICAgICBjb25zdCBuZXdTdGF0ZXMgPSBuZXcgTWFwKHRoaXMuY29weVN0YXRlU2lnbmFsKCkpO1xuICAgICAgICBuZXdTdGF0ZXMuc2V0KGJsb2NrSWQsIHRydWUpO1xuICAgICAgICB0aGlzLmNvcHlTdGF0ZVNpZ25hbC5zZXQobmV3U3RhdGVzKTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1dHRvbiBpbiB0aGUgRE9NXG4gICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYFtkYXRhLWNvZGUtYmxvY2staWQ9XCIke2Jsb2NrSWR9XCJdYFxuICAgICAgICApO1xuICAgICAgICBpZiAoYnV0dG9uKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxIVE1MID0gYnV0dG9uLmlubmVySFRNTDtcbiAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gYFxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMjAgNiA5IDE3bC01LTVcIi8+PC9zdmc+XG4gICAgICAgICAgICA8c3Bhbj4ke3RoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVDb3BpZWRMYWJlbH08L3NwYW4+XG4gICAgICAgICAgYDtcbiAgICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICBgJHt0aGlzLmxhYmVscy5hc3Npc3RhbnRNZXNzYWdlVG9vbGJhckNvcHlDb2RlQ29waWVkTGFiZWx9IGNvZGVgXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlc2V0IGFmdGVyIDIgc2Vjb25kc1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0gbmV3IE1hcCh0aGlzLmNvcHlTdGF0ZVNpZ25hbCgpKTtcbiAgICAgICAgICAgIHN0YXRlcy5zZXQoYmxvY2tJZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5jb3B5U3RhdGVTaWduYWwuc2V0KHN0YXRlcyk7XG4gICAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gb3JpZ2luYWxIVE1MO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCIsXG4gICAgICAgICAgICAgIGAke3RoaXMubGFiZWxzLmFzc2lzdGFudE1lc3NhZ2VUb29sYmFyQ29weUNvZGVMYWJlbH0gY29kZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY29weSBjb2RlOlwiLCBlcnIpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQmxvY2tJZChjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFNpbXBsZSBoYXNoIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBJRHNcbiAgICBsZXQgaGFzaCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFyID0gY29kZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7XG4gICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzItYml0IGludGVnZXJcbiAgICB9XG4gICAgcmV0dXJuIGBjb2RlLWJsb2NrLSR7aGFzaH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Directive, Input, signal, computed } from '@angular/core';
|
|
2
|
+
import { cn } from '../../lib/utils';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class CopilotChatAssistantMessageToolbarComponent {
|
|
5
|
+
set inputClass(value) {
|
|
6
|
+
this.customClass.set(value);
|
|
7
|
+
}
|
|
8
|
+
customClass = signal(undefined);
|
|
9
|
+
computedClass = computed(() => {
|
|
10
|
+
return cn('w-full bg-transparent flex items-center -ml-[5px] -mt-[0px]', this.customClass());
|
|
11
|
+
});
|
|
12
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
13
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatAssistantMessageToolbarComponent, isStandalone: true, selector: "[copilotChatAssistantMessageToolbar]", inputs: { inputClass: "inputClass" }, host: { properties: { "class": "computedClass()" } }, ngImport: i0 });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatAssistantMessageToolbarComponent, decorators: [{
|
|
16
|
+
type: Directive,
|
|
17
|
+
args: [{
|
|
18
|
+
selector: '[copilotChatAssistantMessageToolbar]',
|
|
19
|
+
standalone: true,
|
|
20
|
+
host: {
|
|
21
|
+
'[class]': 'computedClass()'
|
|
22
|
+
}
|
|
23
|
+
}]
|
|
24
|
+
}], propDecorators: { inputClass: [{
|
|
25
|
+
type: Input
|
|
26
|
+
}] } });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWFzc2lzdGFudC1tZXNzYWdlLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtYXNzaXN0YW50LW1lc3NhZ2UtdG9vbGJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBU3JDLE1BQU0sT0FBTywyQ0FBMkM7SUFDdEQsSUFBYSxVQUFVLENBQUMsS0FBeUI7UUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLFdBQVcsR0FBRyxNQUFNLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRTVELGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzVCLE9BQU8sRUFBRSxDQUNQLDZEQUE2RCxFQUM3RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQ25CLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQzt3R0FaUSwyQ0FBMkM7NEZBQTNDLDJDQUEyQzs7NEZBQTNDLDJDQUEyQztrQkFQdkQsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0NBQXNDO29CQUNoRCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNKLFNBQVMsRUFBRSxpQkFBaUI7cUJBQzdCO2lCQUNGOzhCQUVjLFVBQVU7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29waWxvdENoYXRBc3Npc3RhbnRNZXNzYWdlVG9vbGJhcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzc10nOiAnY29tcHV0ZWRDbGFzcygpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0QXNzaXN0YW50TWVzc2FnZVRvb2xiYXJDb21wb25lbnQge1xuICBASW5wdXQoKSBzZXQgaW5wdXRDbGFzcyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jdXN0b21DbGFzcy5zZXQodmFsdWUpO1xuICB9XG4gIFxuICBwcml2YXRlIGN1c3RvbUNsYXNzID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgXG4gIGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3ctZnVsbCBiZy10cmFuc3BhcmVudCBmbGV4IGl0ZW1zLWNlbnRlciAtbWwtWzVweF0gLW10LVswcHhdJyxcbiAgICAgIHRoaXMuY3VzdG9tQ2xhc3MoKVxuICAgICk7XG4gIH0pO1xufSJdfQ==
|