@trillboards/edge-sdk 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +147 -2
- package/deploy/docker/Dockerfile.cpu +132 -0
- package/deploy/docker/Dockerfile.cuda +134 -0
- package/deploy/docker/Dockerfile.openvino +131 -0
- package/deploy/docker/README.md +358 -0
- package/deploy/helm/README.md +508 -0
- package/deploy/helm/trillboards-edge/Chart.yaml +19 -0
- package/deploy/helm/trillboards-edge/templates/_helpers.tpl +40 -0
- package/deploy/helm/trillboards-edge/templates/daemonset.yaml +120 -0
- package/deploy/helm/trillboards-edge/templates/service.yaml +15 -0
- package/deploy/helm/trillboards-edge/values.yaml +95 -0
- package/deploy/k8s/daemonset.yaml +144 -0
- package/dist/CommandRouter.d.ts +113 -0
- package/dist/CommandRouter.d.ts.map +1 -0
- package/dist/CommandRouter.js +392 -0
- package/dist/CommandRouter.js.map +1 -0
- package/dist/EdgeAgent.d.ts +6 -1
- package/dist/EdgeAgent.d.ts.map +1 -1
- package/dist/EdgeAgent.js +277 -10
- package/dist/EdgeAgent.js.map +1 -1
- package/dist/cli.js +60 -8
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/demo.d.ts +111 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +483 -0
- package/dist/demo.js.map +1 -0
- package/dist/diagnose.d.ts +59 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +651 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +19 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +364 -0
- package/dist/init.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +1264 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/status.d.ts +11 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +343 -0
- package/dist/status.js.map +1 -0
- package/package.json +4 -3
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* demo.ts — Trillboards Edge AI SDK Demo Mode
|
|
3
|
+
*
|
|
4
|
+
* Runs WITHOUT device token, camera, models, or backend connection.
|
|
5
|
+
* Generates synthetic AudienceMetricsPayload every 10s with realistic
|
|
6
|
+
* distributions and displays a live terminal dashboard using ANSI escape
|
|
7
|
+
* codes (zero external dependencies).
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { runDemo } from './demo';
|
|
11
|
+
* await runDemo();
|
|
12
|
+
*/
|
|
13
|
+
/** Evidence grades in cycling order. */
|
|
14
|
+
declare const EVIDENCE_GRADES: readonly ["FACE_BACKED", "PERSON_BACKED", "SPEECH_ONLY", "PROXY_ONLY", "EMPTY"];
|
|
15
|
+
type EvidenceGrade = typeof EVIDENCE_GRADES[number];
|
|
16
|
+
/** Observation families mapped from evidence grade. */
|
|
17
|
+
type ObservationFamily = 'SCREEN_AUDIENCE' | 'AMBIENT_COMMERCE_INTENT' | 'DIAGNOSTIC_PROBE' | 'EMPTY_SCENE';
|
|
18
|
+
type Decisionability = 'DECISIONABLE' | 'NON_DECISIONABLE';
|
|
19
|
+
/** Matches the backend contract exactly (AudienceMetricsPayload). */
|
|
20
|
+
interface DemoMetricsPayload {
|
|
21
|
+
fingerprint: string;
|
|
22
|
+
screenId: string | null;
|
|
23
|
+
windowStart: number;
|
|
24
|
+
windowEnd: number;
|
|
25
|
+
avgFaceCount: number;
|
|
26
|
+
maxFaceCount: number;
|
|
27
|
+
avgAttention: number;
|
|
28
|
+
avgDwellTimeMs: number;
|
|
29
|
+
avgNoiseLevel: number;
|
|
30
|
+
sensingMode: string;
|
|
31
|
+
speech: boolean;
|
|
32
|
+
emotionalEngagement: number;
|
|
33
|
+
sensingIntervalMs: number;
|
|
34
|
+
faceSnapshotCount: number;
|
|
35
|
+
audioSnapshotCount: number;
|
|
36
|
+
measurementQuality: string;
|
|
37
|
+
observationFamily: ObservationFamily;
|
|
38
|
+
evidenceGrade: EvidenceGrade;
|
|
39
|
+
decisionability: Decisionability;
|
|
40
|
+
decisionBlockReasons: string[];
|
|
41
|
+
vasRaw: number;
|
|
42
|
+
vasWeighted: number;
|
|
43
|
+
vasQualityMultiplier: number;
|
|
44
|
+
}
|
|
45
|
+
/** A single signal entry stored for the scrollback log. */
|
|
46
|
+
interface SignalEntry {
|
|
47
|
+
timestamp: Date;
|
|
48
|
+
avgFaceCount: number;
|
|
49
|
+
avgAttention: number;
|
|
50
|
+
vasWeighted: number;
|
|
51
|
+
evidenceGrade: EvidenceGrade;
|
|
52
|
+
}
|
|
53
|
+
declare const TICK_INTERVAL_MS = 10000;
|
|
54
|
+
declare const MAX_BUFFER_SIZE = 8640;
|
|
55
|
+
declare const DEMO_FINGERPRINT: string;
|
|
56
|
+
declare function clamp(value: number, min: number, max: number): number;
|
|
57
|
+
declare function formatDuration(ms: number): string;
|
|
58
|
+
declare function formatTime(date: Date): string;
|
|
59
|
+
interface DemoVASResult {
|
|
60
|
+
vasRaw: number;
|
|
61
|
+
vasWeighted: number;
|
|
62
|
+
qualityMultiplier: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Compute VAS (Viewability Attention Score) using the production formula.
|
|
66
|
+
* Inlined so demo mode has zero external dependencies.
|
|
67
|
+
*
|
|
68
|
+
* vasRaw = attentionSeconds * avgFaceCount (capped at 10s dwell)
|
|
69
|
+
* qualityMultiplier = weighted sum of attention + focus components
|
|
70
|
+
* vasWeighted = vasRaw * qualityMultiplier
|
|
71
|
+
*/
|
|
72
|
+
declare function computeDemoVAS(avgAttention: number, avgDwellTimeMs: number, avgFaceCount: number): DemoVASResult;
|
|
73
|
+
interface EvidenceClassification {
|
|
74
|
+
evidenceGrade: EvidenceGrade;
|
|
75
|
+
observationFamily: ObservationFamily;
|
|
76
|
+
decisionability: Decisionability;
|
|
77
|
+
decisionBlockReasons: string[];
|
|
78
|
+
measurementQuality: string;
|
|
79
|
+
}
|
|
80
|
+
declare function classifyEvidence(avgFaceCount: number, speech: boolean, avgNoiseLevel: number): EvidenceClassification;
|
|
81
|
+
/**
|
|
82
|
+
* Generates a synthetic metrics payload that cycles through all evidence grades
|
|
83
|
+
* with realistic distributions. The cycle index ensures all grades are covered
|
|
84
|
+
* over time while randomizing individual measurements.
|
|
85
|
+
*/
|
|
86
|
+
declare function generateSyntheticPayload(cycleIndex: number): DemoMetricsPayload;
|
|
87
|
+
declare function gradeColor(grade: EvidenceGrade): string;
|
|
88
|
+
declare function gradeShortName(grade: EvidenceGrade): string;
|
|
89
|
+
interface DashboardState {
|
|
90
|
+
currentPayload: DemoMetricsPayload | null;
|
|
91
|
+
signals: SignalEntry[];
|
|
92
|
+
bufferSize: number;
|
|
93
|
+
startTime: number;
|
|
94
|
+
tickCount: number;
|
|
95
|
+
gradeDistribution: Record<EvidenceGrade, number>;
|
|
96
|
+
}
|
|
97
|
+
declare function renderDashboard(state: DashboardState): string;
|
|
98
|
+
declare function renderExitSummary(state: DashboardState): string;
|
|
99
|
+
/**
|
|
100
|
+
* Run the Edge SDK demo mode. Generates synthetic audience metrics every 10s
|
|
101
|
+
* and renders a live terminal dashboard. No device token, camera, models, or
|
|
102
|
+
* backend connection required.
|
|
103
|
+
*
|
|
104
|
+
* Returns a Promise that resolves when the user presses Ctrl+C.
|
|
105
|
+
*/
|
|
106
|
+
export declare function runDemo(): Promise<void>;
|
|
107
|
+
/** Advance the demo state by one tick. */
|
|
108
|
+
declare function tick(state: DashboardState): void;
|
|
109
|
+
export { clamp, computeDemoVAS, classifyEvidence, generateSyntheticPayload, renderDashboard, renderExitSummary, tick, formatDuration, formatTime, gradeShortName, gradeColor, EVIDENCE_GRADES, TICK_INTERVAL_MS, MAX_BUFFER_SIZE, DEMO_FINGERPRINT, };
|
|
110
|
+
export type { DemoMetricsPayload, DemoVASResult, SignalEntry, EvidenceGrade, DashboardState, };
|
|
111
|
+
//# sourceMappingURL=demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.js
ADDED
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* demo.ts — Trillboards Edge AI SDK Demo Mode
|
|
4
|
+
*
|
|
5
|
+
* Runs WITHOUT device token, camera, models, or backend connection.
|
|
6
|
+
* Generates synthetic AudienceMetricsPayload every 10s with realistic
|
|
7
|
+
* distributions and displays a live terminal dashboard using ANSI escape
|
|
8
|
+
* codes (zero external dependencies).
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* import { runDemo } from './demo';
|
|
12
|
+
* await runDemo();
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.DEMO_FINGERPRINT = exports.MAX_BUFFER_SIZE = exports.TICK_INTERVAL_MS = exports.EVIDENCE_GRADES = void 0;
|
|
49
|
+
exports.runDemo = runDemo;
|
|
50
|
+
exports.clamp = clamp;
|
|
51
|
+
exports.computeDemoVAS = computeDemoVAS;
|
|
52
|
+
exports.classifyEvidence = classifyEvidence;
|
|
53
|
+
exports.generateSyntheticPayload = generateSyntheticPayload;
|
|
54
|
+
exports.renderDashboard = renderDashboard;
|
|
55
|
+
exports.renderExitSummary = renderExitSummary;
|
|
56
|
+
exports.tick = tick;
|
|
57
|
+
exports.formatDuration = formatDuration;
|
|
58
|
+
exports.formatTime = formatTime;
|
|
59
|
+
exports.gradeShortName = gradeShortName;
|
|
60
|
+
exports.gradeColor = gradeColor;
|
|
61
|
+
const crypto = __importStar(require("crypto"));
|
|
62
|
+
// ─── Types (self-contained — demo must work without @trillboards/edge-core) ──
|
|
63
|
+
/** Evidence grades in cycling order. */
|
|
64
|
+
const EVIDENCE_GRADES = [
|
|
65
|
+
'FACE_BACKED',
|
|
66
|
+
'PERSON_BACKED',
|
|
67
|
+
'SPEECH_ONLY',
|
|
68
|
+
'PROXY_ONLY',
|
|
69
|
+
'EMPTY',
|
|
70
|
+
];
|
|
71
|
+
exports.EVIDENCE_GRADES = EVIDENCE_GRADES;
|
|
72
|
+
// ─── Constants ─────────────────────────────────────────────────────────────────
|
|
73
|
+
const TICK_INTERVAL_MS = 10000;
|
|
74
|
+
exports.TICK_INTERVAL_MS = TICK_INTERVAL_MS;
|
|
75
|
+
const MAX_BUFFER_SIZE = 8640; // 24h at 10s intervals
|
|
76
|
+
exports.MAX_BUFFER_SIZE = MAX_BUFFER_SIZE;
|
|
77
|
+
const MAX_RECENT_SIGNALS = 8;
|
|
78
|
+
const DEMO_FINGERPRINT = `demo-${crypto.randomBytes(4).toString('hex')}`;
|
|
79
|
+
exports.DEMO_FINGERPRINT = DEMO_FINGERPRINT;
|
|
80
|
+
const BAR_WIDTH = 16;
|
|
81
|
+
const VERSION = '0.2.3';
|
|
82
|
+
// ─── ANSI Escape Helpers ───────────────────────────────────────────────────────
|
|
83
|
+
const ESC = '\x1b';
|
|
84
|
+
const RESET = `${ESC}[0m`;
|
|
85
|
+
const BOLD = `${ESC}[1m`;
|
|
86
|
+
const DIM = `${ESC}[2m`;
|
|
87
|
+
const CYAN = `${ESC}[36m`;
|
|
88
|
+
const GREEN = `${ESC}[32m`;
|
|
89
|
+
const YELLOW = `${ESC}[33m`;
|
|
90
|
+
const RED = `${ESC}[31m`;
|
|
91
|
+
const MAGENTA = `${ESC}[35m`;
|
|
92
|
+
const WHITE = `${ESC}[37m`;
|
|
93
|
+
const GRAY = `${ESC}[90m`;
|
|
94
|
+
const BG_BLUE = `${ESC}[44m`;
|
|
95
|
+
const CLEAR_SCREEN = `${ESC}[H${ESC}[2J`;
|
|
96
|
+
const HIDE_CURSOR = `${ESC}[?25l`;
|
|
97
|
+
const SHOW_CURSOR = `${ESC}[?25h`;
|
|
98
|
+
// ─── Utility Functions ─────────────────────────────────────────────────────────
|
|
99
|
+
function clamp(value, min, max) {
|
|
100
|
+
return Math.max(min, Math.min(max, value));
|
|
101
|
+
}
|
|
102
|
+
function randFloat(min, max) {
|
|
103
|
+
return min + Math.random() * (max - min);
|
|
104
|
+
}
|
|
105
|
+
function randInt(min, max) {
|
|
106
|
+
return Math.floor(randFloat(min, max + 1));
|
|
107
|
+
}
|
|
108
|
+
function pad(str, width) {
|
|
109
|
+
return str.length >= width ? str.slice(0, width) : str + ' '.repeat(width - str.length);
|
|
110
|
+
}
|
|
111
|
+
function padStart(str, width) {
|
|
112
|
+
return str.length >= width ? str.slice(0, width) : ' '.repeat(width - str.length) + str;
|
|
113
|
+
}
|
|
114
|
+
function formatDuration(ms) {
|
|
115
|
+
const totalSeconds = Math.floor(ms / 1000);
|
|
116
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
117
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
118
|
+
const seconds = totalSeconds % 60;
|
|
119
|
+
if (hours > 0) {
|
|
120
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
121
|
+
}
|
|
122
|
+
return `${minutes}m ${seconds}s`;
|
|
123
|
+
}
|
|
124
|
+
function formatTime(date) {
|
|
125
|
+
return date.toTimeString().slice(0, 8);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Compute VAS (Viewability Attention Score) using the production formula.
|
|
129
|
+
* Inlined so demo mode has zero external dependencies.
|
|
130
|
+
*
|
|
131
|
+
* vasRaw = attentionSeconds * avgFaceCount (capped at 10s dwell)
|
|
132
|
+
* qualityMultiplier = weighted sum of attention + focus components
|
|
133
|
+
* vasWeighted = vasRaw * qualityMultiplier
|
|
134
|
+
*/
|
|
135
|
+
function computeDemoVAS(avgAttention, avgDwellTimeMs, avgFaceCount) {
|
|
136
|
+
if (avgAttention < 0.5 || avgFaceCount === 0) {
|
|
137
|
+
return { vasRaw: 0, vasWeighted: 0, qualityMultiplier: 0 };
|
|
138
|
+
}
|
|
139
|
+
const attentionSeconds = Math.min(avgDwellTimeMs, 10000) / 1000;
|
|
140
|
+
const vasRaw = attentionSeconds * avgFaceCount;
|
|
141
|
+
const weights = { attention: 0.4, emotion: 0.3, body: 0.2, focus: 0.1 };
|
|
142
|
+
const qualityMultiplier = weights.attention * Math.min(avgAttention, 1) +
|
|
143
|
+
weights.focus * 1.0; // simplified: full focus score in demo
|
|
144
|
+
const vasWeighted = vasRaw * qualityMultiplier;
|
|
145
|
+
return {
|
|
146
|
+
vasRaw: clamp(vasRaw, 0, 100),
|
|
147
|
+
vasWeighted: clamp(vasWeighted, 0, 100),
|
|
148
|
+
qualityMultiplier: clamp(qualityMultiplier, 0, 1),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function classifyEvidence(avgFaceCount, speech, avgNoiseLevel) {
|
|
152
|
+
let evidenceGrade;
|
|
153
|
+
let observationFamily;
|
|
154
|
+
let decisionability;
|
|
155
|
+
const decisionBlockReasons = [];
|
|
156
|
+
let measurementQuality;
|
|
157
|
+
if (avgFaceCount >= 2) {
|
|
158
|
+
evidenceGrade = 'FACE_BACKED';
|
|
159
|
+
observationFamily = 'SCREEN_AUDIENCE';
|
|
160
|
+
decisionability = 'DECISIONABLE';
|
|
161
|
+
measurementQuality = 'face_backed';
|
|
162
|
+
}
|
|
163
|
+
else if (avgFaceCount >= 1) {
|
|
164
|
+
evidenceGrade = 'PERSON_BACKED';
|
|
165
|
+
observationFamily = 'AMBIENT_COMMERCE_INTENT';
|
|
166
|
+
decisionability = 'NON_DECISIONABLE';
|
|
167
|
+
decisionBlockReasons.push('no_face_confirmation');
|
|
168
|
+
measurementQuality = 'ambient_proxy_only';
|
|
169
|
+
}
|
|
170
|
+
else if (speech) {
|
|
171
|
+
evidenceGrade = 'SPEECH_ONLY';
|
|
172
|
+
observationFamily = 'AMBIENT_COMMERCE_INTENT';
|
|
173
|
+
decisionability = 'NON_DECISIONABLE';
|
|
174
|
+
decisionBlockReasons.push('no_visual_confirmation');
|
|
175
|
+
measurementQuality = 'ambient_proxy_only';
|
|
176
|
+
}
|
|
177
|
+
else if (avgNoiseLevel > 0.1) {
|
|
178
|
+
evidenceGrade = 'PROXY_ONLY';
|
|
179
|
+
observationFamily = 'AMBIENT_COMMERCE_INTENT';
|
|
180
|
+
decisionability = 'NON_DECISIONABLE';
|
|
181
|
+
decisionBlockReasons.push('proxy_signal_only');
|
|
182
|
+
measurementQuality = 'proxy_only';
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
evidenceGrade = 'EMPTY';
|
|
186
|
+
observationFamily = 'EMPTY_SCENE';
|
|
187
|
+
decisionability = 'NON_DECISIONABLE';
|
|
188
|
+
decisionBlockReasons.push('empty_scene');
|
|
189
|
+
measurementQuality = 'empty_scene';
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
evidenceGrade,
|
|
193
|
+
observationFamily,
|
|
194
|
+
decisionability,
|
|
195
|
+
decisionBlockReasons,
|
|
196
|
+
measurementQuality,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// ─── Synthetic Data Generator ──────────────────────────────────────────────────
|
|
200
|
+
/**
|
|
201
|
+
* Generates a synthetic metrics payload that cycles through all evidence grades
|
|
202
|
+
* with realistic distributions. The cycle index ensures all grades are covered
|
|
203
|
+
* over time while randomizing individual measurements.
|
|
204
|
+
*/
|
|
205
|
+
function generateSyntheticPayload(cycleIndex) {
|
|
206
|
+
const now = Date.now();
|
|
207
|
+
const windowEnd = now;
|
|
208
|
+
const windowStart = now - TICK_INTERVAL_MS;
|
|
209
|
+
// Cycle through scenarios that cover all evidence grades.
|
|
210
|
+
// Use a weighted distribution: face-heavy scenarios are more common.
|
|
211
|
+
const scenario = cycleIndex % 10;
|
|
212
|
+
let avgFaceCount;
|
|
213
|
+
let speech;
|
|
214
|
+
let avgNoiseLevel;
|
|
215
|
+
if (scenario <= 3) {
|
|
216
|
+
// 40% — FACE_BACKED: 2-8 faces
|
|
217
|
+
avgFaceCount = randInt(2, 8);
|
|
218
|
+
speech = Math.random() > 0.5;
|
|
219
|
+
avgNoiseLevel = randFloat(0.05, 0.4);
|
|
220
|
+
}
|
|
221
|
+
else if (scenario <= 5) {
|
|
222
|
+
// 20% — PERSON_BACKED: exactly 1 face
|
|
223
|
+
avgFaceCount = 1;
|
|
224
|
+
speech = Math.random() > 0.3;
|
|
225
|
+
avgNoiseLevel = randFloat(0.1, 0.3);
|
|
226
|
+
}
|
|
227
|
+
else if (scenario <= 7) {
|
|
228
|
+
// 20% — SPEECH_ONLY: no faces, speech detected
|
|
229
|
+
avgFaceCount = 0;
|
|
230
|
+
speech = true;
|
|
231
|
+
avgNoiseLevel = randFloat(0.15, 0.5);
|
|
232
|
+
}
|
|
233
|
+
else if (scenario === 8) {
|
|
234
|
+
// 10% — PROXY_ONLY: no faces, no speech, ambient noise
|
|
235
|
+
avgFaceCount = 0;
|
|
236
|
+
speech = false;
|
|
237
|
+
avgNoiseLevel = randFloat(0.15, 0.6);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// 10% — EMPTY: nothing
|
|
241
|
+
avgFaceCount = 0;
|
|
242
|
+
speech = false;
|
|
243
|
+
avgNoiseLevel = randFloat(0.0, 0.09);
|
|
244
|
+
}
|
|
245
|
+
const maxFaceCount = avgFaceCount + randInt(0, 3);
|
|
246
|
+
const avgAttention = avgFaceCount > 0 ? randFloat(0.3, 0.95) : 0;
|
|
247
|
+
const avgDwellTimeMs = avgFaceCount > 0 ? randFloat(2000, 10000) : 0;
|
|
248
|
+
const emotionalEngagement = avgFaceCount > 0 ? randFloat(0.1, 0.9) : 0;
|
|
249
|
+
const faceSnapshotCount = avgFaceCount > 0 ? randInt(3, 10) : 0;
|
|
250
|
+
const audioSnapshotCount = speech ? randInt(2, 8) : randInt(0, 2);
|
|
251
|
+
const classification = classifyEvidence(avgFaceCount, speech, avgNoiseLevel);
|
|
252
|
+
const vas = computeDemoVAS(avgAttention, avgDwellTimeMs, avgFaceCount);
|
|
253
|
+
return {
|
|
254
|
+
fingerprint: DEMO_FINGERPRINT,
|
|
255
|
+
screenId: null,
|
|
256
|
+
windowStart,
|
|
257
|
+
windowEnd,
|
|
258
|
+
avgFaceCount,
|
|
259
|
+
maxFaceCount,
|
|
260
|
+
avgAttention: parseFloat(avgAttention.toFixed(2)),
|
|
261
|
+
avgDwellTimeMs: parseFloat(avgDwellTimeMs.toFixed(0)),
|
|
262
|
+
avgNoiseLevel: parseFloat(avgNoiseLevel.toFixed(2)),
|
|
263
|
+
sensingMode: 'demo',
|
|
264
|
+
speech,
|
|
265
|
+
emotionalEngagement: parseFloat(emotionalEngagement.toFixed(2)),
|
|
266
|
+
sensingIntervalMs: TICK_INTERVAL_MS,
|
|
267
|
+
faceSnapshotCount,
|
|
268
|
+
audioSnapshotCount,
|
|
269
|
+
measurementQuality: classification.measurementQuality,
|
|
270
|
+
observationFamily: classification.observationFamily,
|
|
271
|
+
evidenceGrade: classification.evidenceGrade,
|
|
272
|
+
decisionability: classification.decisionability,
|
|
273
|
+
decisionBlockReasons: classification.decisionBlockReasons,
|
|
274
|
+
vasRaw: parseFloat(vas.vasRaw.toFixed(2)),
|
|
275
|
+
vasWeighted: parseFloat(vas.vasWeighted.toFixed(2)),
|
|
276
|
+
vasQualityMultiplier: parseFloat(vas.qualityMultiplier.toFixed(2)),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// ─── Terminal Dashboard Renderer ───────────────────────────────────────────────
|
|
280
|
+
function renderProgressBar(fraction, width) {
|
|
281
|
+
const filled = Math.round(clamp(fraction, 0, 1) * width);
|
|
282
|
+
const empty = width - filled;
|
|
283
|
+
return GREEN + '\u2588'.repeat(filled) + GRAY + '\u2591'.repeat(empty) + RESET;
|
|
284
|
+
}
|
|
285
|
+
function gradeColor(grade) {
|
|
286
|
+
switch (grade) {
|
|
287
|
+
case 'FACE_BACKED': return GREEN;
|
|
288
|
+
case 'PERSON_BACKED': return CYAN;
|
|
289
|
+
case 'SPEECH_ONLY': return YELLOW;
|
|
290
|
+
case 'PROXY_ONLY': return MAGENTA;
|
|
291
|
+
case 'EMPTY': return RED;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function gradeShortName(grade) {
|
|
295
|
+
switch (grade) {
|
|
296
|
+
case 'FACE_BACKED': return 'FACE';
|
|
297
|
+
case 'PERSON_BACKED': return 'PERSON';
|
|
298
|
+
case 'SPEECH_ONLY': return 'SPEECH';
|
|
299
|
+
case 'PROXY_ONLY': return 'PROXY';
|
|
300
|
+
case 'EMPTY': return 'EMPTY';
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function renderDashboard(state) {
|
|
304
|
+
const { currentPayload, signals, bufferSize, startTime, tickCount, gradeDistribution, } = state;
|
|
305
|
+
const uptime = formatDuration(Date.now() - startTime);
|
|
306
|
+
const simulatedFps = currentPayload
|
|
307
|
+
? (currentPayload.faceSnapshotCount / (TICK_INTERVAL_MS / 1000)).toFixed(1)
|
|
308
|
+
: '0.0';
|
|
309
|
+
const faces = currentPayload?.avgFaceCount ?? 0;
|
|
310
|
+
const attention = currentPayload?.avgAttention ?? 0;
|
|
311
|
+
const vas = currentPayload?.vasWeighted ?? 0;
|
|
312
|
+
const grade = currentPayload?.evidenceGrade ?? 'EMPTY';
|
|
313
|
+
const BOX_WIDTH = 65;
|
|
314
|
+
const HR = '\u2500'.repeat(BOX_WIDTH - 2);
|
|
315
|
+
const lines = [];
|
|
316
|
+
// Top border with title
|
|
317
|
+
lines.push(`${BOLD}${CYAN}\u250C\u2500 Trillboards Edge AI SDK \u2014 Demo Mode ${'\u2500'.repeat(BOX_WIDTH - 42)}\u2510${RESET}`);
|
|
318
|
+
// Status line
|
|
319
|
+
const gradeStr = `${gradeColor(grade)}${grade}${RESET}`;
|
|
320
|
+
lines.push(`${CYAN}\u2502${RESET} ${BOLD}Faces:${RESET} ${pad(String(faces), 3)} `
|
|
321
|
+
+ `${BOLD}Attention:${RESET} ${pad(attention.toFixed(2), 5)} `
|
|
322
|
+
+ `${BOLD}VAS:${RESET} ${pad(vas.toFixed(2), 5)} `
|
|
323
|
+
+ `${BOLD}Grade:${RESET} ${gradeStr}`
|
|
324
|
+
+ ' '.repeat(Math.max(0, BOX_WIDTH - 55 - grade.length))
|
|
325
|
+
+ `${CYAN}\u2502${RESET}`);
|
|
326
|
+
// Buffer / uptime line
|
|
327
|
+
lines.push(`${CYAN}\u2502${RESET} ${BOLD}Buffer:${RESET} ${pad(`${bufferSize}/${MAX_BUFFER_SIZE}`, 12)} `
|
|
328
|
+
+ `${BOLD}Uptime:${RESET} ${pad(uptime, 14)} `
|
|
329
|
+
+ `${BOLD}FPS:${RESET} ${pad(simulatedFps, 5)}`
|
|
330
|
+
+ ' '.repeat(Math.max(0, BOX_WIDTH - 56 - uptime.length + 14))
|
|
331
|
+
+ `${CYAN}\u2502${RESET}`);
|
|
332
|
+
// Blank line
|
|
333
|
+
lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
|
|
334
|
+
// Evidence distribution header
|
|
335
|
+
lines.push(`${CYAN}\u2502${RESET} ${BOLD}${WHITE}Evidence Distribution:${RESET}`
|
|
336
|
+
+ ' '.repeat(BOX_WIDTH - 24) + `${CYAN}\u2502${RESET}`);
|
|
337
|
+
// Compute total for percentages
|
|
338
|
+
const totalGrades = Object.values(gradeDistribution).reduce((a, b) => a + b, 0) || 1;
|
|
339
|
+
for (const g of EVIDENCE_GRADES) {
|
|
340
|
+
const count = gradeDistribution[g] || 0;
|
|
341
|
+
const pct = (count / totalGrades) * 100;
|
|
342
|
+
const bar = renderProgressBar(pct / 100, BAR_WIDTH);
|
|
343
|
+
const label = pad(`${g}:`, 16);
|
|
344
|
+
const pctStr = padStart(`${Math.round(pct)}%`, 4);
|
|
345
|
+
const lineContent = ` ${gradeColor(g)}${label}${RESET} ${bar} ${pctStr}`;
|
|
346
|
+
// Calculate actual visual length (without ANSI codes) for padding
|
|
347
|
+
const visualLen = 2 + 16 + 1 + BAR_WIDTH + 2 + 4;
|
|
348
|
+
const padding = Math.max(0, BOX_WIDTH - 2 - visualLen);
|
|
349
|
+
lines.push(`${CYAN}\u2502${RESET} ${lineContent}${' '.repeat(padding)} ${CYAN}\u2502${RESET}`);
|
|
350
|
+
}
|
|
351
|
+
// Blank line
|
|
352
|
+
lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
|
|
353
|
+
// Recent signals header
|
|
354
|
+
lines.push(`${CYAN}\u2502${RESET} ${BOLD}${WHITE}Recent Signals:${RESET}`
|
|
355
|
+
+ ' '.repeat(BOX_WIDTH - 18) + `${CYAN}\u2502${RESET}`);
|
|
356
|
+
// Show last N signals (newest first)
|
|
357
|
+
const recentSlice = signals.slice(-MAX_RECENT_SIGNALS).reverse();
|
|
358
|
+
for (const sig of recentSlice) {
|
|
359
|
+
const ts = formatTime(sig.timestamp);
|
|
360
|
+
const gradeTag = gradeShortName(sig.evidenceGrade);
|
|
361
|
+
const sigLine = ` ${DIM}[${ts}]${RESET} faces=${pad(String(sig.avgFaceCount), 2)}`
|
|
362
|
+
+ ` attn=${pad(sig.avgAttention.toFixed(2), 5)}`
|
|
363
|
+
+ ` vas=${pad(sig.vasWeighted.toFixed(2), 5)}`
|
|
364
|
+
+ ` grade=${gradeColor(sig.evidenceGrade)}${gradeTag}${RESET}`;
|
|
365
|
+
const sigVisualLen = 2 + 10 + 7 + 2 + 6 + 5 + 5 + 5 + 7 + gradeTag.length;
|
|
366
|
+
const sigPadding = Math.max(0, BOX_WIDTH - 2 - sigVisualLen);
|
|
367
|
+
lines.push(`${CYAN}\u2502${RESET} ${sigLine}${' '.repeat(sigPadding)} ${CYAN}\u2502${RESET}`);
|
|
368
|
+
}
|
|
369
|
+
// Fill remaining rows if fewer signals than max
|
|
370
|
+
const emptyRows = MAX_RECENT_SIGNALS - recentSlice.length;
|
|
371
|
+
for (let i = 0; i < emptyRows; i++) {
|
|
372
|
+
lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
|
|
373
|
+
}
|
|
374
|
+
// Blank line
|
|
375
|
+
lines.push(`${CYAN}\u2502${RESET}${' '.repeat(BOX_WIDTH - 2)}${CYAN}\u2502${RESET}`);
|
|
376
|
+
// Ctrl+C hint
|
|
377
|
+
lines.push(`${CYAN}\u2502${RESET} ${DIM}Press Ctrl+C to stop${RESET}`
|
|
378
|
+
+ ' '.repeat(BOX_WIDTH - 23) + `${CYAN}\u2502${RESET}`);
|
|
379
|
+
// Bottom border
|
|
380
|
+
lines.push(`${CYAN}\u2514${HR}\u2518${RESET}`);
|
|
381
|
+
return lines.join('\n');
|
|
382
|
+
}
|
|
383
|
+
// ─── Exit Summary ──────────────────────────────────────────────────────────────
|
|
384
|
+
function renderExitSummary(state) {
|
|
385
|
+
const { signals, startTime, tickCount, gradeDistribution } = state;
|
|
386
|
+
const runtime = formatDuration(Date.now() - startTime);
|
|
387
|
+
const totalSignals = tickCount;
|
|
388
|
+
const totalGrades = Object.values(gradeDistribution).reduce((a, b) => a + b, 0) || 1;
|
|
389
|
+
const avgVAS = signals.length > 0
|
|
390
|
+
? signals.reduce((sum, s) => sum + s.vasWeighted, 0) / signals.length
|
|
391
|
+
: 0;
|
|
392
|
+
const lines = [];
|
|
393
|
+
lines.push('');
|
|
394
|
+
lines.push(`${BOLD}${CYAN}Trillboards Edge AI SDK \u2014 Demo Summary${RESET}`);
|
|
395
|
+
lines.push(`${DIM}${'─'.repeat(45)}${RESET}`);
|
|
396
|
+
lines.push(` ${BOLD}Runtime:${RESET} ${runtime}`);
|
|
397
|
+
lines.push(` ${BOLD}Total Signals:${RESET} ${totalSignals}`);
|
|
398
|
+
lines.push(` ${BOLD}Avg VAS:${RESET} ${avgVAS.toFixed(2)}`);
|
|
399
|
+
lines.push('');
|
|
400
|
+
lines.push(` ${BOLD}Evidence Grade Distribution:${RESET}`);
|
|
401
|
+
for (const g of EVIDENCE_GRADES) {
|
|
402
|
+
const count = gradeDistribution[g] || 0;
|
|
403
|
+
const pct = ((count / totalGrades) * 100).toFixed(1);
|
|
404
|
+
lines.push(` ${gradeColor(g)}${pad(g, 16)}${RESET} ${padStart(String(count), 4)} signals (${padStart(pct, 5)}%)`);
|
|
405
|
+
}
|
|
406
|
+
lines.push('');
|
|
407
|
+
lines.push(` ${DIM}Fingerprint: ${DEMO_FINGERPRINT}${RESET}`);
|
|
408
|
+
lines.push('');
|
|
409
|
+
return lines.join('\n');
|
|
410
|
+
}
|
|
411
|
+
// ─── Main Demo Loop ────────────────────────────────────────────────────────────
|
|
412
|
+
/**
|
|
413
|
+
* Run the Edge SDK demo mode. Generates synthetic audience metrics every 10s
|
|
414
|
+
* and renders a live terminal dashboard. No device token, camera, models, or
|
|
415
|
+
* backend connection required.
|
|
416
|
+
*
|
|
417
|
+
* Returns a Promise that resolves when the user presses Ctrl+C.
|
|
418
|
+
*/
|
|
419
|
+
async function runDemo() {
|
|
420
|
+
const state = {
|
|
421
|
+
currentPayload: null,
|
|
422
|
+
signals: [],
|
|
423
|
+
bufferSize: 0,
|
|
424
|
+
startTime: Date.now(),
|
|
425
|
+
tickCount: 0,
|
|
426
|
+
gradeDistribution: {
|
|
427
|
+
FACE_BACKED: 0,
|
|
428
|
+
PERSON_BACKED: 0,
|
|
429
|
+
SPEECH_ONLY: 0,
|
|
430
|
+
PROXY_ONLY: 0,
|
|
431
|
+
EMPTY: 0,
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
// Hide cursor for clean rendering
|
|
435
|
+
process.stdout.write(HIDE_CURSOR);
|
|
436
|
+
// Print initial banner
|
|
437
|
+
process.stdout.write(CLEAR_SCREEN);
|
|
438
|
+
process.stdout.write(`\n ${BOLD}${CYAN}Trillboards Edge AI SDK v${VERSION} \u2014 Demo Mode${RESET}\n`
|
|
439
|
+
+ ` ${DIM}Generating synthetic audience signals every 10s...${RESET}\n\n`);
|
|
440
|
+
// Generate the first signal immediately so the dashboard is not empty
|
|
441
|
+
tick(state);
|
|
442
|
+
process.stdout.write(CLEAR_SCREEN);
|
|
443
|
+
process.stdout.write(renderDashboard(state) + '\n');
|
|
444
|
+
// Set up interval
|
|
445
|
+
const intervalHandle = setInterval(() => {
|
|
446
|
+
tick(state);
|
|
447
|
+
process.stdout.write(CLEAR_SCREEN);
|
|
448
|
+
process.stdout.write(renderDashboard(state) + '\n');
|
|
449
|
+
}, TICK_INTERVAL_MS);
|
|
450
|
+
// Handle graceful shutdown
|
|
451
|
+
return new Promise((resolve) => {
|
|
452
|
+
const cleanup = () => {
|
|
453
|
+
clearInterval(intervalHandle);
|
|
454
|
+
process.stdout.write(SHOW_CURSOR);
|
|
455
|
+
process.stdout.write(CLEAR_SCREEN);
|
|
456
|
+
process.stdout.write(renderExitSummary(state));
|
|
457
|
+
resolve();
|
|
458
|
+
};
|
|
459
|
+
process.on('SIGINT', cleanup);
|
|
460
|
+
process.on('SIGTERM', cleanup);
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
/** Advance the demo state by one tick. */
|
|
464
|
+
function tick(state) {
|
|
465
|
+
const payload = generateSyntheticPayload(state.tickCount);
|
|
466
|
+
state.currentPayload = payload;
|
|
467
|
+
state.tickCount++;
|
|
468
|
+
state.bufferSize = Math.min(state.bufferSize + 1, MAX_BUFFER_SIZE);
|
|
469
|
+
// Track grade distribution
|
|
470
|
+
state.gradeDistribution[payload.evidenceGrade]++;
|
|
471
|
+
// Append to signal log (cap at MAX_BUFFER_SIZE for memory safety)
|
|
472
|
+
state.signals.push({
|
|
473
|
+
timestamp: new Date(),
|
|
474
|
+
avgFaceCount: payload.avgFaceCount,
|
|
475
|
+
avgAttention: payload.avgAttention,
|
|
476
|
+
vasWeighted: payload.vasWeighted,
|
|
477
|
+
evidenceGrade: payload.evidenceGrade,
|
|
478
|
+
});
|
|
479
|
+
if (state.signals.length > MAX_BUFFER_SIZE) {
|
|
480
|
+
state.signals.shift();
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
//# sourceMappingURL=demo.js.map
|
package/dist/demo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmgBH,0BAmDC;AA4BC,sBAAK;AACL,wCAAc;AACd,4CAAgB;AAChB,4DAAwB;AACxB,0CAAe;AACf,8CAAiB;AACjB,oBAAI;AACJ,wCAAc;AACd,gCAAU;AACV,wCAAc;AACd,gCAAU;AA1lBZ,+CAAiC;AAEjC,gFAAgF;AAEhF,wCAAwC;AACxC,MAAM,eAAe,GAAG;IACtB,aAAa;IACb,eAAe;IACf,aAAa;IACb,YAAY;IACZ,OAAO;CACC,CAAC;AAglBT,0CAAe;AAhiBjB,kFAAkF;AAElF,MAAM,gBAAgB,GAAG,KAAM,CAAC;AA+hB9B,4CAAgB;AA9hBlB,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,uBAAuB;AA+hBnD,0CAAe;AA9hBjB,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAC7B,MAAM,gBAAgB,GAAG,QAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AA8hBvE,4CAAgB;AA7hBlB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,kFAAkF;AAElF,MAAM,GAAG,GAAG,MAAM,CAAC;AACnB,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AAC1B,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;AACzB,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;AACxB,MAAM,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;AAC1B,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC;AAC3B,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;AAC5B,MAAM,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;AACzB,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC;AAC7B,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC;AAC3B,MAAM,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;AAC1B,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC;AAC7B,MAAM,YAAY,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC;AACzC,MAAM,WAAW,GAAG,GAAG,GAAG,OAAO,CAAC;AAClC,MAAM,WAAW,GAAG,GAAG,GAAG,OAAO,CAAC;AAElC,kFAAkF;AAElF,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,GAAW;IACzC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAW;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,KAAa;IACrC,OAAO,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,KAAa;IAC1C,OAAO,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;AAC1F,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,OAAO,KAAK,OAAO,GAAG,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;AACnC,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAUD;;;;;;;GAOG;AACH,SAAS,cAAc,CACrB,YAAoB,EACpB,cAAsB,EACtB,YAAoB;IAEpB,IAAI,YAAY,GAAG,GAAG,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,KAAM,CAAC,GAAG,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,gBAAgB,GAAG,YAAY,CAAC;IAE/C,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACxE,MAAM,iBAAiB,GACrB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,uCAAuC;IAE9D,MAAM,WAAW,GAAG,MAAM,GAAG,iBAAiB,CAAC;IAE/C,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC;QACvC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;KAClD,CAAC;AACJ,CAAC;AAYD,SAAS,gBAAgB,CACvB,YAAoB,EACpB,MAAe,EACf,aAAqB;IAErB,IAAI,aAA4B,CAAC;IACjC,IAAI,iBAAoC,CAAC;IACzC,IAAI,eAAgC,CAAC;IACrC,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,IAAI,kBAA0B,CAAC;IAE/B,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACtB,aAAa,GAAG,aAAa,CAAC;QAC9B,iBAAiB,GAAG,iBAAiB,CAAC;QACtC,eAAe,GAAG,cAAc,CAAC;QACjC,kBAAkB,GAAG,aAAa,CAAC;IACrC,CAAC;SAAM,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,eAAe,CAAC;QAChC,iBAAiB,GAAG,yBAAyB,CAAC;QAC9C,eAAe,GAAG,kBAAkB,CAAC;QACrC,oBAAoB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAClD,kBAAkB,GAAG,oBAAoB,CAAC;IAC5C,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,aAAa,GAAG,aAAa,CAAC;QAC9B,iBAAiB,GAAG,yBAAyB,CAAC;QAC9C,eAAe,GAAG,kBAAkB,CAAC;QACrC,oBAAoB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACpD,kBAAkB,GAAG,oBAAoB,CAAC;IAC5C,CAAC;SAAM,IAAI,aAAa,GAAG,GAAG,EAAE,CAAC;QAC/B,aAAa,GAAG,YAAY,CAAC;QAC7B,iBAAiB,GAAG,yBAAyB,CAAC;QAC9C,eAAe,GAAG,kBAAkB,CAAC;QACrC,oBAAoB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC/C,kBAAkB,GAAG,YAAY,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,OAAO,CAAC;QACxB,iBAAiB,GAAG,aAAa,CAAC;QAClC,eAAe,GAAG,kBAAkB,CAAC;QACrC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,kBAAkB,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,OAAO;QACL,aAAa;QACb,iBAAiB;QACjB,eAAe;QACf,oBAAoB;QACpB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF;;;;GAIG;AACH,SAAS,wBAAwB,CAAC,UAAkB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,CAAC;IACtB,MAAM,WAAW,GAAG,GAAG,GAAG,gBAAgB,CAAC;IAE3C,0DAA0D;IAC1D,qEAAqE;IACrE,MAAM,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAC;IACjC,IAAI,YAAoB,CAAC;IACzB,IAAI,MAAe,CAAC;IACpB,IAAI,aAAqB,CAAC;IAE1B,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,+BAA+B;QAC/B,YAAY,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;QAC7B,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACzB,sCAAsC;QACtC,YAAY,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;QAC7B,aAAa,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACzB,+CAA+C;QAC/C,YAAY,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,IAAI,CAAC;QACd,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;SAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,uDAAuD;QACvD,YAAY,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,KAAK,CAAC;QACf,aAAa,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,YAAY,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,KAAK,CAAC;QACf,aAAa,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,mBAAmB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAElE,MAAM,cAAc,GAAG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;IAEvE,OAAO;QACL,WAAW,EAAE,gBAAgB;QAC7B,QAAQ,EAAE,IAAI;QACd,WAAW;QACX,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjD,cAAc,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrD,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,WAAW,EAAE,MAAM;QACnB,MAAM;QACN,mBAAmB,EAAE,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/D,iBAAiB,EAAE,gBAAgB;QACnC,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB,EAAE,cAAc,CAAC,kBAAkB;QACrD,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;QACnD,aAAa,EAAE,cAAc,CAAC,aAAa;QAC3C,eAAe,EAAE,cAAc,CAAC,eAAe;QAC/C,oBAAoB,EAAE,cAAc,CAAC,oBAAoB;QACzD,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzC,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnD,oBAAoB,EAAE,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAa;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACjF,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB;IACtC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,aAAa,CAAC,CAAC,OAAO,KAAK,CAAC;QACjC,KAAK,eAAe,CAAC,CAAC,OAAO,IAAI,CAAC;QAClC,KAAK,aAAa,CAAC,CAAC,OAAO,MAAM,CAAC;QAClC,KAAK,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC;QAClC,KAAK,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB;IAC1C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,aAAa,CAAC,CAAC,OAAO,MAAM,CAAC;QAClC,KAAK,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAC;QACtC,KAAK,aAAa,CAAC,CAAC,OAAO,QAAQ,CAAC;QACpC,KAAK,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC;QAClC,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;IAC/B,CAAC;AACH,CAAC;AAWD,SAAS,eAAe,CAAC,KAAqB;IAC5C,MAAM,EACJ,cAAc,EACd,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,iBAAiB,GAClB,GAAG,KAAK,CAAC;IAEV,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,CAAC,cAAc,CAAC,iBAAiB,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,KAAK,CAAC;IAEV,MAAM,KAAK,GAAG,cAAc,EAAE,YAAY,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,cAAc,EAAE,YAAY,IAAI,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,cAAc,EAAE,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,cAAc,EAAE,aAAa,IAAI,OAAO,CAAC;IAEvD,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,wBAAwB;IACxB,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,GAAG,IAAI,yDAAyD,QAAQ,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,KAAK,EAAE,CACvH,CAAC;IAEF,cAAc;IACd,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC;IACxD,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG;UACrE,GAAG,IAAI,aAAa,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;UAC5D,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;UAChD,GAAG,IAAI,SAAS,KAAK,IAAI,QAAQ,EAAE;UACnC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;UACtD,GAAG,IAAI,SAAS,KAAK,EAAE,CAC1B,CAAC;IAEF,uBAAuB;IACvB,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,GAAG,CAAC,GAAG,UAAU,IAAI,eAAe,EAAE,EAAE,EAAE,CAAC,GAAG;UAC5F,GAAG,IAAI,UAAU,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG;UAC5C,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE;UAC7C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;UAC5D,GAAG,IAAI,SAAS,KAAK,EAAE,CAC1B,CAAC;IAEF,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;IAErF,+BAA+B;IAC/B,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,GAAG,KAAK,yBAAyB,KAAK,EAAE;UACnE,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,SAAS,KAAK,EAAE,CACvD,CAAC;IAEF,gCAAgC;IAChC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAErF,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;QACxC,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,GAAG,GAAG,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC3E,kEAAkE;QAClE,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,KAAK,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;IAErF,wBAAwB;IACxB,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,IAAI,GAAG,KAAK,kBAAkB,KAAK,EAAE;UAC5D,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,SAAS,KAAK,EAAE,CACvD,CAAC;IAEF,qCAAqC;IACrC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,UAAU,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE;cAC/E,SAAS,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;cAC9C,QAAQ,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;cAC5C,UAAU,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,QAAQ,GAAG,KAAK,EAAE,CAAC;QACjE,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,SAAS,KAAK,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,MAAM,SAAS,GAAG,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC;IAErF,cAAc;IACd,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,SAAS,KAAK,IAAI,GAAG,uBAAuB,KAAK,EAAE;UACxD,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,SAAS,KAAK,EAAE,CACvD,CAAC;IAEF,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAE/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,kFAAkF;AAElF,SAAS,iBAAiB,CAAC,KAAqB;IAC9C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC;IAEnE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,SAAS,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACrF,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,CAAC;QAChB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;QACrE,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,8CAA8C,KAAK,EAAE,CAAC,CAAC;IAChF,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,WAAW,KAAK,WAAW,OAAO,EAAE,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,iBAAiB,KAAK,KAAK,YAAY,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,WAAW,KAAK,WAAW,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,+BAA+B,KAAK,EAAE,CAAC,CAAC;IAE5D,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,cAAc,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACzH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,gBAAgB,gBAAgB,GAAG,KAAK,EAAE,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,kFAAkF;AAElF;;;;;;GAMG;AACI,KAAK,UAAU,OAAO;IAC3B,MAAM,KAAK,GAAmB;QAC5B,cAAc,EAAE,IAAI;QACpB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,CAAC;QACZ,iBAAiB,EAAE;YACjB,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;SACT;KACF,CAAC;IAEF,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAElC,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO,IAAI,GAAG,IAAI,4BAA4B,OAAO,oBAAoB,KAAK,IAAI;UAChF,KAAK,GAAG,qDAAqD,KAAK,MAAM,CAC3E,CAAC;IAEF,sEAAsE;IACtE,IAAI,CAAC,KAAK,CAAC,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpD,kBAAkB;IAClB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAErB,2BAA2B;IAC3B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0CAA0C;AAC1C,SAAS,IAAI,CAAC,KAAqB;IACjC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;IAC/B,KAAK,CAAC,SAAS,EAAE,CAAC;IAClB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;IAEnE,2BAA2B;IAC3B,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;IAEjD,kEAAkE;IAClE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAC3C,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
|