@visuno/angular 0.0.0-stage → 0.1.0

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.
Files changed (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,583 @@
1
+ // framework/angular/terminal-stream/terminal-stream.component.ts
2
+ //
3
+ // Native Angular port of framework/react/terminal-stream/TerminalStream.tsx.
4
+ // The shell commands an agent runs, as a compact terminal: the working directory
5
+ // and how the run is going in the header, each command with its output streaming
6
+ // in under it and an exit code or a check with how long it took, and a summary at
7
+ // the foot once it is over. Long output folds to its last lines. The terminal keeps
8
+ // one height (420px) and its output scrolls, staying on the newest line unless the
9
+ // reader has scrolled up. Inputs mirror the React props; React callbacks become
10
+ // @Output EventEmitters.
11
+ //
12
+ // Icon substitutions (documented per the brief): the React source uses `term`,
13
+ // `stop`, `copy`, `check`, `chev-d`, `edit`, `spark`, `ok` and `alert` — all of
14
+ // which exist in the Angular icon set, so no substitution was needed.
15
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
16
+ import { VoIconComponent } from '../core/icon.component';
17
+ import * as i0 from "@angular/core";
18
+ const TONE = { ok: 'vo-ok', bad: 'vo-bad', muted: 'vo-mu' };
19
+ const lineOf = (l) => typeof l === 'string' ? { text: l, tone: undefined } : l;
20
+ export class TerminalStreamComponent {
21
+ constructor() {
22
+ /** The working directory, shown in the header, like "~/acme/web". */
23
+ this.cwd = '';
24
+ /** Commands, notes and edits, oldest first. */
25
+ this.entries = [];
26
+ /** How many lines a folded output keeps showing. */
27
+ this.tail = 4;
28
+ /** Whether the output has been copied (shows the Copied tooltip/check). */
29
+ this.copied = false;
30
+ /** Overrides for the labels. */
31
+ this.labels = {};
32
+ /** Emitted by the Stop button while the run is going. */
33
+ this.stop = new EventEmitter();
34
+ /** Emitted with the whole run as text when it is copied. */
35
+ this.copy = new EventEmitter();
36
+ /** Which folded commands (by entry index) are open. */
37
+ this.open = new Set();
38
+ this.pinned = true;
39
+ }
40
+ get L() {
41
+ return {
42
+ running: 'Running',
43
+ passed: 'Passed',
44
+ failed: 'Failed',
45
+ stopped: 'Stopped',
46
+ stop: 'Stop',
47
+ copy: 'Copy',
48
+ copied: 'Copied to clipboard',
49
+ more: (n) => `Show ${n} more line${n === 1 ? '' : 's'}`,
50
+ fewer: 'Show fewer lines',
51
+ edit: 'Edit',
52
+ ...this.labels,
53
+ };
54
+ }
55
+ get hasStop() {
56
+ return this.stop.observed;
57
+ }
58
+ get commands() {
59
+ return this.entries.filter((e) => this.kindOf(e) === 'command');
60
+ }
61
+ get state() {
62
+ if (this.status)
63
+ return this.status;
64
+ const busy = this.entries.some((e) => this.kindOf(e) !== 'note' && e.status === 'running');
65
+ if (busy)
66
+ return 'running';
67
+ const last = this.commands[this.commands.length - 1];
68
+ return last?.status === 'failed'
69
+ ? 'failed'
70
+ : last?.status === 'stopped'
71
+ ? 'stopped'
72
+ : 'passed';
73
+ }
74
+ get running() {
75
+ return this.state === 'running';
76
+ }
77
+ get stateLabel() {
78
+ return this.L[this.state];
79
+ }
80
+ get foot() {
81
+ if (this.summary !== undefined)
82
+ return this.summary;
83
+ const n = new Set(this.commands.map((c) => c.command)).size;
84
+ return [`${n} command${n === 1 ? '' : 's'}`, this.elapsed, this.state]
85
+ .filter(Boolean)
86
+ .join(' · ');
87
+ }
88
+ kindOf(e) {
89
+ if (e.kind === 'note')
90
+ return 'note';
91
+ if (e.kind === 'edit')
92
+ return 'edit';
93
+ return 'command';
94
+ }
95
+ asNote(e) {
96
+ return e;
97
+ }
98
+ asEdit(e) {
99
+ return e;
100
+ }
101
+ asCommand(e) {
102
+ return e;
103
+ }
104
+ dataS(e) {
105
+ return e.status === 'running'
106
+ ? 'run'
107
+ : e.status === 'ok'
108
+ ? 'ok'
109
+ : e.status === 'failed'
110
+ ? 'bad'
111
+ : 'stop';
112
+ }
113
+ out(e) {
114
+ return e.output ?? [];
115
+ }
116
+ folds(e) {
117
+ return this.out(e).length > this.tail + 1;
118
+ }
119
+ hidden(e) {
120
+ const o = this.out(e);
121
+ return this.folds(e) ? o.slice(0, o.length - this.tail) : [];
122
+ }
123
+ shown(e) {
124
+ const o = this.out(e);
125
+ return this.folds(e) ? o.slice(o.length - this.tail) : o;
126
+ }
127
+ lineText(l) {
128
+ return lineOf(l).text;
129
+ }
130
+ toneClass(l) {
131
+ const tone = lineOf(l).tone;
132
+ return tone ? TONE[tone] : '';
133
+ }
134
+ more(n) {
135
+ return this.L.more(n);
136
+ }
137
+ toggle(i) {
138
+ if (this.open.has(i))
139
+ this.open.delete(i);
140
+ else
141
+ this.open.add(i);
142
+ }
143
+ text() {
144
+ return this.entries
145
+ .flatMap((e) => {
146
+ if (this.kindOf(e) === 'note')
147
+ return ['# ' + this.asNote(e).text];
148
+ if (this.kindOf(e) === 'edit') {
149
+ const ed = this.asEdit(e);
150
+ const counts = ed.added !== undefined || ed.removed !== undefined
151
+ ? ` (+${ed.added ?? 0} −${ed.removed ?? 0})`
152
+ : '';
153
+ const diff = ed.status === 'done' || ed.status === undefined ? ed.diff ?? [] : [];
154
+ return [`# ${this.L.edit} ${ed.file}${counts}`, ...diff];
155
+ }
156
+ const cmd = this.asCommand(e);
157
+ return ['$ ' + cmd.command, ...(cmd.output ?? []).map((l) => lineOf(l).text)];
158
+ })
159
+ .join('\n');
160
+ }
161
+ copyAll() {
162
+ this.copy.emit(this.text());
163
+ }
164
+ onScroll() {
165
+ const el = this.bodyRef?.nativeElement;
166
+ if (!el)
167
+ return;
168
+ this.pinned = el.scrollTop + el.clientHeight >= el.scrollHeight - 24;
169
+ }
170
+ // new output keeps the log on its newest line, unless the reader has scrolled up
171
+ ngAfterViewInit() {
172
+ const el = this.bodyRef?.nativeElement;
173
+ if (!el)
174
+ return;
175
+ const stick = () => {
176
+ if (this.pinned)
177
+ el.scrollTop = el.scrollHeight;
178
+ };
179
+ this.mo = new MutationObserver(stick);
180
+ this.mo.observe(el, { childList: true, subtree: true, characterData: true });
181
+ if (typeof ResizeObserver === 'function') {
182
+ this.ro = new ResizeObserver(stick);
183
+ this.ro.observe(el);
184
+ }
185
+ stick();
186
+ }
187
+ ngOnDestroy() {
188
+ this.mo?.disconnect();
189
+ this.ro?.disconnect();
190
+ }
191
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TerminalStreamComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
192
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TerminalStreamComponent, isStandalone: true, selector: "vo-terminal-stream", inputs: { cwd: "cwd", entries: "entries", status: "status", elapsed: "elapsed", summary: "summary", tail: "tail", copied: "copied", labels: "labels", className: "className" }, outputs: { stop: "stop", copy: "copy" }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }], ngImport: i0, template: `
193
+ <div
194
+ data-vo=""
195
+ [class]="className ? 'vo-tmx vo-panel ' + className : 'vo-tmx vo-panel'"
196
+ [class.vo-live]="running"
197
+ style="container-type: inline-size"
198
+ >
199
+ <div class="vo-tmx-h">
200
+ <span class="vo-tmx-ic"><vo-icon name="term"></vo-icon></span>
201
+ <span class="vo-tmx-cwd">{{ cwd }}</span>
202
+ <span
203
+ class="vo-tmx-st"
204
+ [class.vo-ok]="state === 'passed'"
205
+ [class.vo-bad]="state === 'failed'"
206
+ >
207
+ <span class="vo-g">
208
+ @if (running) {
209
+ <span class="vo-spin" aria-hidden="true"></span>
210
+ } @else {
211
+ <vo-icon [name]="state === 'passed' ? 'check' : 'stop'" size="xs"></vo-icon>
212
+ }
213
+ </span>
214
+ <span class="vo-tmx-sv vo-num">
215
+ @if (running) {
216
+ {{ elapsed ? L.running + ' · ' + elapsed : L.running }}
217
+ } @else {
218
+ {{ stateLabel }}
219
+ }
220
+ </span>
221
+ </span>
222
+ <span class="vo-sp"></span>
223
+ @if (running && hasStop) {
224
+ <button
225
+ type="button"
226
+ class="vo-pill vo-ghost vo-sm vo-tmx-stop"
227
+ aria-label="Stop the running command"
228
+ (click)="stop.emit()"
229
+ >
230
+ <vo-icon name="stop" size="xs"></vo-icon>{{ L.stop }}
231
+ </button>
232
+ }
233
+ <button
234
+ type="button"
235
+ class="vo-ib vo-tmx-cp"
236
+ [class.vo-copied]="copied"
237
+ aria-label="Copy the output"
238
+ (click)="copyAll()"
239
+ >
240
+ <vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon>
241
+ </button>
242
+ </div>
243
+
244
+ <div
245
+ #body
246
+ class="vo-tmx-body"
247
+ role="log"
248
+ aria-label="Terminal output"
249
+ tabindex="0"
250
+ (scroll)="onScroll()"
251
+ >
252
+ @for (e of entries; track $index; let i = $index) {
253
+ @switch (kindOf(e)) {
254
+ @case ('note') {
255
+ <div class="vo-tmx-note">
256
+ <vo-icon name="spark" size="xs"></vo-icon>
257
+ <span [class.vo-shim]="running && i === entries.length - 1">{{ asNote(e).text }}</span>
258
+ </div>
259
+ }
260
+ @case ('edit') {
261
+ <div class="vo-tmx-blk" [attr.data-s]="asEdit(e).status === 'stopped' ? 'stop' : 'edit'">
262
+ <div class="vo-tmx-cmd">
263
+ <span class="vo-tmx-p"><vo-icon name="edit" size="xs"></vo-icon></span>
264
+ <span class="vo-tmx-c">{{ L.edit }} {{ asEdit(e).file }}</span>
265
+ <span class="vo-tmx-m">
266
+ @if (asEdit(e).status === 'running') {
267
+ <span class="vo-g"><span class="vo-spin" aria-hidden="true"></span></span>
268
+ } @else if (asEdit(e).status === 'stopped') {
269
+ <span class="vo-g"><span class="vo-tag">{{ L.stopped }}</span></span>
270
+ } @else {
271
+ @if (asEdit(e).added !== undefined) {
272
+ <span class="vo-add">+{{ asEdit(e).added }}</span>
273
+ }
274
+ @if (asEdit(e).removed !== undefined) {
275
+ <span class="vo-del">−{{ asEdit(e).removed }}</span>
276
+ }
277
+ }
278
+ </span>
279
+ </div>
280
+ @if (
281
+ asEdit(e).status !== 'running' &&
282
+ asEdit(e).status !== 'stopped' &&
283
+ asEdit(e).diff &&
284
+ asEdit(e).diff!.length > 0
285
+ ) {
286
+ <div class="vo-tmx-df">
287
+ @for (d of asEdit(e).diff; track $index) {
288
+ <div [class.vo-a]="d[0] === '+'" [class.vo-d]="d[0] === '-'">{{ d }}</div>
289
+ }
290
+ </div>
291
+ }
292
+ </div>
293
+ }
294
+ @default {
295
+ <div
296
+ class="vo-tmx-blk"
297
+ [attr.data-s]="dataS(asCommand(e))"
298
+ >
299
+ <div class="vo-tmx-cmd">
300
+ <span class="vo-tmx-p">$</span>
301
+ <span class="vo-tmx-c">{{ asCommand(e).command }}</span>
302
+ <span class="vo-tmx-m">
303
+ <span class="vo-g">
304
+ @switch (asCommand(e).status) {
305
+ @case ('running') {
306
+ <span class="vo-spin" aria-hidden="true"></span>
307
+ }
308
+ @case ('ok') {
309
+ <span class="vo-ok"><vo-icon name="check" size="xs"></vo-icon></span>
310
+ }
311
+ @case ('failed') {
312
+ <span class="vo-tag vo-bad">Exit {{ asCommand(e).exitCode ?? 1 }}</span>
313
+ }
314
+ @default {
315
+ <span class="vo-tag">{{ L.stopped }}</span>
316
+ }
317
+ }
318
+ </span>
319
+ @if (asCommand(e).duration) {
320
+ <span class="vo-t vo-num">{{ asCommand(e).duration }}</span>
321
+ }
322
+ </span>
323
+ </div>
324
+ @if (folds(asCommand(e))) {
325
+ <button
326
+ type="button"
327
+ class="vo-tmx-more"
328
+ [attr.aria-expanded]="open.has(i)"
329
+ (click)="toggle(i)"
330
+ >
331
+ <vo-icon name="chev-d" size="xs"></vo-icon>
332
+ <span>{{ open.has(i) ? L.fewer : more(hidden(asCommand(e)).length) }}</span>
333
+ </button>
334
+ <div class="vo-fold" [class.vo-shut]="!open.has(i)">
335
+ <div>
336
+ <div class="vo-tmx-o">
337
+ @for (l of hidden(asCommand(e)); track $index) {
338
+ <div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
339
+ }
340
+ </div>
341
+ </div>
342
+ </div>
343
+ }
344
+ @if (shown(asCommand(e)).length > 0) {
345
+ <div class="vo-tmx-o">
346
+ @for (l of shown(asCommand(e)); track $index) {
347
+ <div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
348
+ }
349
+ </div>
350
+ }
351
+ </div>
352
+ }
353
+ }
354
+ }
355
+ </div>
356
+
357
+ <div class="vo-fold vo-tmx-ff" [class.vo-shut]="running || foot === false">
358
+ <div>
359
+ <div
360
+ class="vo-tmx-f"
361
+ [class.vo-stop]="state === 'stopped'"
362
+ [class.vo-bad]="state === 'failed'"
363
+ >
364
+ <span class="vo-g">
365
+ <vo-icon [name]="state === 'passed' ? 'ok' : state === 'failed' ? 'alert' : 'stop'"></vo-icon>
366
+ </span>
367
+ <span class="vo-tmx-fs vo-num">{{ foot || '' }}</span>
368
+ </div>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ `, isInline: true, styles: [".vo-tmx{overflow:hidden;display:flex;flex-direction:column;height:420px}.vo-tmx-h{display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-tmx-ic{display:grid;place-items:center;color:var(--vo-fg2);flex:none}.vo-tmx-cwd{min-width:0;flex:0 1 auto;font-family:var(--vo-mono);font-size:12px;color:var(--vo-fg2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-st{display:inline-flex;align-items:center;gap:6px;min-width:0;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-tmx-st .vo-g{display:grid;place-items:center;flex:none}.vo-tmx-st .vo-spin{width:10px;height:10px}.vo-tmx-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-tmx-h .vo-sp{flex:1}.vo-tmx-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:var(--vo-s-2) 0;font-family:var(--vo-mono);font-size:12px;line-height:1.8;scrollbar-width:thin;scrollbar-color:var(--vo-rail) transparent}.vo-tmx-body::-webkit-scrollbar{width:8px}.vo-tmx-body::-webkit-scrollbar-track{background:transparent}.vo-tmx-body::-webkit-scrollbar-thumb{background:var(--vo-rail);border:2px solid transparent;background-clip:padding-box;border-radius:var(--vo-r-pill)}:root:not([data-style=soft]) .vo-tmx-body:not(:where([data-style=soft],[data-style=soft] *))::-webkit-scrollbar-thumb{border-radius:0}.vo-tmx-blk+.vo-tmx-blk{margin-top:var(--vo-s-1)}.vo-tmx-cmd{display:flex;align-items:center;gap:var(--vo-s-2);padding:0 14px}.vo-tmx-p{width:12px;flex:none;display:grid;place-items:center;color:var(--vo-muted)}.vo-tmx-c{flex:1;min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-m{display:inline-flex;align-items:center;gap:6px;font-family:var(--vo-sans);font-size:12px;color:var(--vo-muted);white-space:nowrap;flex:none}.vo-tmx-m .vo-g{display:grid;place-items:center}.vo-tmx-m .vo-spin{width:10px;height:10px}.vo-tmx-m .vo-ok{color:var(--vo-ok)}.vo-tmx-m .vo-add{color:var(--vo-add)}.vo-tmx-m .vo-del{color:var(--vo-del)}.vo-tmx-o{padding:0 14px 0 34px;color:var(--vo-fg2);white-space:pre-wrap;overflow-wrap:anywhere}.vo-tmx-l.vo-ok{color:var(--vo-ok)}.vo-tmx-l.vo-bad{color:var(--vo-bad)}.vo-tmx-l.vo-mu{color:var(--vo-muted)}.vo-tmx-more{display:flex;align-items:center;gap:6px;margin-left:34px;font-family:var(--vo-sans);font-size:12px;line-height:inherit;color:var(--vo-muted);transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-tmx-more:hover{color:var(--vo-fg)}}.vo-tmx-more svg{transition:transform var(--vo-t) var(--vo-ease)}.vo-tmx-more[aria-expanded=true] svg{transform:rotate(180deg)}.vo-tmx-blk .vo-fold.vo-shut>div{visibility:hidden;transition:visibility 0s var(--vo-t)}.vo-tmx-note{margin:var(--vo-s-2) 14px;padding-left:20px;font-family:var(--vo-sans);font-size:12.5px;line-height:1.5;color:var(--vo-fg2);display:flex;gap:var(--vo-s-2)}.vo-tmx-note>svg{color:var(--vo-accent-fg,var(--vo-accent));flex:none;margin-top:3px}.vo-tmx-note .vo-shim{font-size:inherit}.vo-tmx-f{display:flex;align-items:center;gap:var(--vo-s-2);padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-tmx-f .vo-g{display:grid;place-items:center;flex:none;color:var(--vo-ok)}.vo-tmx-f.vo-stop .vo-g{color:var(--vo-muted)}.vo-tmx-f.vo-bad .vo-g{color:var(--vo-bad)}.vo-tmx-st{height:22px;padding:0 var(--vo-s-2);border-radius:var(--vo-r-tag);background:var(--vo-chip);color:var(--vo-fg2);transition:background .3s,color .3s}.vo-tmx.vo-live .vo-tmx-st{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-fg))}.vo-tmx-st.vo-ok,.vo-tmx-st.vo-ok .vo-g{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tmx-st.vo-bad,.vo-tmx-st.vo-bad .vo-g{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-tmx-h{position:relative}.vo-tmx-h:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:linear-gradient(90deg,transparent,var(--vo-accent-mark,var(--vo-accent)),transparent) 0 0/40% 100% no-repeat;opacity:0;transition:opacity .4s;pointer-events:none}.vo-tmx.vo-live .vo-tmx-h:after{opacity:1;animation:vo-tmxsweep 1.8s var(--vo-ease-io) infinite}@keyframes vo-tmxsweep{0%{background-position:-60% 0}to{background-position:160% 0}}.vo-tmx-blk{position:relative}.vo-tmx-blk:before{content:\"\";position:absolute;left:6px;top:4px;bottom:4px;width:2px;border-radius:1px;background:var(--vo-rail);transition:background .3s}.vo-tmx-blk[data-s=run]:before{background:var(--vo-accent-mark,var(--vo-accent));animation:vo-tmxpulse 1.4s var(--vo-ease-io) infinite}.vo-tmx-blk[data-s=ok]:before{background:color-mix(in srgb,var(--vo-ok) 70%,transparent)}.vo-tmx-blk[data-s=bad]:before{background:var(--vo-bad)}.vo-tmx-blk[data-s=edit]:before{background:var(--vo-merge)}@keyframes vo-tmxpulse{50%{opacity:.35}}.vo-tmx-p{color:var(--vo-accent-fg,var(--vo-fg));font-weight:500}.vo-tmx-blk[data-s=edit] .vo-tmx-p{color:var(--vo-merge)}.vo-tmx-df{margin:2px 14px var(--vo-s-1) 34px;border-radius:var(--vo-r-sm);overflow:hidden}.vo-tmx-df div{padding:0 var(--vo-s-2);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--vo-fg2)}.vo-tmx-df .vo-a{background:color-mix(in srgb,var(--vo-add) 10%,transparent)}.vo-tmx-df .vo-a:first-letter{color:var(--vo-add)}.vo-tmx-df .vo-d{background:color-mix(in srgb,var(--vo-del) 10%,transparent)}.vo-tmx-df .vo-d:first-letter{color:var(--vo-del)}.vo-tmx.vo-live .vo-tmx-body:after{content:\"\";display:block;width:7px;height:14px;margin:var(--vo-s-1) 0 0 34px;background:var(--vo-fg2);animation:vo-bpblink 1.1s steps(1,end) infinite}:root:not([data-style=soft]) .vo-tmx-h:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(90deg,var(--vo-accent-mark) 0 6px,transparent 6px 12px);animation:vo-tmxmarch .6s steps(4) infinite}@keyframes vo-tmxmarch{to{background-position:12px 0}}:root:not([data-style=soft]) .vo-tmx-blk:not(:where([data-style=soft],[data-style=soft] *)):before{width:1px}:root:not([data-style=soft]) .vo-tmx-blk[data-s=run]:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-bpblink 1.1s steps(1,end) infinite}@keyframes vo-bpblink{50%{opacity:0}}@container (max-width:420px){.vo-tmx-ic{display:none}.vo-tmx-h{padding-left:var(--vo-s-3)}.vo-tmx-cmd,.vo-tmx-o{padding:0 var(--vo-s-3)}.vo-tmx-more{margin-left:var(--vo-s-3)}.vo-tmx-note{margin-inline:var(--vo-s-3)}.vo-tmx-f{padding-inline:var(--vo-s-3)}.vo-tmx-df{margin-left:var(--vo-s-3);margin-right:var(--vo-s-3)}.vo-tmx-blk:before{left:3px}.vo-tmx.vo-live .vo-tmx-body:after{margin-left:var(--vo-s-3)}}@media (prefers-reduced-motion:reduce){.vo-tmx.vo-live .vo-tmx-h:after,.vo-tmx-blk[data-s=run]:before,.vo-tmx.vo-live .vo-tmx-body:after{animation:none}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-ib.vo-copied{color:var(--vo-ok)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}@media (prefers-reduced-motion:reduce){.vo-spin{animation:none}.vo-shim{color:var(--vo-fg);background:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
373
+ }
374
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TerminalStreamComponent, decorators: [{
375
+ type: Component,
376
+ args: [{ selector: 'vo-terminal-stream', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
377
+ <div
378
+ data-vo=""
379
+ [class]="className ? 'vo-tmx vo-panel ' + className : 'vo-tmx vo-panel'"
380
+ [class.vo-live]="running"
381
+ style="container-type: inline-size"
382
+ >
383
+ <div class="vo-tmx-h">
384
+ <span class="vo-tmx-ic"><vo-icon name="term"></vo-icon></span>
385
+ <span class="vo-tmx-cwd">{{ cwd }}</span>
386
+ <span
387
+ class="vo-tmx-st"
388
+ [class.vo-ok]="state === 'passed'"
389
+ [class.vo-bad]="state === 'failed'"
390
+ >
391
+ <span class="vo-g">
392
+ @if (running) {
393
+ <span class="vo-spin" aria-hidden="true"></span>
394
+ } @else {
395
+ <vo-icon [name]="state === 'passed' ? 'check' : 'stop'" size="xs"></vo-icon>
396
+ }
397
+ </span>
398
+ <span class="vo-tmx-sv vo-num">
399
+ @if (running) {
400
+ {{ elapsed ? L.running + ' · ' + elapsed : L.running }}
401
+ } @else {
402
+ {{ stateLabel }}
403
+ }
404
+ </span>
405
+ </span>
406
+ <span class="vo-sp"></span>
407
+ @if (running && hasStop) {
408
+ <button
409
+ type="button"
410
+ class="vo-pill vo-ghost vo-sm vo-tmx-stop"
411
+ aria-label="Stop the running command"
412
+ (click)="stop.emit()"
413
+ >
414
+ <vo-icon name="stop" size="xs"></vo-icon>{{ L.stop }}
415
+ </button>
416
+ }
417
+ <button
418
+ type="button"
419
+ class="vo-ib vo-tmx-cp"
420
+ [class.vo-copied]="copied"
421
+ aria-label="Copy the output"
422
+ (click)="copyAll()"
423
+ >
424
+ <vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon>
425
+ </button>
426
+ </div>
427
+
428
+ <div
429
+ #body
430
+ class="vo-tmx-body"
431
+ role="log"
432
+ aria-label="Terminal output"
433
+ tabindex="0"
434
+ (scroll)="onScroll()"
435
+ >
436
+ @for (e of entries; track $index; let i = $index) {
437
+ @switch (kindOf(e)) {
438
+ @case ('note') {
439
+ <div class="vo-tmx-note">
440
+ <vo-icon name="spark" size="xs"></vo-icon>
441
+ <span [class.vo-shim]="running && i === entries.length - 1">{{ asNote(e).text }}</span>
442
+ </div>
443
+ }
444
+ @case ('edit') {
445
+ <div class="vo-tmx-blk" [attr.data-s]="asEdit(e).status === 'stopped' ? 'stop' : 'edit'">
446
+ <div class="vo-tmx-cmd">
447
+ <span class="vo-tmx-p"><vo-icon name="edit" size="xs"></vo-icon></span>
448
+ <span class="vo-tmx-c">{{ L.edit }} {{ asEdit(e).file }}</span>
449
+ <span class="vo-tmx-m">
450
+ @if (asEdit(e).status === 'running') {
451
+ <span class="vo-g"><span class="vo-spin" aria-hidden="true"></span></span>
452
+ } @else if (asEdit(e).status === 'stopped') {
453
+ <span class="vo-g"><span class="vo-tag">{{ L.stopped }}</span></span>
454
+ } @else {
455
+ @if (asEdit(e).added !== undefined) {
456
+ <span class="vo-add">+{{ asEdit(e).added }}</span>
457
+ }
458
+ @if (asEdit(e).removed !== undefined) {
459
+ <span class="vo-del">−{{ asEdit(e).removed }}</span>
460
+ }
461
+ }
462
+ </span>
463
+ </div>
464
+ @if (
465
+ asEdit(e).status !== 'running' &&
466
+ asEdit(e).status !== 'stopped' &&
467
+ asEdit(e).diff &&
468
+ asEdit(e).diff!.length > 0
469
+ ) {
470
+ <div class="vo-tmx-df">
471
+ @for (d of asEdit(e).diff; track $index) {
472
+ <div [class.vo-a]="d[0] === '+'" [class.vo-d]="d[0] === '-'">{{ d }}</div>
473
+ }
474
+ </div>
475
+ }
476
+ </div>
477
+ }
478
+ @default {
479
+ <div
480
+ class="vo-tmx-blk"
481
+ [attr.data-s]="dataS(asCommand(e))"
482
+ >
483
+ <div class="vo-tmx-cmd">
484
+ <span class="vo-tmx-p">$</span>
485
+ <span class="vo-tmx-c">{{ asCommand(e).command }}</span>
486
+ <span class="vo-tmx-m">
487
+ <span class="vo-g">
488
+ @switch (asCommand(e).status) {
489
+ @case ('running') {
490
+ <span class="vo-spin" aria-hidden="true"></span>
491
+ }
492
+ @case ('ok') {
493
+ <span class="vo-ok"><vo-icon name="check" size="xs"></vo-icon></span>
494
+ }
495
+ @case ('failed') {
496
+ <span class="vo-tag vo-bad">Exit {{ asCommand(e).exitCode ?? 1 }}</span>
497
+ }
498
+ @default {
499
+ <span class="vo-tag">{{ L.stopped }}</span>
500
+ }
501
+ }
502
+ </span>
503
+ @if (asCommand(e).duration) {
504
+ <span class="vo-t vo-num">{{ asCommand(e).duration }}</span>
505
+ }
506
+ </span>
507
+ </div>
508
+ @if (folds(asCommand(e))) {
509
+ <button
510
+ type="button"
511
+ class="vo-tmx-more"
512
+ [attr.aria-expanded]="open.has(i)"
513
+ (click)="toggle(i)"
514
+ >
515
+ <vo-icon name="chev-d" size="xs"></vo-icon>
516
+ <span>{{ open.has(i) ? L.fewer : more(hidden(asCommand(e)).length) }}</span>
517
+ </button>
518
+ <div class="vo-fold" [class.vo-shut]="!open.has(i)">
519
+ <div>
520
+ <div class="vo-tmx-o">
521
+ @for (l of hidden(asCommand(e)); track $index) {
522
+ <div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
523
+ }
524
+ </div>
525
+ </div>
526
+ </div>
527
+ }
528
+ @if (shown(asCommand(e)).length > 0) {
529
+ <div class="vo-tmx-o">
530
+ @for (l of shown(asCommand(e)); track $index) {
531
+ <div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
532
+ }
533
+ </div>
534
+ }
535
+ </div>
536
+ }
537
+ }
538
+ }
539
+ </div>
540
+
541
+ <div class="vo-fold vo-tmx-ff" [class.vo-shut]="running || foot === false">
542
+ <div>
543
+ <div
544
+ class="vo-tmx-f"
545
+ [class.vo-stop]="state === 'stopped'"
546
+ [class.vo-bad]="state === 'failed'"
547
+ >
548
+ <span class="vo-g">
549
+ <vo-icon [name]="state === 'passed' ? 'ok' : state === 'failed' ? 'alert' : 'stop'"></vo-icon>
550
+ </span>
551
+ <span class="vo-tmx-fs vo-num">{{ foot || '' }}</span>
552
+ </div>
553
+ </div>
554
+ </div>
555
+ </div>
556
+ `, styles: [".vo-tmx{overflow:hidden;display:flex;flex-direction:column;height:420px}.vo-tmx-h{display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-tmx-ic{display:grid;place-items:center;color:var(--vo-fg2);flex:none}.vo-tmx-cwd{min-width:0;flex:0 1 auto;font-family:var(--vo-mono);font-size:12px;color:var(--vo-fg2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-st{display:inline-flex;align-items:center;gap:6px;min-width:0;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-tmx-st .vo-g{display:grid;place-items:center;flex:none}.vo-tmx-st .vo-spin{width:10px;height:10px}.vo-tmx-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-tmx-h .vo-sp{flex:1}.vo-tmx-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:var(--vo-s-2) 0;font-family:var(--vo-mono);font-size:12px;line-height:1.8;scrollbar-width:thin;scrollbar-color:var(--vo-rail) transparent}.vo-tmx-body::-webkit-scrollbar{width:8px}.vo-tmx-body::-webkit-scrollbar-track{background:transparent}.vo-tmx-body::-webkit-scrollbar-thumb{background:var(--vo-rail);border:2px solid transparent;background-clip:padding-box;border-radius:var(--vo-r-pill)}:root:not([data-style=soft]) .vo-tmx-body:not(:where([data-style=soft],[data-style=soft] *))::-webkit-scrollbar-thumb{border-radius:0}.vo-tmx-blk+.vo-tmx-blk{margin-top:var(--vo-s-1)}.vo-tmx-cmd{display:flex;align-items:center;gap:var(--vo-s-2);padding:0 14px}.vo-tmx-p{width:12px;flex:none;display:grid;place-items:center;color:var(--vo-muted)}.vo-tmx-c{flex:1;min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-m{display:inline-flex;align-items:center;gap:6px;font-family:var(--vo-sans);font-size:12px;color:var(--vo-muted);white-space:nowrap;flex:none}.vo-tmx-m .vo-g{display:grid;place-items:center}.vo-tmx-m .vo-spin{width:10px;height:10px}.vo-tmx-m .vo-ok{color:var(--vo-ok)}.vo-tmx-m .vo-add{color:var(--vo-add)}.vo-tmx-m .vo-del{color:var(--vo-del)}.vo-tmx-o{padding:0 14px 0 34px;color:var(--vo-fg2);white-space:pre-wrap;overflow-wrap:anywhere}.vo-tmx-l.vo-ok{color:var(--vo-ok)}.vo-tmx-l.vo-bad{color:var(--vo-bad)}.vo-tmx-l.vo-mu{color:var(--vo-muted)}.vo-tmx-more{display:flex;align-items:center;gap:6px;margin-left:34px;font-family:var(--vo-sans);font-size:12px;line-height:inherit;color:var(--vo-muted);transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-tmx-more:hover{color:var(--vo-fg)}}.vo-tmx-more svg{transition:transform var(--vo-t) var(--vo-ease)}.vo-tmx-more[aria-expanded=true] svg{transform:rotate(180deg)}.vo-tmx-blk .vo-fold.vo-shut>div{visibility:hidden;transition:visibility 0s var(--vo-t)}.vo-tmx-note{margin:var(--vo-s-2) 14px;padding-left:20px;font-family:var(--vo-sans);font-size:12.5px;line-height:1.5;color:var(--vo-fg2);display:flex;gap:var(--vo-s-2)}.vo-tmx-note>svg{color:var(--vo-accent-fg,var(--vo-accent));flex:none;margin-top:3px}.vo-tmx-note .vo-shim{font-size:inherit}.vo-tmx-f{display:flex;align-items:center;gap:var(--vo-s-2);padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-tmx-f .vo-g{display:grid;place-items:center;flex:none;color:var(--vo-ok)}.vo-tmx-f.vo-stop .vo-g{color:var(--vo-muted)}.vo-tmx-f.vo-bad .vo-g{color:var(--vo-bad)}.vo-tmx-st{height:22px;padding:0 var(--vo-s-2);border-radius:var(--vo-r-tag);background:var(--vo-chip);color:var(--vo-fg2);transition:background .3s,color .3s}.vo-tmx.vo-live .vo-tmx-st{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-fg))}.vo-tmx-st.vo-ok,.vo-tmx-st.vo-ok .vo-g{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tmx-st.vo-bad,.vo-tmx-st.vo-bad .vo-g{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-tmx-h{position:relative}.vo-tmx-h:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:linear-gradient(90deg,transparent,var(--vo-accent-mark,var(--vo-accent)),transparent) 0 0/40% 100% no-repeat;opacity:0;transition:opacity .4s;pointer-events:none}.vo-tmx.vo-live .vo-tmx-h:after{opacity:1;animation:vo-tmxsweep 1.8s var(--vo-ease-io) infinite}@keyframes vo-tmxsweep{0%{background-position:-60% 0}to{background-position:160% 0}}.vo-tmx-blk{position:relative}.vo-tmx-blk:before{content:\"\";position:absolute;left:6px;top:4px;bottom:4px;width:2px;border-radius:1px;background:var(--vo-rail);transition:background .3s}.vo-tmx-blk[data-s=run]:before{background:var(--vo-accent-mark,var(--vo-accent));animation:vo-tmxpulse 1.4s var(--vo-ease-io) infinite}.vo-tmx-blk[data-s=ok]:before{background:color-mix(in srgb,var(--vo-ok) 70%,transparent)}.vo-tmx-blk[data-s=bad]:before{background:var(--vo-bad)}.vo-tmx-blk[data-s=edit]:before{background:var(--vo-merge)}@keyframes vo-tmxpulse{50%{opacity:.35}}.vo-tmx-p{color:var(--vo-accent-fg,var(--vo-fg));font-weight:500}.vo-tmx-blk[data-s=edit] .vo-tmx-p{color:var(--vo-merge)}.vo-tmx-df{margin:2px 14px var(--vo-s-1) 34px;border-radius:var(--vo-r-sm);overflow:hidden}.vo-tmx-df div{padding:0 var(--vo-s-2);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--vo-fg2)}.vo-tmx-df .vo-a{background:color-mix(in srgb,var(--vo-add) 10%,transparent)}.vo-tmx-df .vo-a:first-letter{color:var(--vo-add)}.vo-tmx-df .vo-d{background:color-mix(in srgb,var(--vo-del) 10%,transparent)}.vo-tmx-df .vo-d:first-letter{color:var(--vo-del)}.vo-tmx.vo-live .vo-tmx-body:after{content:\"\";display:block;width:7px;height:14px;margin:var(--vo-s-1) 0 0 34px;background:var(--vo-fg2);animation:vo-bpblink 1.1s steps(1,end) infinite}:root:not([data-style=soft]) .vo-tmx-h:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(90deg,var(--vo-accent-mark) 0 6px,transparent 6px 12px);animation:vo-tmxmarch .6s steps(4) infinite}@keyframes vo-tmxmarch{to{background-position:12px 0}}:root:not([data-style=soft]) .vo-tmx-blk:not(:where([data-style=soft],[data-style=soft] *)):before{width:1px}:root:not([data-style=soft]) .vo-tmx-blk[data-s=run]:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-bpblink 1.1s steps(1,end) infinite}@keyframes vo-bpblink{50%{opacity:0}}@container (max-width:420px){.vo-tmx-ic{display:none}.vo-tmx-h{padding-left:var(--vo-s-3)}.vo-tmx-cmd,.vo-tmx-o{padding:0 var(--vo-s-3)}.vo-tmx-more{margin-left:var(--vo-s-3)}.vo-tmx-note{margin-inline:var(--vo-s-3)}.vo-tmx-f{padding-inline:var(--vo-s-3)}.vo-tmx-df{margin-left:var(--vo-s-3);margin-right:var(--vo-s-3)}.vo-tmx-blk:before{left:3px}.vo-tmx.vo-live .vo-tmx-body:after{margin-left:var(--vo-s-3)}}@media (prefers-reduced-motion:reduce){.vo-tmx.vo-live .vo-tmx-h:after,.vo-tmx-blk[data-s=run]:before,.vo-tmx.vo-live .vo-tmx-body:after{animation:none}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-ib.vo-copied{color:var(--vo-ok)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}@media (prefers-reduced-motion:reduce){.vo-spin{animation:none}.vo-shim{color:var(--vo-fg);background:none}}\n"] }]
557
+ }], propDecorators: { cwd: [{
558
+ type: Input
559
+ }], entries: [{
560
+ type: Input
561
+ }], status: [{
562
+ type: Input
563
+ }], elapsed: [{
564
+ type: Input
565
+ }], summary: [{
566
+ type: Input
567
+ }], tail: [{
568
+ type: Input
569
+ }], copied: [{
570
+ type: Input
571
+ }], labels: [{
572
+ type: Input
573
+ }], className: [{
574
+ type: Input
575
+ }], stop: [{
576
+ type: Output
577
+ }], copy: [{
578
+ type: Output
579
+ }], bodyRef: [{
580
+ type: ViewChild,
581
+ args: ['body']
582
+ }] } });
583
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYWwtc3RyZWFtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlcm1pbmFsLXN0cmVhbS90ZXJtaW5hbC1zdHJlYW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLGlGQUFpRjtBQUNqRixpRkFBaUY7QUFDakYsa0ZBQWtGO0FBQ2xGLG9GQUFvRjtBQUNwRixtRkFBbUY7QUFDbkYsZ0ZBQWdGO0FBQ2hGLHlCQUF5QjtBQUN6QixFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFFdEUsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7O0FBZ0UxRSxNQUFNLElBQUksR0FBaUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRTFGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBZSxFQUFvQixFQUFFLENBQ25ELE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBOEwzRCxNQUFNLE9BQU8sdUJBQXVCO0lBNUxwQztRQTZMRSxxRUFBcUU7UUFDNUQsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUVsQiwrQ0FBK0M7UUFDdEMsWUFBTyxHQUFvQixFQUFFLENBQUM7UUFXdkMsb0RBQW9EO1FBQzNDLFNBQUksR0FBRyxDQUFDLENBQUM7UUFFbEIsMkVBQTJFO1FBQ2xFLFdBQU0sR0FBRyxLQUFL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QUFkLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksSUFBSTtzQkFBYixNQUFNO2dCQUdHLElBQUk7c0JBQWIsTUFBTTtnQkFFb0IsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvdGVybWluYWwtc3RyZWFtL3Rlcm1pbmFsLXN0cmVhbS5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC90ZXJtaW5hbC1zdHJlYW0vVGVybWluYWxTdHJlYW0udHN4LlxuLy8gVGhlIHNoZWxsIGNvbW1hbmRzIGFuIGFnZW50IHJ1bnMsIGFzIGEgY29tcGFjdCB0ZXJtaW5hbDogdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4vLyBhbmQgaG93IHRoZSBydW4gaXMgZ29pbmcgaW4gdGhlIGhlYWRlciwgZWFjaCBjb21tYW5kIHdpdGggaXRzIG91dHB1dCBzdHJlYW1pbmdcbi8vIGluIHVuZGVyIGl0IGFuZCBhbiBleGl0IGNvZGUgb3IgYSBjaGVjayB3aXRoIGhvdyBsb25nIGl0IHRvb2ssIGFuZCBhIHN1bW1hcnkgYXRcbi8vIHRoZSBmb290IG9uY2UgaXQgaXMgb3Zlci4gTG9uZyBvdXRwdXQgZm9sZHMgdG8gaXRzIGxhc3QgbGluZXMuIFRoZSB0ZXJtaW5hbCBrZWVwc1xuLy8gb25lIGhlaWdodCAoNDIwcHgpIGFuZCBpdHMgb3V0cHV0IHNjcm9sbHMsIHN0YXlpbmcgb24gdGhlIG5ld2VzdCBsaW5lIHVubGVzcyB0aGVcbi8vIHJlYWRlciBoYXMgc2Nyb2xsZWQgdXAuIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyBSZWFjdCBjYWxsYmFja3MgYmVjb21lXG4vLyBAT3V0cHV0IEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gSWNvbiBzdWJzdGl0dXRpb25zIChkb2N1bWVudGVkIHBlciB0aGUgYnJpZWYpOiB0aGUgUmVhY3Qgc291cmNlIHVzZXMgYHRlcm1gLFxuLy8gYHN0b3BgLCBgY29weWAsIGBjaGVja2AsIGBjaGV2LWRgLCBgZWRpdGAsIGBzcGFya2AsIGBva2AgYW5kIGBhbGVydGAg4oCUIGFsbCBvZlxuLy8gd2hpY2ggZXhpc3QgaW4gdGhlIEFuZ3VsYXIgaWNvbiBzZXQsIHNvIG5vIHN1YnN0aXR1dGlvbiB3YXMgbmVlZGVkLlxuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5cbi8qKiBvayBpcyBncmVlbiwgYmFkIGlzIHJlZCwgbXV0ZWQgaXMgZ3JleS4gKi9cbmV4cG9ydCB0eXBlIFRlcm1pbmFsVG9uZSA9ICdvaycgfCAnYmFkJyB8ICdtdXRlZCc7XG5cbi8qKiBBIGxpbmUgb2Ygb3V0cHV0LCBvciBgeyB0ZXh0LCB0b25lIH1gIHRvIGNvbG91ciBpdC4gKi9cbmV4cG9ydCB0eXBlIFRlcm1pbmFsTGluZSA9IHN0cmluZyB8IHsgdGV4dDogc3RyaW5nOyB0b25lPzogVGVybWluYWxUb25lIH07XG5cbi8qKiBydW5uaW5nIHNob3dzIGEgc3Bpbm5lcjsgb2sgYSBjaGVjazsgZmFpbGVkIGl0cyBleGl0IGNvZGUgaW4gcmVkOyBzdG9wcGVkIGEgU3RvcHBlZCB0YWcuICovXG5leHBvcnQgdHlwZSBUZXJtaW5hbENvbW1hbmRTdGF0dXMgPSAncnVubmluZycgfCAnb2snIHwgJ2ZhaWxlZCcgfCAnc3RvcHBlZCc7XG5cbi8qKiBBIHNoZWxsIGNvbW1hbmQgdGhlIGFnZW50IHJhbiwgd2l0aCBpdHMgc3RyZWFtZWQgb3V0cHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXJtaW5hbENvbW1hbmQge1xuICBraW5kPzogJ2NvbW1hbmQnO1xuICAvKiogTGlrZSBcIm5wbSBydW4gYnVpbGRcIi4gKi9cbiAgY29tbWFuZDogc3RyaW5nO1xuICAvKiogV2hhdCBpdCBwcmludGVkIHNvIGZhci4gTG9uZ2VyIHRoYW4gYHRhaWxgICsgMSBsaW5lcywgYWxsIGJ1dCB0aGUgbGFzdCBgdGFpbGAgZm9sZC4gKi9cbiAgb3V0cHV0PzogVGVybWluYWxMaW5lW107XG4gIHN0YXR1czogVGVybWluYWxDb21tYW5kU3RhdHVzO1xuICAvKiogU2hvd24gd2hlbiBpdCBmYWlsZWQsIGFzIFwiRXhpdCAxXCIuICovXG4gIGV4aXRDb2RlPzogbnVtYmVyO1xuICAvKiogSG93IGxvbmcgaXQgaGFzIHRha2VuLCBsaWtlIFwiNi4xIHNcIi4gKi9cbiAgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGxpbmUgZnJvbSB0aGUgYWdlbnQgYmV0d2VlbiBjb21tYW5kcywgbGlrZSB3aGF0IHdlbnQgd3JvbmcgYW5kIHdoYXQgaXQgd2lsbCBkbyBhYm91dCBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVybWluYWxOb3RlIHtcbiAga2luZDogJ25vdGUnO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiBBIGZpbGUgdGhlIGFnZW50IGVkaXRzIGJldHdlZW4gY29tbWFuZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlcm1pbmFsRWRpdCB7XG4gIGtpbmQ6ICdlZGl0JztcbiAgZmlsZTogc3RyaW5nO1xuICAvKiogTGluZXMgYWRkZWQgYW5kIHJlbW92ZWQsIHNob3duIG9uY2UgaXQgaXMgZG9uZS4gKi9cbiAgYWRkZWQ/OiBudW1iZXI7XG4gIHJlbW92ZWQ/OiBudW1iZXI7XG4gIC8qKiBUaGUgY2hhbmdlZCBsaW5lcywgZWFjaCBzdGFydGluZyB3aXRoIFwiLVwiIChyZW1vdmVkLCByZWQpIG9yIFwiK1wiIChhZGRlZCwgZ3JlZW4pLiAqL1xuICBkaWZmPzogc3RyaW5nW107XG4gIHN0YXR1cz86ICdydW5uaW5nJyB8ICdkb25lJyB8ICdzdG9wcGVkJztcbn1cblxuZXhwb3J0IHR5cGUgVGVybWluYWxFbnRyeSA9IFRlcm1pbmFsQ29tbWFuZCB8IFRlcm1pbmFsTm90ZSB8IFRlcm1pbmFsRWRpdDtcbmV4cG9ydCB0eXBlIFRlcm1pbmFsU3RhdHVzID0gJ3J1bm5pbmcnIHwgJ3Bhc3NlZCcgfCAnZmFpbGVkJyB8ICdzdG9wcGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXJtaW5hbExhYmVscyB7XG4gIHJ1bm5pbmc/OiBzdHJpbmc7XG4gIHBhc3NlZD86IHN0cmluZztcbiAgZmFpbGVkPzogc3RyaW5nO1xuICBzdG9wcGVkPzogc3RyaW5nO1xuICBzdG9wPzogc3RyaW5nO1xuICBjb3B5Pzogc3RyaW5nO1xuICBjb3BpZWQ/OiBzdHJpbmc7XG4gIG1vcmU/OiAobjogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIGZld2VyPzogc3RyaW5nO1xuICBlZGl0Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGVybWluYWxMaW5lVmlldyB7XG4gIHRleHQ6IHN0cmluZztcbiAgdG9uZT86IFRlcm1pbmFsVG9uZTtcbn1cblxuY29uc3QgVE9ORTogUmVjb3JkPFRlcm1pbmFsVG9uZSwgc3RyaW5nPiA9IHsgb2s6ICd2by1vaycsIGJhZDogJ3ZvLWJhZCcsIG11dGVkOiAndm8tbXUnIH07XG5cbmNvbnN0IGxpbmVPZiA9IChsOiBUZXJtaW5hbExpbmUpOiBUZXJtaW5hbExpbmVWaWV3ID0+XG4gIHR5cGVvZiBsID09PSAnc3RyaW5nJyA/IHsgdGV4dDogbCwgdG9uZTogdW5kZWZpbmVkIH0gOiBsO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by10ZXJtaW5hbC1zdHJlYW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBkYXRhLXZvPVwiXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc05hbWUgPyAndm8tdG14IHZvLXBhbmVsICcgKyBjbGFzc05hbWUgOiAndm8tdG14IHZvLXBhbmVsJ1wiXG4gICAgICBbY2xhc3Mudm8tbGl2ZV09XCJydW5uaW5nXCJcbiAgICAgIHN0eWxlPVwiY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LWhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bXgtaWNcIj48dm8taWNvbiBuYW1lPVwidGVybVwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LWN3ZFwiPnt7IGN3ZCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInZvLXRteC1zdFwiXG4gICAgICAgICAgW2NsYXNzLnZvLW9rXT1cInN0YXRlID09PSAncGFzc2VkJ1wiXG4gICAgICAgICAgW2NsYXNzLnZvLWJhZF09XCJzdGF0ZSA9PT0gJ2ZhaWxlZCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1nXCI+XG4gICAgICAgICAgICBAaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cInN0YXRlID09PSAncGFzc2VkJyA/ICdjaGVjaycgOiAnc3RvcCdcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LXN2IHZvLW51bVwiPlxuICAgICAgICAgICAgQGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgIHt7IGVsYXBzZWQgPyBMLnJ1bm5pbmcgKyAnIMK3ICcgKyBlbGFwc2VkIDogTC5ydW5uaW5nIH19XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAge3sgc3RhdGVMYWJlbCB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwXCI+PC9zcGFuPlxuICAgICAgICBAaWYgKHJ1bm5pbmcgJiYgaGFzU3RvcCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ2by1waWxsIHZvLWdob3N0IHZvLXNtIHZvLXRteC1zdG9wXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdG9wIHRoZSBydW5uaW5nIGNvbW1hbmRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInN0b3AuZW1pdCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3RvcFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj57eyBMLnN0b3AgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ2by1pYiB2by10bXgtY3BcIlxuICAgICAgICAgIFtjbGFzcy52by1jb3BpZWRdPVwiY29waWVkXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29weSB0aGUgb3V0cHV0XCJcbiAgICAgICAgICAoY2xpY2spPVwiY29weUFsbCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cImNvcGllZCA/ICdjaGVjaycgOiAnY29weSdcIj48L3ZvLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlcbiAgICAgICAgY2xhc3M9XCJ2by10bXgtYm9keVwiXG4gICAgICAgIHJvbGU9XCJsb2dcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiVGVybWluYWwgb3V0cHV0XCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgKHNjcm9sbCk9XCJvblNjcm9sbCgpXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAoZSBvZiBlbnRyaWVzOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgQHN3aXRjaCAoa2luZE9mKGUpKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ25vdGUnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtbm90ZVwiPlxuICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJzcGFya1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3Mudm8tc2hpbV09XCJydW5uaW5nICYmIGkgPT09IGVudHJpZXMubGVuZ3RoIC0gMVwiPnt7IGFzTm90ZShlKS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZWRpdCcpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1ibGtcIiBbYXR0ci5kYXRhLXNdPVwiYXNFZGl0KGUpLnN0YXR1cyA9PT0gJ3N0b3BwZWQnID8gJ3N0b3AnIDogJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1jbWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LXBcIj48dm8taWNvbiBuYW1lPVwiZWRpdFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1jXCI+e3sgTC5lZGl0IH19IHt7IGFzRWRpdChlKS5maWxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bXgtbVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGFzRWRpdChlKS5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPjxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGFzRWRpdChlKS5zdGF0dXMgPT09ICdzdG9wcGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPjxzcGFuIGNsYXNzPVwidm8tdGFnXCI+e3sgTC5zdG9wcGVkIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChhc0VkaXQoZSkuYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZGRcIj4re3sgYXNFZGl0KGUpLmFkZGVkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFzRWRpdChlKS5yZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZGVsXCI+4oiSe3sgYXNFZGl0KGUpLnJlbW92ZWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgIGFzRWRpdChlKS5zdGF0dXMgIT09ICdydW5uaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgYXNFZGl0KGUpLnN0YXR1cyAhPT0gJ3N0b3BwZWQnICYmXG4gICAgICAgICAgICAgICAgICBhc0VkaXQoZSkuZGlmZiAmJlxuICAgICAgICAgICAgICAgICAgYXNFZGl0KGUpLmRpZmYhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtZGZcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZCBvZiBhc0VkaXQoZSkuZGlmZjsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3Mudm8tYV09XCJkWzBdID09PSAnKydcIiBbY2xhc3Mudm8tZF09XCJkWzBdID09PSAnLSdcIj57eyBkIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXRteC1ibGtcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtc109XCJkYXRhUyhhc0NvbW1hbmQoZSkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtY21kXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1wXCI+JDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LWNcIj57eyBhc0NvbW1hbmQoZSkuY29tbWFuZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoYXNDb21tYW5kKGUpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ29rJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW9rXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZyB2by1iYWRcIj5FeGl0IHt7IGFzQ29tbWFuZChlKS5leGl0Q29kZSA/PyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZ1wiPnt7IEwuc3RvcHBlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChhc0NvbW1hbmQoZSkuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXQgdm8tbnVtXCI+e3sgYXNDb21tYW5kKGUpLmR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChmb2xkcyhhc0NvbW1hbmQoZSkpKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXRteC1tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoaSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1kXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcGVuLmhhcyhpKSA/IEwuZmV3ZXIgOiBtb3JlKGhpZGRlbihhc0NvbW1hbmQoZSkpLmxlbmd0aCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1mb2xkXCIgW2NsYXNzLnZvLXNodXRdPVwiIW9wZW4uaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChsIG9mIGhpZGRlbihhc0NvbW1hbmQoZSkpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1sXCIgW2NsYXNzXT1cInRvbmVDbGFzcyhsKVwiPnt7IGxpbmVUZXh0KGwpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd24oYXNDb21tYW5kKGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LW9cIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAobCBvZiBzaG93bihhc0NvbW1hbmQoZSkpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LWxcIiBbY2xhc3NdPVwidG9uZUNsYXNzKGwpXCI+e3sgbGluZVRleHQobCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by10bXgtZmZcIiBbY2xhc3Mudm8tc2h1dF09XCJydW5uaW5nIHx8IGZvb3QgPT09IGZhbHNlXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2by10bXgtZlwiXG4gICAgICAgICAgICBbY2xhc3Mudm8tc3RvcF09XCJzdGF0ZSA9PT0gJ3N0b3BwZWQnXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1iYWRdPVwic3RhdGUgPT09ICdmYWlsZWQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWdcIj5cbiAgICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwic3RhdGUgPT09ICdwYXNzZWQnID8gJ29rJyA6IHN0YXRlID09PSAnZmFpbGVkJyA/ICdhbGVydCcgOiAnc3RvcCdcIj48L3ZvLWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1mcyB2by1udW1cIj57eyBmb290IHx8ICcnIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vdGVybWluYWwtc3RyZWFtLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsU3RyZWFtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSwgc2hvd24gaW4gdGhlIGhlYWRlciwgbGlrZSBcIn4vYWNtZS93ZWJcIi4gKi9cbiAgQElucHV0KCkgY3dkID0gJyc7XG5cbiAgLyoqIENvbW1hbmRzLCBub3RlcyBhbmQgZWRpdHMsIG9sZGVzdCBmaXJzdC4gKi9cbiAgQElucHV0KCkgZW50cmllczogVGVybWluYWxFbnRyeVtdID0gW107XG5cbiAgLyoqIFRoZSBydW4gYXMgYSB3aG9sZS4gTGVmdCBvdXQsIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgZW50cmllcy4gKi9cbiAgQElucHV0KCkgc3RhdHVzPzogVGVybWluYWxTdGF0dXM7XG5cbiAgLyoqIEhvdyBsb25nIHRoZSBydW4gaGFzIHRha2VuLCBsaWtlIFwiMDoxOFwiLiBTaG93biBiZXNpZGUgUnVubmluZyBhbmQgaW4gdGhlIHN1bW1hcnkuICovXG4gIEBJbnB1dCgpIGVsYXBzZWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBsaW5lIGF0IHRoZSBmb290IG9uY2UgdGhlIHJ1biBpcyBvdmVyOyBmYWxzZSBoaWRlcyBpdC4gKi9cbiAgQElucHV0KCkgc3VtbWFyeT86IHN0cmluZyB8IGZhbHNlO1xuXG4gIC8qKiBIb3cgbWFueSBsaW5lcyBhIGZvbGRlZCBvdXRwdXQga2VlcHMgc2hvd2luZy4gKi9cbiAgQElucHV0KCkgdGFpbCA9IDQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBjb3BpZWQgKHNob3dzIHRoZSBDb3BpZWQgdG9vbHRpcC9jaGVjaykuICovXG4gIEBJbnB1dCgpIGNvcGllZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVycmlkZXMgZm9yIHRoZSBsYWJlbHMuICovXG4gIEBJbnB1dCgpIGxhYmVsczogVGVybWluYWxMYWJlbHMgPSB7fTtcblxuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEVtaXR0ZWQgYnkgdGhlIFN0b3AgYnV0dG9uIHdoaWxlIHRoZSBydW4gaXMgZ29pbmcuICovXG4gIEBPdXRwdXQoKSBzdG9wID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIHdob2xlIHJ1biBhcyB0ZXh0IHdoZW4gaXQgaXMgY29waWVkLiAqL1xuICBAT3V0cHV0KCkgY29weSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2JvZHknKSBwcml2YXRlIGJvZHlSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogV2hpY2ggZm9sZGVkIGNvbW1hbmRzIChieSBlbnRyeSBpbmRleCkgYXJlIG9wZW4uICovXG4gIHJlYWRvbmx5IG9wZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBwcml2YXRlIHBpbm5lZCA9IHRydWU7XG4gIHByaXZhdGUgbW8/OiBNdXRhdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIHJvPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgZ2V0IEwoKTogUmVxdWlyZWQ8VGVybWluYWxMYWJlbHM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcnVubmluZzogJ1J1bm5pbmcnLFxuICAgICAgcGFzc2VkOiAnUGFzc2VkJyxcbiAgICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG4gICAgICBzdG9wcGVkOiAnU3RvcHBlZCcsXG4gICAgICBzdG9wOiAnU3RvcCcsXG4gICAgICBjb3B5OiAnQ29weScsXG4gICAgICBjb3BpZWQ6ICdDb3BpZWQgdG8gY2xpcGJvYXJkJyxcbiAgICAgIG1vcmU6IChuOiBudW1iZXIpID0+IGBTaG93ICR7bn0gbW9yZSBsaW5lJHtuID09PSAxID8gJycgOiAncyd9YCxcbiAgICAgIGZld2VyOiAnU2hvdyBmZXdlciBsaW5lcycsXG4gICAgICBlZGl0OiAnRWRpdCcsXG4gICAgICAuLi50aGlzLmxhYmVscyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGhhc1N0b3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcC5vYnNlcnZlZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmRzKCk6IFRlcm1pbmFsQ29tbWFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcihcbiAgICAgIChlKTogZSBpcyBUZXJtaW5hbENvbW1hbmQgPT4gdGhpcy5raW5kT2YoZSkgPT09ICdjb21tYW5kJ1xuICAgICk7XG4gIH1cblxuICBnZXQgc3RhdGUoKTogVGVybWluYWxTdGF0dXMge1xuICAgIGlmICh0aGlzLnN0YXR1cykgcmV0dXJuIHRoaXMuc3RhdHVzO1xuICAgIGNvbnN0IGJ1c3kgPSB0aGlzLmVudHJpZXMuc29tZShcbiAgICAgIChlKSA9PiB0aGlzLmtpbmRPZihlKSAhPT0gJ25vdGUnICYmIChlIGFzIFRlcm1pbmFsQ29tbWFuZCB8IFRlcm1pbmFsRWRpdCkuc3RhdHVzID09PSAncnVubmluZydcbiAgICApO1xuICAgIGlmIChidXN5KSByZXR1cm4gJ3J1bm5pbmcnO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGxhc3Q/LnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICAgID8gJ2ZhaWxlZCdcbiAgICAgIDogbGFzdD8uc3RhdHVzID09PSAnc3RvcHBlZCdcbiAgICAgICAgPyAnc3RvcHBlZCdcbiAgICAgICAgOiAncGFzc2VkJztcbiAgfVxuXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAncnVubmluZyc7XG4gIH1cblxuICBnZXQgc3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLkxbdGhpcy5zdGF0ZV07XG4gIH1cblxuICBnZXQgZm9vdCgpOiBzdHJpbmcgfCBmYWxzZSB7XG4gICAgaWYgKHRoaXMuc3VtbWFyeSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zdW1tYXJ5O1xuICAgIGNvbnN0IG4gPSBuZXcgU2V0KHRoaXMuY29tbWFuZHMubWFwKChjKSA9PiBjLmNvbW1hbmQpKS5zaXplO1xuICAgIHJldHVybiBbYCR7bn0gY29tbWFuZCR7biA9PT0gMSA/ICcnIDogJ3MnfWAsIHRoaXMuZWxhcHNlZCwgdGhpcy5zdGF0ZV1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcgwrcgJyk7XG4gIH1cblxuICBraW5kT2YoZTogVGVybWluYWxFbnRyeSk6ICdub3RlJyB8ICdlZGl0JyB8ICdjb21tYW5kJyB7XG4gICAgaWYgKGUua2luZCA9PT0gJ25vdGUnKSByZXR1cm4gJ25vdGUnO1xuICAgIGlmIChlLmtpbmQgPT09ICdlZGl0JykgcmV0dXJuICdlZGl0JztcbiAgICByZXR1cm4gJ2NvbW1hbmQnO1xuICB9XG5cbiAgYXNOb3RlKGU6IFRlcm1pbmFsRW50cnkpOiBUZXJtaW5hbE5vdGUge1xuICAgIHJldHVybiBlIGFzIFRlcm1pbmFsTm90ZTtcbiAgfVxuXG4gIGFzRWRpdChlOiBUZXJtaW5hbEVudHJ5KTogVGVybWluYWxFZGl0IHtcbiAgICByZXR1cm4gZSBhcyBUZXJtaW5hbEVkaXQ7XG4gIH1cblxuICBhc0NvbW1hbmQoZTogVGVybWluYWxFbnRyeSk6IFRlcm1pbmFsQ29tbWFuZCB7XG4gICAgcmV0dXJuIGUgYXMgVGVybWluYWxDb21tYW5kO1xuICB9XG5cbiAgZGF0YVMoZTogVGVybWluYWxDb21tYW5kKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZS5zdGF0dXMgPT09ICdydW5uaW5nJ1xuICAgICAgPyAncnVuJ1xuICAgICAgOiBlLnN0YXR1cyA9PT0gJ29rJ1xuICAgICAgICA/ICdvaydcbiAgICAgICAgOiBlLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICAgICAgICA/ICdiYWQnXG4gICAgICAgICAgOiAnc3RvcCc7XG4gIH1cblxuICBwcml2YXRlIG91dChlOiBUZXJtaW5hbENvbW1hbmQpOiBUZXJtaW5hbExpbmVbXSB7XG4gICAgcmV0dXJuIGUub3V0cHV0ID8/IFtdO1xuICB9XG5cbiAgZm9sZHMoZTogVGVybWluYWxDb21tYW5kKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3V0KGUpLmxlbmd0aCA+IHRoaXMudGFpbCArIDE7XG4gIH1cblxuICBoaWRkZW4oZTogVGVybWluYWxDb21tYW5kKTogVGVybWluYWxMaW5lW10ge1xuICAgIGNvbnN0IG8gPSB0aGlzLm91dChlKTtcbiAgICByZXR1cm4gdGhpcy5mb2xkcyhlKSA/IG8uc2xpY2UoMCwgby5sZW5ndGggLSB0aGlzLnRhaWwpIDogW107XG4gIH1cblxuICBzaG93bihlOiBUZXJtaW5hbENvbW1hbmQpOiBUZXJtaW5hbExpbmVbXSB7XG4gICAgY29uc3QgbyA9IHRoaXMub3V0KGUpO1xuICAgIHJldHVybiB0aGlzLmZvbGRzKGUpID8gby5zbGljZShvLmxlbmd0aCAtIHRoaXMudGFpbCkgOiBvO1xuICB9XG5cbiAgbGluZVRleHQobDogVGVybWluYWxMaW5lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluZU9mKGwpLnRleHQ7XG4gIH1cblxuICB0b25lQ2xhc3MobDogVGVybWluYWxMaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b25lID0gbGluZU9mKGwpLnRvbmU7XG4gICAgcmV0dXJuIHRvbmUgPyBUT05FW3RvbmVdIDogJyc7XG4gIH1cblxuICBtb3JlKG46IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuTC5tb3JlKG4pO1xuICB9XG5cbiAgdG9nZ2xlKGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4uaGFzKGkpKSB0aGlzLm9wZW4uZGVsZXRlKGkpO1xuICAgIGVsc2UgdGhpcy5vcGVuLmFkZChpKTtcbiAgfVxuXG4gIHByaXZhdGUgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXNcbiAgICAgIC5mbGF0TWFwKChlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmtpbmRPZihlKSA9PT0gJ25vdGUnKSByZXR1cm4gWycjICcgKyB0aGlzLmFzTm90ZShlKS50ZXh0XTtcbiAgICAgICAgaWYgKHRoaXMua2luZE9mKGUpID09PSAnZWRpdCcpIHtcbiAgICAgICAgICBjb25zdCBlZCA9IHRoaXMuYXNFZGl0KGUpO1xuICAgICAgICAgIGNvbnN0IGNvdW50cyA9XG4gICAgICAgICAgICBlZC5hZGRlZCAhPT0gdW5kZWZpbmVkIHx8IGVkLnJlbW92ZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IGAgKCske2VkLmFkZGVkID8/IDB9IOKIkiR7ZWQucmVtb3ZlZCA/PyAwfSlgXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IGVkLnN0YXR1cyA9PT0gJ2RvbmUnIHx8IGVkLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gZWQuZGlmZiA/PyBbXSA6IFtdO1xuICAgICAgICAgIHJldHVybiBbYCMgJHt0aGlzLkwuZWRpdH0gJHtlZC5maWxlfSR7Y291bnRzfWAsIC4uLmRpZmZdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNtZCA9IHRoaXMuYXNDb21tYW5kKGUpO1xuICAgICAgICByZXR1cm4gWyckICcgKyBjbWQuY29tbWFuZCwgLi4uKGNtZC5vdXRwdXQgPz8gW10pLm1hcCgobCkgPT4gbGluZU9mKGwpLnRleHQpXTtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gIH1cblxuICBjb3B5QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY29weS5lbWl0KHRoaXMudGV4dCgpKTtcbiAgfVxuXG4gIG9uU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICB0aGlzLnBpbm5lZCA9IGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAyNDtcbiAgfVxuXG4gIC8vIG5ldyBvdXRwdXQga2VlcHMgdGhlIGxvZyBvbiBpdHMgbmV3ZXN0IGxpbmUsIHVubGVzcyB0aGUgcmVhZGVyIGhhcyBzY3JvbGxlZCB1cFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmJvZHlSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0aWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGlubmVkKSBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gICAgfTtcbiAgICB0aGlzLm1vID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc3RpY2spO1xuICAgIHRoaXMubW8ub2JzZXJ2ZShlbCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5ybyA9IG5ldyBSZXNpemVPYnNlcnZlcihzdGljayk7XG4gICAgICB0aGlzLnJvLm9ic2VydmUoZWwpO1xuICAgIH1cbiAgICBzdGljaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tbz8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMucm8/LmRpc2Nvbm5lY3QoKTtcbiAgfVxufVxuIl19