qorrelate-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +197 -0
  2. package/dist/client.d.ts +293 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +358 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +26 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +242 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/alerts.d.ts +14 -0
  11. package/dist/tools/alerts.d.ts.map +1 -0
  12. package/dist/tools/alerts.js +381 -0
  13. package/dist/tools/alerts.js.map +1 -0
  14. package/dist/tools/dashboards.d.ts +14 -0
  15. package/dist/tools/dashboards.d.ts.map +1 -0
  16. package/dist/tools/dashboards.js +409 -0
  17. package/dist/tools/dashboards.js.map +1 -0
  18. package/dist/tools/data-control.d.ts +19 -0
  19. package/dist/tools/data-control.d.ts.map +1 -0
  20. package/dist/tools/data-control.js +213 -0
  21. package/dist/tools/data-control.js.map +1 -0
  22. package/dist/tools/logs.d.ts +14 -0
  23. package/dist/tools/logs.d.ts.map +1 -0
  24. package/dist/tools/logs.js +191 -0
  25. package/dist/tools/logs.js.map +1 -0
  26. package/dist/tools/metrics.d.ts +14 -0
  27. package/dist/tools/metrics.d.ts.map +1 -0
  28. package/dist/tools/metrics.js +217 -0
  29. package/dist/tools/metrics.js.map +1 -0
  30. package/dist/tools/organizations.d.ts +16 -0
  31. package/dist/tools/organizations.d.ts.map +1 -0
  32. package/dist/tools/organizations.js +378 -0
  33. package/dist/tools/organizations.js.map +1 -0
  34. package/dist/tools/services.d.ts +14 -0
  35. package/dist/tools/services.d.ts.map +1 -0
  36. package/dist/tools/services.js +218 -0
  37. package/dist/tools/services.js.map +1 -0
  38. package/dist/tools/sessions.d.ts +14 -0
  39. package/dist/tools/sessions.d.ts.map +1 -0
  40. package/dist/tools/sessions.js +221 -0
  41. package/dist/tools/sessions.js.map +1 -0
  42. package/dist/tools/setup.d.ts +17 -0
  43. package/dist/tools/setup.d.ts.map +1 -0
  44. package/dist/tools/setup.js +304 -0
  45. package/dist/tools/setup.js.map +1 -0
  46. package/dist/tools/traces.d.ts +14 -0
  47. package/dist/tools/traces.d.ts.map +1 -0
  48. package/dist/tools/traces.js +350 -0
  49. package/dist/tools/traces.js.map +1 -0
  50. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,197 @@
1
+ # Qorrelate MCP Server
2
+
3
+ [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that enables AI agents to interact with [Qorrelate](https://qorrelate.io) observability data. Query logs, search traces, analyze metrics, manage alerts, and investigate session replaysโ€”all through natural language.
4
+
5
+ ## Features
6
+
7
+ - **๐Ÿ” Log Search**: Query application logs with filters for severity, service, time range, and content
8
+ - **๐Ÿ”— Trace Analysis**: Search distributed traces, analyze latency, and discover service dependencies
9
+ - **๐Ÿ“Š Metrics**: Query time-series metrics with aggregation and comparison capabilities
10
+ - **๐Ÿšจ Alert Management**: View, acknowledge, and analyze alerts
11
+ - **๐ŸŽฌ Session Replay**: List and analyze user session recordings
12
+ - **๐Ÿฅ Service Health**: Monitor service health with error rates and latency percentiles
13
+
14
+ ## Installation
15
+
16
+ ### For Claude Desktop
17
+
18
+ Add to your `claude_desktop_config.json`:
19
+
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "qorrelate": {
24
+ "command": "npx",
25
+ "args": ["@qorrelate/mcp-server"],
26
+ "env": {
27
+ "QORRELATE_API_KEY": "your-api-key-here",
28
+ "QORRELATE_ENDPOINT": "https://qorrelate.io"
29
+ }
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### For Cursor
36
+
37
+ Add to your Cursor settings (`.cursor/mcp.json`):
38
+
39
+ ```json
40
+ {
41
+ "mcpServers": {
42
+ "qorrelate": {
43
+ "command": "npx",
44
+ "args": ["@qorrelate/mcp-server"],
45
+ "env": {
46
+ "QORRELATE_API_KEY": "your-api-key-here",
47
+ "QORRELATE_ENDPOINT": "https://qorrelate.io"
48
+ }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### Get Your API Key
55
+
56
+ 1. Log in to [Qorrelate](https://qorrelate.io)
57
+ 2. Go to **Settings** โ†’ **API Keys**
58
+ 3. Click **Create API Key**
59
+ 4. Copy the key and add it to your MCP configuration
60
+
61
+ ## Available Tools
62
+
63
+ ### Logs
64
+
65
+ | Tool | Description |
66
+ |------|-------------|
67
+ | `query_logs` | Search logs with filters for severity, service, time range, and content |
68
+ | `logs_get_histogram` | Get log count histogram over time |
69
+ | `logs_get_error_summary` | Get grouped error summary for a service |
70
+
71
+ ### Traces
72
+
73
+ | Tool | Description |
74
+ |------|-------------|
75
+ | `search_traces` | Search distributed traces with filters |
76
+ | `get_trace` | Get detailed trace with all spans |
77
+ | `traces_analyze_latency` | Analyze latency patterns (P50/P95/P99) |
78
+ | `traces_find_dependencies` | Discover service dependencies from traces |
79
+
80
+ ### Metrics
81
+
82
+ | Tool | Description |
83
+ |------|-------------|
84
+ | `query_metrics` | Query time-series metrics with aggregation |
85
+ | `metrics_list` | List available metrics |
86
+ | `metrics_compare` | Compare metrics between two time periods |
87
+
88
+ ### Alerts
89
+
90
+ | Tool | Description |
91
+ |------|-------------|
92
+ | `list_alerts` | List active or historical alerts |
93
+ | `alerts_get_details` | Get alert details and history |
94
+ | `acknowledge_alert` | Acknowledge an alert |
95
+ | `alerts_summary` | Get alert summary by severity and service |
96
+
97
+ ### Session Replays
98
+
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `list_sessions` | List user sessions with filters |
102
+ | `get_session` | Get session details and key events |
103
+ | `sessions_analyze_errors` | Analyze JavaScript errors across sessions |
104
+
105
+ ### Services
106
+
107
+ | Tool | Description |
108
+ |------|-------------|
109
+ | `list_services` | List all services sending telemetry |
110
+ | `get_service_health` | Get health metrics for a service |
111
+ | `services_compare_health` | Compare health across multiple services |
112
+ | `services_overview` | Get overview of all service health |
113
+
114
+ ## Example Prompts
115
+
116
+ Once configured, you can ask your AI assistant questions like:
117
+
118
+ ### Investigating Errors
119
+
120
+ > "Show me all errors from the payment-service in the last hour"
121
+
122
+ > "What's causing the increase in 500 errors?"
123
+
124
+ > "Find the trace for this failed request and show me what went wrong"
125
+
126
+ ### Performance Analysis
127
+
128
+ > "Analyze the latency for the checkout-api service"
129
+
130
+ > "Compare CPU usage between yesterday and today"
131
+
132
+ > "Which service has the highest error rate right now?"
133
+
134
+ ### Incident Response
135
+
136
+ > "What alerts are currently firing?"
137
+
138
+ > "Show me the health of all services"
139
+
140
+ > "Are there any user sessions with JavaScript errors?"
141
+
142
+ ### Deployment Verification
143
+
144
+ > "Compare error rates before and after the last deployment"
145
+
146
+ > "Is the new version performing better than the old one?"
147
+
148
+ > "Show me any anomalies in the last 30 minutes"
149
+
150
+ ## Resources
151
+
152
+ The MCP server also exposes resources that provide context:
153
+
154
+ - `qorrelate://services` - List of available services
155
+ - `qorrelate://alerts/active` - Currently firing alerts
156
+
157
+ ## Development
158
+
159
+ ### Build from Source
160
+
161
+ ```bash
162
+ cd mcp-server
163
+ npm install
164
+ npm run build
165
+ ```
166
+
167
+ ### Run Locally
168
+
169
+ ```bash
170
+ QORRELATE_API_KEY=xxx QORRELATE_ENDPOINT=https://qorrelate.io npm start
171
+ ```
172
+
173
+ ### Link for Testing
174
+
175
+ ```bash
176
+ npm link
177
+ # Then in your MCP config, use:
178
+ # "command": "qorrelate-mcp"
179
+ ```
180
+
181
+ ## Environment Variables
182
+
183
+ | Variable | Description | Default |
184
+ |----------|-------------|---------|
185
+ | `QORRELATE_API_KEY` | Your Qorrelate API key (required) | - |
186
+ | `QORRELATE_ENDPOINT` | Qorrelate API endpoint | `https://qorrelate.io` |
187
+
188
+ ## Support
189
+
190
+ - Documentation: https://qorrelate.io/documentation
191
+ - Issues: https://github.com/sethmichaelking/arqive/issues
192
+ - Email: support@qorrelate.io
193
+
194
+ ## License
195
+
196
+ MIT
197
+
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Qorrelate API Client
3
+ *
4
+ * HTTP client for communicating with the Qorrelate backend API.
5
+ */
6
+ export interface LogEntry {
7
+ timestamp: string;
8
+ severity: string;
9
+ body: string;
10
+ service_name?: string;
11
+ trace_id?: string;
12
+ span_id?: string;
13
+ attributes?: Record<string, unknown>;
14
+ resource_attributes?: Record<string, unknown>;
15
+ }
16
+ export interface LogSearchResult {
17
+ logs: LogEntry[];
18
+ total: number;
19
+ has_more: boolean;
20
+ }
21
+ export interface Span {
22
+ trace_id: string;
23
+ span_id: string;
24
+ parent_span_id?: string;
25
+ name: string;
26
+ service_name: string;
27
+ start_time: string;
28
+ end_time: string;
29
+ duration_ms: number;
30
+ status: string;
31
+ attributes?: Record<string, unknown>;
32
+ }
33
+ export interface Trace {
34
+ trace_id: string;
35
+ spans: Span[];
36
+ service_name: string;
37
+ root_span_name: string;
38
+ start_time: string;
39
+ duration_ms: number;
40
+ span_count: number;
41
+ has_error: boolean;
42
+ }
43
+ export interface TraceSearchResult {
44
+ traces: Trace[];
45
+ total: number;
46
+ }
47
+ export interface MetricDataPoint {
48
+ timestamp: string;
49
+ value: number;
50
+ labels?: Record<string, string>;
51
+ }
52
+ export interface MetricQueryResult {
53
+ metric_name: string;
54
+ data_points: MetricDataPoint[];
55
+ }
56
+ export interface Alert {
57
+ id: string;
58
+ name: string;
59
+ severity: string;
60
+ status: string;
61
+ message: string;
62
+ service?: string;
63
+ created_at: string;
64
+ updated_at: string;
65
+ acknowledged: boolean;
66
+ acknowledged_by?: string;
67
+ }
68
+ export interface Session {
69
+ session_id: string;
70
+ user_id?: string;
71
+ start_time: string;
72
+ end_time?: string;
73
+ duration_ms: number;
74
+ url: string;
75
+ country?: string;
76
+ city?: string;
77
+ device_type?: string;
78
+ browser?: string;
79
+ event_count: number;
80
+ has_errors: boolean;
81
+ }
82
+ export interface Service {
83
+ name: string;
84
+ last_seen: string;
85
+ log_count?: number;
86
+ trace_count?: number;
87
+ error_rate?: number;
88
+ }
89
+ export interface ServiceHealth {
90
+ service: string;
91
+ status: 'healthy' | 'degraded' | 'unhealthy' | 'unknown';
92
+ error_rate: number;
93
+ avg_latency_ms: number;
94
+ p95_latency_ms: number;
95
+ request_count: number;
96
+ last_error?: string;
97
+ last_error_time?: string;
98
+ }
99
+ export declare class QorrelateClient {
100
+ private endpoint;
101
+ private apiKey;
102
+ constructor(endpoint: string, apiKey: string);
103
+ private request;
104
+ searchLogs(params: {
105
+ query?: string;
106
+ start_time?: string;
107
+ end_time?: string;
108
+ limit?: number;
109
+ severity?: string;
110
+ service?: string;
111
+ }): Promise<LogSearchResult>;
112
+ getLogHistogram(params: {
113
+ start_time?: string;
114
+ end_time?: string;
115
+ query?: string;
116
+ }): Promise<{
117
+ buckets: Array<{
118
+ timestamp: string;
119
+ count: number;
120
+ }>;
121
+ }>;
122
+ searchTraces(params: {
123
+ start_time?: string;
124
+ end_time?: string;
125
+ limit?: number;
126
+ service?: string;
127
+ min_duration_ms?: number;
128
+ has_error?: boolean;
129
+ }): Promise<TraceSearchResult>;
130
+ getTrace(traceId: string): Promise<Trace>;
131
+ queryMetrics(params: {
132
+ metric_name: string;
133
+ start_time?: string;
134
+ end_time?: string;
135
+ aggregation?: 'avg' | 'sum' | 'min' | 'max' | 'count';
136
+ group_by?: string;
137
+ }): Promise<MetricQueryResult>;
138
+ listMetrics(params?: {
139
+ prefix?: string;
140
+ limit?: number;
141
+ }): Promise<{
142
+ metrics: Array<{
143
+ name: string;
144
+ data_points: number;
145
+ }>;
146
+ }>;
147
+ listAlerts(params?: {
148
+ active?: boolean;
149
+ severity?: string;
150
+ service?: string;
151
+ }): Promise<{
152
+ alerts: Alert[];
153
+ }>;
154
+ getAlert(alertId: string): Promise<Alert>;
155
+ acknowledgeAlert(alertId: string, message?: string): Promise<{
156
+ success: boolean;
157
+ }>;
158
+ getAlertHistory(alertId: string): Promise<{
159
+ history: Array<{
160
+ timestamp: string;
161
+ status: string;
162
+ message?: string;
163
+ }>;
164
+ }>;
165
+ listSessions(params?: {
166
+ start_time?: string;
167
+ end_time?: string;
168
+ limit?: number;
169
+ has_errors?: boolean;
170
+ user_id?: string;
171
+ }): Promise<{
172
+ sessions: Session[];
173
+ }>;
174
+ getSession(sessionId: string): Promise<Session & {
175
+ events: unknown[];
176
+ }>;
177
+ listServices(): Promise<{
178
+ services: Service[];
179
+ }>;
180
+ getServiceHealth(serviceName: string): Promise<ServiceHealth>;
181
+ getSetupOtelPython(params: URLSearchParams): Promise<unknown>;
182
+ getSetupOtelNode(params: URLSearchParams): Promise<unknown>;
183
+ getSetupOtelGo(params: URLSearchParams): Promise<unknown>;
184
+ getSetupCollector(params: URLSearchParams): Promise<unknown>;
185
+ getSetupSessionReplay(): Promise<unknown>;
186
+ getSetupValidate(): Promise<unknown>;
187
+ getSetupStatus(): Promise<unknown>;
188
+ listOrganizations(): Promise<unknown>;
189
+ getOrganizationMembers(orgId: string): Promise<unknown>;
190
+ inviteUser(orgId: string, email: string): Promise<unknown>;
191
+ listInvitations(orgId: string): Promise<unknown>;
192
+ createApiKey(orgId: string, name: string, expiresDays?: number): Promise<unknown>;
193
+ listApiKeys(orgId: string): Promise<unknown>;
194
+ revokeApiKey(orgId: string, keyName: string): Promise<unknown>;
195
+ getOrganizationUsage(orgId: string, params?: {
196
+ start_date?: string;
197
+ end_date?: string;
198
+ }): Promise<unknown>;
199
+ getOrganizationBilling(orgId: string, month?: string): Promise<unknown>;
200
+ getDataUsageSummary(orgId: string, days?: number): Promise<unknown>;
201
+ getUnusedMetrics(orgId: string, days?: number): Promise<unknown>;
202
+ listDropFilters(orgId: string, filterType?: string): Promise<unknown>;
203
+ createDropFilter(orgId: string, params: {
204
+ filter_type: 'logs' | 'metrics';
205
+ query?: string;
206
+ field_name?: string;
207
+ condition?: string;
208
+ value?: string;
209
+ label_name?: string;
210
+ label_value?: string;
211
+ }): Promise<unknown>;
212
+ deleteDropFilter(orgId: string, filterId: string): Promise<unknown>;
213
+ getDropFilterStats(orgId: string): Promise<unknown>;
214
+ listDashboards(search?: string): Promise<{
215
+ dashboards: Dashboard[];
216
+ }>;
217
+ getDashboard(dashboardId: string): Promise<Dashboard>;
218
+ createDashboard(params: {
219
+ name: string;
220
+ description?: string;
221
+ panels?: Array<{
222
+ title: string;
223
+ type: string;
224
+ query: string;
225
+ width?: number;
226
+ height?: number;
227
+ }>;
228
+ }): Promise<Dashboard>;
229
+ updateDashboard(dashboardId: string, params: {
230
+ name?: string;
231
+ description?: string;
232
+ }): Promise<Dashboard>;
233
+ deleteDashboard(dashboardId: string): Promise<{
234
+ success: boolean;
235
+ }>;
236
+ addPanel(dashboardId: string, params: {
237
+ title: string;
238
+ type: string;
239
+ query: string;
240
+ width?: number;
241
+ height?: number;
242
+ position_x?: number;
243
+ position_y?: number;
244
+ }): Promise<Panel>;
245
+ updatePanel(dashboardId: string, panelId: string, params: {
246
+ title?: string;
247
+ query?: string;
248
+ width?: number;
249
+ height?: number;
250
+ }): Promise<Panel>;
251
+ deletePanel(dashboardId: string, panelId: string): Promise<{
252
+ success: boolean;
253
+ }>;
254
+ createAlert(params: {
255
+ name: string;
256
+ type: string;
257
+ condition: string;
258
+ threshold: number;
259
+ severity: string;
260
+ service?: string;
261
+ notification_channels?: string[];
262
+ }): Promise<Alert>;
263
+ updateAlert(alertId: string, params: {
264
+ name?: string;
265
+ condition?: string;
266
+ threshold?: number;
267
+ severity?: string;
268
+ enabled?: boolean;
269
+ }): Promise<Alert>;
270
+ deleteAlert(alertId: string): Promise<{
271
+ success: boolean;
272
+ }>;
273
+ }
274
+ export interface Dashboard {
275
+ id: string;
276
+ name: string;
277
+ description?: string;
278
+ panels: Panel[];
279
+ panel_count?: number;
280
+ created_at: string;
281
+ updated_at: string;
282
+ }
283
+ export interface Panel {
284
+ id: string;
285
+ title: string;
286
+ type: string;
287
+ query: string;
288
+ width: number;
289
+ height: number;
290
+ position_x: number;
291
+ position_y: number;
292
+ }
293
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;YAK9B,OAAO;IAsBf,UAAU,CAAC,MAAM,EAAE;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,eAAe,CAAC;IAYtB,eAAe,CAAC,MAAM,EAAE;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAW/D,YAAY,CAAC,MAAM,EAAE;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAYxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAMzC,YAAY,CAAC,MAAM,EAAE;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;QACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAWxB,WAAW,CAAC,MAAM,CAAC,EAAE;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAUhE,UAAU,CAAC,MAAM,CAAC,EAAE;QACxB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;IAS1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIzC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAOlF,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAMtH,YAAY,CAAC,MAAM,CAAC,EAAE;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAW9B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG;QAAE,MAAM,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAMvE,YAAY,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAIhD,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkD7D,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7D,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3D,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzC,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIpC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAMlC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO1D,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO9E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM9D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QACjD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQd,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOvE,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,OAAO,CAAC;IAOd,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMnE,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMnD,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IAOrE,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAIrD,eAAe,CAAC,MAAM,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,KAAK,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,SAAS,CAAC;IAOhB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE;QACjD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,SAAS,CAAC;IAOhB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAMnE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE;QAC1C,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,KAAK,CAAC;IAOZ,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;QAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,KAAK,CAAC;IAOZ,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAQhF,WAAW,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;KAClC,GAAG,OAAO,CAAC,KAAK,CAAC;IAOZ,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,KAAK,CAAC;IAOZ,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CAKlE;AAGD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}