@terasky/backstage-plugin-vcf-automation 1.1.1 → 1.2.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/dist/api/VcfAutomationClient.esm.js +36 -0
- package/dist/api/VcfAutomationClient.esm.js.map +1 -1
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js +166 -0
- package/dist/components/VCFAutomationCCINamespaceDetails.esm.js.map +1 -0
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js +159 -0
- package/dist/components/VCFAutomationCCINamespaceOverview.esm.js.map +1 -0
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js +359 -0
- package/dist/components/VCFAutomationCCIResourceDetails.esm.js.map +1 -0
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js +265 -0
- package/dist/components/VCFAutomationCCIResourceOverview.esm.js.map +1 -0
- package/dist/components/VCFAutomationProjectDetails.esm.js +25 -8
- package/dist/components/VCFAutomationProjectDetails.esm.js.map +1 -1
- package/dist/components/VCFAutomationProjectOverview.esm.js +17 -6
- package/dist/components/VCFAutomationProjectOverview.esm.js.map +1 -1
- package/dist/index.d.ts +104 -18
- package/dist/index.esm.js +4 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +28 -0
- package/dist/plugin.esm.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
3
|
+
import { InfoCard, StructuredMetadataTable, Table, CodeSnippet, StatusPending, StatusError, StatusOK } from '@backstage/core-components';
|
|
4
|
+
import { Typography, Grid, Card, CardContent, Tabs, Tab, Box, Chip, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';
|
|
5
|
+
import { makeStyles } from '@material-ui/core/styles';
|
|
6
|
+
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
7
|
+
import yaml from 'js-yaml';
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
|
|
10
|
+
const useStyles = makeStyles((theme) => ({
|
|
11
|
+
statusChip: {
|
|
12
|
+
marginRight: theme.spacing(1),
|
|
13
|
+
marginBottom: theme.spacing(0.5)
|
|
14
|
+
},
|
|
15
|
+
sectionTitle: {
|
|
16
|
+
marginBottom: theme.spacing(2)
|
|
17
|
+
},
|
|
18
|
+
conditionChip: {
|
|
19
|
+
margin: theme.spacing(0.25)
|
|
20
|
+
},
|
|
21
|
+
card: {
|
|
22
|
+
marginBottom: theme.spacing(2)
|
|
23
|
+
},
|
|
24
|
+
statusCard: {
|
|
25
|
+
border: `1px solid ${theme.palette.divider}`
|
|
26
|
+
},
|
|
27
|
+
dependencyChip: {
|
|
28
|
+
margin: theme.spacing(0.25),
|
|
29
|
+
cursor: "pointer"
|
|
30
|
+
},
|
|
31
|
+
yamlContainer: {
|
|
32
|
+
"& .MuiAccordionSummary-root": {
|
|
33
|
+
minHeight: 48
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
tabPanel: {
|
|
37
|
+
paddingTop: theme.spacing(2)
|
|
38
|
+
}
|
|
39
|
+
}));
|
|
40
|
+
function TabPanel(props) {
|
|
41
|
+
const { children, value, index } = props;
|
|
42
|
+
const classes = useStyles();
|
|
43
|
+
return /* @__PURE__ */ jsx(
|
|
44
|
+
"div",
|
|
45
|
+
{
|
|
46
|
+
role: "tabpanel",
|
|
47
|
+
hidden: value !== index,
|
|
48
|
+
id: `resource-tabpanel-${index}`,
|
|
49
|
+
"aria-labelledby": `resource-tab-${index}`,
|
|
50
|
+
children: value === index && /* @__PURE__ */ jsx(Box, { className: classes.tabPanel, children })
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const VCFAutomationCCIResourceDetails = () => {
|
|
55
|
+
const classes = useStyles();
|
|
56
|
+
const { entity } = useEntity();
|
|
57
|
+
const [tabValue, setTabValue] = useState(0);
|
|
58
|
+
const resourceProperties = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-properties"];
|
|
59
|
+
const resourceManifest = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-manifest"];
|
|
60
|
+
const resourceObject = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-object"];
|
|
61
|
+
const resourceContext = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-cci-resource-context"];
|
|
62
|
+
const resourceState = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-state"];
|
|
63
|
+
const syncStatus = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-sync-status"];
|
|
64
|
+
const createdAt = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-created-at"];
|
|
65
|
+
const origin = entity.metadata.annotations?.["terasky.backstage.io/vcf-automation-resource-origin"];
|
|
66
|
+
const resourceData = resourceProperties ? JSON.parse(resourceProperties) : null;
|
|
67
|
+
const manifest = resourceManifest ? JSON.parse(resourceManifest) : null;
|
|
68
|
+
const objectData = resourceObject ? JSON.parse(resourceObject) : null;
|
|
69
|
+
const handleTabChange = (_event, newValue) => {
|
|
70
|
+
setTabValue(newValue);
|
|
71
|
+
};
|
|
72
|
+
if (!resourceData) {
|
|
73
|
+
return /* @__PURE__ */ jsx(InfoCard, { title: "CCI Supervisor Resource Details", children: /* @__PURE__ */ jsx(Typography, { children: "No resource data available." }) });
|
|
74
|
+
}
|
|
75
|
+
const renderStatusIcon = (conditionStatus) => {
|
|
76
|
+
switch (conditionStatus.toLowerCase()) {
|
|
77
|
+
case "true":
|
|
78
|
+
return /* @__PURE__ */ jsx(StatusOK, {});
|
|
79
|
+
case "false":
|
|
80
|
+
return /* @__PURE__ */ jsx(StatusError, {});
|
|
81
|
+
default:
|
|
82
|
+
return /* @__PURE__ */ jsx(StatusPending, {});
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const reorderKubernetesResource = (data) => {
|
|
86
|
+
if (!data || typeof data !== "object") {
|
|
87
|
+
return data;
|
|
88
|
+
}
|
|
89
|
+
const orderedFields = ["apiVersion", "kind", "metadata", "spec", "status", "data"];
|
|
90
|
+
const reordered = {};
|
|
91
|
+
orderedFields.forEach((field) => {
|
|
92
|
+
if (data[field] !== void 0) {
|
|
93
|
+
reordered[field] = data[field];
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
Object.keys(data).forEach((field) => {
|
|
97
|
+
if (!orderedFields.includes(field)) {
|
|
98
|
+
reordered[field] = data[field];
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return reordered;
|
|
102
|
+
};
|
|
103
|
+
const formatYaml = (data) => {
|
|
104
|
+
try {
|
|
105
|
+
const reorderedData = reorderKubernetesResource(data);
|
|
106
|
+
return yaml.dump(reorderedData, {
|
|
107
|
+
indent: 2,
|
|
108
|
+
lineWidth: -1,
|
|
109
|
+
noRefs: true,
|
|
110
|
+
sortKeys: false
|
|
111
|
+
});
|
|
112
|
+
} catch (error) {
|
|
113
|
+
return JSON.stringify(data, null, 2);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const basicInfo = {
|
|
117
|
+
"Resource Name": entity.metadata.title || entity.metadata.name,
|
|
118
|
+
"Resource ID": resourceData.id || "Unknown",
|
|
119
|
+
"Context": resourceContext || "Unknown",
|
|
120
|
+
"Resource Link": resourceData.resourceLink || "Not available",
|
|
121
|
+
"Count": resourceData.count?.toString() || "N/A",
|
|
122
|
+
"Count Index": resourceData.countIndex?.toString() || "N/A",
|
|
123
|
+
"Existing": resourceData.existing ? "Yes" : "No",
|
|
124
|
+
"State": resourceState || "Unknown",
|
|
125
|
+
"Sync Status": syncStatus || "Unknown",
|
|
126
|
+
"Origin": origin || "Unknown",
|
|
127
|
+
"Created At": createdAt ? new Date(createdAt).toLocaleString() : "Unknown"
|
|
128
|
+
};
|
|
129
|
+
const getManifestInfo = () => {
|
|
130
|
+
if (!manifest) return {};
|
|
131
|
+
const info = {};
|
|
132
|
+
if (manifest.kind) info["Kind"] = manifest.kind;
|
|
133
|
+
if (manifest.apiVersion) info["API Version"] = manifest.apiVersion;
|
|
134
|
+
if (manifest.metadata?.name) info["Manifest Name"] = manifest.metadata.name;
|
|
135
|
+
if (manifest.metadata?.namespace) info["Namespace"] = manifest.metadata.namespace;
|
|
136
|
+
if (manifest.metadata?.labels) {
|
|
137
|
+
const labelCount = Object.keys(manifest.metadata.labels).length;
|
|
138
|
+
info["Labels"] = `${labelCount} label(s)`;
|
|
139
|
+
}
|
|
140
|
+
if (manifest.metadata?.annotations) {
|
|
141
|
+
const annotationCount = Object.keys(manifest.metadata.annotations).length;
|
|
142
|
+
info["Annotations"] = `${annotationCount} annotation(s)`;
|
|
143
|
+
}
|
|
144
|
+
return info;
|
|
145
|
+
};
|
|
146
|
+
const getObjectStatus = () => {
|
|
147
|
+
if (!objectData?.status) return null;
|
|
148
|
+
const status = objectData.status;
|
|
149
|
+
const statusInfo = {};
|
|
150
|
+
if (status.powerState) statusInfo["Power State"] = status.powerState;
|
|
151
|
+
if (status.phase) statusInfo["Phase"] = status.phase;
|
|
152
|
+
if (status.primaryIP4) statusInfo["Primary IP"] = status.primaryIP4;
|
|
153
|
+
if (status.host) statusInfo["Host"] = status.host;
|
|
154
|
+
if (status.zone) statusInfo["Zone"] = status.zone;
|
|
155
|
+
if (status.uniqueID) statusInfo["Unique ID"] = status.uniqueID;
|
|
156
|
+
if (status.instanceUUID) statusInfo["Instance UUID"] = status.instanceUUID;
|
|
157
|
+
if (status.biosUUID) statusInfo["BIOS UUID"] = status.biosUUID;
|
|
158
|
+
if (status.hardwareVersion) statusInfo["Hardware Version"] = status.hardwareVersion;
|
|
159
|
+
if (status.changeBlockTracking !== void 0) statusInfo["Change Block Tracking"] = status.changeBlockTracking ? "Enabled" : "Disabled";
|
|
160
|
+
return Object.keys(statusInfo).length > 0 ? statusInfo : null;
|
|
161
|
+
};
|
|
162
|
+
const manifestInfo = getManifestInfo();
|
|
163
|
+
const objectStatus = getObjectStatus();
|
|
164
|
+
const waitConditionColumns = [
|
|
165
|
+
{
|
|
166
|
+
title: "Status",
|
|
167
|
+
field: "status",
|
|
168
|
+
render: (rowData) => /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
|
|
169
|
+
renderStatusIcon(rowData.status),
|
|
170
|
+
/* @__PURE__ */ jsx("span", { style: { marginLeft: 8 }, children: rowData.status })
|
|
171
|
+
] })
|
|
172
|
+
},
|
|
173
|
+
{ title: "Type", field: "type" }
|
|
174
|
+
];
|
|
175
|
+
const resourceConditionColumns = [
|
|
176
|
+
{
|
|
177
|
+
title: "Status",
|
|
178
|
+
field: "status",
|
|
179
|
+
render: (rowData) => /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
|
|
180
|
+
renderStatusIcon(rowData.status),
|
|
181
|
+
/* @__PURE__ */ jsx("span", { style: { marginLeft: 8 }, children: rowData.status })
|
|
182
|
+
] })
|
|
183
|
+
},
|
|
184
|
+
{ title: "Type", field: "type" },
|
|
185
|
+
{ title: "Last Transition", field: "lastTransitionTime" },
|
|
186
|
+
{ title: "Reason", field: "reason" },
|
|
187
|
+
{ title: "Message", field: "message" }
|
|
188
|
+
];
|
|
189
|
+
const getNetworkInfo = () => {
|
|
190
|
+
if (!objectData?.status?.network) return null;
|
|
191
|
+
const network = objectData.status.network;
|
|
192
|
+
const networkInfo2 = {};
|
|
193
|
+
if (network.primaryIP4) networkInfo2["Primary IPv4"] = network.primaryIP4;
|
|
194
|
+
if (network.interfaces && network.interfaces.length > 0) {
|
|
195
|
+
networkInfo2["Network Interfaces"] = `${network.interfaces.length} interface(s)`;
|
|
196
|
+
network.interfaces.forEach((iface, index) => {
|
|
197
|
+
if (iface.ip?.macAddr) networkInfo2[`Interface ${index + 1} MAC`] = iface.ip.macAddr;
|
|
198
|
+
if (iface.ip?.addresses && iface.ip.addresses.length > 0) {
|
|
199
|
+
const primaryAddr = iface.ip.addresses.find((addr) => addr.state === "preferred");
|
|
200
|
+
if (primaryAddr) networkInfo2[`Interface ${index + 1} IP`] = primaryAddr.address;
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return Object.keys(networkInfo2).length > 0 ? networkInfo2 : null;
|
|
205
|
+
};
|
|
206
|
+
const networkInfo = getNetworkInfo();
|
|
207
|
+
return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
208
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(InfoCard, { title: "Resource Overview", children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 2, children: [
|
|
209
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 3, children: /* @__PURE__ */ jsx(Card, { className: classes.statusCard, children: /* @__PURE__ */ jsxs(CardContent, { children: [
|
|
210
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "textSecondary", children: "State" }),
|
|
211
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", children: resourceState || "Unknown" })
|
|
212
|
+
] }) }) }),
|
|
213
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 3, children: /* @__PURE__ */ jsx(Card, { className: classes.statusCard, children: /* @__PURE__ */ jsxs(CardContent, { children: [
|
|
214
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "textSecondary", children: "Sync Status" }),
|
|
215
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", children: syncStatus || "Unknown" })
|
|
216
|
+
] }) }) }),
|
|
217
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 3, children: /* @__PURE__ */ jsx(Card, { className: classes.statusCard, children: /* @__PURE__ */ jsxs(CardContent, { children: [
|
|
218
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "textSecondary", children: "Kind" }),
|
|
219
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", children: manifest?.kind || "Unknown" })
|
|
220
|
+
] }) }) }),
|
|
221
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, sm: 6, md: 3, children: /* @__PURE__ */ jsx(Card, { className: classes.statusCard, children: /* @__PURE__ */ jsxs(CardContent, { children: [
|
|
222
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", color: "textSecondary", children: "Power State" }),
|
|
223
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", children: objectData?.status?.powerState || "Unknown" })
|
|
224
|
+
] }) }) })
|
|
225
|
+
] }) }) }),
|
|
226
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(InfoCard, { children: [
|
|
227
|
+
/* @__PURE__ */ jsxs(Tabs, { value: tabValue, onChange: handleTabChange, "aria-label": "resource details tabs", children: [
|
|
228
|
+
/* @__PURE__ */ jsx(Tab, { label: "Basic Information" }),
|
|
229
|
+
/* @__PURE__ */ jsx(Tab, { label: "Manifest Details" }),
|
|
230
|
+
/* @__PURE__ */ jsx(Tab, { label: "Object Status" }),
|
|
231
|
+
/* @__PURE__ */ jsx(Tab, { label: "Conditions" }),
|
|
232
|
+
/* @__PURE__ */ jsx(Tab, { label: "YAML Views" })
|
|
233
|
+
] }),
|
|
234
|
+
/* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 0, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
235
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: basicInfo }) }),
|
|
236
|
+
entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
237
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Dependencies" }),
|
|
238
|
+
/* @__PURE__ */ jsx(Box, { children: entity.spec.dependsOn.filter((dep) => typeof dep === "string").map((dep, index) => /* @__PURE__ */ jsx(
|
|
239
|
+
Chip,
|
|
240
|
+
{
|
|
241
|
+
label: dep,
|
|
242
|
+
size: "small",
|
|
243
|
+
className: classes.dependencyChip,
|
|
244
|
+
color: "primary",
|
|
245
|
+
variant: "outlined"
|
|
246
|
+
},
|
|
247
|
+
index
|
|
248
|
+
)) })
|
|
249
|
+
] })
|
|
250
|
+
] }) }),
|
|
251
|
+
/* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 1, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
252
|
+
Object.keys(manifestInfo).length > 0 && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
253
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Manifest Information" }),
|
|
254
|
+
/* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: manifestInfo })
|
|
255
|
+
] }),
|
|
256
|
+
manifest?.metadata?.labels && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
257
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Labels" }),
|
|
258
|
+
/* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: manifest.metadata.labels })
|
|
259
|
+
] })
|
|
260
|
+
] }) }),
|
|
261
|
+
/* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 2, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
262
|
+
objectStatus && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
263
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Object Status" }),
|
|
264
|
+
/* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: objectStatus })
|
|
265
|
+
] }),
|
|
266
|
+
networkInfo && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
267
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Network Information" }),
|
|
268
|
+
/* @__PURE__ */ jsx(StructuredMetadataTable, { metadata: networkInfo })
|
|
269
|
+
] })
|
|
270
|
+
] }) }),
|
|
271
|
+
/* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 3, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
272
|
+
resourceData.wait?.conditions && resourceData.wait.conditions.length > 0 && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
273
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Wait Conditions" }),
|
|
274
|
+
/* @__PURE__ */ jsx(
|
|
275
|
+
Table,
|
|
276
|
+
{
|
|
277
|
+
columns: waitConditionColumns,
|
|
278
|
+
data: resourceData.wait.conditions,
|
|
279
|
+
options: {
|
|
280
|
+
search: false,
|
|
281
|
+
paging: false,
|
|
282
|
+
padding: "dense"
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
)
|
|
286
|
+
] }),
|
|
287
|
+
objectData?.status?.conditions && objectData.status.conditions.length > 0 && /* @__PURE__ */ jsxs(Grid, { item: true, xs: 12, children: [
|
|
288
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", className: classes.sectionTitle, children: "Resource Conditions" }),
|
|
289
|
+
/* @__PURE__ */ jsx(
|
|
290
|
+
Table,
|
|
291
|
+
{
|
|
292
|
+
columns: resourceConditionColumns,
|
|
293
|
+
data: objectData.status.conditions,
|
|
294
|
+
options: {
|
|
295
|
+
search: true,
|
|
296
|
+
paging: objectData.status.conditions.length > 10,
|
|
297
|
+
pageSize: 10,
|
|
298
|
+
padding: "dense"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
)
|
|
302
|
+
] })
|
|
303
|
+
] }) }),
|
|
304
|
+
/* @__PURE__ */ jsx(TabPanel, { value: tabValue, index: 4, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 3, children: [
|
|
305
|
+
manifest && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(Accordion, { className: classes.yamlContainer, defaultExpanded: true, children: [
|
|
306
|
+
/* @__PURE__ */ jsx(
|
|
307
|
+
AccordionSummary,
|
|
308
|
+
{
|
|
309
|
+
expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}),
|
|
310
|
+
"aria-controls": "manifest-content",
|
|
311
|
+
id: "manifest-header",
|
|
312
|
+
children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Resource Manifest" })
|
|
313
|
+
}
|
|
314
|
+
),
|
|
315
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
316
|
+
CodeSnippet,
|
|
317
|
+
{
|
|
318
|
+
text: formatYaml(manifest),
|
|
319
|
+
language: "yaml",
|
|
320
|
+
showLineNumbers: true,
|
|
321
|
+
customStyle: {
|
|
322
|
+
fontSize: "12px",
|
|
323
|
+
maxHeight: "600px",
|
|
324
|
+
overflow: "auto"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
) }) })
|
|
328
|
+
] }) }),
|
|
329
|
+
objectData && /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsxs(Accordion, { className: classes.yamlContainer, children: [
|
|
330
|
+
/* @__PURE__ */ jsx(
|
|
331
|
+
AccordionSummary,
|
|
332
|
+
{
|
|
333
|
+
expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}),
|
|
334
|
+
"aria-controls": "object-content",
|
|
335
|
+
id: "object-header",
|
|
336
|
+
children: /* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Live Kubernetes Object" })
|
|
337
|
+
}
|
|
338
|
+
),
|
|
339
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
|
|
340
|
+
CodeSnippet,
|
|
341
|
+
{
|
|
342
|
+
text: formatYaml(objectData),
|
|
343
|
+
language: "yaml",
|
|
344
|
+
showLineNumbers: true,
|
|
345
|
+
customStyle: {
|
|
346
|
+
fontSize: "12px",
|
|
347
|
+
maxHeight: "600px",
|
|
348
|
+
overflow: "auto"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
) }) })
|
|
352
|
+
] }) })
|
|
353
|
+
] }) })
|
|
354
|
+
] }) })
|
|
355
|
+
] });
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
export { VCFAutomationCCIResourceDetails };
|
|
359
|
+
//# sourceMappingURL=VCFAutomationCCIResourceDetails.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VCFAutomationCCIResourceDetails.esm.js","sources":["../../src/components/VCFAutomationCCIResourceDetails.tsx"],"sourcesContent":["import { useEntity } from '@backstage/plugin-catalog-react';\nimport {\n InfoCard,\n StructuredMetadataTable,\n StatusOK,\n StatusError,\n StatusPending,\n Table,\n TableColumn,\n CodeSnippet,\n} from '@backstage/core-components';\nimport { \n Grid, \n Typography, \n Chip, \n Box, \n Card, \n CardContent, \n Tabs, \n Tab,\n Accordion,\n AccordionSummary,\n AccordionDetails\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport yaml from 'js-yaml';\nimport { useState } from 'react';\n\nconst useStyles = makeStyles(theme => ({\n statusChip: {\n marginRight: theme.spacing(1),\n marginBottom: theme.spacing(0.5),\n },\n sectionTitle: {\n marginBottom: theme.spacing(2),\n },\n conditionChip: {\n margin: theme.spacing(0.25),\n },\n card: {\n marginBottom: theme.spacing(2),\n },\n statusCard: {\n border: `1px solid ${theme.palette.divider}`,\n },\n dependencyChip: {\n margin: theme.spacing(0.25),\n cursor: 'pointer',\n },\n yamlContainer: {\n '& .MuiAccordionSummary-root': {\n minHeight: 48,\n },\n },\n tabPanel: {\n paddingTop: theme.spacing(2),\n },\n}));\n\ninterface Condition {\n type: string;\n status: string;\n lastTransitionTime?: string;\n reason?: string;\n message?: string;\n}\n\ninterface WaitCondition {\n type: string;\n status: string;\n}\n\nfunction TabPanel(props: { children?: React.ReactNode; index: number; value: number }) {\n const { children, value, index } = props;\n const classes = useStyles();\n\n return (\n <div\n role=\"tabpanel\"\n hidden={value !== index}\n id={`resource-tabpanel-${index}`}\n aria-labelledby={`resource-tab-${index}`}\n >\n {value === index && (\n <Box className={classes.tabPanel}>\n {children}\n </Box>\n )}\n </div>\n );\n}\n\nexport const VCFAutomationCCIResourceDetails = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const [tabValue, setTabValue] = useState(0);\n\n const resourceProperties = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-properties'];\n const resourceManifest = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-manifest'];\n const resourceObject = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-object'];\n const resourceContext = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-cci-resource-context'];\n const resourceState = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-state'];\n const syncStatus = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-sync-status'];\n const createdAt = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-created-at'];\n const origin = entity.metadata.annotations?.['terasky.backstage.io/vcf-automation-resource-origin'];\n\n const resourceData = resourceProperties ? JSON.parse(resourceProperties) : null;\n const manifest = resourceManifest ? JSON.parse(resourceManifest) : null;\n const objectData = resourceObject ? JSON.parse(resourceObject) : null;\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setTabValue(newValue);\n };\n\n if (!resourceData) {\n return (\n <InfoCard title=\"CCI Supervisor Resource Details\">\n <Typography>No resource data available.</Typography>\n </InfoCard>\n );\n }\n\n const renderStatusIcon = (conditionStatus: string) => {\n switch (conditionStatus.toLowerCase()) {\n case 'true':\n return <StatusOK />;\n case 'false':\n return <StatusError />;\n default:\n return <StatusPending />;\n }\n };\n\n const reorderKubernetesResource = (data: any) => {\n if (!data || typeof data !== 'object') {\n return data;\n }\n\n // Standard Kubernetes resource field order\n const orderedFields = ['apiVersion', 'kind', 'metadata', 'spec', 'status', 'data'];\n const reordered: any = {};\n\n // Add fields in the correct order\n orderedFields.forEach(field => {\n if (data[field] !== undefined) {\n reordered[field] = data[field];\n }\n });\n\n // Add any remaining fields that weren't in our standard list\n Object.keys(data).forEach(field => {\n if (!orderedFields.includes(field)) {\n reordered[field] = data[field];\n }\n });\n\n return reordered;\n };\n\n const formatYaml = (data: any) => {\n try {\n const reorderedData = reorderKubernetesResource(data);\n return yaml.dump(reorderedData, { \n indent: 2, \n lineWidth: -1,\n noRefs: true,\n sortKeys: false \n });\n } catch (error) {\n return JSON.stringify(data, null, 2);\n }\n };\n\n const basicInfo = {\n 'Resource Name': entity.metadata.title || entity.metadata.name,\n 'Resource ID': resourceData.id || 'Unknown',\n 'Context': resourceContext || 'Unknown',\n 'Resource Link': resourceData.resourceLink || 'Not available',\n 'Count': resourceData.count?.toString() || 'N/A',\n 'Count Index': resourceData.countIndex?.toString() || 'N/A',\n 'Existing': resourceData.existing ? 'Yes' : 'No',\n 'State': resourceState || 'Unknown',\n 'Sync Status': syncStatus || 'Unknown',\n 'Origin': origin || 'Unknown',\n 'Created At': createdAt ? new Date(createdAt).toLocaleString() : 'Unknown',\n };\n\n const getManifestInfo = () => {\n if (!manifest) return {};\n \n const info: any = {};\n if (manifest.kind) info['Kind'] = manifest.kind;\n if (manifest.apiVersion) info['API Version'] = manifest.apiVersion;\n if (manifest.metadata?.name) info['Manifest Name'] = manifest.metadata.name;\n if (manifest.metadata?.namespace) info['Namespace'] = manifest.metadata.namespace;\n if (manifest.metadata?.labels) {\n const labelCount = Object.keys(manifest.metadata.labels).length;\n info['Labels'] = `${labelCount} label(s)`;\n }\n if (manifest.metadata?.annotations) {\n const annotationCount = Object.keys(manifest.metadata.annotations).length;\n info['Annotations'] = `${annotationCount} annotation(s)`;\n }\n \n return info;\n };\n\n const getObjectStatus = () => {\n if (!objectData?.status) return null;\n \n const status = objectData.status;\n const statusInfo: any = {};\n \n if (status.powerState) statusInfo['Power State'] = status.powerState;\n if (status.phase) statusInfo['Phase'] = status.phase;\n if (status.primaryIP4) statusInfo['Primary IP'] = status.primaryIP4;\n if (status.host) statusInfo['Host'] = status.host;\n if (status.zone) statusInfo['Zone'] = status.zone;\n if (status.uniqueID) statusInfo['Unique ID'] = status.uniqueID;\n if (status.instanceUUID) statusInfo['Instance UUID'] = status.instanceUUID;\n if (status.biosUUID) statusInfo['BIOS UUID'] = status.biosUUID;\n if (status.hardwareVersion) statusInfo['Hardware Version'] = status.hardwareVersion;\n if (status.changeBlockTracking !== undefined) statusInfo['Change Block Tracking'] = status.changeBlockTracking ? 'Enabled' : 'Disabled';\n \n return Object.keys(statusInfo).length > 0 ? statusInfo : null;\n };\n\n const manifestInfo = getManifestInfo();\n const objectStatus = getObjectStatus();\n\n const waitConditionColumns: TableColumn<WaitCondition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n ];\n\n const resourceConditionColumns: TableColumn<Condition>[] = [\n { \n title: 'Status', \n field: 'status',\n render: (rowData) => (\n <Box display=\"flex\" alignItems=\"center\">\n {renderStatusIcon(rowData.status)}\n <span style={{ marginLeft: 8 }}>{rowData.status}</span>\n </Box>\n ),\n },\n { title: 'Type', field: 'type' },\n { title: 'Last Transition', field: 'lastTransitionTime' },\n { title: 'Reason', field: 'reason' },\n { title: 'Message', field: 'message' },\n ];\n\n const getNetworkInfo = () => {\n if (!objectData?.status?.network) return null;\n \n const network = objectData.status.network;\n const networkInfo: any = {};\n \n if (network.primaryIP4) networkInfo['Primary IPv4'] = network.primaryIP4;\n if (network.interfaces && network.interfaces.length > 0) {\n networkInfo['Network Interfaces'] = `${network.interfaces.length} interface(s)`;\n \n network.interfaces.forEach((iface: any, index: number) => {\n if (iface.ip?.macAddr) networkInfo[`Interface ${index + 1} MAC`] = iface.ip.macAddr;\n if (iface.ip?.addresses && iface.ip.addresses.length > 0) {\n const primaryAddr = iface.ip.addresses.find((addr: any) => addr.state === 'preferred');\n if (primaryAddr) networkInfo[`Interface ${index + 1} IP`] = primaryAddr.address;\n }\n });\n }\n \n return Object.keys(networkInfo).length > 0 ? networkInfo : null;\n };\n\n const networkInfo = getNetworkInfo();\n\n return (\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <InfoCard title=\"Resource Overview\">\n <Grid container spacing={2}>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n State\n </Typography>\n <Typography variant=\"h4\">\n {resourceState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Sync Status\n </Typography>\n <Typography variant=\"h4\">\n {syncStatus || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Kind\n </Typography>\n <Typography variant=\"h4\">\n {manifest?.kind || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n <Grid item xs={12} sm={6} md={3}>\n <Card className={classes.statusCard}>\n <CardContent>\n <Typography variant=\"h6\" color=\"textSecondary\">\n Power State\n </Typography>\n <Typography variant=\"h4\">\n {objectData?.status?.powerState || 'Unknown'}\n </Typography>\n </CardContent>\n </Card>\n </Grid>\n </Grid>\n </InfoCard>\n </Grid>\n\n <Grid item xs={12}>\n <InfoCard>\n <Tabs value={tabValue} onChange={handleTabChange} aria-label=\"resource details tabs\">\n <Tab label=\"Basic Information\" />\n <Tab label=\"Manifest Details\" />\n <Tab label=\"Object Status\" />\n <Tab label=\"Conditions\" />\n <Tab label=\"YAML Views\" />\n </Tabs>\n\n <TabPanel value={tabValue} index={0}>\n <Grid container spacing={3}>\n <Grid item xs={12}>\n <StructuredMetadataTable metadata={basicInfo} />\n </Grid>\n \n {entity.spec?.dependsOn && Array.isArray(entity.spec.dependsOn) && entity.spec.dependsOn.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Dependencies\n </Typography>\n <Box>\n {entity.spec.dependsOn\n .filter((dep): dep is string => typeof dep === 'string')\n .map((dep: string, index: number) => (\n <Chip\n key={index}\n label={dep}\n size=\"small\"\n className={classes.dependencyChip}\n color=\"primary\"\n variant=\"outlined\"\n />\n ))}\n </Box>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={1}>\n <Grid container spacing={3}>\n {Object.keys(manifestInfo).length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Manifest Information\n </Typography>\n <StructuredMetadataTable metadata={manifestInfo} />\n </Grid>\n )}\n \n {manifest?.metadata?.labels && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Labels\n </Typography>\n <StructuredMetadataTable metadata={manifest.metadata.labels} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={2}>\n <Grid container spacing={3}>\n {objectStatus && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Object Status\n </Typography>\n <StructuredMetadataTable metadata={objectStatus} />\n </Grid>\n )}\n \n {networkInfo && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Network Information\n </Typography>\n <StructuredMetadataTable metadata={networkInfo} />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={3}>\n <Grid container spacing={3}>\n {resourceData.wait?.conditions && resourceData.wait.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Wait Conditions\n </Typography>\n <Table\n columns={waitConditionColumns}\n data={resourceData.wait.conditions}\n options={{\n search: false,\n paging: false,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n\n {objectData?.status?.conditions && objectData.status.conditions.length > 0 && (\n <Grid item xs={12}>\n <Typography variant=\"h6\" className={classes.sectionTitle}>\n Resource Conditions\n </Typography>\n <Table\n columns={resourceConditionColumns}\n data={objectData.status.conditions}\n options={{\n search: true,\n paging: objectData.status.conditions.length > 10,\n pageSize: 10,\n padding: 'dense',\n }}\n />\n </Grid>\n )}\n </Grid>\n </TabPanel>\n\n <TabPanel value={tabValue} index={4}>\n <Grid container spacing={3}>\n {manifest && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer} defaultExpanded>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"manifest-content\"\n id=\"manifest-header\"\n >\n <Typography variant=\"h6\">Resource Manifest</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(manifest)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n\n {objectData && (\n <Grid item xs={12}>\n <Accordion className={classes.yamlContainer}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"object-content\"\n id=\"object-header\"\n >\n <Typography variant=\"h6\">Live Kubernetes Object</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box width=\"100%\">\n <CodeSnippet\n text={formatYaml(objectData)}\n language=\"yaml\"\n showLineNumbers\n customStyle={{ \n fontSize: '12px',\n maxHeight: '600px',\n overflow: 'auto'\n }}\n />\n </Box>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n </TabPanel>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};"],"names":["networkInfo"],"mappings":";;;;;;;;;AA6BA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,UAAY,EAAA;AAAA,IACV,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,GAAG;AAAA,GACjC;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GAC/B;AAAA,EACA,aAAe,EAAA;AAAA,IACb,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,IAAI;AAAA,GAC5B;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,YAAA,EAAc,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GAC/B;AAAA,EACA,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,GAC5C;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC1B,MAAQ,EAAA;AAAA,GACV;AAAA,EACA,aAAe,EAAA;AAAA,IACb,6BAA+B,EAAA;AAAA,MAC7B,SAAW,EAAA;AAAA;AACb,GACF;AAAA,EACA,QAAU,EAAA;AAAA,IACR,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAE/B,CAAE,CAAA,CAAA;AAeF,SAAS,SAAS,KAAqE,EAAA;AACrF,EAAA,MAAM,EAAE,QAAA,EAAU,KAAO,EAAA,KAAA,EAAU,GAAA,KAAA;AACnC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,UAAA;AAAA,MACL,QAAQ,KAAU,KAAA,KAAA;AAAA,MAClB,EAAA,EAAI,qBAAqB,KAAK,CAAA,CAAA;AAAA,MAC9B,iBAAA,EAAiB,gBAAgB,KAAK,CAAA,CAAA;AAAA,MAErC,oBAAU,KACT,oBAAA,GAAA,CAAC,OAAI,SAAW,EAAA,OAAA,CAAQ,UACrB,QACH,EAAA;AAAA;AAAA,GAEJ;AAEJ;AAEO,MAAM,kCAAkC,MAAM;AACnD,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,CAAC,CAAA;AAE1C,EAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,yDAAyD,CAAA;AAClH,EAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,2DAA2D,CAAA;AAClH,EAAA,MAAM,cAAiB,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,yDAAyD,CAAA;AAC9G,EAAA,MAAM,eAAkB,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,0DAA0D,CAAA;AAChH,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,oDAAoD,CAAA;AACxG,EAAA,MAAM,UAAa,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,0DAA0D,CAAA;AAC3G,EAAA,MAAM,SAAY,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,yDAAyD,CAAA;AACzG,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,GAAc,qDAAqD,CAAA;AAElG,EAAA,MAAM,YAAe,GAAA,kBAAA,GAAqB,IAAK,CAAA,KAAA,CAAM,kBAAkB,CAAI,GAAA,IAAA;AAC3E,EAAA,MAAM,QAAW,GAAA,gBAAA,GAAmB,IAAK,CAAA,KAAA,CAAM,gBAAgB,CAAI,GAAA,IAAA;AACnE,EAAA,MAAM,UAAa,GAAA,cAAA,GAAiB,IAAK,CAAA,KAAA,CAAM,cAAc,CAAI,GAAA,IAAA;AAEjE,EAAM,MAAA,eAAA,GAAkB,CAAC,MAAA,EAA+B,QAAqB,KAAA;AAC3E,IAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,GACtB;AAEA,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAA,2BACG,QAAS,EAAA,EAAA,KAAA,EAAM,mCACd,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,yCAA2B,CACzC,EAAA,CAAA;AAAA;AAIJ,EAAM,MAAA,gBAAA,GAAmB,CAAC,eAA4B,KAAA;AACpD,IAAQ,QAAA,eAAA,CAAgB,aAAe;AAAA,MACrC,KAAK,MAAA;AACH,QAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,MACnB,KAAK,OAAA;AACH,QAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA;AAAA,MACtB;AACE,QAAA,2BAAQ,aAAc,EAAA,EAAA,CAAA;AAAA;AAC1B,GACF;AAEA,EAAM,MAAA,yBAAA,GAA4B,CAAC,IAAc,KAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAU,EAAA;AACrC,MAAO,OAAA,IAAA;AAAA;AAIT,IAAA,MAAM,gBAAgB,CAAC,YAAA,EAAc,QAAQ,UAAY,EAAA,MAAA,EAAQ,UAAU,MAAM,CAAA;AACjF,IAAA,MAAM,YAAiB,EAAC;AAGxB,IAAA,aAAA,CAAc,QAAQ,CAAS,KAAA,KAAA;AAC7B,MAAI,IAAA,IAAA,CAAK,KAAK,CAAA,KAAM,KAAW,CAAA,EAAA;AAC7B,QAAU,SAAA,CAAA,KAAK,CAAI,GAAA,IAAA,CAAK,KAAK,CAAA;AAAA;AAC/B,KACD,CAAA;AAGD,IAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAS,KAAA,KAAA;AACjC,MAAA,IAAI,CAAC,aAAA,CAAc,QAAS,CAAA,KAAK,CAAG,EAAA;AAClC,QAAU,SAAA,CAAA,KAAK,CAAI,GAAA,IAAA,CAAK,KAAK,CAAA;AAAA;AAC/B,KACD,CAAA;AAED,IAAO,OAAA,SAAA;AAAA,GACT;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,IAAc,KAAA;AAChC,IAAI,IAAA;AACF,MAAM,MAAA,aAAA,GAAgB,0BAA0B,IAAI,CAAA;AACpD,MAAO,OAAA,IAAA,CAAK,KAAK,aAAe,EAAA;AAAA,QAC9B,MAAQ,EAAA,CAAA;AAAA,QACR,SAAW,EAAA,CAAA,CAAA;AAAA,QACX,MAAQ,EAAA,IAAA;AAAA,QACR,QAAU,EAAA;AAAA,OACX,CAAA;AAAA,aACM,KAAO,EAAA;AACd,MAAA,OAAO,IAAK,CAAA,SAAA,CAAU,IAAM,EAAA,IAAA,EAAM,CAAC,CAAA;AAAA;AACrC,GACF;AAEA,EAAA,MAAM,SAAY,GAAA;AAAA,IAChB,eAAiB,EAAA,MAAA,CAAO,QAAS,CAAA,KAAA,IAAS,OAAO,QAAS,CAAA,IAAA;AAAA,IAC1D,aAAA,EAAe,aAAa,EAAM,IAAA,SAAA;AAAA,IAClC,WAAW,eAAmB,IAAA,SAAA;AAAA,IAC9B,eAAA,EAAiB,aAAa,YAAgB,IAAA,eAAA;AAAA,IAC9C,OAAS,EAAA,YAAA,CAAa,KAAO,EAAA,QAAA,EAAc,IAAA,KAAA;AAAA,IAC3C,aAAe,EAAA,YAAA,CAAa,UAAY,EAAA,QAAA,EAAc,IAAA,KAAA;AAAA,IACtD,UAAA,EAAY,YAAa,CAAA,QAAA,GAAW,KAAQ,GAAA,IAAA;AAAA,IAC5C,SAAS,aAAiB,IAAA,SAAA;AAAA,IAC1B,eAAe,UAAc,IAAA,SAAA;AAAA,IAC7B,UAAU,MAAU,IAAA,SAAA;AAAA,IACpB,cAAc,SAAY,GAAA,IAAI,KAAK,SAAS,CAAA,CAAE,gBAAmB,GAAA;AAAA,GACnE;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAI,IAAA,CAAC,QAAU,EAAA,OAAO,EAAC;AAEvB,IAAA,MAAM,OAAY,EAAC;AACnB,IAAA,IAAI,QAAS,CAAA,IAAA,EAAW,IAAA,CAAA,MAAM,IAAI,QAAS,CAAA,IAAA;AAC3C,IAAA,IAAI,QAAS,CAAA,UAAA,EAAiB,IAAA,CAAA,aAAa,IAAI,QAAS,CAAA,UAAA;AACxD,IAAA,IAAI,SAAS,QAAU,EAAA,IAAA,OAAW,eAAe,CAAA,GAAI,SAAS,QAAS,CAAA,IAAA;AACvE,IAAA,IAAI,SAAS,QAAU,EAAA,SAAA,OAAgB,WAAW,CAAA,GAAI,SAAS,QAAS,CAAA,SAAA;AACxE,IAAI,IAAA,QAAA,CAAS,UAAU,MAAQ,EAAA;AAC7B,MAAA,MAAM,aAAa,MAAO,CAAA,IAAA,CAAK,QAAS,CAAA,QAAA,CAAS,MAAM,CAAE,CAAA,MAAA;AACzD,MAAK,IAAA,CAAA,QAAQ,CAAI,GAAA,CAAA,EAAG,UAAU,CAAA,SAAA,CAAA;AAAA;AAEhC,IAAI,IAAA,QAAA,CAAS,UAAU,WAAa,EAAA;AAClC,MAAA,MAAM,kBAAkB,MAAO,CAAA,IAAA,CAAK,QAAS,CAAA,QAAA,CAAS,WAAW,CAAE,CAAA,MAAA;AACnE,MAAK,IAAA,CAAA,aAAa,CAAI,GAAA,CAAA,EAAG,eAAe,CAAA,cAAA,CAAA;AAAA;AAG1C,IAAO,OAAA,IAAA;AAAA,GACT;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAI,IAAA,CAAC,UAAY,EAAA,MAAA,EAAe,OAAA,IAAA;AAEhC,IAAA,MAAM,SAAS,UAAW,CAAA,MAAA;AAC1B,IAAA,MAAM,aAAkB,EAAC;AAEzB,IAAA,IAAI,MAAO,CAAA,UAAA,EAAuB,UAAA,CAAA,aAAa,IAAI,MAAO,CAAA,UAAA;AAC1D,IAAA,IAAI,MAAO,CAAA,KAAA,EAAkB,UAAA,CAAA,OAAO,IAAI,MAAO,CAAA,KAAA;AAC/C,IAAA,IAAI,MAAO,CAAA,UAAA,EAAuB,UAAA,CAAA,YAAY,IAAI,MAAO,CAAA,UAAA;AACzD,IAAA,IAAI,MAAO,CAAA,IAAA,EAAiB,UAAA,CAAA,MAAM,IAAI,MAAO,CAAA,IAAA;AAC7C,IAAA,IAAI,MAAO,CAAA,IAAA,EAAiB,UAAA,CAAA,MAAM,IAAI,MAAO,CAAA,IAAA;AAC7C,IAAA,IAAI,MAAO,CAAA,QAAA,EAAqB,UAAA,CAAA,WAAW,IAAI,MAAO,CAAA,QAAA;AACtD,IAAA,IAAI,MAAO,CAAA,YAAA,EAAyB,UAAA,CAAA,eAAe,IAAI,MAAO,CAAA,YAAA;AAC9D,IAAA,IAAI,MAAO,CAAA,QAAA,EAAqB,UAAA,CAAA,WAAW,IAAI,MAAO,CAAA,QAAA;AACtD,IAAA,IAAI,MAAO,CAAA,eAAA,EAA4B,UAAA,CAAA,kBAAkB,IAAI,MAAO,CAAA,eAAA;AACpE,IAAI,IAAA,MAAA,CAAO,wBAAwB,KAAW,CAAA,EAAA,UAAA,CAAW,uBAAuB,CAAI,GAAA,MAAA,CAAO,sBAAsB,SAAY,GAAA,UAAA;AAE7H,IAAA,OAAO,OAAO,IAAK,CAAA,UAAU,CAAE,CAAA,MAAA,GAAS,IAAI,UAAa,GAAA,IAAA;AAAA,GAC3D;AAEA,EAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,EAAA,MAAM,eAAe,eAAgB,EAAA;AAErC,EAAA,MAAM,oBAAqD,GAAA;AAAA,IACzD;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAC,OACP,qBAAA,IAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,YAAW,QAC5B,EAAA,QAAA,EAAA;AAAA,QAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAAA,wBAChC,GAAA,CAAC,UAAK,KAAO,EAAA,EAAE,YAAY,CAAE,EAAA,EAAI,kBAAQ,MAAO,EAAA;AAAA,OAClD,EAAA;AAAA,KAEJ;AAAA,IACA,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,MAAO;AAAA,GACjC;AAEA,EAAA,MAAM,wBAAqD,GAAA;AAAA,IACzD;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAC,OACP,qBAAA,IAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,YAAW,QAC5B,EAAA,QAAA,EAAA;AAAA,QAAA,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAAA,wBAChC,GAAA,CAAC,UAAK,KAAO,EAAA,EAAE,YAAY,CAAE,EAAA,EAAI,kBAAQ,MAAO,EAAA;AAAA,OAClD,EAAA;AAAA,KAEJ;AAAA,IACA,EAAE,KAAA,EAAO,MAAQ,EAAA,KAAA,EAAO,MAAO,EAAA;AAAA,IAC/B,EAAE,KAAA,EAAO,iBAAmB,EAAA,KAAA,EAAO,oBAAqB,EAAA;AAAA,IACxD,EAAE,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,QAAS,EAAA;AAAA,IACnC,EAAE,KAAA,EAAO,SAAW,EAAA,KAAA,EAAO,SAAU;AAAA,GACvC;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,UAAA,EAAY,MAAQ,EAAA,OAAA,EAAgB,OAAA,IAAA;AAEzC,IAAM,MAAA,OAAA,GAAU,WAAW,MAAO,CAAA,OAAA;AAClC,IAAA,MAAMA,eAAmB,EAAC;AAE1B,IAAA,IAAI,QAAQ,UAAY,EAAAA,YAAY,CAAA,cAAc,IAAI,OAAQ,CAAA,UAAA;AAC9D,IAAA,IAAI,OAAQ,CAAA,UAAA,IAAc,OAAQ,CAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AACvD,MAAAA,aAAY,oBAAoB,CAAA,GAAI,CAAG,EAAA,OAAA,CAAQ,WAAW,MAAM,CAAA,aAAA,CAAA;AAEhE,MAAA,OAAA,CAAQ,UAAW,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAY,KAAkB,KAAA;AACxD,QAAI,IAAA,KAAA,CAAM,EAAI,EAAA,OAAA,EAASA,YAAAA,CAAY,CAAa,UAAA,EAAA,KAAA,GAAQ,CAAC,CAAA,IAAA,CAAM,CAAI,GAAA,KAAA,CAAM,EAAG,CAAA,OAAA;AAC5E,QAAA,IAAI,MAAM,EAAI,EAAA,SAAA,IAAa,MAAM,EAAG,CAAA,SAAA,CAAU,SAAS,CAAG,EAAA;AACxD,UAAM,MAAA,WAAA,GAAc,MAAM,EAAG,CAAA,SAAA,CAAU,KAAK,CAAC,IAAA,KAAc,IAAK,CAAA,KAAA,KAAU,WAAW,CAAA;AACrF,UAAI,IAAA,WAAA,EAAaA,YAAY,CAAA,CAAA,UAAA,EAAa,QAAQ,CAAC,CAAA,GAAA,CAAK,IAAI,WAAY,CAAA,OAAA;AAAA;AAC1E,OACD,CAAA;AAAA;AAGH,IAAA,OAAO,OAAO,IAAKA,CAAAA,YAAW,CAAE,CAAA,MAAA,GAAS,IAAIA,YAAc,GAAA,IAAA;AAAA,GAC7D;AAEA,EAAA,MAAM,cAAc,cAAe,EAAA;AAEnC,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,mBAAA,EACd,QAAC,kBAAA,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAC5B,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,UAAA,EACvB,+BAAC,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,KAAA,EAAM,iBAAgB,QAE/C,EAAA,OAAA,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EACjB,2BAAiB,SACpB,EAAA;AAAA,OAAA,EACF,GACF,CACF,EAAA,CAAA;AAAA,0BACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAC5B,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,UAAA,EACvB,+BAAC,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,KAAA,EAAM,iBAAgB,QAE/C,EAAA,aAAA,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EACjB,wBAAc,SACjB,EAAA;AAAA,OAAA,EACF,GACF,CACF,EAAA,CAAA;AAAA,0BACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAC5B,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,UAAA,EACvB,+BAAC,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,KAAA,EAAM,iBAAgB,QAE/C,EAAA,MAAA,EAAA,CAAA;AAAA,4BACC,UAAW,EAAA,EAAA,OAAA,EAAQ,IACjB,EAAA,QAAA,EAAA,QAAA,EAAU,QAAQ,SACrB,EAAA;AAAA,OAAA,EACF,GACF,CACF,EAAA,CAAA;AAAA,0BACC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAC5B,8BAAC,IAAK,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,UAAA,EACvB,+BAAC,WACC,EAAA,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,KAAA,EAAM,iBAAgB,QAE/C,EAAA,aAAA,EAAA,CAAA;AAAA,4BACC,UAAW,EAAA,EAAA,OAAA,EAAQ,MACjB,QAAY,EAAA,UAAA,EAAA,MAAA,EAAQ,cAAc,SACrC,EAAA;AAAA,OAAA,EACF,GACF,CACF,EAAA;AAAA,KAAA,EACF,GACF,CACF,EAAA,CAAA;AAAA,wBAEC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EACb,+BAAC,QACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,QAAK,KAAO,EAAA,QAAA,EAAU,QAAU,EAAA,eAAA,EAAiB,cAAW,uBAC3D,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,GAAA,EAAA,EAAI,OAAM,mBAAoB,EAAA,CAAA;AAAA,wBAC/B,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAM,kBAAmB,EAAA,CAAA;AAAA,wBAC9B,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAM,eAAgB,EAAA,CAAA;AAAA,wBAC3B,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAM,YAAa,EAAA,CAAA;AAAA,wBACxB,GAAA,CAAC,GAAI,EAAA,EAAA,KAAA,EAAM,YAAa,EAAA;AAAA,OAC1B,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,CAChC,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACvB,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IACb,QAAC,kBAAA,GAAA,CAAA,uBAAA,EAAA,EAAwB,QAAU,EAAA,SAAA,EAAW,CAChD,EAAA,CAAA;AAAA,QAEC,OAAO,IAAM,EAAA,SAAA,IAAa,MAAM,OAAQ,CAAA,MAAA,CAAO,KAAK,SAAS,CAAA,IAAK,OAAO,IAAK,CAAA,SAAA,CAAU,SAAS,CAChG,oBAAA,IAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,cAAA,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,GAAA,EAAA,EACE,QAAO,EAAA,MAAA,CAAA,IAAA,CAAK,UACV,MAAO,CAAA,CAAC,GAAuB,KAAA,OAAO,QAAQ,QAAQ,CAAA,CACtD,GAAI,CAAA,CAAC,KAAa,KACjB,qBAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cAEC,KAAO,EAAA,GAAA;AAAA,cACP,IAAK,EAAA,OAAA;AAAA,cACL,WAAW,OAAQ,CAAA,cAAA;AAAA,cACnB,KAAM,EAAA,SAAA;AAAA,cACN,OAAQ,EAAA;AAAA,aAAA;AAAA,YALH;AAAA,WAOR,CACL,EAAA;AAAA,SACF,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,CAChC,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACtB,EAAA,QAAA,EAAA;AAAA,QAAO,MAAA,CAAA,IAAA,CAAK,YAAY,CAAA,CAAE,MAAS,GAAA,CAAA,yBACjC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,sBAAA,EAAA,CAAA;AAAA,0BACA,GAAA,CAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,YAAc,EAAA;AAAA,SACnD,EAAA,CAAA;AAAA,QAGD,QAAA,EAAU,UAAU,MACnB,oBAAA,IAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,QAAA,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,uBAAA,EAAA,EAAwB,QAAU,EAAA,QAAA,CAAS,SAAS,MAAQ,EAAA;AAAA,SAC/D,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,CAChC,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACtB,EAAA,QAAA,EAAA;AAAA,QAAA,YAAA,oBACE,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,eAAA,EAAA,CAAA;AAAA,0BACA,GAAA,CAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,YAAc,EAAA;AAAA,SACnD,EAAA,CAAA;AAAA,QAGD,+BACE,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,qBAAA,EAAA,CAAA;AAAA,0BACA,GAAA,CAAC,uBAAwB,EAAA,EAAA,QAAA,EAAU,WAAa,EAAA;AAAA,SAClD,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,CAChC,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACtB,EAAA,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,IAAM,EAAA,UAAA,IAAc,YAAa,CAAA,IAAA,CAAK,UAAW,CAAA,MAAA,GAAS,CACtE,oBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,iBAAA,EAAA,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,oBAAA;AAAA,cACT,IAAA,EAAM,aAAa,IAAK,CAAA,UAAA;AAAA,cACxB,OAAS,EAAA;AAAA,gBACP,MAAQ,EAAA,KAAA;AAAA,gBACR,MAAQ,EAAA,KAAA;AAAA,gBACR,OAAS,EAAA;AAAA;AACX;AAAA;AACF,SACF,EAAA,CAAA;AAAA,QAGD,UAAY,EAAA,MAAA,EAAQ,UAAc,IAAA,UAAA,CAAW,MAAO,CAAA,UAAA,CAAW,MAAS,GAAA,CAAA,oBACtE,IAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,IAAA,EAAK,SAAW,EAAA,OAAA,CAAQ,cAAc,QAE1D,EAAA,qBAAA,EAAA,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,wBAAA;AAAA,cACT,IAAA,EAAM,WAAW,MAAO,CAAA,UAAA;AAAA,cACxB,OAAS,EAAA;AAAA,gBACP,MAAQ,EAAA,IAAA;AAAA,gBACR,MAAQ,EAAA,UAAA,CAAW,MAAO,CAAA,UAAA,CAAW,MAAS,GAAA,EAAA;AAAA,gBAC9C,QAAU,EAAA,EAAA;AAAA,gBACV,OAAS,EAAA;AAAA;AACX;AAAA;AACF,SACF,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA,CAAA;AAAA,sBAEA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,CAChC,EAAA,QAAA,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IAAC,EAAA,OAAA,EAAS,CACtB,EAAA,QAAA,EAAA;AAAA,QAAA,QAAA,oBACE,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EACb,QAAC,kBAAA,IAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,OAAA,CAAQ,aAAe,EAAA,eAAA,EAAe,IAC1D,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,UAAA,sBAAa,cAAe,EAAA,EAAA,CAAA;AAAA,cAC5B,eAAc,EAAA,kBAAA;AAAA,cACd,EAAG,EAAA,iBAAA;AAAA,cAEH,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAK,QAAiB,EAAA,mBAAA,EAAA;AAAA;AAAA,WAC5C;AAAA,0BACC,GAAA,CAAA,gBAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,GAAA,EAAA,EAAI,OAAM,MACT,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAW,QAAQ,CAAA;AAAA,cACzB,QAAS,EAAA,MAAA;AAAA,cACT,eAAe,EAAA,IAAA;AAAA,cACf,WAAa,EAAA;AAAA,gBACX,QAAU,EAAA,MAAA;AAAA,gBACV,SAAW,EAAA,OAAA;AAAA,gBACX,QAAU,EAAA;AAAA;AACZ;AAAA,aAEJ,CACF,EAAA;AAAA,SAAA,EACF,CACF,EAAA,CAAA;AAAA,QAGD,UAAA,oBACE,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EACb,QAAC,kBAAA,IAAA,CAAA,SAAA,EAAA,EAAU,SAAW,EAAA,OAAA,CAAQ,aAC5B,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,UAAA,sBAAa,cAAe,EAAA,EAAA,CAAA;AAAA,cAC5B,eAAc,EAAA,gBAAA;AAAA,cACd,EAAG,EAAA,eAAA;AAAA,cAEH,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAK,QAAsB,EAAA,wBAAA,EAAA;AAAA;AAAA,WACjD;AAAA,0BACC,GAAA,CAAA,gBAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,GAAA,EAAA,EAAI,OAAM,MACT,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,WAAW,UAAU,CAAA;AAAA,cAC3B,QAAS,EAAA,MAAA;AAAA,cACT,eAAe,EAAA,IAAA;AAAA,cACf,WAAa,EAAA;AAAA,gBACX,QAAU,EAAA,MAAA;AAAA,gBACV,SAAW,EAAA,OAAA;AAAA,gBACX,QAAU,EAAA;AAAA;AACZ;AAAA,aAEJ,CACF,EAAA;AAAA,SAAA,EACF,CACF,EAAA;AAAA,OAAA,EAEJ,CACF,EAAA;AAAA,KAAA,EACF,CACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|