@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,600 @@
1
+ // framework/angular/agent-lanes/agent-lanes.component.ts
2
+ //
3
+ // Native Angular port of framework/react/agent-lanes/AgentLanes.tsx.
4
+ // Several agents working side by side, each in its own lane and hue, handing work
5
+ // to one another down a relay line. A working lane breathes, shimmers and fills
6
+ // its next step; a hand-off opens a line between two lanes and runs a light down
7
+ // the relay line from the sender's badge to the taker's, and the stretch it
8
+ // crossed stays lit. Inputs mirror the React props; callback props become
9
+ // @Output() EventEmitters.
10
+ //
11
+ // The relay-line strokes are positioned from badge to badge with a ResizeObserver
12
+ // (ported from the React useLayoutEffect / the vanilla place()). Reduced motion is
13
+ // respected via the shared ReducedMotionService.
14
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
15
+ import { VoIconComponent } from '../core/icon.component';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "../core/reduced-motion.service";
18
+ const TONE = {
19
+ blue: 'pb',
20
+ purple: 'pl',
21
+ green: 'pm',
22
+ orange: 'pp',
23
+ red: 'pr',
24
+ yellow: 'py',
25
+ pink: 'pk',
26
+ teal: 'pt',
27
+ };
28
+ const hueOf = (l) => TONE[l?.tone ?? 'blue'];
29
+ const clamp01 = (n) => Math.max(0, Math.min(1, n));
30
+ const clock = (s) => `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
31
+ /** Several agents working in parallel, each in its own lane and hue, with hand-offs down a relay line. */
32
+ export class AgentLanesComponent {
33
+ /** Whether every agent is paused. Working lanes then show Paused and the clock stops. */
34
+ set paused(value) {
35
+ this.pausedControlled = value !== undefined;
36
+ if (value !== undefined)
37
+ this.innerPaused = value;
38
+ }
39
+ /** Keys of the lanes that are open. Leave it out to let each row toggle itself. */
40
+ set expanded(value) {
41
+ this.expandedControlled = value !== undefined;
42
+ if (value !== undefined)
43
+ this.innerExpanded = value;
44
+ }
45
+ constructor(reduced) {
46
+ this.reduced = reduced;
47
+ this.lanes = [];
48
+ this.defaultPaused = false;
49
+ /** Adds the Pause all / Resume button, until every lane is done (React: onPausedChange wired). */
50
+ this.pauseWired = false;
51
+ this.defaultExpanded = [];
52
+ /** Sits flat in a chat thread (the default). Set false to give it a card of its own. */
53
+ this.bare = true;
54
+ this.pausedChange = new EventEmitter();
55
+ this.expandedChange = new EventEmitter();
56
+ this.pausedControlled = false;
57
+ this.expandedControlled = false;
58
+ this.innerPaused = false;
59
+ this.innerExpanded = [];
60
+ this.counted = 0;
61
+ this.handOpen = false;
62
+ // the hand-offs whose light has arrived: their stretch of relay line stays lit
63
+ this.relayed = [];
64
+ this.lastHandKey = '';
65
+ }
66
+ // ----- controllable state -----
67
+ get isPaused() {
68
+ return this.innerPaused;
69
+ }
70
+ get expandedKeys() {
71
+ return this.innerExpanded;
72
+ }
73
+ togglePaused() {
74
+ const next = !this.isPaused;
75
+ if (!this.pausedControlled)
76
+ this.innerPaused = next;
77
+ this.pausedChange.emit(next);
78
+ }
79
+ toggleLane(key) {
80
+ const open = this.expandedKeys.includes(key);
81
+ const next = open ? this.expandedKeys.filter((k) => k !== key) : [...this.expandedKeys, key];
82
+ if (!this.expandedControlled)
83
+ this.innerExpanded = next;
84
+ this.expandedChange.emit(next);
85
+ }
86
+ // ----- derived view state -----
87
+ get finished() {
88
+ return this.lanes.length > 0 && this.lanes.every((l) => l.status === 'done');
89
+ }
90
+ get head() {
91
+ if (this.title !== undefined)
92
+ return this.title;
93
+ if (this.finished)
94
+ return `All ${this.lanes.length} agents finished`;
95
+ if (this.isPaused)
96
+ return 'All agents paused';
97
+ return `${this.lanes.length} agents working`;
98
+ }
99
+ get clockText() {
100
+ return clock(this.seconds ?? this.counted);
101
+ }
102
+ get total() {
103
+ return this.lanes.reduce((n, l) => n + (l.steps ?? 3), 0);
104
+ }
105
+ get stepsDone() {
106
+ return this.lanes.reduce((n, l) => n + Math.min(l.done ?? 0, l.steps ?? 3), 0);
107
+ }
108
+ get views() {
109
+ return this.lanes.map((lane) => {
110
+ const status = this.isPaused && lane.status === 'working' ? 'paused' : lane.status;
111
+ const steps = lane.steps ?? 3;
112
+ const done = lane.done ?? 0;
113
+ const live = status === 'working' || status === 'paused';
114
+ const bars = Array.from({ length: steps }, (_, i) => {
115
+ const run = i === done && live;
116
+ return {
117
+ on: i < done,
118
+ run,
119
+ ind: run && lane.progress === undefined,
120
+ progress: run && lane.progress !== undefined ? clamp01(lane.progress) : undefined,
121
+ };
122
+ });
123
+ return {
124
+ lane,
125
+ status,
126
+ tone: hueOf(lane),
127
+ live,
128
+ sent: this.relayed.some((k) => k.startsWith(lane.key + '>')),
129
+ got: this.relayed.some((k) => k.endsWith('>' + lane.key)),
130
+ ping: this.pinged === lane.key,
131
+ open: this.expandedKeys.includes(lane.key),
132
+ bars,
133
+ };
134
+ });
135
+ }
136
+ nameOf(key) {
137
+ return this.lanes.find((l) => l.key === key)?.name ?? key;
138
+ }
139
+ toneOf(key) {
140
+ return hueOf(this.lanes.find((l) => l.key === key));
141
+ }
142
+ /** The hand-off line to render before the lane it is handed to, or undefined. */
143
+ handFor(laneKey) {
144
+ const h = this.kept;
145
+ if (!h || h.to !== laneKey)
146
+ return undefined;
147
+ const key = `${h.from}>${h.to}`;
148
+ return {
149
+ key,
150
+ from: h.from,
151
+ to: h.to,
152
+ what: h.what,
153
+ fromName: this.nameOf(h.from),
154
+ toName: this.nameOf(h.to),
155
+ fromTone: this.toneOf(h.from),
156
+ toTone: this.toneOf(h.to),
157
+ open: this.handOpen,
158
+ leaving: this.handoff === undefined,
159
+ lit: this.relayed.includes(key),
160
+ };
161
+ }
162
+ get strokes() {
163
+ const keys = this.drawing && !this.relayed.includes(this.drawing)
164
+ ? [...this.relayed, this.drawing]
165
+ : this.relayed;
166
+ return keys.map((key) => {
167
+ const [from, to] = key.split('>');
168
+ return { key, from, to, fromTone: this.toneOf(from), toTone: this.toneOf(to) };
169
+ });
170
+ }
171
+ // ----- lifecycle -----
172
+ ngAfterViewInit() {
173
+ if (!this.pausedControlled)
174
+ this.innerPaused = this.defaultPaused;
175
+ if (!this.expandedControlled && this.innerExpanded.length === 0) {
176
+ this.innerExpanded = [...this.defaultExpanded];
177
+ }
178
+ this.startCounter();
179
+ const box = this.rowsRef?.nativeElement;
180
+ if (box && typeof ResizeObserver === 'function') {
181
+ this.ro = new ResizeObserver(() => this.placeStrokes());
182
+ this.ro.observe(box);
183
+ }
184
+ this.placeStrokes();
185
+ }
186
+ ngOnChanges(changes) {
187
+ if (changes['seconds'] || changes['paused'] || changes['lanes'])
188
+ this.startCounter();
189
+ if (changes['handoff'])
190
+ this.onHandoffChange();
191
+ if (changes['lanes'])
192
+ queueMicrotask(() => this.placeStrokes());
193
+ }
194
+ onHandoffChange() {
195
+ const h = this.handoff;
196
+ if (h) {
197
+ // bring the line in: mount shut, then open on the next frame so the lanes below glide down
198
+ this.kept = h;
199
+ if (this.keptTimer) {
200
+ clearTimeout(this.keptTimer);
201
+ this.keptTimer = undefined;
202
+ }
203
+ this.handOpen = false;
204
+ this.scheduleOpen();
205
+ const key = `${h.from}>${h.to}`;
206
+ this.lastHandKey = key;
207
+ if (!this.relayed.includes(key)) {
208
+ if (this.drawTimer)
209
+ clearTimeout(this.drawTimer);
210
+ this.drawTimer = setTimeout(() => this.startDraw(key), this.reduced.reduce() ? 0 : 500);
211
+ }
212
+ }
213
+ else {
214
+ // keep the last one on screen while it plays its exit
215
+ this.handOpen = false;
216
+ if (this.kept && !this.keptTimer) {
217
+ this.keptTimer = setTimeout(() => {
218
+ this.kept = undefined;
219
+ this.keptTimer = undefined;
220
+ }, this.reduced.reduce() ? 0 : 700);
221
+ }
222
+ }
223
+ }
224
+ scheduleOpen() {
225
+ if (this.handRaf)
226
+ cancelAnimationFrame(this.handRaf);
227
+ if (this.openFrame)
228
+ cancelAnimationFrame(this.openFrame);
229
+ const raf = typeof requestAnimationFrame === 'function'
230
+ ? requestAnimationFrame
231
+ : (cb) => setTimeout(() => cb(0), 16);
232
+ this.handRaf = raf(() => {
233
+ this.openFrame = raf(() => {
234
+ this.handOpen = true;
235
+ this.placeStrokes();
236
+ });
237
+ });
238
+ }
239
+ startDraw(key) {
240
+ if (this.relayed.includes(key))
241
+ return;
242
+ this.drawing = key;
243
+ this.placeStrokes();
244
+ const to = key.split('>')[1];
245
+ const arrive = () => {
246
+ if (!this.relayed.includes(key))
247
+ this.relayed = [...this.relayed, key];
248
+ if (this.drawing === key)
249
+ this.drawing = undefined;
250
+ this.pinged = to;
251
+ if (this.pingTimer)
252
+ clearTimeout(this.pingTimer);
253
+ this.pingTimer = setTimeout(() => {
254
+ if (this.pinged === to)
255
+ this.pinged = undefined;
256
+ }, 950);
257
+ this.placeStrokes();
258
+ };
259
+ // the stroke draws itself from the sender's badge down to the taker's
260
+ const pk = this.rowsRef?.nativeElement.querySelector(`:scope>.vo-aln-pk[data-k="${CSS.escape(key)}"]`);
261
+ if (!pk || this.reduced.reduce()) {
262
+ arrive();
263
+ return;
264
+ }
265
+ const an = pk.animate([{ transform: 'scaleY(0)' }, { transform: 'scaleY(1)' }], {
266
+ duration: 800,
267
+ easing: 'cubic-bezier(.65,0,.35,1)',
268
+ });
269
+ an.finished.then(arrive, () => { });
270
+ }
271
+ /** Lay each lit stroke from the sender's badge down to the taker's, in the gap between them. */
272
+ placeStrokes() {
273
+ const box = this.rowsRef?.nativeElement;
274
+ if (!box)
275
+ return;
276
+ const rr = box.getBoundingClientRect();
277
+ box.querySelectorAll(':scope>.vo-aln-pk').forEach((pk) => {
278
+ const [f, g] = (pk.dataset['k'] ?? '').split('>');
279
+ const a = box.querySelector(`[data-lane="${CSS.escape(f)}"] .vo-aln-av`);
280
+ const b = box.querySelector(`[data-lane="${CSS.escape(g)}"] .vo-aln-av`);
281
+ if (!a || !b)
282
+ return;
283
+ const y0 = a.getBoundingClientRect().bottom - rr.top + 4;
284
+ const y1 = b.getBoundingClientRect().top - rr.top - 4;
285
+ pk.style.top = y0 + 'px';
286
+ pk.style.height = Math.max(0, y1 - y0) + 'px';
287
+ });
288
+ }
289
+ startCounter() {
290
+ const shouldCount = this.seconds === undefined && !this.isPaused && !this.finished && !this.reduced.reduce();
291
+ if (shouldCount && !this.tick) {
292
+ this.tick = setInterval(() => (this.counted += 1), 1000);
293
+ }
294
+ else if (!shouldCount && this.tick) {
295
+ clearInterval(this.tick);
296
+ this.tick = undefined;
297
+ }
298
+ }
299
+ ngOnDestroy() {
300
+ if (this.tick)
301
+ clearInterval(this.tick);
302
+ if (this.keptTimer)
303
+ clearTimeout(this.keptTimer);
304
+ if (this.drawTimer)
305
+ clearTimeout(this.drawTimer);
306
+ if (this.pingTimer)
307
+ clearTimeout(this.pingTimer);
308
+ if (this.handRaf)
309
+ cancelAnimationFrame(this.handRaf);
310
+ if (this.openFrame)
311
+ cancelAnimationFrame(this.openFrame);
312
+ this.ro?.disconnect();
313
+ }
314
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentLanesComponent, deps: [{ token: i1.ReducedMotionService }], target: i0.ɵɵFactoryTarget.Component }); }
315
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AgentLanesComponent, isStandalone: true, selector: "vo-agent-lanes", inputs: { lanes: "lanes", title: "title", seconds: "seconds", paused: "paused", defaultPaused: "defaultPaused", pauseWired: "pauseWired", handoff: "handoff", expanded: "expanded", defaultExpanded: "defaultExpanded", bare: "bare" }, outputs: { pausedChange: "pausedChange", expandedChange: "expandedChange" }, viewQueries: [{ propertyName: "rowsRef", first: true, predicate: ["rows"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
316
+ <div
317
+ data-vo=""
318
+ class="vo-aln"
319
+ [class.vo-panel]="!bare"
320
+ [class.vo-fin]="finished"
321
+ [style.padding-inline]="bare ? '0' : null"
322
+ >
323
+ <div class="vo-aln-h">
324
+ <span class="vo-aln-ic">
325
+ @if (finished) {
326
+ <span class="vo-enter" style="display:grid"><vo-icon name="ok"></vo-icon></span>
327
+ } @else {
328
+ <vo-icon name="users"></vo-icon>
329
+ }
330
+ </span>
331
+ <span class="vo-sw vo-aln-t">{{ head }}</span>
332
+ <span class="vo-aln-m vo-muted vo-num">{{ clockText }}</span>
333
+ <span class="vo-sw vo-aln-ct vo-num">{{ stepsDone }} of {{ total }} steps</span>
334
+ @if (pauseWired && !finished) {
335
+ <button type="button" class="vo-pill vo-soft vo-sm" (click)="togglePaused()">
336
+ <vo-icon [name]="isPaused ? 'play' : 'pause'" size="xs"></vo-icon>
337
+ {{ isPaused ? 'Resume' : 'Pause all' }}
338
+ </button>
339
+ }
340
+ </div>
341
+
342
+ <div class="vo-aln-rows" #rows>
343
+ @for (v of views; track v.lane.key) {
344
+ @if (handFor(v.lane.key); as h) {
345
+ <div
346
+ class="vo-fold vo-aln-hf"
347
+ [class.vo-shut]="!(h.open && !h.leaving)"
348
+ [class.vo-lit]="h.lit"
349
+ [attr.inert]="h.open && !h.leaving ? null : ''"
350
+ [attr.aria-hidden]="h.open && !h.leaving ? null : 'true'"
351
+ [style.--vo-from]="'var(--vo-' + h.fromTone + ')'"
352
+ [style.--vo-to]="'var(--vo-' + h.toTone + ')'"
353
+ >
354
+ <div>
355
+ <div class="vo-aln-hand vo-enter">
356
+ <b class="vo-f">{{ h.fromName }}</b> handed {{ h.what }} to <b class="vo-t">{{ h.toName }}</b>
357
+ </div>
358
+ </div>
359
+ </div>
360
+ }
361
+ <div
362
+ class="vo-aln-lane"
363
+ [class.vo-sent]="v.sent"
364
+ [class.vo-got]="v.got"
365
+ [attr.data-s]="v.status"
366
+ [attr.data-lane]="v.lane.key"
367
+ [style.--vo-c]="'var(--vo-' + v.tone + ')'"
368
+ [style.--vo-cb]="'var(--vo-' + v.tone + '-bg)'"
369
+ [style.--vo-cm]="'var(--vo-aln-' + v.tone + ',var(--vo-' + v.tone + '))'"
370
+ >
371
+ <button
372
+ type="button"
373
+ class="vo-aln-row"
374
+ [attr.aria-expanded]="v.open"
375
+ (click)="toggleLane(v.lane.key)"
376
+ >
377
+ <span class="vo-aln-av" [class.vo-ping]="v.ping">
378
+ <vo-icon [name]="v.lane.icon"></vo-icon>
379
+ </span>
380
+ <span class="vo-aln-who">
381
+ <span class="vo-aln-n">{{ v.lane.name }}</span>
382
+ <span class="vo-sw vo-aln-a" [class.vo-live]="v.live" [class.vo-shim]="v.status === 'working'">{{ v.lane.activity }}</span>
383
+ </span>
384
+ <span class="vo-aln-tr" aria-hidden="true">
385
+ @for (b of v.bars; track $index) {
386
+ <i
387
+ [class.vo-on]="b.on"
388
+ [class.vo-run]="b.run"
389
+ [class.vo-ind]="b.ind"
390
+ [style.--vo-p]="b.progress ?? null"
391
+ ></i>
392
+ }
393
+ </span>
394
+ <span class="vo-aln-st">
395
+ @switch (v.status) {
396
+ @case ('working') {
397
+ <span class="vo-tag vo-aln-tg"><span class="vo-spin" aria-hidden="true"></span>Working</span>
398
+ }
399
+ @case ('paused') {
400
+ <span class="vo-tag vo-warn">Paused</span>
401
+ }
402
+ @case ('done') {
403
+ <span class="vo-tag vo-ok"><vo-icon name="check" size="xs"></vo-icon>Done</span>
404
+ }
405
+ @case ('waiting') {
406
+ <span class="vo-tag"><vo-icon name="clock" size="xs"></vo-icon>Waiting</span>
407
+ }
408
+ @default {
409
+ <span class="vo-tag">Queued</span>
410
+ }
411
+ }
412
+ </span>
413
+ </button>
414
+ <div class="vo-fold" [class.vo-shut]="!v.open" [attr.inert]="v.open ? null : ''">
415
+ <div>
416
+ <div class="vo-aln-det">
417
+ @for (l of v.lane.log ?? []; track $index) {
418
+ <div class="vo-enter">
419
+ <span>{{ l.text }}</span>
420
+ @if (l.time) {
421
+ <span class="vo-muted">{{ l.time }}</span>
422
+ }
423
+ </div>
424
+ }
425
+ </div>
426
+ </div>
427
+ </div>
428
+ </div>
429
+ }
430
+ @for (s of strokes; track s.key) {
431
+ <span
432
+ class="vo-aln-pk"
433
+ [attr.data-k]="s.key"
434
+ aria-hidden="true"
435
+ [style.--vo-from]="'var(--vo-aln-' + s.fromTone + ',var(--vo-' + s.fromTone + '))'"
436
+ [style.--vo-to]="'var(--vo-aln-' + s.toTone + ',var(--vo-' + s.toTone + '))'"
437
+ ></span>
438
+ }
439
+ </div>
440
+ </div>
441
+ `, isInline: true, styles: [".vo-aln{padding:var(--vo-s-2)}.vo-aln{--vo-aln-pb:#2a7bff;--vo-aln-pm:#1fa66a;--vo-aln-pl:#7a5af5}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}}:root[data-theme=dark] .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}.vo-stage-in:has(>.vo-aln){display:flex;flex-direction:column;justify-content:center}.vo-aln-h{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px 10px}.vo-aln-ic{color:var(--vo-fg2);display:grid;transition:color .3s}.vo-aln.vo-fin .vo-aln-ic{color:var(--vo-ok)}.vo-aln-t{font-weight:500}.vo-aln-m{font-size:12.5px}.vo-aln-ct{font-size:12.5px;color:var(--vo-muted);margin-right:auto;white-space:nowrap}.vo-aln-ct:before{content:\"\\b7\";margin-right:6px}.vo-aln-rows{position:relative}.vo-aln-rows>*{position:relative}.vo-aln-lane{border-radius:calc(14px * var(--vo-rk));transition:background .3s}@media (hover:hover) and (pointer:fine){.vo-aln-lane:hover{background:var(--vo-row)}}.vo-aln-lane[data-s=working]{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%)}@media (hover:hover) and (pointer:fine){.vo-aln-lane[data-s=working]:hover{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%),var(--vo-row)}}.vo-aln-rows>*:before{content:\"\";position:absolute;left:26px;width:2px;top:0;bottom:0;background:var(--vo-line);pointer-events:none}.vo-aln-lane:before{top:48px}.vo-aln-lane:last-child:before{display:none}.vo-aln-lane:after{content:\"\";position:absolute;left:26px;width:2px;top:0;height:6px;background:var(--vo-line);pointer-events:none}.vo-aln-lane:first-child:after{display:none}.vo-aln-rows>.vo-aln-lane.vo-sent:before,.vo-aln-rows>.vo-aln-lane.vo-got:after,.vo-aln-rows>.vo-aln-hf.vo-lit:before{background:transparent}.vo-aln-row{display:grid;grid-template-columns:34px minmax(0,1.2fr) minmax(0,1fr) auto;align-items:center;gap:var(--vo-s-3);width:100%;padding:10px;text-align:left}.vo-aln-av{position:relative;width:34px;height:34px;border-radius:calc(11px * var(--vo-rk));display:grid;place-items:center;color:var(--vo-c);background:var(--vo-cb);transition:color .4s,background .4s}.vo-aln-av:before{content:\"\";position:absolute;inset:0;border-radius:inherit;pointer-events:none}.vo-aln-lane[data-s=working] .vo-aln-av{animation:vo-alnbreathe 2.4s var(--vo-ease-io) infinite}@keyframes vo-alnbreathe{0%,to{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 1px color-mix(in srgb,var(--vo-fg) 0%,transparent)}50%{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 5px color-mix(in srgb,var(--vo-fg) 6%,transparent)}}.vo-aln-av.vo-ping:before{animation:vo-alnping .9s var(--vo-ease)}@keyframes vo-alnping{0%{box-shadow:0 0 color-mix(in srgb,var(--vo-fg) 20%,transparent)}to{box-shadow:0 0 0 12px color-mix(in srgb,var(--vo-fg) 0%,transparent)}}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-lane[data-s=working] .vo-aln-tg{background:var(--vo-surface);box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent)}.vo-aln-lane[data-s=done] .vo-aln-av{background:var(--vo-cm);color:var(--vo-surface)}.vo-aln-who{min-width:0}.vo-aln-n{display:block;font-weight:500;font-size:13.5px}.vo-aln-a{display:block;font-size:12.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aln-a.vo-live{color:var(--vo-fg2)}.vo-aln-tr{display:flex;gap:3px}.vo-aln-tr i{flex:1;height:10px;border-radius:5px;background:color-mix(in srgb,var(--vo-cm) 13%,var(--vo-line));position:relative;overflow:hidden}.vo-aln-tr i:after{content:\"\";position:absolute;inset:0;border-radius:inherit;background:var(--vo-cm);transform:scaleX(var(--vo-p,0));transform-origin:left;transition:transform .25s linear}.vo-aln-tr i.vo-on:after{transform:scaleX(1);transition:transform .5s var(--vo-ease)}.vo-aln-tr i.vo-run:after{background:linear-gradient(90deg,var(--vo-cm) 0 30%,color-mix(in srgb,var(--vo-cm) 30%,var(--vo-surface)) 50%,var(--vo-cm) 70% 100%) 0 0/250% 100%;animation:vo-alnsheen 1.6s linear infinite}.vo-aln-tr i.vo-run.vo-ind:after{transform:scaleX(.6);transition:transform 2.4s var(--vo-ease)}@keyframes vo-alnsheen{0%{background-position:100% 0}to{background-position:-150% 0}}.vo-aln-st{min-width:92px;display:flex;justify-content:flex-end}.vo-aln-tg{background:var(--vo-cb);color:var(--vo-c)}.vo-aln-tg .vo-spin{width:9px;height:9px}.vo-aln-det{padding:0 10px 10px 56px;font-size:12.5px;color:var(--vo-fg2)}.vo-aln-det div{display:flex;align-items:center;gap:var(--vo-s-2);padding:3px 0}.vo-aln-det div:before{content:\"\";width:5px;height:5px;border-radius:50%;background:var(--vo-c);flex:none}.vo-aln-det .vo-muted{margin-left:auto}.vo-aln-hf{transition-duration:var(--vo-t-slow)}.vo-aln-hand{padding:6px 10px 6px 56px;font-size:12.5px;line-height:18px;color:var(--vo-fg2)}.vo-aln-hand b{font-weight:500}.vo-aln-hand .vo-f{color:var(--vo-from)}.vo-aln-hand .vo-t{color:var(--vo-to)}.vo-aln-rows>.vo-aln-pk:before{display:none}.vo-aln-pk{position:absolute;left:26px;top:0;width:2px;background:linear-gradient(var(--vo-from),var(--vo-to));transform-origin:50% 0;pointer-events:none;z-index:2}@media (max-width:600px){.vo-aln-row{grid-template-columns:34px minmax(0,1fr) auto;row-gap:var(--vo-s-2)}.vo-aln-tr{grid-column:2 / -1;grid-row:2}.vo-aln-lane:before{top:48px}.vo-aln-ct{display:none}.vo-aln-m{margin-right:auto}}@media (max-width:400px){.vo-aln-ic{display:none}}:root:not([data-style=soft]) .vo-aln-rows>*:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-lane:not(:where([data-style=soft],[data-style=soft] *)):after{width:1px;left:26.5px;background:repeating-linear-gradient(var(--vo-rail) 0 3px,transparent 3px 6px)}:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-sent:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-got:not(:where([data-style=soft],[data-style=soft] *)):after,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-hf.vo-lit:not(:where([data-style=soft],[data-style=soft] *)):before{background:transparent}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] :is(.vo-aln-av,.vo-aln-tg):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 45%,transparent)}:root:not([data-style=soft]) .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-alnbp 1.1s steps(1,end) infinite}@keyframes vo-alnbp{0%,55%{box-shadow:inset 0 0 0 1px var(--vo-c)}56%,to{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}}:root:not([data-style=soft]) .vo-aln-lane[data-s=working]:not(:where([data-style=soft],[data-style=soft] *)){background:color-mix(in srgb,var(--vo-c) 5%,transparent)}:root:not([data-style=soft]) .vo-aln-tr i:not(:where([data-style=soft],[data-style=soft] *)){height:8px}:root:not([data-style=soft]) .vo-aln-tr i.vo-run:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(135deg,var(--vo-cm) 0 4px,color-mix(in srgb,var(--vo-cm) 55%,var(--vo-surface)) 4px 7px);animation:none}:root:not([data-style=soft]) .vo-aln-pk:not(:where([data-style=soft],[data-style=soft] *)){width:1px;left:26.5px;border-radius:0;background:var(--vo-to)}:root:not([data-style=soft]) .vo-aln-av.vo-ping:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-alnpingbp .6s steps(3,end)}@keyframes vo-alnpingbp{0%{box-shadow:0 0 0 1px var(--vo-c)}to{box-shadow:0 0 0 7px transparent}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.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-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.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-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-ok{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-soft{background:var(--vo-soft);color:var(--vo-fg);box-shadow:var(--vo-soft-ring)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft:hover{background:var(--vo-soft-h)}}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}.vo-enter{animation:none}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-av.vo-ping:before,.vo-aln-tr i.vo-run:after,.vo-spin{animation-duration:.01ms!important;animation-iteration-count:1!important}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
442
+ }
443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentLanesComponent, decorators: [{
444
+ type: Component,
445
+ args: [{ selector: 'vo-agent-lanes', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
446
+ <div
447
+ data-vo=""
448
+ class="vo-aln"
449
+ [class.vo-panel]="!bare"
450
+ [class.vo-fin]="finished"
451
+ [style.padding-inline]="bare ? '0' : null"
452
+ >
453
+ <div class="vo-aln-h">
454
+ <span class="vo-aln-ic">
455
+ @if (finished) {
456
+ <span class="vo-enter" style="display:grid"><vo-icon name="ok"></vo-icon></span>
457
+ } @else {
458
+ <vo-icon name="users"></vo-icon>
459
+ }
460
+ </span>
461
+ <span class="vo-sw vo-aln-t">{{ head }}</span>
462
+ <span class="vo-aln-m vo-muted vo-num">{{ clockText }}</span>
463
+ <span class="vo-sw vo-aln-ct vo-num">{{ stepsDone }} of {{ total }} steps</span>
464
+ @if (pauseWired && !finished) {
465
+ <button type="button" class="vo-pill vo-soft vo-sm" (click)="togglePaused()">
466
+ <vo-icon [name]="isPaused ? 'play' : 'pause'" size="xs"></vo-icon>
467
+ {{ isPaused ? 'Resume' : 'Pause all' }}
468
+ </button>
469
+ }
470
+ </div>
471
+
472
+ <div class="vo-aln-rows" #rows>
473
+ @for (v of views; track v.lane.key) {
474
+ @if (handFor(v.lane.key); as h) {
475
+ <div
476
+ class="vo-fold vo-aln-hf"
477
+ [class.vo-shut]="!(h.open && !h.leaving)"
478
+ [class.vo-lit]="h.lit"
479
+ [attr.inert]="h.open && !h.leaving ? null : ''"
480
+ [attr.aria-hidden]="h.open && !h.leaving ? null : 'true'"
481
+ [style.--vo-from]="'var(--vo-' + h.fromTone + ')'"
482
+ [style.--vo-to]="'var(--vo-' + h.toTone + ')'"
483
+ >
484
+ <div>
485
+ <div class="vo-aln-hand vo-enter">
486
+ <b class="vo-f">{{ h.fromName }}</b> handed {{ h.what }} to <b class="vo-t">{{ h.toName }}</b>
487
+ </div>
488
+ </div>
489
+ </div>
490
+ }
491
+ <div
492
+ class="vo-aln-lane"
493
+ [class.vo-sent]="v.sent"
494
+ [class.vo-got]="v.got"
495
+ [attr.data-s]="v.status"
496
+ [attr.data-lane]="v.lane.key"
497
+ [style.--vo-c]="'var(--vo-' + v.tone + ')'"
498
+ [style.--vo-cb]="'var(--vo-' + v.tone + '-bg)'"
499
+ [style.--vo-cm]="'var(--vo-aln-' + v.tone + ',var(--vo-' + v.tone + '))'"
500
+ >
501
+ <button
502
+ type="button"
503
+ class="vo-aln-row"
504
+ [attr.aria-expanded]="v.open"
505
+ (click)="toggleLane(v.lane.key)"
506
+ >
507
+ <span class="vo-aln-av" [class.vo-ping]="v.ping">
508
+ <vo-icon [name]="v.lane.icon"></vo-icon>
509
+ </span>
510
+ <span class="vo-aln-who">
511
+ <span class="vo-aln-n">{{ v.lane.name }}</span>
512
+ <span class="vo-sw vo-aln-a" [class.vo-live]="v.live" [class.vo-shim]="v.status === 'working'">{{ v.lane.activity }}</span>
513
+ </span>
514
+ <span class="vo-aln-tr" aria-hidden="true">
515
+ @for (b of v.bars; track $index) {
516
+ <i
517
+ [class.vo-on]="b.on"
518
+ [class.vo-run]="b.run"
519
+ [class.vo-ind]="b.ind"
520
+ [style.--vo-p]="b.progress ?? null"
521
+ ></i>
522
+ }
523
+ </span>
524
+ <span class="vo-aln-st">
525
+ @switch (v.status) {
526
+ @case ('working') {
527
+ <span class="vo-tag vo-aln-tg"><span class="vo-spin" aria-hidden="true"></span>Working</span>
528
+ }
529
+ @case ('paused') {
530
+ <span class="vo-tag vo-warn">Paused</span>
531
+ }
532
+ @case ('done') {
533
+ <span class="vo-tag vo-ok"><vo-icon name="check" size="xs"></vo-icon>Done</span>
534
+ }
535
+ @case ('waiting') {
536
+ <span class="vo-tag"><vo-icon name="clock" size="xs"></vo-icon>Waiting</span>
537
+ }
538
+ @default {
539
+ <span class="vo-tag">Queued</span>
540
+ }
541
+ }
542
+ </span>
543
+ </button>
544
+ <div class="vo-fold" [class.vo-shut]="!v.open" [attr.inert]="v.open ? null : ''">
545
+ <div>
546
+ <div class="vo-aln-det">
547
+ @for (l of v.lane.log ?? []; track $index) {
548
+ <div class="vo-enter">
549
+ <span>{{ l.text }}</span>
550
+ @if (l.time) {
551
+ <span class="vo-muted">{{ l.time }}</span>
552
+ }
553
+ </div>
554
+ }
555
+ </div>
556
+ </div>
557
+ </div>
558
+ </div>
559
+ }
560
+ @for (s of strokes; track s.key) {
561
+ <span
562
+ class="vo-aln-pk"
563
+ [attr.data-k]="s.key"
564
+ aria-hidden="true"
565
+ [style.--vo-from]="'var(--vo-aln-' + s.fromTone + ',var(--vo-' + s.fromTone + '))'"
566
+ [style.--vo-to]="'var(--vo-aln-' + s.toTone + ',var(--vo-' + s.toTone + '))'"
567
+ ></span>
568
+ }
569
+ </div>
570
+ </div>
571
+ `, styles: [".vo-aln{padding:var(--vo-s-2)}.vo-aln{--vo-aln-pb:#2a7bff;--vo-aln-pm:#1fa66a;--vo-aln-pl:#7a5af5}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}}:root[data-theme=dark] .vo-aln{--vo-aln-pb:var(--vo-pb);--vo-aln-pm:var(--vo-pm);--vo-aln-pl:var(--vo-pl)}.vo-stage-in:has(>.vo-aln){display:flex;flex-direction:column;justify-content:center}.vo-aln-h{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px 10px}.vo-aln-ic{color:var(--vo-fg2);display:grid;transition:color .3s}.vo-aln.vo-fin .vo-aln-ic{color:var(--vo-ok)}.vo-aln-t{font-weight:500}.vo-aln-m{font-size:12.5px}.vo-aln-ct{font-size:12.5px;color:var(--vo-muted);margin-right:auto;white-space:nowrap}.vo-aln-ct:before{content:\"\\b7\";margin-right:6px}.vo-aln-rows{position:relative}.vo-aln-rows>*{position:relative}.vo-aln-lane{border-radius:calc(14px * var(--vo-rk));transition:background .3s}@media (hover:hover) and (pointer:fine){.vo-aln-lane:hover{background:var(--vo-row)}}.vo-aln-lane[data-s=working]{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%)}@media (hover:hover) and (pointer:fine){.vo-aln-lane[data-s=working]:hover{background:linear-gradient(90deg,color-mix(in srgb,var(--vo-c) 8%,transparent),transparent 72%),var(--vo-row)}}.vo-aln-rows>*:before{content:\"\";position:absolute;left:26px;width:2px;top:0;bottom:0;background:var(--vo-line);pointer-events:none}.vo-aln-lane:before{top:48px}.vo-aln-lane:last-child:before{display:none}.vo-aln-lane:after{content:\"\";position:absolute;left:26px;width:2px;top:0;height:6px;background:var(--vo-line);pointer-events:none}.vo-aln-lane:first-child:after{display:none}.vo-aln-rows>.vo-aln-lane.vo-sent:before,.vo-aln-rows>.vo-aln-lane.vo-got:after,.vo-aln-rows>.vo-aln-hf.vo-lit:before{background:transparent}.vo-aln-row{display:grid;grid-template-columns:34px minmax(0,1.2fr) minmax(0,1fr) auto;align-items:center;gap:var(--vo-s-3);width:100%;padding:10px;text-align:left}.vo-aln-av{position:relative;width:34px;height:34px;border-radius:calc(11px * var(--vo-rk));display:grid;place-items:center;color:var(--vo-c);background:var(--vo-cb);transition:color .4s,background .4s}.vo-aln-av:before{content:\"\";position:absolute;inset:0;border-radius:inherit;pointer-events:none}.vo-aln-lane[data-s=working] .vo-aln-av{animation:vo-alnbreathe 2.4s var(--vo-ease-io) infinite}@keyframes vo-alnbreathe{0%,to{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 1px color-mix(in srgb,var(--vo-fg) 0%,transparent)}50%{box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent),0 0 0 5px color-mix(in srgb,var(--vo-fg) 6%,transparent)}}.vo-aln-av.vo-ping:before{animation:vo-alnping .9s var(--vo-ease)}@keyframes vo-alnping{0%{box-shadow:0 0 color-mix(in srgb,var(--vo-fg) 20%,transparent)}to{box-shadow:0 0 0 12px color-mix(in srgb,var(--vo-fg) 0%,transparent)}}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-lane[data-s=working] .vo-aln-tg{background:var(--vo-surface);box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-c) 22%,transparent)}.vo-aln-lane[data-s=done] .vo-aln-av{background:var(--vo-cm);color:var(--vo-surface)}.vo-aln-who{min-width:0}.vo-aln-n{display:block;font-weight:500;font-size:13.5px}.vo-aln-a{display:block;font-size:12.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aln-a.vo-live{color:var(--vo-fg2)}.vo-aln-tr{display:flex;gap:3px}.vo-aln-tr i{flex:1;height:10px;border-radius:5px;background:color-mix(in srgb,var(--vo-cm) 13%,var(--vo-line));position:relative;overflow:hidden}.vo-aln-tr i:after{content:\"\";position:absolute;inset:0;border-radius:inherit;background:var(--vo-cm);transform:scaleX(var(--vo-p,0));transform-origin:left;transition:transform .25s linear}.vo-aln-tr i.vo-on:after{transform:scaleX(1);transition:transform .5s var(--vo-ease)}.vo-aln-tr i.vo-run:after{background:linear-gradient(90deg,var(--vo-cm) 0 30%,color-mix(in srgb,var(--vo-cm) 30%,var(--vo-surface)) 50%,var(--vo-cm) 70% 100%) 0 0/250% 100%;animation:vo-alnsheen 1.6s linear infinite}.vo-aln-tr i.vo-run.vo-ind:after{transform:scaleX(.6);transition:transform 2.4s var(--vo-ease)}@keyframes vo-alnsheen{0%{background-position:100% 0}to{background-position:-150% 0}}.vo-aln-st{min-width:92px;display:flex;justify-content:flex-end}.vo-aln-tg{background:var(--vo-cb);color:var(--vo-c)}.vo-aln-tg .vo-spin{width:9px;height:9px}.vo-aln-det{padding:0 10px 10px 56px;font-size:12.5px;color:var(--vo-fg2)}.vo-aln-det div{display:flex;align-items:center;gap:var(--vo-s-2);padding:3px 0}.vo-aln-det div:before{content:\"\";width:5px;height:5px;border-radius:50%;background:var(--vo-c);flex:none}.vo-aln-det .vo-muted{margin-left:auto}.vo-aln-hf{transition-duration:var(--vo-t-slow)}.vo-aln-hand{padding:6px 10px 6px 56px;font-size:12.5px;line-height:18px;color:var(--vo-fg2)}.vo-aln-hand b{font-weight:500}.vo-aln-hand .vo-f{color:var(--vo-from)}.vo-aln-hand .vo-t{color:var(--vo-to)}.vo-aln-rows>.vo-aln-pk:before{display:none}.vo-aln-pk{position:absolute;left:26px;top:0;width:2px;background:linear-gradient(var(--vo-from),var(--vo-to));transform-origin:50% 0;pointer-events:none;z-index:2}@media (max-width:600px){.vo-aln-row{grid-template-columns:34px minmax(0,1fr) auto;row-gap:var(--vo-s-2)}.vo-aln-tr{grid-column:2 / -1;grid-row:2}.vo-aln-lane:before{top:48px}.vo-aln-ct{display:none}.vo-aln-m{margin-right:auto}}@media (max-width:400px){.vo-aln-ic{display:none}}:root:not([data-style=soft]) .vo-aln-rows>*:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-lane:not(:where([data-style=soft],[data-style=soft] *)):after{width:1px;left:26.5px;background:repeating-linear-gradient(var(--vo-rail) 0 3px,transparent 3px 6px)}:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-sent:not(:where([data-style=soft],[data-style=soft] *)):before,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-lane.vo-got:not(:where([data-style=soft],[data-style=soft] *)):after,:root:not([data-style=soft]) .vo-aln-rows>.vo-aln-hf.vo-lit:not(:where([data-style=soft],[data-style=soft] *)):before{background:transparent}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] :is(.vo-aln-av,.vo-aln-tg):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 45%,transparent)}:root:not([data-style=soft]) .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}:root:not([data-style=soft]) .vo-aln-lane[data-s=working] .vo-aln-av:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-alnbp 1.1s steps(1,end) infinite}@keyframes vo-alnbp{0%,55%{box-shadow:inset 0 0 0 1px var(--vo-c)}56%,to{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-c) 35%,transparent)}}:root:not([data-style=soft]) .vo-aln-lane[data-s=working]:not(:where([data-style=soft],[data-style=soft] *)){background:color-mix(in srgb,var(--vo-c) 5%,transparent)}:root:not([data-style=soft]) .vo-aln-tr i:not(:where([data-style=soft],[data-style=soft] *)){height:8px}:root:not([data-style=soft]) .vo-aln-tr i.vo-run:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(135deg,var(--vo-cm) 0 4px,color-mix(in srgb,var(--vo-cm) 55%,var(--vo-surface)) 4px 7px);animation:none}:root:not([data-style=soft]) .vo-aln-pk:not(:where([data-style=soft],[data-style=soft] *)){width:1px;left:26.5px;border-radius:0;background:var(--vo-to)}:root:not([data-style=soft]) .vo-aln-av.vo-ping:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-alnpingbp .6s steps(3,end)}@keyframes vo-alnpingbp{0%{box-shadow:0 0 0 1px var(--vo-c)}to{box-shadow:0 0 0 7px transparent}}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.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-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.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-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-ok{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tag.vo-warn{background:var(--vo-warn-bg);color:var(--vo-warn)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-soft{background:var(--vo-soft);color:var(--vo-fg);box-shadow:var(--vo-soft-ring)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft:hover{background:var(--vo-soft-h)}}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}.vo-enter{animation:none}.vo-aln-lane[data-s=working] .vo-aln-av,.vo-aln-av.vo-ping:before,.vo-aln-tr i.vo-run:after,.vo-spin{animation-duration:.01ms!important;animation-iteration-count:1!important}}\n"] }]
572
+ }], ctorParameters: () => [{ type: i1.ReducedMotionService }], propDecorators: { lanes: [{
573
+ type: Input
574
+ }], title: [{
575
+ type: Input
576
+ }], seconds: [{
577
+ type: Input
578
+ }], paused: [{
579
+ type: Input
580
+ }], defaultPaused: [{
581
+ type: Input
582
+ }], pauseWired: [{
583
+ type: Input
584
+ }], handoff: [{
585
+ type: Input
586
+ }], expanded: [{
587
+ type: Input
588
+ }], defaultExpanded: [{
589
+ type: Input
590
+ }], bare: [{
591
+ type: Input
592
+ }], pausedChange: [{
593
+ type: Output
594
+ }], expandedChange: [{
595
+ type: Output
596
+ }], rowsRef: [{
597
+ type: ViewChild,
598
+ args: ['rows']
599
+ }] } });
600
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbGFuZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWdlbnQtbGFuZXMvYWdlbnQtbGFuZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLGtGQUFrRjtBQUNsRixnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSwwRUFBMEU7QUFDMUUsMkJBQTJCO0FBQzNCLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLGlEQUFpRDtBQUVqRCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBbUIsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBb0QxRSxNQUFNLElBQUksR0FBNkI7SUFDckMsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUk7SUFDWixHQUFHLEVBQUUsSUFBSTtJQUNULE1BQU0sRUFBRSxJQUFJO0lBQ1osSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsSUFBSTtDQUNYLENBQUM7QUFDRixNQUFNLEtBQUssR0FBRyxDQUFDLENBQWEsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUM7QUFDakUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUNsQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBK0M3RCwwR0FBMEc7QUF1STFHLE1BQU0sT0FBTyxtQkFBbUI7SUFNOUIseUZBQXlGO0lBQ3pGLElBQWEsTUFBTSxDQUFDLEtBQTBCO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDO1FBQzVDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBTUQsbUZBQW1GO0lBQ25GLElBQWEsUUFBUSxDQUFDLEtBQTJCO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDO1FBQzlDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0RCxDQUFDO0lBa0NELFlBQTZCLE9BQTZCO1FBQTdCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBckRqRCxVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQVV4QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUMvQixrR0FBa0c7UUFDekYsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVFuQixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUN4Qyx3RkFBd0Y7UUFDL0UsU0FBSSxHQUFHLElBQUksQ0FBQztRQUVYLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUMzQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFJaEQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixrQkFBYSxHQUFhLEVBQUUsQ0FBQztRQUM3QixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBTVosYUFBUSxHQUFHLEtBQUssQ0FBQztRQUl6QiwrRUFBK0U7UUFDdkUsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUt2QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQUlvQyxDQUFDO0lBRTlELGlDQUFpQztJQUVqQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQVksWUFBWTtRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVc7UUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtZQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxpQ0FBaUM7SUFFakMsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLGtCQUFrQixDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLG1CQUFtQixDQUFDO1FBQzlDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0saUJBQWlCLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBZSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDOUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxHQUFjLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDO2dCQUMvQixPQUFPO29CQUNMLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSTtvQkFDWixHQUFHO29CQUNILEdBQUcsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTO29CQUN2QyxRQUFRLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUNsRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDakIsSUFBSTtnQkFDSixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDNUQsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHO2dCQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFDMUMsSUFBSTthQUNMLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsR0FBVztRQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUM7SUFDNUQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxHQUFXO1FBQ3hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixPQUFPLENBQUMsT0FBZTtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxPQUFPO1lBQ0wsR0FBRztZQUNILElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekIsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFDbkMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksT0FBTztRQUNULE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNsQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFFeEIsZUFBZTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7UUFDeEMsSUFBSSxHQUFHLElBQUksT0FBTyxjQUFjLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckYsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9DLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUFFLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDTiwyRkFBMkY7WUFDM0YsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxTQUFTO29CQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixzREFBc0Q7WUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztnQkFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsTUFBTSxHQUFHLEdBQ1AsT0FBTyxxQkFBcUIsS0FBSyxVQUFVO1lBQ3pDLENBQUMsQ0FBQyxxQkFBcUI7WUFDdkIsQ0FBQyxDQUFDLENBQUMsRUFBd0IsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQXNCLENBQUM7UUFDckYsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBQyxHQUFXO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxHQUFTLEVBQUU7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxHQUFHO2dCQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxFQUFFO29CQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ2xELENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNSLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUM7UUFDRixzRUFBc0U7UUFDdEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsYUFBYSxDQUNsRCw2QkFBNkIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNqRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxFQUFFLENBQUM7WUFDVCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQzlFLFFBQVEsRUFBRSxHQUFHO1lBQ2IsTUFBTSxFQUFFLDJCQUEyQjtTQUNwQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGdHQUFnRztJQUN4RixZQUFZO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsZ0JBQWdCLENBQWMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNwRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFBRSxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN6RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDdEQsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztZQUN6QixFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxXQUFXLEdBQ2YsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0YsSUFBSSxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELENBQUM7YUFBTSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBaFRVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHFmQWpJcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThIVCwwNVVBL0hTLGVBQWU7OzRGQWtJZCxtQkFBbUI7a0JBdEkvQixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEhUO3lGQUlRLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVPLE1BQU07c0JBQWxCLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFTyxRQUFRO3NCQUFwQixLQUFLO2dCQUlHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFb0IsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvYWdlbnQtbGFuZXMvYWdlbnQtbGFuZXMuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvYWdlbnQtbGFuZXMvQWdlbnRMYW5lcy50c3guXG4vLyBTZXZlcmFsIGFnZW50cyB3b3JraW5nIHNpZGUgYnkgc2lkZSwgZWFjaCBpbiBpdHMgb3duIGxhbmUgYW5kIGh1ZSwgaGFuZGluZyB3b3JrXG4vLyB0byBvbmUgYW5vdGhlciBkb3duIGEgcmVsYXkgbGluZS4gQSB3b3JraW5nIGxhbmUgYnJlYXRoZXMsIHNoaW1tZXJzIGFuZCBmaWxsc1xuLy8gaXRzIG5leHQgc3RlcDsgYSBoYW5kLW9mZiBvcGVucyBhIGxpbmUgYmV0d2VlbiB0d28gbGFuZXMgYW5kIHJ1bnMgYSBsaWdodCBkb3duXG4vLyB0aGUgcmVsYXkgbGluZSBmcm9tIHRoZSBzZW5kZXIncyBiYWRnZSB0byB0aGUgdGFrZXIncywgYW5kIHRoZSBzdHJldGNoIGl0XG4vLyBjcm9zc2VkIHN0YXlzIGxpdC4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IGNhbGxiYWNrIHByb3BzIGJlY29tZVxuLy8gQE91dHB1dCgpIEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gVGhlIHJlbGF5LWxpbmUgc3Ryb2tlcyBhcmUgcG9zaXRpb25lZCBmcm9tIGJhZGdlIHRvIGJhZGdlIHdpdGggYSBSZXNpemVPYnNlcnZlclxuLy8gKHBvcnRlZCBmcm9tIHRoZSBSZWFjdCB1c2VMYXlvdXRFZmZlY3QgLyB0aGUgdmFuaWxsYSBwbGFjZSgpKS4gUmVkdWNlZCBtb3Rpb24gaXNcbi8vIHJlc3BlY3RlZCB2aWEgdGhlIHNoYXJlZCBSZWR1Y2VkTW90aW9uU2VydmljZS5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIExhbmVTdGF0dXMgPSAncXVldWVkJyB8ICd3YWl0aW5nJyB8ICd3b3JraW5nJyB8ICdwYXVzZWQnIHwgJ2RvbmUnO1xuZXhwb3J0IHR5cGUgTGFuZVRvbmUgPVxuICB8ICdibHVlJ1xuICB8ICdwdXJwbGUnXG4gIHwgJ2dyZWVuJ1xuICB8ICdvcmFuZ2UnXG4gIHwgJ3JlZCdcbiAgfCAneWVsbG93J1xuICB8ICdwaW5rJ1xuICB8ICd0ZWFsJztcblxuLyoqIE9uZSBlbnRyeSBpbiBhIGxhbmUncyBsb2csIHNob3duIHdoZW4gdGhlIGxhbmUgaXMgb3BlbmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW5lTG9nIHtcbiAgdGV4dDogc3RyaW5nO1xuICB0aW1lPzogc3RyaW5nO1xufVxuXG4vKiogT25lIGFnZW50J3MgbGFuZTogaXRzIG5hbWUsIGh1ZSwgc3RhdHVzLCB0aGUgc3RlcCB0cmFjayBhbmQgaXRzIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRMYW5lIHtcbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwiUmVzZWFyY2hlclwiLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIGljb246IFZvSWNvbk5hbWU7XG4gIC8qKiBUaGUgbGFuZSdzIGh1ZTogaXRzIGJhZGdlLCBpdHMgdHJhY2ssIGl0cyBXb3JraW5nIHRhZyBhbmQgaXRzIHN0cmV0Y2ggb2YgdGhlIHJlbGF5IGxpbmUuIERlZmF1bHRzIHRvIGJsdWUuICovXG4gIHRvbmU/OiBMYW5lVG9uZTtcbiAgLyoqIHdvcmtpbmcgYnJlYXRoZXMsIHNoaW1tZXJzIGFuZCBmaWxscyB0aGUgbmV4dCBzdGVwLCBwYXVzZWQgaG9sZHMgaXQsIGRvbmUgZmlsbHMgdGhlIGJhZGdlIHdpdGggaXRzIGh1ZS4gKi9cbiAgc3RhdHVzOiBMYW5lU3RhdHVzO1xuICAvKiogV2hhdCB0aGUgYWdlbnQgaXMgZG9pbmcgbm93LCBvciB3aGF0IGl0IGlzIHdhaXRpbmcgZm9yLiBJdCBjcm9zc2ZhZGVzIHdoZW4gaXQgY2hhbmdlcywgYW5kIHNoaW1tZXJzIHdoaWxlIHRoZSBhZ2VudCB3b3Jrcy4gKi9cbiAgYWN0aXZpdHk6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IHN0ZXBzIHRoZSB0cmFjayBpcyBjdXQgaW50by4gRGVmYXVsdHMgdG8gMy4gKi9cbiAgc3RlcHM/OiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBzdGVwcyBhcmUgZmluaXNoZWQuIFRoZSBuZXh0IG9uZSBmaWxscyB3aGlsZSB0aGUgYWdlbnQgd29ya3MuICovXG4gIGRvbmU/OiBudW1iZXI7XG4gIC8qKiBIb3cgZmFyIHRoZSBhZ2VudCBpcyB0aHJvdWdoIHRoZSBzdGVwIGluIGhhbmQsIGZyb20gMCB0byAxLiBMZWF2ZSBpdCBvdXQgYW5kIHRoYXQgc3RlcCBmaWxscyBwYXJ0IHdheS4gKi9cbiAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBkaWQsIHNob3duIHdoZW4gdGhlIGxhbmUgaXMgb3BlbmVkLiBOZXcgZW50cmllcyBzbGlkZSBpbi4gKi9cbiAgbG9nPzogTGFuZUxvZ1tdO1xufVxuXG4vKiogT25lIGFnZW50IHBhc3Npbmcgd29yayB0byBhbm90aGVyOiBhIGxpZ2h0IHJ1bnMgZG93biB0aGUgcmVsYXkgbGluZSBiZXR3ZWVuIHRoZWlyIGJhZGdlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnRIYW5kb2ZmIHtcbiAgLyoqIEtleSBvZiB0aGUgbGFuZSBoYW5kaW5nIG92ZXIuICovXG4gIGZyb206IHN0cmluZztcbiAgLyoqIEtleSBvZiB0aGUgbGFuZSB0YWtpbmcgaXQuICovXG4gIHRvOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGNoYW5nZXMgaGFuZHMsIGxpa2UgXCJ0aGUgYnJpZWZcIi4gKi9cbiAgd2hhdDogc3RyaW5nO1xufVxuXG5jb25zdCBUT05FOiBSZWNvcmQ8TGFuZVRvbmUsIHN0cmluZz4gPSB7XG4gIGJsdWU6ICdwYicsXG4gIHB1cnBsZTogJ3BsJyxcbiAgZ3JlZW46ICdwbScsXG4gIG9yYW5nZTogJ3BwJyxcbiAgcmVkOiAncHInLFxuICB5ZWxsb3c6ICdweScsXG4gIHBpbms6ICdwaycsXG4gIHRlYWw6ICdwdCcsXG59O1xuY29uc3QgaHVlT2YgPSAobD86IEFnZW50TGFuZSk6IHN0cmluZyA9PiBUT05FW2w/LnRvbmUgPz8gJ2JsdWUnXTtcbmNvbnN0IGNsYW1wMDEgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG4pKTtcbmNvbnN0IGNsb2NrID0gKHM6IG51bWJlcik6IHN0cmluZyA9PlxuICBgJHtNYXRoLmZsb29yKHMgLyA2MCl9OiR7U3RyaW5nKHMgJSA2MCkucGFkU3RhcnQoMiwgJzAnKX1gO1xuXG4vKiogQSBsYW5lIHByZXBhcmVkIGZvciB0aGUgdGVtcGxhdGUuICovXG5pbnRlcmZhY2UgTGFuZVZpZXcge1xuICBsYW5lOiBBZ2VudExhbmU7XG4gIHN0YXR1czogTGFuZVN0YXR1cztcbiAgdG9uZTogc3RyaW5nO1xuICBsaXZlOiBib29sZWFuO1xuICBzZW50OiBib29sZWFuO1xuICBnb3Q6IGJvb2xlYW47XG4gIHBpbmc6IGJvb2xlYW47XG4gIG9wZW46IGJvb2xlYW47XG4gIGJhcnM6IEJhclZpZXdbXTtcbn1cblxuLyoqIE9uZSBzZWdtZW50IG9mIGEgbGFuZSdzIHN0ZXAgdHJhY2suICovXG5pbnRlcmZhY2UgQmFyVmlldyB7XG4gIG9uOiBib29sZWFuO1xuICBydW46IGJvb2xlYW47XG4gIGluZDogYm9vbGVhbjtcbiAgcHJvZ3Jlc3M/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgaGFuZC1vZmYgbGluZSBrZXB0IG9uIHNjcmVlbiAod2l0aCBpdHMgZXhpdCBzdGF0ZSB3aGlsZSBpdCBsZWF2ZXMpLiAqL1xuaW50ZXJmYWNlIEhhbmRWaWV3IHtcbiAga2V5OiBzdHJpbmc7XG4gIGZyb206IHN0cmluZztcbiAgdG86IHN0cmluZztcbiAgd2hhdDogc3RyaW5nO1xuICBmcm9tTmFtZTogc3RyaW5nO1xuICB0b05hbWU6IHN0cmluZztcbiAgZnJvbVRvbmU6IHN0cmluZztcbiAgdG9Ub25lOiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG4gIGxlYXZpbmc6IGJvb2xlYW47XG4gIGxpdDogYm9vbGVhbjtcbn1cblxuLyoqIEEgbGl0IHN0cmV0Y2ggb2YgdGhlIHJlbGF5IGxpbmUsIGRyYXduIGZyb20gb25lIGJhZGdlIGRvd24gdG8gdGhlIG5leHQuICovXG5pbnRlcmZhY2UgU3Ryb2tlVmlldyB7XG4gIGtleTogc3RyaW5nO1xuICBmcm9tOiBzdHJpbmc7XG4gIHRvOiBzdHJpbmc7XG4gIGZyb21Ub25lOiBzdHJpbmc7XG4gIHRvVG9uZTogc3RyaW5nO1xufVxuXG4vKiogU2V2ZXJhbCBhZ2VudHMgd29ya2luZyBpbiBwYXJhbGxlbCwgZWFjaCBpbiBpdHMgb3duIGxhbmUgYW5kIGh1ZSwgd2l0aCBoYW5kLW9mZnMgZG93biBhIHJlbGF5IGxpbmUuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1hZ2VudC1sYW5lcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1hbG5cIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtjbGFzcy52by1maW5dPVwiZmluaXNoZWRcIlxuICAgICAgW3N0eWxlLnBhZGRpbmctaW5saW5lXT1cImJhcmUgPyAnMCcgOiBudWxsXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tYWxuLWhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbG4taWNcIj5cbiAgICAgICAgICBAaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWVudGVyXCIgc3R5bGU9XCJkaXNwbGF5OmdyaWRcIj48dm8taWNvbiBuYW1lPVwib2tcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInVzZXJzXCI+PC92by1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXN3IHZvLWFsbi10XCI+e3sgaGVhZCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbG4tbSB2by1tdXRlZCB2by1udW1cIj57eyBjbG9ja1RleHQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3cgdm8tYWxuLWN0IHZvLW51bVwiPnt7IHN0ZXBzRG9uZSB9fSBvZiB7eyB0b3RhbCB9fSBzdGVwczwvc3Bhbj5cbiAgICAgICAgQGlmIChwYXVzZVdpcmVkICYmICFmaW5pc2hlZCkge1xuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1zb2Z0IHZvLXNtXCIgKGNsaWNrKT1cInRvZ2dsZVBhdXNlZCgpXCI+XG4gICAgICAgICAgICA8dm8taWNvbiBbbmFtZV09XCJpc1BhdXNlZCA/ICdwbGF5JyA6ICdwYXVzZSdcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB7eyBpc1BhdXNlZCA/ICdSZXN1bWUnIDogJ1BhdXNlIGFsbCcgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1hbG4tcm93c1wiICNyb3dzPlxuICAgICAgICBAZm9yICh2IG9mIHZpZXdzOyB0cmFjayB2LmxhbmUua2V5KSB7XG4gICAgICAgICAgQGlmIChoYW5kRm9yKHYubGFuZS5rZXkpOyBhcyBoKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tZm9sZCB2by1hbG4taGZcIlxuICAgICAgICAgICAgICBbY2xhc3Mudm8tc2h1dF09XCIhKGgub3BlbiAmJiAhaC5sZWF2aW5nKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy52by1saXRdPVwiaC5saXRcIlxuICAgICAgICAgICAgICBbYXR0ci5pbmVydF09XCJoLm9wZW4gJiYgIWgubGVhdmluZyA/IG51bGwgOiAnJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImgub3BlbiAmJiAhaC5sZWF2aW5nID8gbnVsbCA6ICd0cnVlJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXZvLWZyb21dPVwiJ3ZhcigtLXZvLScgKyBoLmZyb21Ub25lICsgJyknXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tdm8tdG9dPVwiJ3ZhcigtLXZvLScgKyBoLnRvVG9uZSArICcpJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFsbi1oYW5kIHZvLWVudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8YiBjbGFzcz1cInZvLWZcIj57eyBoLmZyb21OYW1lIH19PC9iPiBoYW5kZWQge3sgaC53aGF0IH19IHRvIDxiIGNsYXNzPVwidm8tdFwiPnt7IGgudG9OYW1lIH19PC9iPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZvLWFsbi1sYW5lXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1zZW50XT1cInYuc2VudFwiXG4gICAgICAgICAgICBbY2xhc3Mudm8tZ290XT1cInYuZ290XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtc109XCJ2LnN0YXR1c1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxhbmVdPVwidi5sYW5lLmtleVwiXG4gICAgICAgICAgICBbc3R5bGUuLS12by1jXT1cIid2YXIoLS12by0nICsgdi50b25lICsgJyknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWNiXT1cIid2YXIoLS12by0nICsgdi50b25lICsgJy1iZyknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWNtXT1cIid2YXIoLS12by1hbG4tJyArIHYudG9uZSArICcsdmFyKC0tdm8tJyArIHYudG9uZSArICcpKSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tYWxuLXJvd1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidi5vcGVuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUxhbmUodi5sYW5lLmtleSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi1hdlwiIFtjbGFzcy52by1waW5nXT1cInYucGluZ1wiPlxuICAgICAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cInYubGFuZS5pY29uXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxuLXdob1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxuLW5cIj57eyB2LmxhbmUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXN3IHZvLWFsbi1hXCIgW2NsYXNzLnZvLWxpdmVdPVwidi5saXZlXCIgW2NsYXNzLnZvLXNoaW1dPVwidi5zdGF0dXMgPT09ICd3b3JraW5nJ1wiPnt7IHYubGFuZS5hY3Rpdml0eSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi10clwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGIgb2Ygdi5iYXJzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJiLm9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLXJ1bl09XCJiLnJ1blwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1pbmRdPVwiYi5pbmRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS12by1wXT1cImIucHJvZ3Jlc3MgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsbi1zdFwiPlxuICAgICAgICAgICAgICAgIEBzd2l0Y2ggKHYuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ3dvcmtpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLWFsbi10Z1wiPjxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5Xb3JraW5nPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKCdwYXVzZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLXdhcm5cIj5QYXVzZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLW9rXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPkRvbmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ3dhaXRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnXCI+PHZvLWljb24gbmFtZT1cImNsb2NrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPldhaXRpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnXCI+UXVldWVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiF2Lm9wZW5cIiBbYXR0ci5pbmVydF09XCJ2Lm9wZW4gPyBudWxsIDogJydcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWxuLWRldFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAobCBvZiB2LmxhbmUubG9nID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWVudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbC50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAobC50aW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+e3sgbC50aW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgQGZvciAocyBvZiBzdHJva2VzOyB0cmFjayBzLmtleSkge1xuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInZvLWFsbi1wa1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWtdPVwicy5rZXlcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLWZyb21dPVwiJ3ZhcigtLXZvLWFsbi0nICsgcy5mcm9tVG9uZSArICcsdmFyKC0tdm8tJyArIHMuZnJvbVRvbmUgKyAnKSknXCJcbiAgICAgICAgICAgIFtzdHlsZS4tLXZvLXRvXT1cIid2YXIoLS12by1hbG4tJyArIHMudG9Ub25lICsgJyx2YXIoLS12by0nICsgcy50b1RvbmUgKyAnKSknXCJcbiAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2FnZW50LWxhbmVzLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEFnZW50TGFuZXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGxhbmVzOiBBZ2VudExhbmVbXSA9IFtdO1xuICAvKiogSGVhZGVyIHRleHQuIERlZmF1bHRzIHRvIFwiTiBhZ2VudHMgd29ya2luZ1wiLCBcIkFsbCBhZ2VudHMgcGF1c2VkXCIgb3IgXCJBbGwgTiBhZ2VudHMgZmluaXNoZWRcIi4gKi9cbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBTZWNvbmRzIHRvIHNob3cgYXMgbTpzcy4gTGVhdmUgaXQgb3V0IHRvIGxldCB0aGUgaGVhZGVyIGNvdW50IHdoaWxlIGFnZW50cyB3b3JrLiAqL1xuICBASW5wdXQoKSBzZWNvbmRzPzogbnVtYmVyO1xuICAvKiogV2hldGhlciBldmVyeSBhZ2VudCBpcyBwYXVzZWQuIFdvcmtpbmcgbGFuZXMgdGhlbiBzaG93IFBhdXNlZCBhbmQgdGhlIGNsb2NrIHN0b3BzLiAqL1xuICBASW5wdXQoKSBzZXQgcGF1c2VkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXVzZWRDb250cm9sbGVkID0gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgdGhpcy5pbm5lclBhdXNlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRQYXVzZWQgPSBmYWxzZTtcbiAgLyoqIEFkZHMgdGhlIFBhdXNlIGFsbCAvIFJlc3VtZSBidXR0b24sIHVudGlsIGV2ZXJ5IGxhbmUgaXMgZG9uZSAoUmVhY3Q6IG9uUGF1c2VkQ2hhbmdlIHdpcmVkKS4gKi9cbiAgQElucHV0KCkgcGF1c2VXaXJlZCA9IGZhbHNlO1xuICAvKiogVGhlIGhhbmRvZmYgdG8gc2hvdy4gU2V0IGl0IGJhY2sgdG8gdW5kZWZpbmVkIGFuZCBpdHMgbGluZSBzbGlkZXMgYXdheTsgdGhlIHN0cmV0Y2ggaXQgY3Jvc3NlZCBzdGF5cyBsaXQuICovXG4gIEBJbnB1dCgpIGhhbmRvZmY/OiBBZ2VudEhhbmRvZmY7XG4gIC8qKiBLZXlzIG9mIHRoZSBsYW5lcyB0aGF0IGFyZSBvcGVuLiBMZWF2ZSBpdCBvdXQgdG8gbGV0IGVhY2ggcm93IHRvZ2dsZSBpdHNlbGYuICovXG4gIEBJbnB1dCgpIHNldCBleHBhbmRlZCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmV4cGFuZGVkQ29udHJvbGxlZCA9IHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMuaW5uZXJFeHBhbmRlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRFeHBhbmRlZDogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFNpdHMgZmxhdCBpbiBhIGNoYXQgdGhyZWFkICh0aGUgZGVmYXVsdCkuIFNldCBmYWxzZSB0byBnaXZlIGl0IGEgY2FyZCBvZiBpdHMgb3duLiAqL1xuICBASW5wdXQoKSBiYXJlID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgcGF1c2VkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Jvd3MnKSBwcml2YXRlIHJvd3NSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIHBhdXNlZENvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBleHBhbmRlZENvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbm5lclBhdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlubmVyRXhwYW5kZWQ6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY291bnRlZCA9IDA7XG4gIHByaXZhdGUgdGljaz86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcblxuICAvLyB0aGUgaGFuZC1vZmYga2VwdCBvbiBzY3JlZW4sIHNvIGl0IGNhbiBwbGF5IGl0cyBleGl0IGFmdGVyIGBoYW5kb2ZmYCBpcyBjbGVhcmVkXG4gIHByaXZhdGUga2VwdD86IEFnZW50SGFuZG9mZjtcbiAgcHJpdmF0ZSBrZXB0VGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBoYW5kT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW5GcmFtZT86IG51bWJlcjtcbiAgcHJpdmF0ZSBoYW5kUmFmPzogbnVtYmVyO1xuXG4gIC8vIHRoZSBoYW5kLW9mZnMgd2hvc2UgbGlnaHQgaGFzIGFycml2ZWQ6IHRoZWlyIHN0cmV0Y2ggb2YgcmVsYXkgbGluZSBzdGF5cyBsaXRcbiAgcHJpdmF0ZSByZWxheWVkOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGRyYXdpbmc/OiBzdHJpbmc7XG4gIHByaXZhdGUgcGluZ2VkPzogc3RyaW5nO1xuICBwcml2YXRlIGRyYXdUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHBpbmdUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIGxhc3RIYW5kS2V5ID0gJyc7XG5cbiAgcHJpdmF0ZSBybz86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVkdWNlZDogUmVkdWNlZE1vdGlvblNlcnZpY2UpIHt9XG5cbiAgLy8gLS0tLS0gY29udHJvbGxhYmxlIHN0YXRlIC0tLS0tXG5cbiAgZ2V0IGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlubmVyUGF1c2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgZXhwYW5kZWRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbm5lckV4cGFuZGVkO1xuICB9XG5cbiAgdG9nZ2xlUGF1c2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc1BhdXNlZDtcbiAgICBpZiAoIXRoaXMucGF1c2VkQ29udHJvbGxlZCkgdGhpcy5pbm5lclBhdXNlZCA9IG5leHQ7XG4gICAgdGhpcy5wYXVzZWRDaGFuZ2UuZW1pdChuZXh0KTtcbiAgfVxuXG4gIHRvZ2dsZUxhbmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBvcGVuID0gdGhpcy5leHBhbmRlZEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBuZXh0ID0gb3BlbiA/IHRoaXMuZXhwYW5kZWRLZXlzLmZpbHRlcigoaykgPT4gayAhPT0ga2V5KSA6IFsuLi50aGlzLmV4cGFuZGVkS2V5cywga2V5XTtcbiAgICBpZiAoIXRoaXMuZXhwYW5kZWRDb250cm9sbGVkKSB0aGlzLmlubmVyRXhwYW5kZWQgPSBuZXh0O1xuICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdChuZXh0KTtcbiAgfVxuXG4gIC8vIC0tLS0tIGRlcml2ZWQgdmlldyBzdGF0ZSAtLS0tLVxuXG4gIGdldCBmaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5sZW5ndGggPiAwICYmIHRoaXMubGFuZXMuZXZlcnkoKGwpID0+IGwuc3RhdHVzID09PSAnZG9uZScpO1xuICB9XG5cbiAgZ2V0IGhlYWQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50aXRsZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy50aXRsZTtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuIGBBbGwgJHt0aGlzLmxhbmVzLmxlbmd0aH0gYWdlbnRzIGZpbmlzaGVkYDtcbiAgICBpZiAodGhpcy5pc1BhdXNlZCkgcmV0dXJuICdBbGwgYWdlbnRzIHBhdXNlZCc7XG4gICAgcmV0dXJuIGAke3RoaXMubGFuZXMubGVuZ3RofSBhZ2VudHMgd29ya2luZ2A7XG4gIH1cblxuICBnZXQgY2xvY2tUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsb2NrKHRoaXMuc2Vjb25kcyA/PyB0aGlzLmNvdW50ZWQpO1xuICB9XG5cbiAgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubGFuZXMucmVkdWNlKChuLCBsKSA9PiBuICsgKGwuc3RlcHMgPz8gMyksIDApO1xuICB9XG5cbiAgZ2V0IHN0ZXBzRG9uZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmxhbmVzLnJlZHVjZSgobiwgbCkgPT4gbiArIE1hdGgubWluKGwuZG9uZSA/PyAwLCBsLnN0ZXBzID8/IDMpLCAwKTtcbiAgfVxuXG4gIGdldCB2aWV3cygpOiBMYW5lVmlld1tdIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5tYXAoKGxhbmUpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1czogTGFuZVN0YXR1cyA9IHRoaXMuaXNQYXVzZWQgJiYgbGFuZS5zdGF0dXMgPT09ICd3b3JraW5nJyA/ICdwYXVzZWQnIDogbGFuZS5zdGF0dXM7XG4gICAgICBjb25zdCBzdGVwcyA9IGxhbmUuc3RlcHMgPz8gMztcbiAgICAgIGNvbnN0IGRvbmUgPSBsYW5lLmRvbmUgPz8gMDtcbiAgICAgIGNvbnN0IGxpdmUgPSBzdGF0dXMgPT09ICd3b3JraW5nJyB8fCBzdGF0dXMgPT09ICdwYXVzZWQnO1xuICAgICAgY29uc3QgYmFyczogQmFyVmlld1tdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogc3RlcHMgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgcnVuID0gaSA9PT0gZG9uZSAmJiBsaXZlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9uOiBpIDwgZG9uZSxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgaW5kOiBydW4gJiYgbGFuZS5wcm9ncmVzcyA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2dyZXNzOiBydW4gJiYgbGFuZS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkID8gY2xhbXAwMShsYW5lLnByb2dyZXNzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFuZSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICB0b25lOiBodWVPZihsYW5lKSxcbiAgICAgICAgbGl2ZSxcbiAgICAgICAgc2VudDogdGhpcy5yZWxheWVkLnNvbWUoKGspID0+IGsuc3RhcnRzV2l0aChsYW5lLmtleSArICc+JykpLFxuICAgICAgICBnb3Q6IHRoaXMucmVsYXllZC5zb21lKChrKSA9PiBrLmVuZHNXaXRoKCc+JyArIGxhbmUua2V5KSksXG4gICAgICAgIHBpbmc6IHRoaXMucGluZ2VkID09PSBsYW5lLmtleSxcbiAgICAgICAgb3BlbjogdGhpcy5leHBhbmRlZEtleXMuaW5jbHVkZXMobGFuZS5rZXkpLFxuICAgICAgICBiYXJzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmFtZU9mKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sYW5lcy5maW5kKChsKSA9PiBsLmtleSA9PT0ga2V5KT8ubmFtZSA/PyBrZXk7XG4gIH1cblxuICBwcml2YXRlIHRvbmVPZihrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGh1ZU9mKHRoaXMubGFuZXMuZmluZCgobCkgPT4gbC5rZXkgPT09IGtleSkpO1xuICB9XG5cbiAgLyoqIFRoZSBoYW5kLW9mZiBsaW5lIHRvIHJlbmRlciBiZWZvcmUgdGhlIGxhbmUgaXQgaXMgaGFuZGVkIHRvLCBvciB1bmRlZmluZWQuICovXG4gIGhhbmRGb3IobGFuZUtleTogc3RyaW5nKTogSGFuZFZpZXcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGggPSB0aGlzLmtlcHQ7XG4gICAgaWYgKCFoIHx8IGgudG8gIT09IGxhbmVLZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2V5ID0gYCR7aC5mcm9tfT4ke2gudG99YDtcbiAgICByZXR1cm4ge1xuICAgICAga2V5LFxuICAgICAgZnJvbTogaC5mcm9tLFxuICAgICAgdG86IGgudG8sXG4gICAgICB3aGF0OiBoLndoYXQsXG4gICAgICBmcm9tTmFtZTogdGhpcy5uYW1lT2YoaC5mcm9tKSxcbiAgICAgIHRvTmFtZTogdGhpcy5uYW1lT2YoaC50byksXG4gICAgICBmcm9tVG9uZTogdGhpcy50b25lT2YoaC5mcm9tKSxcbiAgICAgIHRvVG9uZTogdGhpcy50b25lT2YoaC50byksXG4gICAgICBvcGVuOiB0aGlzLmhhbmRPcGVuLFxuICAgICAgbGVhdmluZzogdGhpcy5oYW5kb2ZmID09PSB1bmRlZmluZWQsXG4gICAgICBsaXQ6IHRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpLFxuICAgIH07XG4gIH1cblxuICBnZXQgc3Ryb2tlcygpOiBTdHJva2VWaWV3W10ge1xuICAgIGNvbnN0IGtleXMgPVxuICAgICAgdGhpcy5kcmF3aW5nICYmICF0aGlzLnJlbGF5ZWQuaW5jbHVkZXModGhpcy5kcmF3aW5nKVxuICAgICAgICA/IFsuLi50aGlzLnJlbGF5ZWQsIHRoaXMuZHJhd2luZ11cbiAgICAgICAgOiB0aGlzLnJlbGF5ZWQ7XG4gICAgcmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IFtmcm9tLCB0b10gPSBrZXkuc3BsaXQoJz4nKTtcbiAgICAgIHJldHVybiB7IGtleSwgZnJvbSwgdG8sIGZyb21Ub25lOiB0aGlzLnRvbmVPZihmcm9tKSwgdG9Ub25lOiB0aGlzLnRvbmVPZih0bykgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tIGxpZmVjeWNsZSAtLS0tLVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGF1c2VkQ29udHJvbGxlZCkgdGhpcy5pbm5lclBhdXNlZCA9IHRoaXMuZGVmYXVsdFBhdXNlZDtcbiAgICBpZiAoIXRoaXMuZXhwYW5kZWRDb250cm9sbGVkICYmIHRoaXMuaW5uZXJFeHBhbmRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaW5uZXJFeHBhbmRlZCA9IFsuLi50aGlzLmRlZmF1bHRFeHBhbmRlZF07XG4gICAgfVxuICAgIHRoaXMuc3RhcnRDb3VudGVyKCk7XG4gICAgY29uc3QgYm94ID0gdGhpcy5yb3dzUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChib3ggJiYgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMucGxhY2VTdHJva2VzKCkpO1xuICAgICAgdGhpcy5yby5vYnNlcnZlKGJveCk7XG4gICAgfVxuICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlY29uZHMnXSB8fCBjaGFuZ2VzWydwYXVzZWQnXSB8fCBjaGFuZ2VzWydsYW5lcyddKSB0aGlzLnN0YXJ0Q291bnRlcigpO1xuICAgIGlmIChjaGFuZ2VzWydoYW5kb2ZmJ10pIHRoaXMub25IYW5kb2ZmQ2hhbmdlKCk7XG4gICAgaWYgKGNoYW5nZXNbJ2xhbmVzJ10pIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMucGxhY2VTdHJva2VzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhhbmRvZmZDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgaCA9IHRoaXMuaGFuZG9mZjtcbiAgICBpZiAoaCkge1xuICAgICAgLy8gYnJpbmcgdGhlIGxpbmUgaW46IG1vdW50IHNodXQsIHRoZW4gb3BlbiBvbiB0aGUgbmV4dCBmcmFtZSBzbyB0aGUgbGFuZXMgYmVsb3cgZ2xpZGUgZG93blxuICAgICAgdGhpcy5rZXB0ID0gaDtcbiAgICAgIGlmICh0aGlzLmtlcHRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5rZXB0VGltZXIpO1xuICAgICAgICB0aGlzLmtlcHRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVPcGVuKCk7XG4gICAgICBjb25zdCBrZXkgPSBgJHtoLmZyb219PiR7aC50b31gO1xuICAgICAgdGhpcy5sYXN0SGFuZEtleSA9IGtleTtcbiAgICAgIGlmICghdGhpcy5yZWxheWVkLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhd1RpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5kcmF3VGltZXIpO1xuICAgICAgICB0aGlzLmRyYXdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zdGFydERyYXcoa2V5KSwgdGhpcy5yZWR1Y2VkLnJlZHVjZSgpID8gMCA6IDUwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGtlZXAgdGhlIGxhc3Qgb25lIG9uIHNjcmVlbiB3aGlsZSBpdCBwbGF5cyBpdHMgZXhpdFxuICAgICAgdGhpcy5oYW5kT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMua2VwdCAmJiAhdGhpcy5rZXB0VGltZXIpIHtcbiAgICAgICAgdGhpcy5rZXB0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmtlcHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5rZXB0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0sIHRoaXMucmVkdWNlZC5yZWR1Y2UoKSA/IDAgOiA3MDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVPcGVuKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhbmRSYWYpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuaGFuZFJhZik7XG4gICAgaWYgKHRoaXMub3BlbkZyYW1lKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLm9wZW5GcmFtZSk7XG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5oYW5kUmFmID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMub3BlbkZyYW1lID0gcmFmKCgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kT3BlbiA9IHRydWU7XG4gICAgICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREcmF3KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgdGhpcy5kcmF3aW5nID0ga2V5O1xuICAgIHRoaXMucGxhY2VTdHJva2VzKCk7XG4gICAgY29uc3QgdG8gPSBrZXkuc3BsaXQoJz4nKVsxXTtcbiAgICBjb25zdCBhcnJpdmUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMucmVsYXllZC5pbmNsdWRlcyhrZXkpKSB0aGlzLnJlbGF5ZWQgPSBbLi4udGhpcy5yZWxheWVkLCBrZXldO1xuICAgICAgaWYgKHRoaXMuZHJhd2luZyA9PT0ga2V5KSB0aGlzLmRyYXdpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnBpbmdlZCA9IHRvO1xuICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5waW5nVGltZXIpO1xuICAgICAgdGhpcy5waW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGluZ2VkID09PSB0bykgdGhpcy5waW5nZWQgPSB1bmRlZmluZWQ7XG4gICAgICB9LCA5NTApO1xuICAgICAgdGhpcy5wbGFjZVN0cm9rZXMoKTtcbiAgICB9O1xuICAgIC8vIHRoZSBzdHJva2UgZHJhd3MgaXRzZWxmIGZyb20gdGhlIHNlbmRlcidzIGJhZGdlIGRvd24gdG8gdGhlIHRha2VyJ3NcbiAgICBjb25zdCBwayA9IHRoaXMucm93c1JlZj8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcbiAgICAgIGA6c2NvcGU+LnZvLWFsbi1wa1tkYXRhLWs9XCIke0NTUy5lc2NhcGUoa2V5KX1cIl1gLFxuICAgICk7XG4gICAgaWYgKCFwayB8fCB0aGlzLnJlZHVjZWQucmVkdWNlKCkpIHtcbiAgICAgIGFycml2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbiA9IHBrLmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVZKDApJyB9LCB7IHRyYW5zZm9ybTogJ3NjYWxlWSgxKScgfV0sIHtcbiAgICAgIGR1cmF0aW9uOiA4MDAsXG4gICAgICBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjY1LDAsLjM1LDEpJyxcbiAgICB9KTtcbiAgICBhbi5maW5pc2hlZC50aGVuKGFycml2ZSwgKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqIExheSBlYWNoIGxpdCBzdHJva2UgZnJvbSB0aGUgc2VuZGVyJ3MgYmFkZ2UgZG93biB0byB0aGUgdGFrZXIncywgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoZW0uICovXG4gIHByaXZhdGUgcGxhY2VTdHJva2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IHRoaXMucm93c1JlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWJveCkgcmV0dXJuO1xuICAgIGNvbnN0IHJyID0gYm94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGJveC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlPi52by1hbG4tcGsnKS5mb3JFYWNoKChwaykgPT4ge1xuICAgICAgY29uc3QgW2YsIGddID0gKHBrLmRhdGFzZXRbJ2snXSA/PyAnJykuc3BsaXQoJz4nKTtcbiAgICAgIGNvbnN0IGEgPSBib3gucXVlcnlTZWxlY3RvcihgW2RhdGEtbGFuZT1cIiR7Q1NTLmVzY2FwZShmKX1cIl0gLnZvLWFsbi1hdmApO1xuICAgICAgY29uc3QgYiA9IGJveC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1sYW5lPVwiJHtDU1MuZXNjYXBlKGcpfVwiXSAudm8tYWxuLWF2YCk7XG4gICAgICBpZiAoIWEgfHwgIWIpIHJldHVybjtcbiAgICAgIGNvbnN0IHkwID0gYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSByci50b3AgKyA0O1xuICAgICAgY29uc3QgeTEgPSBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHJyLnRvcCAtIDQ7XG4gICAgICBway5zdHlsZS50b3AgPSB5MCArICdweCc7XG4gICAgICBway5zdHlsZS5oZWlnaHQgPSBNYXRoLm1heCgwLCB5MSAtIHkwKSArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q291bnRlcigpOiB2b2lkIHtcbiAgICBjb25zdCBzaG91bGRDb3VudCA9XG4gICAgICB0aGlzLnNlY29uZHMgPT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1BhdXNlZCAmJiAhdGhpcy5maW5pc2hlZCAmJiAhdGhpcy5yZWR1Y2VkLnJlZHVjZSgpO1xuICAgIGlmIChzaG91bGRDb3VudCAmJiAhdGhpcy50aWNrKSB7XG4gICAgICB0aGlzLnRpY2sgPSBzZXRJbnRlcnZhbCgoKSA9PiAodGhpcy5jb3VudGVkICs9IDEpLCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKCFzaG91bGRDb3VudCAmJiB0aGlzLnRpY2spIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aWNrKTtcbiAgICAgIHRoaXMudGljayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aWNrKSBjbGVhckludGVydmFsKHRoaXMudGljayk7XG4gICAgaWYgKHRoaXMua2VwdFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5rZXB0VGltZXIpO1xuICAgIGlmICh0aGlzLmRyYXdUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuZHJhd1RpbWVyKTtcbiAgICBpZiAodGhpcy5waW5nVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lcik7XG4gICAgaWYgKHRoaXMuaGFuZFJhZikgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5oYW5kUmFmKTtcbiAgICBpZiAodGhpcy5vcGVuRnJhbWUpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMub3BlbkZyYW1lKTtcbiAgICB0aGlzLnJvPy5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdfQ==