@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,177 @@
1
+ // framework/angular/action-log/action-log.component.ts
2
+ //
3
+ // Native Angular port of framework/react/action-log/ActionLog.tsx.
4
+ // Every tool call the agent makes, as a list that grows while it works. Each row
5
+ // opens to show its output. Inputs mirror the React props; callbacks become
6
+ // @Output EventEmitters. The header shows a spinner while running and a green dot
7
+ // once done, as in the vanilla JS (action-log.js).
8
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
9
+ import { VoIconComponent } from '../core/icon.component';
10
+ import * as i0 from "@angular/core";
11
+ export class ActionLogComponent {
12
+ constructor() {
13
+ /** The tool calls, newest at the end. */
14
+ this.actions = [];
15
+ this.title = 'Agent activity';
16
+ /** Shows a spinner in the header while true, and a green dot once false. */
17
+ this.running = true;
18
+ /** Sits flat in a chat thread (the default). Set false to give it a card. */
19
+ this.bare = true;
20
+ /** Emitted when a row opens or closes, with its index and the new open state. */
21
+ this.toggleRow = new EventEmitter();
22
+ this.open = new Set();
23
+ }
24
+ isOpen(i) {
25
+ return this.open.has(i);
26
+ }
27
+ toggle(i) {
28
+ const next = !this.open.has(i);
29
+ if (next)
30
+ this.open.add(i);
31
+ else
32
+ this.open.delete(i);
33
+ this.toggleRow.emit({ index: i, open: next });
34
+ }
35
+ get words() {
36
+ if (this.status)
37
+ return this.status;
38
+ if (this.running) {
39
+ return this.actions.length ? `Running step ${this.actions.length}` : 'Running';
40
+ }
41
+ const total = this.actions.reduce((s, a) => s + (parseFloat(a.time ?? '') || 0), 0);
42
+ return `${this.actions.length} steps${total ? `, ${total.toFixed(1)}s` : ''}`;
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActionLogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
45
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ActionLogComponent, isStandalone: true, selector: "vo-action-log", inputs: { actions: "actions", title: "title", running: "running", status: "status", bare: "bare" }, outputs: { toggleRow: "toggleRow" }, ngImport: i0, template: `
46
+ <div
47
+ data-vo=""
48
+ class="vo-alg"
49
+ [class.vo-panel]="!bare"
50
+ [style.padding-inline]="bare ? '0' : null"
51
+ >
52
+ <div class="vo-alg-h">
53
+ <span class="vo-alg-t">{{ title }}</span>
54
+ @if (running) {
55
+ <span class="vo-alg-st">
56
+ <span class="vo-spin"></span>
57
+ <span class="vo-sw vo-alg-sum">{{ words }}</span>
58
+ </span>
59
+ } @else {
60
+ <span class="vo-alg-st vo-enter">
61
+ <span class="vo-dot" style="color:var(--vo-ok)"></span>
62
+ <span>{{ words }}</span>
63
+ </span>
64
+ }
65
+ </div>
66
+ <ol class="vo-alg-list">
67
+ @for (a of actions; track $index) {
68
+ <li class="vo-alg-it vo-enter">
69
+ <button
70
+ type="button"
71
+ class="vo-alg-row"
72
+ [attr.aria-expanded]="a.output ? isOpen($index) : null"
73
+ (click)="toggle($index)"
74
+ >
75
+ <span class="vo-alg-ic"><vo-icon [name]="a.icon" size="sm"></vo-icon></span>
76
+ <span class="vo-alg-tx">
77
+ <b [innerHTML]="a.title"></b>
78
+ @if (a.detail) {
79
+ <span class="vo-d" [innerHTML]="a.detail"></span>
80
+ }
81
+ </span>
82
+ <span class="vo-alg-r">
83
+ <span class="vo-num vo-ms">{{ a.state === 'done' ? a.time : '' }}</span>
84
+ <span class="vo-g">
85
+ @if (a.state === 'done') {
86
+ <span class="vo-enter" style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
87
+ } @else {
88
+ <span class="vo-spin" style="width:10px;height:10px"></span>
89
+ }
90
+ </span>
91
+ </span>
92
+ </button>
93
+ @if (a.output) {
94
+ <div class="vo-fold vo-alg-det" [class.vo-shut]="!isOpen($index)" [attr.inert]="isOpen($index) ? null : ''" [attr.aria-hidden]="!isOpen($index)">
95
+ <div><pre [innerHTML]="a.output"></pre></div>
96
+ </div>
97
+ }
98
+ </li>
99
+ }
100
+ </ol>
101
+ </div>
102
+ `, isInline: true, styles: [".vo-alg{padding:var(--vo-s-2)}.vo-alg-h{display:flex;align-items:center;justify-content:space-between;padding:var(--vo-s-2) 10px 6px}.vo-alg-t{font-weight:500}.vo-alg-st{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--vo-fg2)}.vo-alg-st .vo-spin{width:10px;height:10px}.vo-alg-list{list-style:none;margin:0;padding:0}.vo-alg-it{border-radius:var(--vo-r-in);transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover{background:var(--vo-row)}}.vo-alg-row{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;text-align:left;cursor:pointer}.vo-alg-ic{width:26px;height:26px;border-radius:var(--vo-r-sm);background:var(--vo-chip);display:grid;place-items:center;color:var(--vo-fg2);flex:none;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover .vo-alg-ic{background:var(--vo-surface)}}.vo-alg-tx{flex:1;min-width:0}.vo-alg-tx b{font-weight:500}.vo-alg-tx code{font-family:var(--vo-mono);font-size:12px}.vo-alg-tx .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-alg-r{display:flex;align-items:center;gap:var(--vo-s-2);color:var(--vo-muted);font-size:12px}.vo-alg-r .vo-g{width:14px;display:grid;place-items:center}.vo-alg-det{margin:0 10px 0 46px}.vo-alg-det pre{margin:0 0 10px;font-family:var(--vo-mono);font-size:11.5px;line-height:1.6;background:var(--vo-surface);border-radius:calc(10px * var(--vo-rk));padding:var(--vo-s-2) 10px;white-space:pre-wrap;color:var(--vo-fg2);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-alg-det .vo-a{color:var(--vo-add)}.vo-alg-det .vo-x{color:var(--vo-del)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.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-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-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)}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
103
+ }
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActionLogComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'vo-action-log', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
107
+ <div
108
+ data-vo=""
109
+ class="vo-alg"
110
+ [class.vo-panel]="!bare"
111
+ [style.padding-inline]="bare ? '0' : null"
112
+ >
113
+ <div class="vo-alg-h">
114
+ <span class="vo-alg-t">{{ title }}</span>
115
+ @if (running) {
116
+ <span class="vo-alg-st">
117
+ <span class="vo-spin"></span>
118
+ <span class="vo-sw vo-alg-sum">{{ words }}</span>
119
+ </span>
120
+ } @else {
121
+ <span class="vo-alg-st vo-enter">
122
+ <span class="vo-dot" style="color:var(--vo-ok)"></span>
123
+ <span>{{ words }}</span>
124
+ </span>
125
+ }
126
+ </div>
127
+ <ol class="vo-alg-list">
128
+ @for (a of actions; track $index) {
129
+ <li class="vo-alg-it vo-enter">
130
+ <button
131
+ type="button"
132
+ class="vo-alg-row"
133
+ [attr.aria-expanded]="a.output ? isOpen($index) : null"
134
+ (click)="toggle($index)"
135
+ >
136
+ <span class="vo-alg-ic"><vo-icon [name]="a.icon" size="sm"></vo-icon></span>
137
+ <span class="vo-alg-tx">
138
+ <b [innerHTML]="a.title"></b>
139
+ @if (a.detail) {
140
+ <span class="vo-d" [innerHTML]="a.detail"></span>
141
+ }
142
+ </span>
143
+ <span class="vo-alg-r">
144
+ <span class="vo-num vo-ms">{{ a.state === 'done' ? a.time : '' }}</span>
145
+ <span class="vo-g">
146
+ @if (a.state === 'done') {
147
+ <span class="vo-enter" style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
148
+ } @else {
149
+ <span class="vo-spin" style="width:10px;height:10px"></span>
150
+ }
151
+ </span>
152
+ </span>
153
+ </button>
154
+ @if (a.output) {
155
+ <div class="vo-fold vo-alg-det" [class.vo-shut]="!isOpen($index)" [attr.inert]="isOpen($index) ? null : ''" [attr.aria-hidden]="!isOpen($index)">
156
+ <div><pre [innerHTML]="a.output"></pre></div>
157
+ </div>
158
+ }
159
+ </li>
160
+ }
161
+ </ol>
162
+ </div>
163
+ `, styles: [".vo-alg{padding:var(--vo-s-2)}.vo-alg-h{display:flex;align-items:center;justify-content:space-between;padding:var(--vo-s-2) 10px 6px}.vo-alg-t{font-weight:500}.vo-alg-st{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--vo-fg2)}.vo-alg-st .vo-spin{width:10px;height:10px}.vo-alg-list{list-style:none;margin:0;padding:0}.vo-alg-it{border-radius:var(--vo-r-in);transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover{background:var(--vo-row)}}.vo-alg-row{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;text-align:left;cursor:pointer}.vo-alg-ic{width:26px;height:26px;border-radius:var(--vo-r-sm);background:var(--vo-chip);display:grid;place-items:center;color:var(--vo-fg2);flex:none;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover .vo-alg-ic{background:var(--vo-surface)}}.vo-alg-tx{flex:1;min-width:0}.vo-alg-tx b{font-weight:500}.vo-alg-tx code{font-family:var(--vo-mono);font-size:12px}.vo-alg-tx .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-alg-r{display:flex;align-items:center;gap:var(--vo-s-2);color:var(--vo-muted);font-size:12px}.vo-alg-r .vo-g{width:14px;display:grid;place-items:center}.vo-alg-det{margin:0 10px 0 46px}.vo-alg-det pre{margin:0 0 10px;font-family:var(--vo-mono);font-size:11.5px;line-height:1.6;background:var(--vo-surface);border-radius:calc(10px * var(--vo-rk));padding:var(--vo-s-2) 10px;white-space:pre-wrap;color:var(--vo-fg2);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-alg-det .vo-a{color:var(--vo-add)}.vo-alg-det .vo-x{color:var(--vo-del)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.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-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-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)}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"] }]
164
+ }], propDecorators: { actions: [{
165
+ type: Input
166
+ }], title: [{
167
+ type: Input
168
+ }], running: [{
169
+ type: Input
170
+ }], status: [{
171
+ type: Input
172
+ }], bare: [{
173
+ type: Input
174
+ }], toggleRow: [{
175
+ type: Output
176
+ }] } });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb24tbG9nL2FjdGlvbi1sb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsbUVBQW1FO0FBQ25FLGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsa0ZBQWtGO0FBQ2xGLG1EQUFtRDtBQUVuRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHdCQUF3QixDQUFDOztBQW9GMUUsTUFBTSxPQUFPLGtCQUFrQjtJQWpFL0I7UUFrRUUseUNBQXlDO1FBQ2hDLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDdkIsVUFBSyxHQUFHLGdCQUFnQixDQUFDO1FBQ2xDLDRFQUE0RTtRQUNuRSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR3hCLDZFQUE2RTtRQUNwRSxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBRXJCLGlGQUFpRjtRQUN2RSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQW9DLENBQUM7UUFFMUQsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7S0FxQjNDO0lBbkJDLE1BQU0sQ0FBQyxDQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxDQUFDLENBQVM7UUFDZCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDaEYsQ0FBQzsrR0FsQ1Usa0JBQWtCO21HQUFsQixrQkFBa0Isa05BNURuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURULHVoR0ExRFMsZUFBZTs7NEZBNkRkLGtCQUFrQjtrQkFqRTlCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURUOzhCQUtRLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0ksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2FjdGlvbi1sb2cvYWN0aW9uLWxvZy5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9hY3Rpb24tbG9nL0FjdGlvbkxvZy50c3guXG4vLyBFdmVyeSB0b29sIGNhbGwgdGhlIGFnZW50IG1ha2VzLCBhcyBhIGxpc3QgdGhhdCBncm93cyB3aGlsZSBpdCB3b3Jrcy4gRWFjaCByb3dcbi8vIG9wZW5zIHRvIHNob3cgaXRzIG91dHB1dC4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IGNhbGxiYWNrcyBiZWNvbWVcbi8vIEBPdXRwdXQgRXZlbnRFbWl0dGVycy4gVGhlIGhlYWRlciBzaG93cyBhIHNwaW5uZXIgd2hpbGUgcnVubmluZyBhbmQgYSBncmVlbiBkb3Rcbi8vIG9uY2UgZG9uZSwgYXMgaW4gdGhlIHZhbmlsbGEgSlMgKGFjdGlvbi1sb2cuanMpLlxuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50LCB0eXBlIFZvSWNvbk5hbWUgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcblxuLyoqIE9uZSB0b29sIGNhbGwgaW4gdGhlIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uIHtcbiAgLyoqIFRoZSB0b29sJ3MgaWNvbiwgbGlrZSAnZmlsZS10ZXh0JywgJ3NlYXJjaCcsICdlZGl0JywgJ3Rlcm0nIG9yICdwcicuICovXG4gIGljb246IFZvSWNvbk5hbWU7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBkaWQuIEhUTUwgaXMgYWxsb3dlZCAod3JhcCBmaWxlIG5hbWVzIGluIDxjb2RlPikuICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBUaGUgcXVpZXQgbGluZSB1bmRlciBpdCwgbGlrZSBcInNyYy9wYWdlcywgMjEyIGxpbmVzXCIuIEhUTUwgaXMgYWxsb3dlZC4gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xuICAvKiogcnVubmluZyBzaG93cyBhIHNwaW5uZXIsIGRvbmUgYSBjaGVjayBhbmQgdGhlIHRpbWUuICovXG4gIHN0YXRlOiAncnVubmluZycgfCAnZG9uZSc7XG4gIC8qKiBIb3cgbG9uZyBpdCB0b29rLCBsaWtlIFwiMC40c1wiLiBTaG93biBvbmNlIHRoZSBhY3Rpb24gaXMgZG9uZS4gKi9cbiAgdGltZT86IHN0cmluZztcbiAgLyoqIFdoYXQgb3BlbnMgdW5kZXIgdGhlIHJvdywgbGlrZSBhIGRpZmYgb3IgdGVzdCBvdXRwdXQuIEhUTUwgaXMgYWxsb3dlZDtcbiAgICogIGxpbmVzIGluIDxzcGFuIGNsYXNzPVwidm8tYVwiPiBvciBcInZvLXhcIiByZWFkIGFzIGFkZGVkIG9yIHJlbW92ZWQuICovXG4gIG91dHB1dD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tYWN0aW9uLWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1hbGdcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtzdHlsZS5wYWRkaW5nLWlubGluZV09XCJiYXJlID8gJzAnIDogbnVsbFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWFsZy1oXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXRcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgQGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbGctc3RcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3cgdm8tYWxnLXN1bVwiPnt7IHdvcmRzIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbGctc3Qgdm8tZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZG90XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS12by1vaylcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyB3b3JkcyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPG9sIGNsYXNzPVwidm8tYWxnLWxpc3RcIj5cbiAgICAgICAgQGZvciAoYSBvZiBhY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8bGkgY2xhc3M9XCJ2by1hbGctaXQgdm8tZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tYWxnLXJvd1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYS5vdXRwdXQgPyBpc09wZW4oJGluZGV4KSA6IG51bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKCRpbmRleClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsZy1pY1wiPjx2by1pY29uIFtuYW1lXT1cImEuaWNvblwiIHNpemU9XCJzbVwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXR4XCI+XG4gICAgICAgICAgICAgICAgPGIgW2lubmVySFRNTF09XCJhLnRpdGxlXCI+PC9iPlxuICAgICAgICAgICAgICAgIEBpZiAoYS5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZFwiIFtpbm5lckhUTUxdPVwiYS5kZXRhaWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW51bSB2by1tc1wiPnt7IGEuc3RhdGUgPT09ICdkb25lJyA/IGEudGltZSA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChhLnN0YXRlID09PSAnZG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1lbnRlclwiIHN0eWxlPVwiY29sb3I6dmFyKC0tdm8tb2spXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBzdHlsZT1cIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHhcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAoYS5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWZvbGQgdm8tYWxnLWRldFwiIFtjbGFzcy52by1zaHV0XT1cIiFpc09wZW4oJGluZGV4KVwiIFthdHRyLmluZXJ0XT1cImlzT3BlbigkaW5kZXgpID8gbnVsbCA6ICcnXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlbigkaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdj48cHJlIFtpbm5lckhUTUxdPVwiYS5vdXRwdXRcIj48L3ByZT48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgPC9vbD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2FjdGlvbi1sb2cuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uTG9nQ29tcG9uZW50IHtcbiAgLyoqIFRoZSB0b29sIGNhbGxzLCBuZXdlc3QgYXQgdGhlIGVuZC4gKi9cbiAgQElucHV0KCkgYWN0aW9uczogQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgdGl0bGUgPSAnQWdlbnQgYWN0aXZpdHknO1xuICAvKiogU2hvd3MgYSBzcGlubmVyIGluIHRoZSBoZWFkZXIgd2hpbGUgdHJ1ZSwgYW5kIGEgZ3JlZW4gZG90IG9uY2UgZmFsc2UuICovXG4gIEBJbnB1dCgpIHJ1bm5pbmcgPSB0cnVlO1xuICAvKiogVGhlIHdvcmRzIGJlc2lkZSBpdC4gRGVmYXVsdHMgdG8gXCJSdW5uaW5nIHN0ZXAgTlwiLCB0aGVuIFwiTiBzdGVwcywgWHNcIi4gKi9cbiAgQElucHV0KCkgc3RhdHVzPzogc3RyaW5nO1xuICAvKiogU2l0cyBmbGF0IGluIGEgY2hhdCB0aHJlYWQgKHRoZSBkZWZhdWx0KS4gU2V0IGZhbHNlIHRvIGdpdmUgaXQgYSBjYXJkLiAqL1xuICBASW5wdXQoKSBiYXJlID0gdHJ1ZTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IG9wZW5zIG9yIGNsb3Nlcywgd2l0aCBpdHMgaW5kZXggYW5kIHRoZSBuZXcgb3BlbiBzdGF0ZS4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpbmRleDogbnVtYmVyOyBvcGVuOiBib29sZWFuIH0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgaXNPcGVuKGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW4uaGFzKGkpO1xuICB9XG5cbiAgdG9nZ2xlKGk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5vcGVuLmhhcyhpKTtcbiAgICBpZiAobmV4dCkgdGhpcy5vcGVuLmFkZChpKTtcbiAgICBlbHNlIHRoaXMub3Blbi5kZWxldGUoaSk7XG4gICAgdGhpcy50b2dnbGVSb3cuZW1pdCh7IGluZGV4OiBpLCBvcGVuOiBuZXh0IH0pO1xuICB9XG5cbiAgZ2V0IHdvcmRzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RhdHVzKSByZXR1cm4gdGhpcy5zdGF0dXM7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5sZW5ndGggPyBgUnVubmluZyBzdGVwICR7dGhpcy5hY3Rpb25zLmxlbmd0aH1gIDogJ1J1bm5pbmcnO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuYWN0aW9ucy5yZWR1Y2UoKHMsIGEpID0+IHMgKyAocGFyc2VGbG9hdChhLnRpbWUgPz8gJycpIHx8IDApLCAwKTtcbiAgICByZXR1cm4gYCR7dGhpcy5hY3Rpb25zLmxlbmd0aH0gc3RlcHMke3RvdGFsID8gYCwgJHt0b3RhbC50b0ZpeGVkKDEpfXNgIDogJyd9YDtcbiAgfVxufVxuIl19
@@ -0,0 +1,285 @@
1
+ // framework/angular/activity-heatmap/activity-heatmap.component.ts
2
+ //
3
+ // Native Angular port of framework/react/activity-heatmap/ActivityHeatmap.tsx.
4
+ // When the agent or the team is busy, by day and hour, as a 7x24 grid of cells
5
+ // tinted from the accent by their value. The cells fill in as a wave from the
6
+ // top left; a switch (shown with two or more series) sweeps a new series in the
7
+ // same way. In a narrow card (a phone) the grid shows half the day at a time in
8
+ // bigger cells, scrolls sideways and starts at the latest hours. Inputs mirror
9
+ // the React props; the fill-in, the switch and the scroll edges are ported from
10
+ // the vanilla JS (activity-heatmap.js).
11
+ //
12
+ // Icons: none of this component's chrome uses an icon (the switch is text), so
13
+ // no VoIconComponent is needed.
14
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../core/reduced-motion.service";
17
+ const DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
18
+ const LEGEND = [0.08, 0.3, 0.55, 0.85];
19
+ // every three hours; the ones between the four on a wide card only show on a phone
20
+ const HOURS = ['12am', '3am', '6am', '9am', '12pm', '3pm', '6pm', '9pm'];
21
+ const DAY_LABELS = ['Mon', '', 'Wed', '', 'Fri', '', 'Sun'];
22
+ const hour = (h) => (h % 12 || 12) + (h < 12 ? 'am' : 'pm');
23
+ export class ActivityHeatmapComponent {
24
+ /** The series on show, by key. Leave it out to let the switch pick it. */
25
+ set value(v) {
26
+ this.controlled = v !== undefined;
27
+ if (v !== undefined && v !== this.key) {
28
+ this.key = v;
29
+ if (this.ready) {
30
+ this.placeKnob();
31
+ this.draw();
32
+ }
33
+ }
34
+ }
35
+ get current() {
36
+ return this.series.find((s) => s.key === this.key) ?? this.series[0];
37
+ }
38
+ get gridLabel() {
39
+ return `${this.title}, ${this.current?.note ?? this.period}`;
40
+ }
41
+ constructor(reduced, cdr) {
42
+ this.reduced = reduced;
43
+ this.cdr = cdr;
44
+ /** One or more series; the switch shows when there are two or more. */
45
+ this.series = [];
46
+ /** Header text. */
47
+ this.title = 'Activity';
48
+ /** The line under the title before the cells fill in, and when a series has no note. */
49
+ this.period = 'Last 4 weeks';
50
+ this.className = '';
51
+ this.valueChange = new EventEmitter();
52
+ this.dayLabels = DAY_LABELS;
53
+ this.hours = HOURS;
54
+ this.legend = LEGEND;
55
+ this.key = '';
56
+ this.cells = Array.from({ length: 168 }, () => ({ alpha: 0, transition: '', tip: '' }));
57
+ this.stText = '';
58
+ this.stOut = false;
59
+ this.knobLeft = 0;
60
+ this.knobWidth = 0;
61
+ this.controlled = false;
62
+ this.ready = false;
63
+ this.drawn = false;
64
+ this.timers = [];
65
+ this.moved = false;
66
+ }
67
+ ngAfterViewInit() {
68
+ if (!this.controlled && !this.key) {
69
+ this.key = this.defaultValue ?? this.series[0]?.key ?? '';
70
+ }
71
+ this.stText = this.period;
72
+ this.ready = true;
73
+ this.cdr.detectChanges();
74
+ this.placeKnob();
75
+ this.setupScroll();
76
+ // the cells start empty and fill in a moment after the card appears
77
+ this.later(() => {
78
+ this.drawn = true;
79
+ this.draw();
80
+ }, 150);
81
+ }
82
+ select(key) {
83
+ if (!this.controlled) {
84
+ this.key = key;
85
+ this.placeKnob();
86
+ this.draw();
87
+ }
88
+ this.valueChange.emit(key);
89
+ }
90
+ draw() {
91
+ const s = this.current;
92
+ const reduce = this.reduced.reduce();
93
+ // the line under the title blurs out and back in when the series changes
94
+ const note = this.drawn ? s?.note ?? this.period : this.period;
95
+ if (note !== this.stText) {
96
+ this.stOut = true;
97
+ this.later(() => {
98
+ this.stText = note;
99
+ this.stOut = false;
100
+ this.cdr.markForCheck();
101
+ }, reduce ? 0 : 170);
102
+ }
103
+ for (let i = 0; i < 168; i++) {
104
+ const d = Math.floor(i / 24);
105
+ const h = i % 24;
106
+ const v = s?.values[i] ?? 0;
107
+ // each cell changes a beat after the one before it, so a new series sweeps in from the top left
108
+ const delay = reduce ? 0 : (h + d) * 14;
109
+ this.cells[i].alpha = this.drawn ? +(v * 0.9).toFixed(2) : 0;
110
+ this.cells[i].transition = `background .5s var(--vo-ease) ${delay}ms, transform .2s`;
111
+ this.cells[i].tip = this.drawn && s ? `${DAYS[d]} ${hour(h)}: ${Math.round(v * s.max)} ${s.unit}` : '';
112
+ }
113
+ this.cdr.markForCheck();
114
+ }
115
+ placeKnob() {
116
+ if (this.series.length < 2)
117
+ return;
118
+ const btns = this.sc?.nativeElement
119
+ ? (this.sc.nativeElement.closest('.vo-hmx')?.querySelectorAll('.vo-hmx-sg button') ?? [])
120
+ : [];
121
+ const at = this.series.findIndex((s) => s.key === this.key);
122
+ const b = btns[at < 0 ? 0 : at];
123
+ if (b) {
124
+ this.knobLeft = b.offsetLeft;
125
+ this.knobWidth = b.offsetWidth;
126
+ this.cdr.markForCheck();
127
+ }
128
+ }
129
+ // on a phone the grid scrolls sideways: it starts at the latest hours, and fades out on whichever side has more to see
130
+ setupScroll() {
131
+ const el = this.sc?.nativeElement;
132
+ if (!el)
133
+ return;
134
+ const edges = () => {
135
+ const m = el.scrollWidth - el.clientWidth;
136
+ el.classList.toggle('vo-ml', m > 1 && el.scrollLeft > 1);
137
+ el.classList.toggle('vo-mr', m > 1 && el.scrollLeft < m - 1);
138
+ };
139
+ // it stays on the latest hours as the card settles its size, until the person scrolls it themselves
140
+ const fit = () => {
141
+ if (!this.moved)
142
+ el.scrollLeft = el.scrollWidth;
143
+ edges();
144
+ };
145
+ const move = () => {
146
+ this.moved = true;
147
+ };
148
+ el.addEventListener('scroll', edges, { passive: true });
149
+ ['pointerdown', 'wheel', 'touchstart', 'keydown'].forEach((e) => el.addEventListener(e, move, { passive: true }));
150
+ if (typeof ResizeObserver === 'function') {
151
+ this.ro = new ResizeObserver(fit);
152
+ this.ro.observe(el);
153
+ const grid = el.querySelector('.vo-hmx-grid');
154
+ if (grid)
155
+ this.ro.observe(grid);
156
+ }
157
+ }
158
+ later(fn, ms) {
159
+ this.timers.push(setTimeout(fn, ms));
160
+ }
161
+ ngOnDestroy() {
162
+ this.timers.forEach(clearTimeout);
163
+ this.timers = [];
164
+ this.ro?.disconnect();
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActivityHeatmapComponent, deps: [{ token: i1.ReducedMotionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ActivityHeatmapComponent, isStandalone: true, selector: "vo-activity-heatmap", inputs: { series: "series", value: "value", defaultValue: "defaultValue", title: "title", period: "period", className: "className" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "sc", first: true, predicate: ["sc"], descendants: true }], ngImport: i0, template: `
168
+ <div data-vo="" class="vo-hmx vo-panel" [class]="className">
169
+ <div class="vo-hmx-h">
170
+ <div>
171
+ <b>{{ title }}</b>
172
+ <span class="vo-sw vo-muted vo-hmx-st" [class.vo-out]="stOut">{{ stText }}</span>
173
+ </div>
174
+ @if (series.length > 1) {
175
+ <div class="vo-seg2 vo-hmx-sg" role="group" aria-label="Who">
176
+ <span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
177
+ @for (s of series; track s.key) {
178
+ <button
179
+ type="button"
180
+ [attr.aria-pressed]="s.key === key"
181
+ (click)="select(s.key)"
182
+ >{{ s.label }}</button>
183
+ }
184
+ </div>
185
+ }
186
+ </div>
187
+ <div class="vo-hmx-wrap">
188
+ <div #sc class="vo-hmx-sc">
189
+ <div class="vo-hmx-days vo-muted" aria-hidden="true">
190
+ @for (d of dayLabels; track $index) {
191
+ <span>{{ d }}</span>
192
+ }
193
+ </div>
194
+ <div class="vo-hmx-grid" role="img" [attr.aria-label]="gridLabel">
195
+ @for (cell of cells; track $index) {
196
+ <i
197
+ [style.--vo-a]="cell.alpha"
198
+ [style.transition]="cell.transition"
199
+ [attr.data-tip]="cell.tip || null"
200
+ ></i>
201
+ }
202
+ </div>
203
+ <div class="vo-hmx-f vo-muted" aria-hidden="true">
204
+ @for (t of hours; track t; let i = $index) {
205
+ <span class="vo-hmx-ax" [class.vo-x]="i % 2 === 1">{{ t }}</span>
206
+ }
207
+ </div>
208
+ </div>
209
+ </div>
210
+ <div class="vo-hmx-lg vo-muted" aria-hidden="true">
211
+ Less@for (a of legend; track a) {<i [style.--vo-a]="a"></i>}More
212
+ </div>
213
+ </div>
214
+ `, isInline: true, styles: [".vo-hmx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-hmx-h{display:flex;align-items:center;justify-content:space-between;gap:10px}.vo-hmx-h>div:first-child{display:flex;flex-direction:column;font-size:13.5px}.vo-hmx-h b{font-weight:500}.vo-hmx-st{font-size:12px}.vo-hmx-sg button{font-size:12px;height:26px;padding:0 9px}.vo-hmx-sc{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px}.vo-hmx-days{display:grid;grid-template-rows:repeat(7,1fr);gap:3px;font-size:10px}.vo-hmx-days span{display:flex;align-items:center;height:100%}.vo-hmx-grid{display:grid;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;min-width:0}.vo-hmx-grid i{aspect-ratio:1;border-radius:3px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip));transition:background .5s var(--vo-ease),transform .2s;max-width:100%}@media (hover:hover) and (pointer:fine){.vo-hmx-grid i:hover{transform:scale(1.35);box-shadow:0 0 0 1.5px var(--vo-surface);position:relative;z-index:1}}.vo-hmx-f{grid-column:2;display:grid;grid-template-columns:repeat(4,1fr);font-size:10.5px}.vo-hmx-f .vo-x{display:none}.vo-hmx{container-type:inline-size}@container (max-width:400px){.vo-hmx-sc{grid-template-columns:34px calc((100cqw - 34px)*2);column-gap:0;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;scroll-snap-type:x proximity;scroll-padding-left:34px;--vo-fl:0px;--vo-fr:0px;-webkit-mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent);mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent)}.vo-hmx-sc::-webkit-scrollbar{display:none}.vo-hmx-sc.vo-ml{--vo-fl:16px}.vo-hmx-sc.vo-mr{--vo-fr:16px}.vo-hmx-days{position:sticky;left:0;z-index:2;background:var(--vo-surface);gap:4px;padding-right:6px;font-size:10.5px}.vo-hmx-sc:after{content:\"\";grid-row:2;grid-column:1;position:sticky;left:0;z-index:2;background:var(--vo-surface)}.vo-hmx-grid{gap:4px}.vo-hmx-grid i{border-radius:calc(4px * var(--vo-rk));scroll-snap-align:start}.vo-hmx-f{grid-template-columns:repeat(8,1fr)}.vo-hmx-f .vo-x{display:block}}.vo-hmx-lg{align-self:flex-end;display:flex;align-items:center;gap:3px;font-size:10.5px}.vo-hmx-lg i{width:9px;height:9px;border-radius:2px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip))}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-seg2{display:inline-flex;padding:2px;background:var(--vo-chip);border-radius:var(--vo-r-pill);position:relative}.vo-seg2 button{position:relative;z-index:1;height:26px;padding:0 11px;border-radius:var(--vo-r-pill);font-size:12.5px;color:var(--vo-fg2);transition:color var(--vo-t-fast)}.vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-seg2 button:focus-visible{outline-offset:-2px;border-radius:var(--vo-r-pill)}.vo-seg2 .vo-knob{position:absolute;top:2px;bottom:2px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:0 1px 2px #00000014;transition:left var(--vo-t) var(--vo-ease),width var(--vo-t) var(--vo-ease)}.vo-seg2 .vo-knob:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}.vo-sw{display:inline-block;transition:opacity .22s var(--vo-ease),filter .22s var(--vo-ease),transform .22s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(4px);transform:translateY(3px)}@media (prefers-reduced-motion:reduce){.vo-sw{transition:none}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
215
+ }
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActivityHeatmapComponent, decorators: [{
217
+ type: Component,
218
+ args: [{ selector: 'vo-activity-heatmap', standalone: true, encapsulation: ViewEncapsulation.None, template: `
219
+ <div data-vo="" class="vo-hmx vo-panel" [class]="className">
220
+ <div class="vo-hmx-h">
221
+ <div>
222
+ <b>{{ title }}</b>
223
+ <span class="vo-sw vo-muted vo-hmx-st" [class.vo-out]="stOut">{{ stText }}</span>
224
+ </div>
225
+ @if (series.length > 1) {
226
+ <div class="vo-seg2 vo-hmx-sg" role="group" aria-label="Who">
227
+ <span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
228
+ @for (s of series; track s.key) {
229
+ <button
230
+ type="button"
231
+ [attr.aria-pressed]="s.key === key"
232
+ (click)="select(s.key)"
233
+ >{{ s.label }}</button>
234
+ }
235
+ </div>
236
+ }
237
+ </div>
238
+ <div class="vo-hmx-wrap">
239
+ <div #sc class="vo-hmx-sc">
240
+ <div class="vo-hmx-days vo-muted" aria-hidden="true">
241
+ @for (d of dayLabels; track $index) {
242
+ <span>{{ d }}</span>
243
+ }
244
+ </div>
245
+ <div class="vo-hmx-grid" role="img" [attr.aria-label]="gridLabel">
246
+ @for (cell of cells; track $index) {
247
+ <i
248
+ [style.--vo-a]="cell.alpha"
249
+ [style.transition]="cell.transition"
250
+ [attr.data-tip]="cell.tip || null"
251
+ ></i>
252
+ }
253
+ </div>
254
+ <div class="vo-hmx-f vo-muted" aria-hidden="true">
255
+ @for (t of hours; track t; let i = $index) {
256
+ <span class="vo-hmx-ax" [class.vo-x]="i % 2 === 1">{{ t }}</span>
257
+ }
258
+ </div>
259
+ </div>
260
+ </div>
261
+ <div class="vo-hmx-lg vo-muted" aria-hidden="true">
262
+ Less@for (a of legend; track a) {<i [style.--vo-a]="a"></i>}More
263
+ </div>
264
+ </div>
265
+ `, styles: [".vo-hmx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-hmx-h{display:flex;align-items:center;justify-content:space-between;gap:10px}.vo-hmx-h>div:first-child{display:flex;flex-direction:column;font-size:13.5px}.vo-hmx-h b{font-weight:500}.vo-hmx-st{font-size:12px}.vo-hmx-sg button{font-size:12px;height:26px;padding:0 9px}.vo-hmx-sc{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px}.vo-hmx-days{display:grid;grid-template-rows:repeat(7,1fr);gap:3px;font-size:10px}.vo-hmx-days span{display:flex;align-items:center;height:100%}.vo-hmx-grid{display:grid;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;min-width:0}.vo-hmx-grid i{aspect-ratio:1;border-radius:3px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip));transition:background .5s var(--vo-ease),transform .2s;max-width:100%}@media (hover:hover) and (pointer:fine){.vo-hmx-grid i:hover{transform:scale(1.35);box-shadow:0 0 0 1.5px var(--vo-surface);position:relative;z-index:1}}.vo-hmx-f{grid-column:2;display:grid;grid-template-columns:repeat(4,1fr);font-size:10.5px}.vo-hmx-f .vo-x{display:none}.vo-hmx{container-type:inline-size}@container (max-width:400px){.vo-hmx-sc{grid-template-columns:34px calc((100cqw - 34px)*2);column-gap:0;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;scroll-snap-type:x proximity;scroll-padding-left:34px;--vo-fl:0px;--vo-fr:0px;-webkit-mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent);mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent)}.vo-hmx-sc::-webkit-scrollbar{display:none}.vo-hmx-sc.vo-ml{--vo-fl:16px}.vo-hmx-sc.vo-mr{--vo-fr:16px}.vo-hmx-days{position:sticky;left:0;z-index:2;background:var(--vo-surface);gap:4px;padding-right:6px;font-size:10.5px}.vo-hmx-sc:after{content:\"\";grid-row:2;grid-column:1;position:sticky;left:0;z-index:2;background:var(--vo-surface)}.vo-hmx-grid{gap:4px}.vo-hmx-grid i{border-radius:calc(4px * var(--vo-rk));scroll-snap-align:start}.vo-hmx-f{grid-template-columns:repeat(8,1fr)}.vo-hmx-f .vo-x{display:block}}.vo-hmx-lg{align-self:flex-end;display:flex;align-items:center;gap:3px;font-size:10.5px}.vo-hmx-lg i{width:9px;height:9px;border-radius:2px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip))}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-seg2{display:inline-flex;padding:2px;background:var(--vo-chip);border-radius:var(--vo-r-pill);position:relative}.vo-seg2 button{position:relative;z-index:1;height:26px;padding:0 11px;border-radius:var(--vo-r-pill);font-size:12.5px;color:var(--vo-fg2);transition:color var(--vo-t-fast)}.vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-seg2 button:focus-visible{outline-offset:-2px;border-radius:var(--vo-r-pill)}.vo-seg2 .vo-knob{position:absolute;top:2px;bottom:2px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:0 1px 2px #00000014;transition:left var(--vo-t) var(--vo-ease),width var(--vo-t) var(--vo-ease)}.vo-seg2 .vo-knob:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}.vo-sw{display:inline-block;transition:opacity .22s var(--vo-ease),filter .22s var(--vo-ease),transform .22s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(4px);transform:translateY(3px)}@media (prefers-reduced-motion:reduce){.vo-sw{transition:none}}\n"] }]
266
+ }], ctorParameters: () => [{ type: i1.ReducedMotionService }, { type: i0.ChangeDetectorRef }], propDecorators: { series: [{
267
+ type: Input,
268
+ args: [{ required: true }]
269
+ }], value: [{
270
+ type: Input
271
+ }], defaultValue: [{
272
+ type: Input
273
+ }], title: [{
274
+ type: Input
275
+ }], period: [{
276
+ type: Input
277
+ }], className: [{
278
+ type: Input
279
+ }], valueChange: [{
280
+ type: Output
281
+ }], sc: [{
282
+ type: ViewChild,
283
+ args: ['sc']
284
+ }] } });
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktaGVhdG1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpdml0eS1oZWF0bWFwL2FjdGl2aXR5LWhlYXRtYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLHdDQUF3QztBQUN4QyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGdDQUFnQztBQUVoQyxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7OztBQWtCdkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLG1GQUFtRjtBQUNuRixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRTVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEdB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dml0eS1oZWF0bWFwL2FjdGl2aXR5LWhlYXRtYXAuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvYWN0aXZpdHktaGVhdG1hcC9BY3Rpdml0eUhlYXRtYXAudHN4LlxuLy8gV2hlbiB0aGUgYWdlbnQgb3IgdGhlIHRlYW0gaXMgYnVzeSwgYnkgZGF5IGFuZCBob3VyLCBhcyBhIDd4MjQgZ3JpZCBvZiBjZWxsc1xuLy8gdGludGVkIGZyb20gdGhlIGFjY2VudCBieSB0aGVpciB2YWx1ZS4gVGhlIGNlbGxzIGZpbGwgaW4gYXMgYSB3YXZlIGZyb20gdGhlXG4vLyB0b3AgbGVmdDsgYSBzd2l0Y2ggKHNob3duIHdpdGggdHdvIG9yIG1vcmUgc2VyaWVzKSBzd2VlcHMgYSBuZXcgc2VyaWVzIGluIHRoZVxuLy8gc2FtZSB3YXkuIEluIGEgbmFycm93IGNhcmQgKGEgcGhvbmUpIHRoZSBncmlkIHNob3dzIGhhbGYgdGhlIGRheSBhdCBhIHRpbWUgaW5cbi8vIGJpZ2dlciBjZWxscywgc2Nyb2xscyBzaWRld2F5cyBhbmQgc3RhcnRzIGF0IHRoZSBsYXRlc3QgaG91cnMuIElucHV0cyBtaXJyb3Jcbi8vIHRoZSBSZWFjdCBwcm9wczsgdGhlIGZpbGwtaW4sIHRoZSBzd2l0Y2ggYW5kIHRoZSBzY3JvbGwgZWRnZXMgYXJlIHBvcnRlZCBmcm9tXG4vLyB0aGUgdmFuaWxsYSBKUyAoYWN0aXZpdHktaGVhdG1hcC5qcykuXG4vL1xuLy8gSWNvbnM6IG5vbmUgb2YgdGhpcyBjb21wb25lbnQncyBjaHJvbWUgdXNlcyBhbiBpY29uICh0aGUgc3dpdGNoIGlzIHRleHQpLCBzb1xuLy8gbm8gVm9JY29uQ29tcG9uZW50IGlzIG5lZWRlZC5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogT25lIHNlcmllczogYSBzd2l0Y2ggb3B0aW9uIHdpdGggaXRzIDE2OCBob3VybHkgdmFsdWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUhlYXRtYXBTZXJpZXMge1xuICBrZXk6IHN0cmluZztcbiAgLyoqIFRoZSBzd2l0Y2ggbGFiZWwsIGxpa2UgXCJBZ2VudFwiLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogMTY4IHZhbHVlcyBmcm9tIDAgdG8gMSwgb25lIGFuIGhvdXIsIE1vbmRheSAxMmFtIGZpcnN0LiAqL1xuICB2YWx1ZXM6IG51bWJlcltdO1xuICAvKiogV2hhdCBhIGZ1bGwgY2VsbCBjb3VudHMsIGZvciB0aGUgdGlwcywgbGlrZSA0MC4gKi9cbiAgbWF4OiBudW1iZXI7XG4gIC8qKiBXaGF0IGl0IGNvdW50cywgZm9yIHRoZSB0aXBzLCBsaWtlIFwicnVuc1wiLiAqL1xuICB1bml0OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGluZSB1bmRlciB0aGUgdGl0bGUgd2hpbGUgdGhpcyBzZXJpZXMgc2hvd3MsIGxpa2UgXCJCdXNpZXN0IG92ZXJuaWdodCwgd2hlbiB0aGUgcXVldWUgcnVuc1wiLiAqL1xuICBub3RlPzogc3RyaW5nO1xufVxuXG5jb25zdCBEQVlTID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xuY29uc3QgTEVHRU5EID0gWzAuMDgsIDAuMywgMC41NSwgMC44NV07XG4vLyBldmVyeSB0aHJlZSBob3VyczsgdGhlIG9uZXMgYmV0d2VlbiB0aGUgZm91ciBvbiBhIHdpZGUgY2FyZCBvbmx5IHNob3cgb24gYSBwaG9uZVxuY29uc3QgSE9VUlMgPSBbJzEyYW0nLCAnM2FtJywgJzZhbScsICc5YW0nLCAnMTJwbScsICczcG0nLCAnNnBtJywgJzlwbSddO1xuY29uc3QgREFZX0xBQkVMUyA9IFsnTW9uJywgJycsICdXZWQnLCAnJywgJ0ZyaScsICcnLCAnU3VuJ107XG5cbmNvbnN0IGhvdXIgPSAoaDogbnVtYmVyKTogc3RyaW5nID0+IChoICUgMTIgfHwgMTIpICsgKGggPCAxMiA/ICdhbScgOiAncG0nKTtcblxuLyoqIE9uZSBjZWxsJ3MgcmVuZGVyIHN0YXRlOiBpdHMgdGludCwgaXRzIHBlci1jZWxsIHRyYW5zaXRpb24gYW5kIGl0cyB0aXAuICovXG5pbnRlcmZhY2UgQ2VsbCB7XG4gIGFscGhhOiBudW1iZXI7XG4gIHRyYW5zaXRpb246IHN0cmluZztcbiAgdGlwOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLWFjdGl2aXR5LWhlYXRtYXAnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8taG14IHZvLXBhbmVsXCIgW2NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWhteC1oXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGI+e3sgdGl0bGUgfX08L2I+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zdyB2by1tdXRlZCB2by1obXgtc3RcIiBbY2xhc3Mudm8tb3V0XT1cInN0T3V0XCI+e3sgc3RUZXh0IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChzZXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zZWcyIHZvLWhteC1zZ1wiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJXaG9cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8ta25vYlwiIFtzdHlsZS5sZWZ0LnB4XT1cImtub2JMZWZ0XCIgW3N0eWxlLndpZHRoLnB4XT1cImtub2JXaWR0aFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIEBmb3IgKHMgb2Ygc2VyaWVzOyB0cmFjayBzLmtleSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInMua2V5ID09PSBrZXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Qocy5rZXkpXCJcbiAgICAgICAgICAgICAgPnt7IHMubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8taG14LXdyYXBcIj5cbiAgICAgICAgPGRpdiAjc2MgY2xhc3M9XCJ2by1obXgtc2NcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWRheXMgdm8tbXV0ZWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIEBmb3IgKGQgb2YgZGF5TGFiZWxzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWdyaWRcIiByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJncmlkTGFiZWxcIj5cbiAgICAgICAgICAgIEBmb3IgKGNlbGwgb2YgY2VsbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIFtzdHlsZS4tLXZvLWFdPVwiY2VsbC5hbHBoYVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwiY2VsbC50cmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpcF09XCJjZWxsLnRpcCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWYgdm8tbXV0ZWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIEBmb3IgKHQgb2YgaG91cnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG14LWF4XCIgW2NsYXNzLnZvLXhdPVwiaSAlIDIgPT09IDFcIj57eyB0IH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWhteC1sZyB2by1tdXRlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICBMZXNzQGZvciAoYSBvZiBsZWdlbmQ7IHRyYWNrIGEpIHs8aSBbc3R5bGUuLS12by1hXT1cImFcIj48L2k+fU1vcmVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vYWN0aXZpdHktaGVhdG1hcC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUhlYXRtYXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogT25lIG9yIG1vcmUgc2VyaWVzOyB0aGUgc3dpdGNoIHNob3dzIHdoZW4gdGhlcmUgYXJlIHR3byBvciBtb3JlLiAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXJpZXM6IEFjdGl2aXR5SGVhdG1hcFNlcmllc1tdID0gW107XG4gIC8qKiBUaGUgc2VyaWVzIG9uIHNob3csIGJ5IGtleS4gTGVhdmUgaXQgb3V0IHRvIGxldCB0aGUgc3dpdGNoIHBpY2sgaXQuICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbnRyb2xsZWQgPSB2ICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSB0aGlzLmtleSkge1xuICAgICAgdGhpcy5rZXkgPSB2O1xuICAgICAgaWYgKHRoaXMucmVhZHkpIHtcbiAgICAgICAgdGhpcy5wbGFjZUtub2IoKTtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgLyoqIEhlYWRlciB0ZXh0LiAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICdBY3Rpdml0eSc7XG4gIC8qKiBUaGUgbGluZSB1bmRlciB0aGUgdGl0bGUgYmVmb3JlIHRoZSBjZWxscyBmaWxsIGluLCBhbmQgd2hlbiBhIHNlcmllcyBoYXMgbm8gbm90ZS4gKi9cbiAgQElucHV0KCkgcGVyaW9kID0gJ0xhc3QgNCB3ZWVrcyc7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NjJykgc2MhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICByZWFkb25seSBkYXlMYWJlbHMgPSBEQVlfTEFCRUxTO1xuICByZWFkb25seSBob3VycyA9IEhPVVJTO1xuICByZWFkb25seSBsZWdlbmQgPSBMRUdFTkQ7XG5cbiAga2V5ID0gJyc7XG4gIGNlbGxzOiBDZWxsW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNjggfSwgKCkgPT4gKHsgYWxwaGE6IDAsIHRyYW5zaXRpb246ICcnLCB0aXA6ICcnIH0pKTtcbiAgc3RUZXh0ID0gJyc7XG4gIHN0T3V0ID0gZmFsc2U7XG4gIGtub2JMZWZ0ID0gMDtcbiAga25vYldpZHRoID0gMDtcblxuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRyYXduID0gZmFsc2U7XG4gIHByaXZhdGUgdGltZXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PltdID0gW107XG4gIHByaXZhdGUgcm8/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBtb3ZlZCA9IGZhbHNlO1xuXG4gIGdldCBjdXJyZW50KCk6IEFjdGl2aXR5SGVhdG1hcFNlcmllcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzLmZpbmQoKHMpID0+IHMua2V5ID09PSB0aGlzLmtleSkgPz8gdGhpcy5zZXJpZXNbMF07XG4gIH1cblxuICBnZXQgZ3JpZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGl0bGV9LCAke3RoaXMuY3VycmVudD8ubm90ZSA/PyB0aGlzLnBlcmlvZH1gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWR1Y2VkOiBSZWR1Y2VkTW90aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZWQgJiYgIXRoaXMua2V5KSB7XG4gICAgICB0aGlzLmtleSA9IHRoaXMuZGVmYXVsdFZhbHVlID8/IHRoaXMuc2VyaWVzWzBdPy5rZXkgPz8gJyc7XG4gICAgfVxuICAgIHRoaXMuc3RUZXh0ID0gdGhpcy5wZXJpb2Q7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucGxhY2VLbm9iKCk7XG4gICAgdGhpcy5zZXR1cFNjcm9sbCgpO1xuICAgIC8vIHRoZSBjZWxscyBzdGFydCBlbXB0eSBhbmQgZmlsbCBpbiBhIG1vbWVudCBhZnRlciB0aGUgY2FyZCBhcHBlYXJzXG4gICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICB0aGlzLmRyYXduID0gdHJ1ZTtcbiAgICAgIHRoaXMuZHJhdygpO1xuICAgIH0sIDE1MCk7XG4gIH1cblxuICBzZWxlY3Qoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICB0aGlzLnBsYWNlS25vYigpO1xuICAgICAgdGhpcy5kcmF3KCk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3KCk6IHZvaWQge1xuICAgIGNvbnN0IHMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgcmVkdWNlID0gdGhpcy5yZWR1Y2VkLnJlZHVjZSgpO1xuICAgIC8vIHRoZSBsaW5lIHVuZGVyIHRoZSB0aXRsZSBibHVycyBvdXQgYW5kIGJhY2sgaW4gd2hlbiB0aGUgc2VyaWVzIGNoYW5nZXNcbiAgICBjb25zdCBub3RlID0gdGhpcy5kcmF3biA/IHM/Lm5vdGUgPz8gdGhpcy5wZXJpb2QgOiB0aGlzLnBlcmlvZDtcbiAgICBpZiAobm90ZSAhPT0gdGhpcy5zdFRleHQpIHtcbiAgICAgIHRoaXMuc3RPdXQgPSB0cnVlO1xuICAgICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RUZXh0ID0gbm90ZTtcbiAgICAgICAgdGhpcy5zdE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sIHJlZHVjZSA/IDAgOiAxNzApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2ODsgaSsrKSB7XG4gICAgICBjb25zdCBkID0gTWF0aC5mbG9vcihpIC8gMjQpO1xuICAgICAgY29uc3QgaCA9IGkgJSAyNDtcbiAgICAgIGNvbnN0IHYgPSBzPy52YWx1ZXNbaV0gPz8gMDtcbiAgICAgIC8vIGVhY2ggY2VsbCBjaGFuZ2VzIGEgYmVhdCBhZnRlciB0aGUgb25lIGJlZm9yZSBpdCwgc28gYSBuZXcgc2VyaWVzIHN3ZWVwcyBpbiBmcm9tIHRoZSB0b3AgbGVmdFxuICAgICAgY29uc3QgZGVsYXkgPSByZWR1Y2UgPyAwIDogKGggKyBkKSAqIDE0O1xuICAgICAgdGhpcy5jZWxsc1tpXS5hbHBoYSA9IHRoaXMuZHJhd24gPyArKHYgKiAwLjkpLnRvRml4ZWQoMikgOiAwO1xuICAgICAgdGhpcy5jZWxsc1tpXS50cmFuc2l0aW9uID0gYGJhY2tncm91bmQgLjVzIHZhcigtLXZvLWVhc2UpICR7ZGVsYXl9bXMsIHRyYW5zZm9ybSAuMnNgO1xuICAgICAgdGhpcy5jZWxsc1tpXS50aXAgPSB0aGlzLmRyYXduICYmIHMgPyBgJHtEQVlTW2RdfSAke2hvdXIoaCl9OiAke01hdGgucm91bmQodiAqIHMubWF4KX0gJHtzLnVuaXR9YCA6ICcnO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcGxhY2VLbm9iKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcmllcy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgY29uc3QgYnRucyA9IHRoaXMuc2M/Lm5hdGl2ZUVsZW1lbnRcbiAgICAgID8gKHRoaXMuc2MubmF0aXZlRWxlbWVudC5jbG9zZXN0KCcudm8taG14Jyk/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8taG14LXNnIGJ1dHRvbicpID8/IFtdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBhdCA9IHRoaXMuc2VyaWVzLmZpbmRJbmRleCgocykgPT4gcy5rZXkgPT09IHRoaXMua2V5KTtcbiAgICBjb25zdCBiID0gYnRuc1thdCA8IDAgPyAwIDogYXRdO1xuICAgIGlmIChiKSB7XG4gICAgICB0aGlzLmtub2JMZWZ0ID0gYi5vZmZzZXRMZWZ0O1xuICAgICAgdGhpcy5rbm9iV2lkdGggPSBiLm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gb24gYSBwaG9uZSB0aGUgZ3JpZCBzY3JvbGxzIHNpZGV3YXlzOiBpdCBzdGFydHMgYXQgdGhlIGxhdGVzdCBob3VycywgYW5kIGZhZGVzIG91dCBvbiB3aGljaGV2ZXIgc2lkZSBoYXMgbW9yZSB0byBzZWVcbiAgcHJpdmF0ZSBzZXR1cFNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2M/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGVkZ2VzID0gKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGVsLnNjcm9sbFdpZHRoIC0gZWwuY2xpZW50V2lkdGg7XG4gICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCd2by1tbCcsIG0gPiAxICYmIGVsLnNjcm9sbExlZnQgPiAxKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3ZvLW1yJywgbSA+IDEgJiYgZWwuc2Nyb2xsTGVmdCA8IG0gLSAxKTtcbiAgICB9O1xuICAgIC8vIGl0IHN0YXlzIG9uIHRoZSBsYXRlc3QgaG91cnMgYXMgdGhlIGNhcmQgc2V0dGxlcyBpdHMgc2l6ZSwgdW50aWwgdGhlIHBlcnNvbiBzY3JvbGxzIGl0IHRoZW1zZWx2ZXNcbiAgICBjb25zdCBmaXQgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMubW92ZWQpIGVsLnNjcm9sbExlZnQgPSBlbC5zY3JvbGxXaWR0aDtcbiAgICAgIGVkZ2VzKCk7XG4gICAgfTtcbiAgICBjb25zdCBtb3ZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5tb3ZlZCA9IHRydWU7XG4gICAgfTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBlZGdlcywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIChbJ3BvaW50ZXJkb3duJywgJ3doZWVsJywgJ3RvdWNoc3RhcnQnLCAna2V5ZG93biddIGFzIGNvbnN0KS5mb3JFYWNoKChlKSA9PlxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlLCBtb3ZlLCB7IHBhc3NpdmU6IHRydWUgfSksXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZpdCk7XG4gICAgICB0aGlzLnJvLm9ic2VydmUoZWwpO1xuICAgICAgY29uc3QgZ3JpZCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy52by1obXgtZ3JpZCcpO1xuICAgICAgaWYgKGdyaWQpIHRoaXMucm8ub2JzZXJ2ZShncmlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxhdGVyKGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMucHVzaChzZXRUaW1lb3V0KGZuLCBtcykpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaChjbGVhclRpbWVvdXQpO1xuICAgIHRoaXMudGltZXJzID0gW107XG4gICAgdGhpcy5ybz8uZGlzY29ubmVjdCgpO1xuICB9XG59XG4iXX0=