@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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
// framework/angular/metric-insight/metric-insight.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/metric-insight/MetricInsight.tsx.
|
|
4
|
+
// A metric with its trend line, a one-line read on why it moved, and a
|
|
5
|
+
// breakdown of what moved it. A range switch re-rolls the big number and the
|
|
6
|
+
// change tag and redraws the line in place; a pointer readout follows the
|
|
7
|
+
// cursor across the chart; a marker fades in late where a release happened; and
|
|
8
|
+
// "Why did it move?" opens a staggered breakdown of drivers. Inputs mirror the
|
|
9
|
+
// React props; the draw-in, the count-up, the pointer readout and the fold are
|
|
10
|
+
// ported from the vanilla JS (metric-insight.js). Tokens only — no colour
|
|
11
|
+
// literals. The only icon used is `spark`, via core/icon.component.
|
|
12
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
13
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "../core/reduced-motion.service";
|
|
16
|
+
const W = 300, H = 90;
|
|
17
|
+
export class MetricInsightComponent {
|
|
18
|
+
/** The range on show, by key. Leave it out to let the switch pick it. */
|
|
19
|
+
set range(value) {
|
|
20
|
+
this.rangeControlled = value !== undefined;
|
|
21
|
+
if (value !== undefined && value !== this.current) {
|
|
22
|
+
this.current = value;
|
|
23
|
+
if (this.ready)
|
|
24
|
+
this.draw(true);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Whether the breakdown is open. Leave it out to let the button toggle it. */
|
|
28
|
+
set open(value) {
|
|
29
|
+
this.openControlled = value !== undefined;
|
|
30
|
+
if (value !== undefined)
|
|
31
|
+
this.isOpen = value;
|
|
32
|
+
}
|
|
33
|
+
constructor(reduced, cdr) {
|
|
34
|
+
this.reduced = reduced;
|
|
35
|
+
this.cdr = cdr;
|
|
36
|
+
/** The metric's name, like "Trial to paid". */
|
|
37
|
+
this.label = '';
|
|
38
|
+
/** The ranges to switch between. */
|
|
39
|
+
this.ranges = [];
|
|
40
|
+
/** Formats the large number and the hovered point. Defaults to one decimal and a %. */
|
|
41
|
+
this.format = (v) => v.toFixed(1) + '%';
|
|
42
|
+
/** Formats the change. Defaults to "+8.1 pts". */
|
|
43
|
+
this.formatChange = (v) => (v < 0 ? '−' : '+') + Math.abs(v).toFixed(1) + ' pts';
|
|
44
|
+
/** Shows "Looking into it" on the button and keeps the breakdown shut, while you fetch the drivers. */
|
|
45
|
+
this.explaining = false;
|
|
46
|
+
this.defaultOpen = false;
|
|
47
|
+
this.rangeChange = new EventEmitter();
|
|
48
|
+
this.openChange = new EventEmitter();
|
|
49
|
+
this.W = W;
|
|
50
|
+
this.H = H;
|
|
51
|
+
this.ids = 'mix' + Math.random().toString(36).slice(2, 8);
|
|
52
|
+
this.current = '';
|
|
53
|
+
this.value = 0;
|
|
54
|
+
this.change = 0;
|
|
55
|
+
this.rangeChangeValue = 0;
|
|
56
|
+
this.lineD = '';
|
|
57
|
+
this.areaD = '';
|
|
58
|
+
this.dash = null;
|
|
59
|
+
this.len = 0;
|
|
60
|
+
this.drawn = false;
|
|
61
|
+
this.hover = null;
|
|
62
|
+
this.knobLeft = 0;
|
|
63
|
+
this.knobWidth = 0;
|
|
64
|
+
this.shownInsight = '';
|
|
65
|
+
this.insightOut = false;
|
|
66
|
+
this.whyLabel = 'Why did it move?';
|
|
67
|
+
this.whyOut = false;
|
|
68
|
+
this.isOpen = false;
|
|
69
|
+
this.rangeControlled = false;
|
|
70
|
+
this.openControlled = false;
|
|
71
|
+
this.ready = false;
|
|
72
|
+
this.pts = [];
|
|
73
|
+
this.timers = [];
|
|
74
|
+
this.frames = [];
|
|
75
|
+
}
|
|
76
|
+
/** The change of the range on show, used to tint the tag green or red.
|
|
77
|
+
* Named `rangeDelta` to avoid colliding with the `rangeChange` output. */
|
|
78
|
+
get rangeDelta() {
|
|
79
|
+
return this.rangeChangeValue;
|
|
80
|
+
}
|
|
81
|
+
get currentRange() {
|
|
82
|
+
return this.ranges.find((r) => r.key === this.current) ?? this.ranges[0];
|
|
83
|
+
}
|
|
84
|
+
/** The breakdown is on screen only when open, not explaining, and there are drivers. */
|
|
85
|
+
get shown() {
|
|
86
|
+
return this.isOpen && !this.explaining && !!this.drivers?.length;
|
|
87
|
+
}
|
|
88
|
+
ngAfterViewInit() {
|
|
89
|
+
if (!this.current) {
|
|
90
|
+
this.current = this.rangeControlled
|
|
91
|
+
? this.current
|
|
92
|
+
: this.defaultRange ?? this.ranges[0]?.key ?? '';
|
|
93
|
+
}
|
|
94
|
+
this.shownInsight = this.currentRange?.insight ?? '';
|
|
95
|
+
this.whyLabel = this.labelFor();
|
|
96
|
+
this.ready = true;
|
|
97
|
+
this.cdr.detectChanges();
|
|
98
|
+
this.placeKnob();
|
|
99
|
+
// the numbers roll and the line draws in a moment after the card appears
|
|
100
|
+
this.later(() => this.draw(false), 400);
|
|
101
|
+
}
|
|
102
|
+
select(key) {
|
|
103
|
+
if (key === this.current)
|
|
104
|
+
return;
|
|
105
|
+
if (!this.rangeControlled) {
|
|
106
|
+
this.current = key;
|
|
107
|
+
this.draw(true);
|
|
108
|
+
}
|
|
109
|
+
this.rangeChange.emit(key);
|
|
110
|
+
}
|
|
111
|
+
toggle() {
|
|
112
|
+
if (this.explaining)
|
|
113
|
+
return;
|
|
114
|
+
const next = !this.isOpen;
|
|
115
|
+
if (!this.openControlled) {
|
|
116
|
+
this.isOpen = next;
|
|
117
|
+
this.swapWhy();
|
|
118
|
+
}
|
|
119
|
+
this.openChange.emit(next);
|
|
120
|
+
}
|
|
121
|
+
labelFor() {
|
|
122
|
+
if (this.explaining)
|
|
123
|
+
return 'Looking into it';
|
|
124
|
+
return this.shown ? 'Hide the breakdown' : 'Why did it move?';
|
|
125
|
+
}
|
|
126
|
+
// crossfade the button's label the way the <Swap> does
|
|
127
|
+
swapWhy() {
|
|
128
|
+
const to = this.labelFor();
|
|
129
|
+
if (to === this.whyLabel)
|
|
130
|
+
return;
|
|
131
|
+
if (this.reduced.reduce()) {
|
|
132
|
+
this.whyLabel = to;
|
|
133
|
+
this.cdr.markForCheck();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.whyOut = true;
|
|
137
|
+
this.cdr.markForCheck();
|
|
138
|
+
this.later(() => {
|
|
139
|
+
this.whyLabel = to;
|
|
140
|
+
this.whyOut = false;
|
|
141
|
+
this.cdr.markForCheck();
|
|
142
|
+
}, 170);
|
|
143
|
+
}
|
|
144
|
+
placeKnob() {
|
|
145
|
+
const el = this.segEl?.nativeElement;
|
|
146
|
+
if (!el)
|
|
147
|
+
return;
|
|
148
|
+
const btn = el.querySelector('[aria-pressed="true"]');
|
|
149
|
+
if (btn) {
|
|
150
|
+
this.knobLeft = btn.offsetLeft;
|
|
151
|
+
this.knobWidth = btn.offsetWidth;
|
|
152
|
+
this.cdr.markForCheck();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// builds the path for the current range, then draws it in; a range change
|
|
156
|
+
// redraws in place (the dashes reset without a transition, then run)
|
|
157
|
+
draw(redraw) {
|
|
158
|
+
const r = this.currentRange;
|
|
159
|
+
if (!r)
|
|
160
|
+
return;
|
|
161
|
+
const d = r.points;
|
|
162
|
+
const lo = Math.min(...d) - 1, hi = Math.max(...d) + 1;
|
|
163
|
+
this.pts = d.map((v, i) => ({
|
|
164
|
+
x: d.length > 1 ? (i / (d.length - 1)) * W : 0,
|
|
165
|
+
y: 86 - ((v - lo) / (hi - lo || 1)) * 80,
|
|
166
|
+
v,
|
|
167
|
+
}));
|
|
168
|
+
this.lineD = this.pts.map((q, i) => (i ? 'L' : 'M') + q.x.toFixed(1) + ' ' + q.y.toFixed(1)).join(' ');
|
|
169
|
+
this.areaD = this.lineD ? this.lineD + ` L${W} ${H} L0 ${H} Z` : '';
|
|
170
|
+
this.rangeChangeValue = r.change;
|
|
171
|
+
this.swapInsight(r.insight);
|
|
172
|
+
this.whyLabel = this.labelFor();
|
|
173
|
+
this.placeKnob();
|
|
174
|
+
const el = this.chartEl?.nativeElement;
|
|
175
|
+
if (this.reduced.reduce() || !el) {
|
|
176
|
+
this.drawn = true;
|
|
177
|
+
this.dash = 'none';
|
|
178
|
+
this.value = r.value;
|
|
179
|
+
this.change = r.change;
|
|
180
|
+
this.cdr.markForCheck();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// the stroke doesn't scale with the stretched chart, so its dashes are
|
|
184
|
+
// measured on screen: use the line's on-screen length
|
|
185
|
+
const sx = el.clientWidth / W, sy = el.clientHeight / H;
|
|
186
|
+
const len = this.pts.reduce((t, q, i) => (i ? t + Math.hypot((q.x - this.pts[i - 1].x) * sx, (q.y - this.pts[i - 1].y) * sy) : 0), 0);
|
|
187
|
+
this.len = Math.ceil(len) + 2;
|
|
188
|
+
this.dash = null;
|
|
189
|
+
if (redraw)
|
|
190
|
+
this.drawn = false;
|
|
191
|
+
this.cdr.markForCheck();
|
|
192
|
+
// next frame, flip the class so the dash-offset transition runs
|
|
193
|
+
this.frames.push(requestAnimationFrame(() => {
|
|
194
|
+
this.drawn = true;
|
|
195
|
+
this.cdr.markForCheck();
|
|
196
|
+
}));
|
|
197
|
+
this.tween(this.value, r.value, 900, (v) => (this.value = v));
|
|
198
|
+
this.tween(this.change, r.change, 900, (v) => (this.change = v));
|
|
199
|
+
}
|
|
200
|
+
swapInsight(to) {
|
|
201
|
+
if (to === this.shownInsight)
|
|
202
|
+
return;
|
|
203
|
+
if (this.reduced.reduce()) {
|
|
204
|
+
this.shownInsight = to;
|
|
205
|
+
this.cdr.markForCheck();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.insightOut = true;
|
|
209
|
+
this.cdr.markForCheck();
|
|
210
|
+
this.later(() => {
|
|
211
|
+
this.shownInsight = to;
|
|
212
|
+
this.insightOut = false;
|
|
213
|
+
this.cdr.markForCheck();
|
|
214
|
+
}, 170);
|
|
215
|
+
}
|
|
216
|
+
move(e) {
|
|
217
|
+
if (!this.pts.length)
|
|
218
|
+
return;
|
|
219
|
+
const b = this.chartEl.nativeElement.getBoundingClientRect();
|
|
220
|
+
const fx = ((e.clientX - b.left) / b.width) * W;
|
|
221
|
+
let best = this.pts[0];
|
|
222
|
+
for (const q of this.pts)
|
|
223
|
+
if (Math.abs(q.x - fx) < Math.abs(best.x - fx))
|
|
224
|
+
best = q;
|
|
225
|
+
this.hover = {
|
|
226
|
+
x: best.x,
|
|
227
|
+
y: best.y,
|
|
228
|
+
px: (best.x / W) * b.width,
|
|
229
|
+
py: (best.y / H) * b.height,
|
|
230
|
+
v: best.v,
|
|
231
|
+
};
|
|
232
|
+
this.cdr.markForCheck();
|
|
233
|
+
}
|
|
234
|
+
tween(from, to, dur, set) {
|
|
235
|
+
if (from === to) {
|
|
236
|
+
set(to);
|
|
237
|
+
this.cdr.markForCheck();
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const t0 = performance.now();
|
|
241
|
+
const step = (t) => {
|
|
242
|
+
const p = Math.max(0, Math.min(1, (t - t0) / dur));
|
|
243
|
+
const e = 1 - Math.pow(1 - p, 3);
|
|
244
|
+
set(from + (to - from) * e);
|
|
245
|
+
this.cdr.markForCheck();
|
|
246
|
+
if (p < 1)
|
|
247
|
+
this.frames.push(requestAnimationFrame(step));
|
|
248
|
+
};
|
|
249
|
+
this.frames.push(requestAnimationFrame(step));
|
|
250
|
+
}
|
|
251
|
+
later(fn, ms) {
|
|
252
|
+
this.timers.push(setTimeout(fn, ms));
|
|
253
|
+
}
|
|
254
|
+
ngOnDestroy() {
|
|
255
|
+
this.timers.forEach(clearTimeout);
|
|
256
|
+
this.frames.forEach(cancelAnimationFrame);
|
|
257
|
+
this.timers = [];
|
|
258
|
+
this.frames = [];
|
|
259
|
+
}
|
|
260
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MetricInsightComponent, deps: [{ token: i1.ReducedMotionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
261
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: MetricInsightComponent, isStandalone: true, selector: "vo-metric-insight", inputs: { label: "label", ranges: "ranges", range: "range", defaultRange: "defaultRange", format: "format", formatChange: "formatChange", drivers: "drivers", explaining: "explaining", open: "open", defaultOpen: "defaultOpen" }, outputs: { rangeChange: "rangeChange", openChange: "openChange" }, viewQueries: [{ propertyName: "chartEl", first: true, predicate: ["chart"], descendants: true }, { propertyName: "segEl", first: true, predicate: ["seg"], descendants: true }], ngImport: i0, template: `
|
|
262
|
+
<div data-vo="" class="vo-mix vo-panel">
|
|
263
|
+
<div class="vo-mix-h">
|
|
264
|
+
<span class="vo-muted">{{ label }}</span>
|
|
265
|
+
<div class="vo-seg2 vo-mix-rg" role="group" aria-label="Range" #seg>
|
|
266
|
+
<span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
|
|
267
|
+
@for (r of ranges; track r.key) {
|
|
268
|
+
<button
|
|
269
|
+
type="button"
|
|
270
|
+
[attr.aria-pressed]="r.key === current"
|
|
271
|
+
[attr.data-v]="r.key"
|
|
272
|
+
(click)="select(r.key)"
|
|
273
|
+
>
|
|
274
|
+
{{ r.label }}
|
|
275
|
+
</button>
|
|
276
|
+
}
|
|
277
|
+
</div>
|
|
278
|
+
</div>
|
|
279
|
+
<div class="vo-mix-v">
|
|
280
|
+
<b class="vo-num vo-mix-n">{{ format(hover ? hover.v : value) }}</b>
|
|
281
|
+
<span class="vo-tag vo-mix-d vo-num" [class.vo-bad]="rangeDelta < 0" [class.vo-ok]="rangeDelta >= 0">
|
|
282
|
+
{{ formatChange(change) }}
|
|
283
|
+
</span>
|
|
284
|
+
</div>
|
|
285
|
+
<div
|
|
286
|
+
#chart
|
|
287
|
+
class="vo-mix-ch"
|
|
288
|
+
[class.vo-in]="drawn"
|
|
289
|
+
(pointermove)="move($event)"
|
|
290
|
+
(pointerleave)="hover = null"
|
|
291
|
+
>
|
|
292
|
+
<svg class="vo-mix-svg" [attr.viewBox]="'0 0 ' + W + ' ' + H" preserveAspectRatio="none" aria-hidden="true">
|
|
293
|
+
<defs>
|
|
294
|
+
<linearGradient [attr.id]="ids + 'g'" x1="0" x2="0" y1="0" y2="1">
|
|
295
|
+
<stop offset="0" stop-color="var(--vo-accent-mark,var(--vo-accent))" stop-opacity=".18"></stop>
|
|
296
|
+
<stop offset="1" stop-color="var(--vo-accent-mark,var(--vo-accent))" stop-opacity="0"></stop>
|
|
297
|
+
</linearGradient>
|
|
298
|
+
</defs>
|
|
299
|
+
<path class="vo-mix-a" [attr.fill]="'url(#' + ids + 'g)'" [attr.d]="areaD"></path>
|
|
300
|
+
<path
|
|
301
|
+
class="vo-mix-l"
|
|
302
|
+
[attr.d]="lineD"
|
|
303
|
+
fill="none"
|
|
304
|
+
stroke="var(--vo-accent-mark,var(--vo-accent))"
|
|
305
|
+
stroke-width="2"
|
|
306
|
+
vector-effect="non-scaling-stroke"
|
|
307
|
+
stroke-linejoin="round"
|
|
308
|
+
[style.stroke-dasharray]="dash"
|
|
309
|
+
[style.--vo-len]="len"
|
|
310
|
+
></path>
|
|
311
|
+
<line
|
|
312
|
+
class="vo-mix-x"
|
|
313
|
+
[attr.x1]="hover?.x ?? 0"
|
|
314
|
+
[attr.x2]="hover?.x ?? 0"
|
|
315
|
+
y1="0"
|
|
316
|
+
y2="90"
|
|
317
|
+
stroke="var(--vo-faint)"
|
|
318
|
+
stroke-dasharray="2 3"
|
|
319
|
+
vector-effect="non-scaling-stroke"
|
|
320
|
+
[style.opacity]="hover ? 1 : null"
|
|
321
|
+
></line>
|
|
322
|
+
</svg>
|
|
323
|
+
<span
|
|
324
|
+
class="vo-mix-dot"
|
|
325
|
+
[style.left.px]="hover ? hover.px : null"
|
|
326
|
+
[style.top.px]="hover ? hover.py : null"
|
|
327
|
+
[style.opacity]="hover ? 1 : null"
|
|
328
|
+
></span>
|
|
329
|
+
@if (currentRange?.marker; as mk) {
|
|
330
|
+
<span class="vo-mix-mk" [style.left]="mk.at * 100 + '%'">
|
|
331
|
+
<b [title]="mk.label"><vo-icon name="spark" size="xs"></vo-icon>{{ mk.label }}</b>
|
|
332
|
+
</span>
|
|
333
|
+
}
|
|
334
|
+
</div>
|
|
335
|
+
<div class="vo-mix-ins">
|
|
336
|
+
<span class="vo-mix-ic"><vo-icon name="spark" size="xs"></vo-icon></span>
|
|
337
|
+
<span class="vo-sw vo-mix-t" [class.vo-out]="insightOut">{{ shownInsight }}</span>
|
|
338
|
+
</div>
|
|
339
|
+
@if (drivers) {
|
|
340
|
+
<button
|
|
341
|
+
type="button"
|
|
342
|
+
class="vo-pill vo-soft vo-sm vo-mix-why"
|
|
343
|
+
[attr.aria-expanded]="shown"
|
|
344
|
+
(click)="toggle()"
|
|
345
|
+
>
|
|
346
|
+
@if (explaining) {
|
|
347
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
348
|
+
}
|
|
349
|
+
<span class="vo-sw" [class.vo-out]="whyOut">{{ whyLabel }}</span>
|
|
350
|
+
</button>
|
|
351
|
+
<div class="vo-fold vo-mix-box" [class.vo-shut]="!shown" [attr.inert]="!shown ? '' : null" [attr.aria-hidden]="!shown">
|
|
352
|
+
<div>
|
|
353
|
+
<div class="vo-mix-rs">
|
|
354
|
+
@for (q of drivers; track q.label; let i = $index) {
|
|
355
|
+
<div class="vo-mix-r vo-enter" [style.animation-delay]="i * 60 + 'ms'">
|
|
356
|
+
<span class="vo-dot" [style.color]="q.color ?? 'var(--vo-accent)'"></span>
|
|
357
|
+
<span class="vo-t">{{ q.label }}</span>
|
|
358
|
+
<span class="vo-bar"><i [style.width]="q.percent + '%'" [style.background]="q.color ?? 'var(--vo-accent)'"></i></span>
|
|
359
|
+
<span class="vo-v vo-num">{{ q.percent }}%</span>
|
|
360
|
+
</div>
|
|
361
|
+
}
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
}
|
|
366
|
+
</div>
|
|
367
|
+
`, isInline: true, styles: [".vo-mix{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-mix-h{display:flex;align-items:center;justify-content:space-between;font-size:12.5px}.vo-mix-rg button{font-size:11.5px;padding:0 var(--vo-s-2);height:24px}.vo-mix-v{display:flex;align-items:baseline;gap:var(--vo-s-2)}.vo-mix-v b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-mix-ch{position:relative;height:90px;cursor:crosshair}.vo-mix-svg{width:100%;height:100%;display:block;overflow:visible}.vo-mix-l{stroke-dasharray:var(--vo-len);stroke-dashoffset:var(--vo-len);transition:stroke-dashoffset 1.2s var(--vo-ease)}.vo-mix-ch.vo-in .vo-mix-l{stroke-dashoffset:0}.vo-mix-a{opacity:0;transition:opacity .8s .5s}.vo-mix-ch.vo-in .vo-mix-a{opacity:1}.vo-mix-x{opacity:0;transition:opacity .2s}@media (hover:hover) and (pointer:fine){.vo-mix-ch:hover .vo-mix-x,.vo-mix-ch:hover .vo-mix-dot{opacity:1}}.vo-mix-dot{position:absolute;width:9px;height:9px;margin:-4.5px;border-radius:50%;background:var(--vo-surface);box-shadow:0 0 0 2px var(--vo-accent-mark,var(--vo-accent));opacity:0;transition:opacity .2s;pointer-events:none}.vo-mix-mk{position:absolute;top:-14px;bottom:0;display:flex;flex-direction:column;align-items:center;transform:translate(-50%);opacity:0;transition:opacity .4s 1.1s;pointer-events:none}.vo-mix-mk b{pointer-events:auto;display:inline-flex;align-items:center;gap:var(--vo-s-1);height:20px;padding:0 7px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:11.5px;font-weight:500;color:var(--vo-fg2);white-space:nowrap}.vo-mix-mk b svg{width:10px;height:10px;color:var(--vo-accent-fg,var(--vo-accent))}.vo-mix-mk:after{content:\"\";flex:1;border-left:1px dashed color-mix(in srgb,var(--vo-faint) 50%,transparent)}.vo-mix-ch.vo-in .vo-mix-mk{opacity:1}.vo-mix-ins{display:flex;gap:var(--vo-s-2);align-items:flex-start;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-mix-ic{color:var(--vo-accent-fg,var(--vo-accent));display:grid;margin-top:2px}.vo-mix-why{align-self:flex-start}.vo-pill.vo-soft.vo-mix-why{background:var(--vo-chip);box-shadow:none}.vo-pill.vo-soft.vo-mix-why[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft.vo-mix-why:hover{background:var(--vo-hover)}}.vo-mix-rs{display:flex;flex-direction:column;gap:6px;padding-top:2px}.vo-mix-r{display:flex;align-items:center;gap:10px;font-size:12.5px}.vo-mix-r .vo-t{flex:1;min-width:0}.vo-mix-r .vo-bar{width:70px;height:5px;border-radius:3px;background:var(--vo-line);overflow:hidden;flex:none}.vo-mix-r .vo-bar i{display:block;height:100%;border-radius:3px;transform-origin:left;animation:vo-ssrel .8s var(--vo-ease) both}.vo-mix-r .vo-v{width:44px;text-align:right;font-size:12px;color:var(--vo-fg2)}@keyframes vo-ssrel{0%{transform:scaleX(0)}}.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-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.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-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}@supports (corner-shape:squircle){.vo-tag{corner-shape:squircle;border-radius:var(--vo-r-tag-sq)}}.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-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-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-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);cursor:pointer;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;left: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-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-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)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.vo-enter,.vo-think,.vo-mix-r .vo-bar i{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
368
|
+
}
|
|
369
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MetricInsightComponent, decorators: [{
|
|
370
|
+
type: Component,
|
|
371
|
+
args: [{ selector: 'vo-metric-insight', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
372
|
+
<div data-vo="" class="vo-mix vo-panel">
|
|
373
|
+
<div class="vo-mix-h">
|
|
374
|
+
<span class="vo-muted">{{ label }}</span>
|
|
375
|
+
<div class="vo-seg2 vo-mix-rg" role="group" aria-label="Range" #seg>
|
|
376
|
+
<span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
|
|
377
|
+
@for (r of ranges; track r.key) {
|
|
378
|
+
<button
|
|
379
|
+
type="button"
|
|
380
|
+
[attr.aria-pressed]="r.key === current"
|
|
381
|
+
[attr.data-v]="r.key"
|
|
382
|
+
(click)="select(r.key)"
|
|
383
|
+
>
|
|
384
|
+
{{ r.label }}
|
|
385
|
+
</button>
|
|
386
|
+
}
|
|
387
|
+
</div>
|
|
388
|
+
</div>
|
|
389
|
+
<div class="vo-mix-v">
|
|
390
|
+
<b class="vo-num vo-mix-n">{{ format(hover ? hover.v : value) }}</b>
|
|
391
|
+
<span class="vo-tag vo-mix-d vo-num" [class.vo-bad]="rangeDelta < 0" [class.vo-ok]="rangeDelta >= 0">
|
|
392
|
+
{{ formatChange(change) }}
|
|
393
|
+
</span>
|
|
394
|
+
</div>
|
|
395
|
+
<div
|
|
396
|
+
#chart
|
|
397
|
+
class="vo-mix-ch"
|
|
398
|
+
[class.vo-in]="drawn"
|
|
399
|
+
(pointermove)="move($event)"
|
|
400
|
+
(pointerleave)="hover = null"
|
|
401
|
+
>
|
|
402
|
+
<svg class="vo-mix-svg" [attr.viewBox]="'0 0 ' + W + ' ' + H" preserveAspectRatio="none" aria-hidden="true">
|
|
403
|
+
<defs>
|
|
404
|
+
<linearGradient [attr.id]="ids + 'g'" x1="0" x2="0" y1="0" y2="1">
|
|
405
|
+
<stop offset="0" stop-color="var(--vo-accent-mark,var(--vo-accent))" stop-opacity=".18"></stop>
|
|
406
|
+
<stop offset="1" stop-color="var(--vo-accent-mark,var(--vo-accent))" stop-opacity="0"></stop>
|
|
407
|
+
</linearGradient>
|
|
408
|
+
</defs>
|
|
409
|
+
<path class="vo-mix-a" [attr.fill]="'url(#' + ids + 'g)'" [attr.d]="areaD"></path>
|
|
410
|
+
<path
|
|
411
|
+
class="vo-mix-l"
|
|
412
|
+
[attr.d]="lineD"
|
|
413
|
+
fill="none"
|
|
414
|
+
stroke="var(--vo-accent-mark,var(--vo-accent))"
|
|
415
|
+
stroke-width="2"
|
|
416
|
+
vector-effect="non-scaling-stroke"
|
|
417
|
+
stroke-linejoin="round"
|
|
418
|
+
[style.stroke-dasharray]="dash"
|
|
419
|
+
[style.--vo-len]="len"
|
|
420
|
+
></path>
|
|
421
|
+
<line
|
|
422
|
+
class="vo-mix-x"
|
|
423
|
+
[attr.x1]="hover?.x ?? 0"
|
|
424
|
+
[attr.x2]="hover?.x ?? 0"
|
|
425
|
+
y1="0"
|
|
426
|
+
y2="90"
|
|
427
|
+
stroke="var(--vo-faint)"
|
|
428
|
+
stroke-dasharray="2 3"
|
|
429
|
+
vector-effect="non-scaling-stroke"
|
|
430
|
+
[style.opacity]="hover ? 1 : null"
|
|
431
|
+
></line>
|
|
432
|
+
</svg>
|
|
433
|
+
<span
|
|
434
|
+
class="vo-mix-dot"
|
|
435
|
+
[style.left.px]="hover ? hover.px : null"
|
|
436
|
+
[style.top.px]="hover ? hover.py : null"
|
|
437
|
+
[style.opacity]="hover ? 1 : null"
|
|
438
|
+
></span>
|
|
439
|
+
@if (currentRange?.marker; as mk) {
|
|
440
|
+
<span class="vo-mix-mk" [style.left]="mk.at * 100 + '%'">
|
|
441
|
+
<b [title]="mk.label"><vo-icon name="spark" size="xs"></vo-icon>{{ mk.label }}</b>
|
|
442
|
+
</span>
|
|
443
|
+
}
|
|
444
|
+
</div>
|
|
445
|
+
<div class="vo-mix-ins">
|
|
446
|
+
<span class="vo-mix-ic"><vo-icon name="spark" size="xs"></vo-icon></span>
|
|
447
|
+
<span class="vo-sw vo-mix-t" [class.vo-out]="insightOut">{{ shownInsight }}</span>
|
|
448
|
+
</div>
|
|
449
|
+
@if (drivers) {
|
|
450
|
+
<button
|
|
451
|
+
type="button"
|
|
452
|
+
class="vo-pill vo-soft vo-sm vo-mix-why"
|
|
453
|
+
[attr.aria-expanded]="shown"
|
|
454
|
+
(click)="toggle()"
|
|
455
|
+
>
|
|
456
|
+
@if (explaining) {
|
|
457
|
+
<span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
|
|
458
|
+
}
|
|
459
|
+
<span class="vo-sw" [class.vo-out]="whyOut">{{ whyLabel }}</span>
|
|
460
|
+
</button>
|
|
461
|
+
<div class="vo-fold vo-mix-box" [class.vo-shut]="!shown" [attr.inert]="!shown ? '' : null" [attr.aria-hidden]="!shown">
|
|
462
|
+
<div>
|
|
463
|
+
<div class="vo-mix-rs">
|
|
464
|
+
@for (q of drivers; track q.label; let i = $index) {
|
|
465
|
+
<div class="vo-mix-r vo-enter" [style.animation-delay]="i * 60 + 'ms'">
|
|
466
|
+
<span class="vo-dot" [style.color]="q.color ?? 'var(--vo-accent)'"></span>
|
|
467
|
+
<span class="vo-t">{{ q.label }}</span>
|
|
468
|
+
<span class="vo-bar"><i [style.width]="q.percent + '%'" [style.background]="q.color ?? 'var(--vo-accent)'"></i></span>
|
|
469
|
+
<span class="vo-v vo-num">{{ q.percent }}%</span>
|
|
470
|
+
</div>
|
|
471
|
+
}
|
|
472
|
+
</div>
|
|
473
|
+
</div>
|
|
474
|
+
</div>
|
|
475
|
+
}
|
|
476
|
+
</div>
|
|
477
|
+
`, styles: [".vo-mix{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-mix-h{display:flex;align-items:center;justify-content:space-between;font-size:12.5px}.vo-mix-rg button{font-size:11.5px;padding:0 var(--vo-s-2);height:24px}.vo-mix-v{display:flex;align-items:baseline;gap:var(--vo-s-2)}.vo-mix-v b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-mix-ch{position:relative;height:90px;cursor:crosshair}.vo-mix-svg{width:100%;height:100%;display:block;overflow:visible}.vo-mix-l{stroke-dasharray:var(--vo-len);stroke-dashoffset:var(--vo-len);transition:stroke-dashoffset 1.2s var(--vo-ease)}.vo-mix-ch.vo-in .vo-mix-l{stroke-dashoffset:0}.vo-mix-a{opacity:0;transition:opacity .8s .5s}.vo-mix-ch.vo-in .vo-mix-a{opacity:1}.vo-mix-x{opacity:0;transition:opacity .2s}@media (hover:hover) and (pointer:fine){.vo-mix-ch:hover .vo-mix-x,.vo-mix-ch:hover .vo-mix-dot{opacity:1}}.vo-mix-dot{position:absolute;width:9px;height:9px;margin:-4.5px;border-radius:50%;background:var(--vo-surface);box-shadow:0 0 0 2px var(--vo-accent-mark,var(--vo-accent));opacity:0;transition:opacity .2s;pointer-events:none}.vo-mix-mk{position:absolute;top:-14px;bottom:0;display:flex;flex-direction:column;align-items:center;transform:translate(-50%);opacity:0;transition:opacity .4s 1.1s;pointer-events:none}.vo-mix-mk b{pointer-events:auto;display:inline-flex;align-items:center;gap:var(--vo-s-1);height:20px;padding:0 7px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:11.5px;font-weight:500;color:var(--vo-fg2);white-space:nowrap}.vo-mix-mk b svg{width:10px;height:10px;color:var(--vo-accent-fg,var(--vo-accent))}.vo-mix-mk:after{content:\"\";flex:1;border-left:1px dashed color-mix(in srgb,var(--vo-faint) 50%,transparent)}.vo-mix-ch.vo-in .vo-mix-mk{opacity:1}.vo-mix-ins{display:flex;gap:var(--vo-s-2);align-items:flex-start;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-mix-ic{color:var(--vo-accent-fg,var(--vo-accent));display:grid;margin-top:2px}.vo-mix-why{align-self:flex-start}.vo-pill.vo-soft.vo-mix-why{background:var(--vo-chip);box-shadow:none}.vo-pill.vo-soft.vo-mix-why[aria-expanded=true]{background:var(--vo-hover)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-soft.vo-mix-why:hover{background:var(--vo-hover)}}.vo-mix-rs{display:flex;flex-direction:column;gap:6px;padding-top:2px}.vo-mix-r{display:flex;align-items:center;gap:10px;font-size:12.5px}.vo-mix-r .vo-t{flex:1;min-width:0}.vo-mix-r .vo-bar{width:70px;height:5px;border-radius:3px;background:var(--vo-line);overflow:hidden;flex:none}.vo-mix-r .vo-bar i{display:block;height:100%;border-radius:3px;transform-origin:left;animation:vo-ssrel .8s var(--vo-ease) both}.vo-mix-r .vo-v{width:44px;text-align:right;font-size:12px;color:var(--vo-fg2)}@keyframes vo-ssrel{0%{transform:scaleX(0)}}.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-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.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-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}@supports (corner-shape:squircle){.vo-tag{corner-shape:squircle;border-radius:var(--vo-r-tag-sq)}}.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-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-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-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);cursor:pointer;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;left: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-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-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)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.vo-enter,.vo-think,.vo-mix-r .vo-bar i{animation:none}}\n"] }]
|
|
478
|
+
}], ctorParameters: () => [{ type: i1.ReducedMotionService }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
479
|
+
type: Input,
|
|
480
|
+
args: [{ required: true }]
|
|
481
|
+
}], ranges: [{
|
|
482
|
+
type: Input,
|
|
483
|
+
args: [{ required: true }]
|
|
484
|
+
}], range: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], defaultRange: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], format: [{
|
|
489
|
+
type: Input
|
|
490
|
+
}], formatChange: [{
|
|
491
|
+
type: Input
|
|
492
|
+
}], drivers: [{
|
|
493
|
+
type: Input
|
|
494
|
+
}], explaining: [{
|
|
495
|
+
type: Input
|
|
496
|
+
}], open: [{
|
|
497
|
+
type: Input
|
|
498
|
+
}], defaultOpen: [{
|
|
499
|
+
type: Input
|
|
500
|
+
}], rangeChange: [{
|
|
501
|
+
type: Output
|
|
502
|
+
}], openChange: [{
|
|
503
|
+
type: Output
|
|
504
|
+
}], chartEl: [{
|
|
505
|
+
type: ViewChild,
|
|
506
|
+
args: ['chart']
|
|
507
|
+
}], segEl: [{
|
|
508
|
+
type: ViewChild,
|
|
509
|
+
args: ['seg']
|
|
510
|
+
}] } });
|
|
511
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljLWluc2lnaHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbWV0cmljLWluc2lnaHQvbWV0cmljLWluc2lnaHQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxFQUFFO0FBQ0YsMkVBQTJFO0FBQzNFLHVFQUF1RTtBQUN2RSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxvRUFBb0U7QUFFcEUsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBOEJ6RCxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQTJIdEIsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQyx5RUFBeUU7SUFDekUsSUFBYSxLQUFLLENBQUMsS0FBeUI7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDO1FBQzNDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUs7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQVVELCtFQUErRTtJQUMvRSxJQUFhLElBQUksQ0FBQyxLQUEwQjtRQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssS0FBSyxTQUFTLENBQUM7UUFDMUMsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFF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TUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDOytHQWxRVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixxaUJBN0d2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBHVCxrbE5BM0dTLGVBQWU7OzRGQThHZCxzQkFBc0I7a0JBbEhsQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLGlCQUNELGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxlQUFlLENBQUMsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwR1Q7eUhBSzBCLEtBQUs7c0JBQS9CLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVFLE1BQU07c0JBQWhDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVaLEtBQUs7c0JBQWpCLEtBQUs7Z0JBT0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFTyxJQUFJO3NCQUFoQixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVxQixPQUFPO3NCQUFsQyxTQUFTO3VCQUFDLE9BQU87Z0JBQ1EsS0FBSztzQkFBOUIsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvbWV0cmljLWluc2lnaHQvbWV0cmljLWluc2lnaHQuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvbWV0cmljLWluc2lnaHQvTWV0cmljSW5zaWdodC50c3guXG4vLyBBIG1ldHJpYyB3aXRoIGl0cyB0cmVuZCBsaW5lLCBhIG9uZS1saW5lIHJlYWQgb24gd2h5IGl0IG1vdmVkLCBhbmQgYVxuLy8gYnJlYWtkb3duIG9mIHdoYXQgbW92ZWQgaXQuIEEgcmFuZ2Ugc3dpdGNoIHJlLXJvbGxzIHRoZSBiaWcgbnVtYmVyIGFuZCB0aGVcbi8vIGNoYW5nZSB0YWcgYW5kIHJlZHJhd3MgdGhlIGxpbmUgaW4gcGxhY2U7IGEgcG9pbnRlciByZWFkb3V0IGZvbGxvd3MgdGhlXG4vLyBjdXJzb3IgYWNyb3NzIHRoZSBjaGFydDsgYSBtYXJrZXIgZmFkZXMgaW4gbGF0ZSB3aGVyZSBhIHJlbGVhc2UgaGFwcGVuZWQ7IGFuZFxuLy8gXCJXaHkgZGlkIGl0IG1vdmU/XCIgb3BlbnMgYSBzdGFnZ2VyZWQgYnJlYWtkb3duIG9mIGRyaXZlcnMuIElucHV0cyBtaXJyb3IgdGhlXG4vLyBSZWFjdCBwcm9wczsgdGhlIGRyYXctaW4sIHRoZSBjb3VudC11cCwgdGhlIHBvaW50ZXIgcmVhZG91dCBhbmQgdGhlIGZvbGQgYXJlXG4vLyBwb3J0ZWQgZnJvbSB0aGUgdmFuaWxsYSBKUyAobWV0cmljLWluc2lnaHQuanMpLiBUb2tlbnMgb25seSDigJQgbm8gY29sb3VyXG4vLyBsaXRlcmFscy4gVGhlIG9ubHkgaWNvbiB1c2VkIGlzIGBzcGFya2AsIHZpYSBjb3JlL2ljb24uY29tcG9uZW50LlxuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIE9uZSByYW5nZSBvZiB0aGUgbWV0cmljLCBsaWtlIHRoZSBsYXN0IDMwIGRheXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1JhbmdlIHtcbiAgLyoqIElkZW50aWZpZXMgdGhlIHJhbmdlLCBsaWtlICczMCcuICovXG4gIGtleTogc3RyaW5nO1xuICAvKiogVGhlIHN3aXRjaCBsYWJlbCwgbGlrZSBcIjMwZFwiLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogVGhlIHZhbHVlcyBvdmVyIHRoZSByYW5nZSwgb2xkZXN0IGZpcnN0LiAqL1xuICBwb2ludHM6IG51bWJlcltdO1xuICAvKiogVGhlIG51bWJlciBpbiBsYXJnZSB0eXBlLCB3aGljaCByb2xscyB0byBpdC4gKi9cbiAgdmFsdWU6IG51bWJlcjtcbiAgLyoqIFRoZSBjaGFuZ2Ugb3ZlciB0aGUgcmFuZ2UsIGluIHRoZSB0YWcgYmVzaWRlIGl0LiAqL1xuICBjaGFuZ2U6IG51bWJlcjtcbiAgLyoqIE9uZSBsaW5lIG9uIHdoYXQgaGFwcGVuZWQsIGxpa2UgXCJKdW1wZWQgYWZ0ZXIgdGhlIHByaWNpbmcgcGFnZSB1cGRhdGUgb24gU2VwIDE4LlwiICovXG4gIGluc2lnaHQ6IHN0cmluZztcbiAgLyoqIEEgbWFya2VyIG9uIHRoZSBjaGFydCwgbGlrZSBhIHJlbGVhc2U6IGBhdGAgaXMgMCB0byAxIGFjcm9zcywgYGxhYmVsYCBzaG93cyBvbiBob3Zlci4gKi9cbiAgbWFya2VyPzogeyBhdDogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH07XG59XG5cbi8qKiBPbmUgY29udHJpYnV0b3IgdG8gdGhlIGNoYW5nZSwgc2hvd24gdW5kZXIgXCJXaHkgZGlkIGl0IG1vdmU/XCIuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY0RyaXZlciB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBJdHMgc2hhcmUgb2YgdGhlIGNoYW5nZSwgMCB0byAxMDAuICovXG4gIHBlcmNlbnQ6IG51bWJlcjtcbiAgLyoqIEFueSBDU1MgY29sb3VyLCBsaWtlICd2YXIoLS12by1hY2NlbnQpJy4gRGVmYXVsdHMgdG8gdGhlIGFjY2VudC4gKi9cbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFcgPSAzMDAsIEggPSA5MDtcblxuLyoqIEludGVybmFsIHBlci1wb2ludCByZW5kZXIgc3RhdGU6IG9uLXNjcmVlbiB4L3kgcGx1cyB0aGUgcmF3IHZhbHVlLiAqL1xuaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHY6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tbWV0cmljLWluc2lnaHQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGRhdGEtdm89XCJcIiBjbGFzcz1cInZvLW1peCB2by1wYW5lbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLW1peC1oXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLXNlZzIgdm8tbWl4LXJnXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlJhbmdlXCIgI3NlZz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWtub2JcIiBbc3R5bGUubGVmdC5weF09XCJrbm9iTGVmdFwiIFtzdHlsZS53aWR0aC5weF09XCJrbm9iV2lkdGhcIj48L3NwYW4+XG4gICAgICAgICAgQGZvciAociBvZiByYW5nZXM7IHRyYWNrIHIua2V5KSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwici5rZXkgPT09IGN1cnJlbnRcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXZdPVwici5rZXlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0KHIua2V5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHIubGFiZWwgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1taXgtdlwiPlxuICAgICAgICA8YiBjbGFzcz1cInZvLW51bSB2by1taXgtblwiPnt7IGZvcm1hdChob3ZlciA/IGhvdmVyLnYgOiB2YWx1ZSkgfX08L2I+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGFnIHZvLW1peC1kIHZvLW51bVwiIFtjbGFzcy52by1iYWRdPVwicmFuZ2VEZWx0YSA8IDBcIiBbY2xhc3Mudm8tb2tdPVwicmFuZ2VEZWx0YSA+PSAwXCI+XG4gICAgICAgICAge3sgZm9ybWF0Q2hhbmdlKGNoYW5nZSkgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICNjaGFydFxuICAgICAgICBjbGFzcz1cInZvLW1peC1jaFwiXG4gICAgICAgIFtjbGFzcy52by1pbl09XCJkcmF3blwiXG4gICAgICAgIChwb2ludGVybW92ZSk9XCJtb3ZlKCRldmVudClcIlxuICAgICAgICAocG9pbnRlcmxlYXZlKT1cImhvdmVyID0gbnVsbFwiXG4gICAgICA+XG4gICAgICAgIDxzdmcgY2xhc3M9XCJ2by1taXgtc3ZnXCIgW2F0dHIudmlld0JveF09XCInMCAwICcgKyBXICsgJyAnICsgSFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgW2F0dHIuaWRdPVwiaWRzICsgJ2cnXCIgeDE9XCIwXCIgeDI9XCIwXCIgeTE9XCIwXCIgeTI9XCIxXCI+XG4gICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwidmFyKC0tdm8tYWNjZW50LW1hcmssdmFyKC0tdm8tYWNjZW50KSlcIiBzdG9wLW9wYWNpdHk9XCIuMThcIj48L3N0b3A+XG4gICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwidmFyKC0tdm8tYWNjZW50LW1hcmssdmFyKC0tdm8tYWNjZW50KSlcIiBzdG9wLW9wYWNpdHk9XCIwXCI+PC9zdG9wPlxuICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgPHBhdGggY2xhc3M9XCJ2by1taXgtYVwiIFthdHRyLmZpbGxdPVwiJ3VybCgjJyArIGlkcyArICdnKSdcIiBbYXR0ci5kXT1cImFyZWFEXCI+PC9wYXRoPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBjbGFzcz1cInZvLW1peC1sXCJcbiAgICAgICAgICAgIFthdHRyLmRdPVwibGluZURcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0tdm8tYWNjZW50LW1hcmssdmFyKC0tdm8tYWNjZW50KSlcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICB2ZWN0b3ItZWZmZWN0PVwibm9uLXNjYWxpbmctc3Ryb2tlXCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5XT1cImRhc2hcIlxuICAgICAgICAgICAgW3N0eWxlLi0tdm8tbGVuXT1cImxlblwiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgY2xhc3M9XCJ2by1taXgteFwiXG4gICAgICAgICAgICBbYXR0ci54MV09XCJob3Zlcj8ueCA/PyAwXCJcbiAgICAgICAgICAgIFthdHRyLngyXT1cImhvdmVyPy54ID8/IDBcIlxuICAgICAgICAgICAgeTE9XCIwXCJcbiAgICAgICAgICAgIHkyPVwiOTBcIlxuICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0tdm8tZmFpbnQpXCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCIyIDNcIlxuICAgICAgICAgICAgdmVjdG9yLWVmZmVjdD1cIm5vbi1zY2FsaW5nLXN0cm9rZVwiXG4gICAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJob3ZlciA/IDEgOiBudWxsXCJcbiAgICAgICAgICA+PC9saW5lPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInZvLW1peC1kb3RcIlxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImhvdmVyID8gaG92ZXIucHggOiBudWxsXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImhvdmVyID8gaG92ZXIucHkgOiBudWxsXCJcbiAgICAgICAgICBbc3R5bGUub3BhY2l0eV09XCJob3ZlciA/IDEgOiBudWxsXCJcbiAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgQGlmIChjdXJyZW50UmFuZ2U/Lm1hcmtlcjsgYXMgbWspIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW1peC1ta1wiIFtzdHlsZS5sZWZ0XT1cIm1rLmF0ICogMTAwICsgJyUnXCI+XG4gICAgICAgICAgICA8YiBbdGl0bGVdPVwibWsubGFiZWxcIj48dm8taWNvbiBuYW1lPVwic3BhcmtcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgbWsubGFiZWwgfX08L2I+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1taXgtaW5zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbWl4LWljXCI+PHZvLWljb24gbmFtZT1cInNwYXJrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zdyB2by1taXgtdFwiIFtjbGFzcy52by1vdXRdPVwiaW5zaWdodE91dFwiPnt7IHNob3duSW5zaWdodCB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChkcml2ZXJzKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInZvLXBpbGwgdm8tc29mdCB2by1zbSB2by1taXgtd2h5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3duXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChleHBsYWluaW5nKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRoaW5rIHZvLW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGk+PC9pPjxpPjwvaT48aT48L2k+PGk+PC9pPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zd1wiIFtjbGFzcy52by1vdXRdPVwid2h5T3V0XCI+e3sgd2h5TGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by1taXgtYm94XCIgW2NsYXNzLnZvLXNodXRdPVwiIXNob3duXCIgW2F0dHIuaW5lcnRdPVwiIXNob3duID8gJycgOiBudWxsXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXNob3duXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1taXgtcnNcIj5cbiAgICAgICAgICAgICAgQGZvciAocSBvZiBkcml2ZXJzOyB0cmFjayBxLmxhYmVsOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1taXgtciB2by1lbnRlclwiIFtzdHlsZS5hbmltYXRpb24tZGVsYXldPVwiaSAqIDYwICsgJ21zJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kb3RcIiBbc3R5bGUuY29sb3JdPVwicS5jb2xvciA/PyAndmFyKC0tdm8tYWNjZW50KSdcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj57eyBxLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1iYXJcIj48aSBbc3R5bGUud2lkdGhdPVwicS5wZXJjZW50ICsgJyUnXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicS5jb2xvciA/PyAndmFyKC0tdm8tYWNjZW50KSdcIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by12IHZvLW51bVwiPnt7IHEucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL21ldHJpYy1pbnNpZ2h0LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIE1ldHJpY0luc2lnaHRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIG1ldHJpYydzIG5hbWUsIGxpa2UgXCJUcmlhbCB0byBwYWlkXCIuICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGxhYmVsID0gJyc7XG4gIC8qKiBUaGUgcmFuZ2VzIHRvIHN3aXRjaCBiZXR3ZWVuLiAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByYW5nZXM6IE1ldHJpY1JhbmdlW10gPSBbXTtcbiAgLyoqIFRoZSByYW5nZSBvbiBzaG93LCBieSBrZXkuIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIHN3aXRjaCBwaWNrIGl0LiAqL1xuICBASW5wdXQoKSBzZXQgcmFuZ2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMucmFuZ2VDb250cm9sbGVkID0gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gdGhpcy5jdXJyZW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnJlYWR5KSB0aGlzLmRyYXcodHJ1ZSk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRSYW5nZT86IHN0cmluZztcbiAgLyoqIEZvcm1hdHMgdGhlIGxhcmdlIG51bWJlciBhbmQgdGhlIGhvdmVyZWQgcG9pbnQuIERlZmF1bHRzIHRvIG9uZSBkZWNpbWFsIGFuZCBhICUuICovXG4gIEBJbnB1dCgpIGZvcm1hdDogKHZhbHVlOiBudW1iZXIpID0+IHN0cmluZyA9ICh2KSA9PiB2LnRvRml4ZWQoMSkgKyAnJSc7XG4gIC8qKiBGb3JtYXRzIHRoZSBjaGFuZ2UuIERlZmF1bHRzIHRvIFwiKzguMSBwdHNcIi4gKi9cbiAgQElucHV0KCkgZm9ybWF0Q2hhbmdlOiAoY2hhbmdlOiBudW1iZXIpID0+IHN0cmluZyA9ICh2KSA9PiAodiA8IDAgPyAn4oiSJyA6ICcrJykgKyBNYXRoLmFicyh2KS50b0ZpeGVkKDEpICsgJyBwdHMnO1xuICAvKiogV2hhdCBtb3ZlZCB0aGUgbnVtYmVyLCBzaG93biB1bmRlciBcIldoeSBkaWQgaXQgbW92ZT9cIi4gTGVhdmUgaXQgb3V0IHRvIGhpZGUgdGhlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgZHJpdmVycz86IE1ldHJpY0RyaXZlcltdO1xuICAvKiogU2hvd3MgXCJMb29raW5nIGludG8gaXRcIiBvbiB0aGUgYnV0dG9uIGFuZCBrZWVwcyB0aGUgYnJlYWtkb3duIHNodXQsIHdoaWxlIHlvdSBmZXRjaCB0aGUgZHJpdmVycy4gKi9cbiAgQElucHV0KCkgZXhwbGFpbmluZyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgYnJlYWtkb3duIGlzIG9wZW4uIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIGJ1dHRvbiB0b2dnbGUgaXQuICovXG4gIEBJbnB1dCgpIHNldCBvcGVuKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vcGVuQ29udHJvbGxlZCA9IHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMuaXNPcGVuID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KCkgZGVmYXVsdE9wZW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgcmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgQFZpZXdDaGlsZCgnY2hhcnQnKSBwcml2YXRlIGNoYXJ0RWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2VnJykgcHJpdmF0ZSBzZWdFbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHJlYWRvbmx5IFcgPSBXO1xuICByZWFkb25seSBIID0gSDtcbiAgaWRzID0gJ21peCcgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcblxuICBjdXJyZW50ID0gJyc7XG4gIHZhbHVlID0gMDtcbiAgY2hhbmdlID0gMDtcbiAgcmFuZ2VDaGFuZ2VWYWx1ZSA9IDA7XG4gIGxpbmVEID0gJyc7XG4gIGFyZWFEID0gJyc7XG4gIGRhc2g6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZW4gPSAwO1xuICBkcmF3biA9IGZhbHNlO1xuICBob3ZlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgcHg6IG51bWJlcjsgcHk6IG51bWJlcjsgdjogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAga25vYkxlZnQgPSAwO1xuICBrbm9iV2lkdGggPSAwO1xuXG4gIHNob3duSW5zaWdodCA9ICcnO1xuICBpbnNpZ2h0T3V0ID0gZmFsc2U7XG4gIHdoeUxhYmVsID0gJ1doeSBkaWQgaXQgbW92ZT8nO1xuICB3aHlPdXQgPSBmYWxzZTtcblxuICBwcml2YXRlIGlzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIHJhbmdlQ29udHJvbGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW5Db250cm9sbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwdHM6IFBvaW50W10gPSBbXTtcbiAgcHJpdmF0ZSB0aW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWR1Y2VkOiBSZWR1Y2VkTW90aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICAvKiogVGhlIGNoYW5nZSBvZiB0aGUgcmFuZ2Ugb24gc2hvdywgdXNlZCB0byB0aW50IHRoZSB0YWcgZ3JlZW4gb3IgcmVkLlxuICAgKiAgTmFtZWQgYHJhbmdlRGVsdGFgIHRvIGF2b2lkIGNvbGxpZGluZyB3aXRoIHRoZSBgcmFuZ2VDaGFuZ2VgIG91dHB1dC4gKi9cbiAgZ2V0IHJhbmdlRGVsdGEoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZUNoYW5nZVZhbHVlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRSYW5nZSgpOiBNZXRyaWNSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VzLmZpbmQoKHIpID0+IHIua2V5ID09PSB0aGlzLmN1cnJlbnQpID8/IHRoaXMucmFuZ2VzWzBdO1xuICB9XG5cbiAgLyoqIFRoZSBicmVha2Rvd24gaXMgb24gc2NyZWVuIG9ubHkgd2hlbiBvcGVuLCBub3QgZXhwbGFpbmluZywgYW5kIHRoZXJlIGFyZSBkcml2ZXJzLiAqL1xuICBnZXQgc2hvd24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNPcGVuICYmICF0aGlzLmV4cGxhaW5pbmcgJiYgISF0aGlzLmRyaXZlcnM/Lmxlbmd0aDtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudCkge1xuICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5yYW5nZUNvbnRyb2xsZWRcbiAgICAgICAgPyB0aGlzLmN1cnJlbnRcbiAgICAgICAgOiB0aGlzLmRlZmF1bHRSYW5nZSA/PyB0aGlzLnJhbmdlc1swXT8ua2V5ID8/ICcnO1xuICAgIH1cbiAgICB0aGlzLnNob3duSW5zaWdodCA9IHRoaXMuY3VycmVudFJhbmdlPy5pbnNpZ2h0ID8/ICcnO1xuICAgIHRoaXMud2h5TGFiZWwgPSB0aGlzLmxhYmVsRm9yKCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucGxhY2VLbm9iKCk7XG4gICAgLy8gdGhlIG51bWJlcnMgcm9sbCBhbmQgdGhlIGxpbmUgZHJhd3MgaW4gYSBtb21lbnQgYWZ0ZXIgdGhlIGNhcmQgYXBwZWFyc1xuICAgIHRoaXMubGF0ZXIoKCkgPT4gdGhpcy5kcmF3KGZhbHNlKSwgNDAwKTtcbiAgfVxuXG4gIHNlbGVjdChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChrZXkgPT09IHRoaXMuY3VycmVudCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5yYW5nZUNvbnRyb2xsZWQpIHtcbiAgICAgIHRoaXMuY3VycmVudCA9IGtleTtcbiAgICAgIHRoaXMuZHJhdyh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5yYW5nZUNoYW5nZS5lbWl0KGtleSk7XG4gIH1cblxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXhwbGFpbmluZykgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc09wZW47XG4gICAgaWYgKCF0aGlzLm9wZW5Db250cm9sbGVkKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IG5leHQ7XG4gICAgICB0aGlzLnN3YXBXaHkoKTtcbiAgICB9XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIGxhYmVsRm9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZXhwbGFpbmluZykgcmV0dXJuICdMb29raW5nIGludG8gaXQnO1xuICAgIHJldHVybiB0aGlzLnNob3duID8gJ0hpZGUgdGhlIGJyZWFrZG93bicgOiAnV2h5IGRpZCBpdCBtb3ZlPyc7XG4gIH1cblxuICAvLyBjcm9zc2ZhZGUgdGhlIGJ1dHRvbidzIGxhYmVsIHRoZSB3YXkgdGhlIDxTd2FwPiBkb2VzXG4gIHByaXZhdGUgc3dhcFdoeSgpOiB2b2lkIHtcbiAgICBjb25zdCB0byA9IHRoaXMubGFiZWxGb3IoKTtcbiAgICBpZiAodG8gPT09IHRoaXMud2h5TGFiZWwpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWR1Y2VkLnJlZHVjZSgpKSB7XG4gICAgICB0aGlzLndoeUxhYmVsID0gdG87XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53aHlPdXQgPSB0cnVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMubGF0ZXIoKCkgPT4ge1xuICAgICAgdGhpcy53aHlMYWJlbCA9IHRvO1xuICAgICAgdGhpcy53aHlPdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDE3MCk7XG4gIH1cblxuICBwcml2YXRlIHBsYWNlS25vYigpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2VnRWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ0biA9IGVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbYXJpYS1wcmVzc2VkPVwidHJ1ZVwiXScpO1xuICAgIGlmIChidG4pIHtcbiAgICAgIHRoaXMua25vYkxlZnQgPSBidG4ub2Zmc2V0TGVmdDtcbiAgICAgIHRoaXMua25vYldpZHRoID0gYnRuLm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnVpbGRzIHRoZSBwYXRoIGZvciB0aGUgY3VycmVudCByYW5nZSwgdGhlbiBkcmF3cyBpdCBpbjsgYSByYW5nZSBjaGFuZ2VcbiAgLy8gcmVkcmF3cyBpbiBwbGFjZSAodGhlIGRhc2hlcyByZXNldCB3aXRob3V0IGEgdHJhbnNpdGlvbiwgdGhlbiBydW4pXG4gIHByaXZhdGUgZHJhdyhyZWRyYXc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByID0gdGhpcy5jdXJyZW50UmFuZ2U7XG4gICAgaWYgKCFyKSByZXR1cm47XG4gICAgY29uc3QgZCA9IHIucG9pbnRzO1xuICAgIGNvbnN0IGxvID0gTWF0aC5taW4oLi4uZCkgLSAxLCBoaSA9IE1hdGgubWF4KC4uLmQpICsgMTtcbiAgICB0aGlzLnB0cyA9IGQubWFwKCh2LCBpKTogUG9pbnQgPT4gKHtcbiAgICAgIHg6IGQubGVuZ3RoID4gMSA/IChpIC8gKGQubGVuZ3RoIC0gMSkpICogVyA6IDAsXG4gICAgICB5OiA4NiAtICgodiAtIGxvKSAvIChoaSAtIGxvIHx8IDEpKSAqIDgwLFxuICAgICAgdixcbiAgICB9KSk7XG4gICAgdGhpcy5saW5lRCA9IHRoaXMucHRzLm1hcCgocSwgaSkgPT4gKGkgPyAnTCcgOiAnTScpICsgcS54LnRvRml4ZWQoMSkgKyAnICcgKyBxLnkudG9GaXhlZCgxKSkuam9pbignICcpO1xuICAgIHRoaXMuYXJlYUQgPSB0aGlzLmxpbmVEID8gdGhpcy5saW5lRCArIGAgTCR7V30gJHtIfSBMMCAke0h9IFpgIDogJyc7XG4gICAgdGhpcy5yYW5nZUNoYW5nZVZhbHVlID0gci5jaGFuZ2U7XG4gICAgdGhpcy5zd2FwSW5zaWdodChyLmluc2lnaHQpO1xuICAgIHRoaXMud2h5TGFiZWwgPSB0aGlzLmxhYmVsRm9yKCk7XG4gICAgdGhpcy5wbGFjZUtub2IoKTtcblxuICAgIGNvbnN0IGVsID0gdGhpcy5jaGFydEVsPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLnJlZHVjZWQucmVkdWNlKCkgfHwgIWVsKSB7XG4gICAgICB0aGlzLmRyYXduID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGFzaCA9ICdub25lJztcbiAgICAgIHRoaXMudmFsdWUgPSByLnZhbHVlO1xuICAgICAgdGhpcy5jaGFuZ2UgPSByLmNoYW5nZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoZSBzdHJva2UgZG9lc24ndCBzY2FsZSB3aXRoIHRoZSBzdHJldGNoZWQgY2hhcnQsIHNvIGl0cyBkYXNoZXMgYXJlXG4gICAgLy8gbWVhc3VyZWQgb24gc2NyZWVuOiB1c2UgdGhlIGxpbmUncyBvbi1zY3JlZW4gbGVuZ3RoXG4gICAgY29uc3Qgc3ggPSBlbC5jbGllbnRXaWR0aCAvIFcsIHN5ID0gZWwuY2xpZW50SGVpZ2h0IC8gSDtcbiAgICBjb25zdCBsZW4gPSB0aGlzLnB0cy5yZWR1Y2UoKHQsIHEsIGkpID0+IChpID8gdCArIE1hdGguaHlwb3QoKHEueCAtIHRoaXMucHRzW2kgLSAxXS54KSAqIHN4LCAocS55IC0gdGhpcy5wdHNbaSAtIDFdLnkpICogc3kpIDogMCksIDApO1xuICAgIHRoaXMubGVuID0gTWF0aC5jZWlsKGxlbikgKyAyO1xuICAgIHRoaXMuZGFzaCA9IG51bGw7XG4gICAgaWYgKHJlZHJhdykgdGhpcy5kcmF3biA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIG5leHQgZnJhbWUsIGZsaXAgdGhlIGNsYXNzIHNvIHRoZSBkYXNoLW9mZnNldCB0cmFuc2l0aW9uIHJ1bnNcbiAgICB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLmRyYXduID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIHRoaXMudHdlZW4odGhpcy52YWx1ZSwgci52YWx1ZSwgOTAwLCAodikgPT4gKHRoaXMudmFsdWUgPSB2KSk7XG4gICAgdGhpcy50d2Vlbih0aGlzLmNoYW5nZSwgci5jaGFuZ2UsIDkwMCwgKHYpID0+ICh0aGlzLmNoYW5nZSA9IHYpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3dhcEluc2lnaHQodG86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0byA9PT0gdGhpcy5zaG93bkluc2lnaHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZWR1Y2VkLnJlZHVjZSgpKSB7XG4gICAgICB0aGlzLnNob3duSW5zaWdodCA9IHRvO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5zaWdodE91dCA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICB0aGlzLnNob3duSW5zaWdodCA9IHRvO1xuICAgICAgdGhpcy5pbnNpZ2h0T3V0ID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAxNzApO1xuICB9XG5cbiAgbW92ZShlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSB0aGlzLmNoYXJ0RWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBmeCA9ICgoZS5jbGllbnRYIC0gYi5sZWZ0KSAvIGIud2lkdGgpICogVztcbiAgICBsZXQgYmVzdCA9IHRoaXMucHRzWzBdO1xuICAgIGZvciAoY29uc3QgcSBvZiB0aGlzLnB0cykgaWYgKE1hdGguYWJzKHEueCAtIGZ4KSA8IE1hdGguYWJzKGJlc3QueCAtIGZ4KSkgYmVzdCA9IHE7XG4gICAgdGhpcy5ob3ZlciA9IHtcbiAgICAgIHg6IGJlc3QueCxcbiAgICAgIHk6IGJlc3QueSxcbiAgICAgIHB4OiAoYmVzdC54IC8gVykgKiBiLndpZHRoLFxuICAgICAgcHk6IChiZXN0LnkgLyBIKSAqIGIuaGVpZ2h0LFxuICAgICAgdjogYmVzdC52LFxuICAgIH07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHR3ZWVuKGZyb206IG51bWJlciwgdG86IG51bWJlciwgZHVyOiBudW1iZXIsIHNldDogKG46IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgc2V0KHRvKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHN0ZXAgPSAodDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHQgLSB0MCkgLyBkdXIpKTtcbiAgICAgIGNvbnN0IGUgPSAxIC0gTWF0aC5wb3coMSAtIHAsIDMpO1xuICAgICAgc2V0KGZyb20gKyAodG8gLSBmcm9tKSAqIGUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBpZiAocCA8IDEpIHRoaXMuZnJhbWVzLnB1c2gocmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApKTtcbiAgICB9O1xuICAgIHRoaXMuZnJhbWVzLnB1c2gocmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApKTtcbiAgfVxuXG4gIHByaXZhdGUgbGF0ZXIoZm46ICgpID0+IHZvaWQsIG1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVycy5wdXNoKHNldFRpbWVvdXQoZm4sIG1zKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVycy5mb3JFYWNoKGNsZWFyVGltZW91dCk7XG4gICAgdGhpcy5mcmFtZXMuZm9yRWFjaChjYW5jZWxBbmltYXRpb25GcmFtZSk7XG4gICAgdGhpcy50aW1lcnMgPSBbXTtcbiAgICB0aGlzLmZyYW1lcyA9IFtdO1xuICB9XG59XG4iXX0=
|