@grafana/ui
Version:
Grafana Components Library
1 lines • 37.5 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","sources":["../../../../src/graveyard/TimeSeries/utils.ts"],"sourcesContent":["import { isNumber } from 'lodash';\nimport uPlot from 'uplot';\n\nimport {\n DashboardCursorSync,\n DataFrame,\n FieldConfig,\n FieldType,\n formattedValueToString,\n getFieldColorModeForField,\n getFieldSeriesColor,\n getFieldDisplayName,\n getDisplayProcessor,\n FieldColorModeId,\n DecimalCount,\n} from '@grafana/data';\nimport {\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n GraphThresholdsStyleMode,\n VisibilityMode,\n ScaleDirection,\n ScaleOrientation,\n StackingMode,\n GraphTransform,\n AxisColorMode,\n GraphGradientMode,\n} from '@grafana/schema';\n\n// unit lookup needed to determine if we want power-of-2 or power-of-10 axis ticks\n// see categories.ts is @grafana/data\nconst IEC_UNITS = new Set([\n 'bytes',\n 'bits',\n 'kbytes',\n 'mbytes',\n 'gbytes',\n 'tbytes',\n 'pbytes',\n 'binBps',\n 'binbps',\n 'KiBs',\n 'Kibits',\n 'MiBs',\n 'Mibits',\n 'GiBs',\n 'Gibits',\n 'TiBs',\n 'Tibits',\n 'PiBs',\n 'Pibits',\n]);\n\nconst BIN_INCRS = Array(53);\n\nfor (let i = 0; i < BIN_INCRS.length; i++) {\n BIN_INCRS[i] = 2 ** i;\n}\n\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../../components/uPlot/config/UPlotConfigBuilder';\nimport { getScaleGradientFn } from '../../components/uPlot/config/gradientFills';\nimport { getStackingGroups, preparePlotData2 } from '../../components/uPlot/utils';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst defaultFormatter = (v: any, decimals: DecimalCount = 1) => (v == null ? '-' : v.toFixed(decimals));\n\nconst defaultConfig: GraphFieldConfig = {\n drawStyle: GraphDrawStyle.Line,\n showPoints: VisibilityMode.Auto,\n axisPlacement: AxisPlacement.Auto,\n};\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<{\n sync?: () => DashboardCursorSync;\n}> = ({\n frame,\n theme,\n timeZones,\n getTimeRange,\n sync,\n allFrames,\n renderers,\n tweakScale = (opts) => opts,\n tweakAxis = (opts) => opts,\n}) => {\n const eventsScope = '__global_';\n\n const builder = new UPlotConfigBuilder(timeZones[0]);\n\n let alignedFrame: DataFrame;\n\n builder.setPrepData((frames) => {\n // cache alignedFrame\n alignedFrame = frames[0];\n\n return preparePlotData2(frames[0], builder.getStackingGroups());\n });\n\n // X is the first field in the aligned frame\n const xField = frame.fields[0];\n if (!xField) {\n return builder; // empty frame with no options\n }\n\n const xScaleKey = 'x';\n let yScaleKey = '';\n\n const xFieldAxisPlacement =\n xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden;\n const xFieldAxisShow = xField.config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n if (xField.type === FieldType.time) {\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n isTime: true,\n range: () => {\n const r = getTimeRange();\n return [r.from.valueOf(), r.to.valueOf()];\n },\n });\n\n // filters first 2 ticks to make space for timezone labels\n const filterTicks: uPlot.Axis.Filter | undefined =\n timeZones.length > 1\n ? (u, splits) => {\n return splits.map((v, i) => (i < 2 ? null : v));\n }\n : undefined;\n\n for (let i = 0; i < timeZones.length; i++) {\n const timeZone = timeZones[i];\n builder.addAxis({\n scaleKey: xScaleKey,\n isTime: true,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n timeZone,\n theme,\n grid: { show: i === 0 && xField.config.custom?.axisGridShow },\n filter: filterTicks,\n });\n }\n\n // render timezone labels\n if (timeZones.length > 1) {\n builder.addHook('drawAxes', (u: uPlot) => {\n u.ctx.save();\n\n u.ctx.fillStyle = theme.colors.text.primary;\n u.ctx.textAlign = 'left';\n u.ctx.textBaseline = 'bottom';\n\n let i = 0;\n u.axes.forEach((a) => {\n if (a.side === 2) {\n //@ts-ignore\n let cssBaseline: number = a._pos + a._size;\n u.ctx.fillText(timeZones[i], u.bbox.left, cssBaseline * uPlot.pxRatio);\n i++;\n }\n });\n\n u.ctx.restore();\n });\n }\n } else {\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n range: (u, dataMin, dataMax) => [xField.config.min ?? dataMin, xField.config.max ?? dataMax],\n });\n\n builder.addAxis({\n scaleKey: xScaleKey,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n theme,\n grid: { show: xField.config.custom?.axisGridShow },\n formatValue: (v, decimals) => formattedValueToString(xField.display!(v, decimals)),\n });\n }\n\n let customRenderedFields =\n renderers?.flatMap((r) => Object.values(r.fieldMap).filter((name) => r.indicesOnly.indexOf(name) === -1)) ?? [];\n\n let indexByName: Map<string, number> | undefined;\n\n for (let i = 1; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n\n const config: FieldConfig<GraphFieldConfig> = {\n ...field.config,\n custom: {\n ...defaultConfig,\n ...field.config.custom,\n },\n };\n\n const customConfig: GraphFieldConfig = config.custom!;\n\n if (field === xField || (field.type !== FieldType.number && field.type !== FieldType.enum)) {\n continue;\n }\n\n let fmt = field.display ?? defaultFormatter;\n if (field.config.custom?.stacking?.mode === StackingMode.Percent) {\n fmt = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'percentunit',\n },\n },\n theme,\n });\n }\n const scaleKey = buildScaleKey(config, field.type);\n const colorMode = getFieldColorModeForField(field);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n // The builder will manage unique scaleKeys and combine where appropriate\n builder.addScale(\n tweakScale(\n {\n scaleKey,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n distribution: customConfig.scaleDistribution?.type,\n log: customConfig.scaleDistribution?.log,\n linearThreshold: customConfig.scaleDistribution?.linearThreshold,\n min: field.config.min,\n max: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n centeredZero: customConfig.axisCenteredZero,\n range:\n customConfig.stacking?.mode === StackingMode.Percent\n ? (u: uPlot, dataMin: number, dataMax: number) => {\n dataMin = dataMin < 0 ? -1 : 0;\n dataMax = dataMax > 0 ? 1 : 0;\n return [dataMin, dataMax];\n }\n : field.type === FieldType.enum\n ? (u: uPlot, dataMin: number, dataMax: number) => {\n // this is the exhaustive enum (stable)\n let len = field.config.type!.enum!.text!.length;\n\n return [-1, len];\n\n // these are only values that are present\n // return [dataMin - 1, dataMax + 1]\n }\n : undefined,\n decimals: field.config.decimals,\n },\n field\n )\n );\n\n if (!yScaleKey) {\n yScaleKey = scaleKey;\n }\n\n if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n let axisColor: uPlot.Axis.Stroke | undefined;\n\n if (customConfig.axisColorMode === AxisColorMode.Series) {\n if (\n colorMode.isByValue &&\n field.config.custom?.gradientMode === GraphGradientMode.Scheme &&\n colorMode.id === FieldColorModeId.Thresholds\n ) {\n axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);\n } else {\n axisColor = seriesColor;\n }\n }\n\n const axisDisplayOptions = {\n border: {\n show: customConfig.axisBorderShow || false,\n width: 1 / devicePixelRatio,\n stroke: axisColor || theme.colors.text.primary,\n },\n ticks: {\n show: customConfig.axisBorderShow || false,\n stroke: axisColor || theme.colors.text.primary,\n },\n color: axisColor || theme.colors.text.primary,\n };\n\n let incrs: uPlot.Axis.Incrs | undefined;\n\n // TODO: these will be dynamic with frame updates, so need to accept getYTickLabels()\n let values: uPlot.Axis.Values | undefined;\n let splits: uPlot.Axis.Splits | undefined;\n\n if (IEC_UNITS.has(config.unit!)) {\n incrs = BIN_INCRS;\n } else if (field.type === FieldType.enum) {\n let text = field.config.type!.enum!.text!;\n splits = text.map((v: string, i: number) => i);\n values = text;\n }\n\n builder.addAxis(\n tweakAxis(\n {\n scaleKey,\n label: customConfig.axisLabel,\n size: customConfig.axisWidth,\n placement: customConfig.axisPlacement ?? AxisPlacement.Auto,\n formatValue: (v, decimals) => formattedValueToString(fmt(v, decimals)),\n theme,\n grid: { show: customConfig.axisGridShow },\n decimals: field.config.decimals,\n distr: customConfig.scaleDistribution?.type,\n splits,\n values,\n incrs,\n ...axisDisplayOptions,\n },\n field\n )\n );\n }\n\n const showPoints =\n customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n let pointsFilter: uPlot.Series.Points.Filter = () => null;\n\n if (customConfig.spanNulls !== true) {\n pointsFilter = (u, seriesIdx, show, gaps) => {\n let filtered = [];\n\n let series = u.series[seriesIdx];\n\n if (!show && gaps && gaps.length) {\n const [firstIdx, lastIdx] = series.idxs!;\n const xData = u.data[0];\n const yData = u.data[seriesIdx];\n const firstPos = Math.round(u.valToPos(xData[firstIdx], 'x', true));\n const lastPos = Math.round(u.valToPos(xData[lastIdx], 'x', true));\n\n if (gaps[0][0] === firstPos) {\n filtered.push(firstIdx);\n }\n\n // show single points between consecutive gaps that share end/start\n for (let i = 0; i < gaps.length; i++) {\n let thisGap = gaps[i];\n let nextGap = gaps[i + 1];\n\n if (nextGap && thisGap[1] === nextGap[0]) {\n // approx when data density is > 1pt/px, since gap start/end pixels are rounded\n let approxIdx = u.posToIdx(thisGap[1], true);\n\n if (yData[approxIdx] == null) {\n // scan left/right alternating to find closest index with non-null value\n for (let j = 1; j < 100; j++) {\n if (yData[approxIdx + j] != null) {\n approxIdx += j;\n break;\n }\n if (yData[approxIdx - j] != null) {\n approxIdx -= j;\n break;\n }\n }\n }\n\n filtered.push(approxIdx);\n }\n }\n\n if (gaps[gaps.length - 1][1] === lastPos) {\n filtered.push(lastIdx);\n }\n }\n\n return filtered.length ? filtered : null;\n };\n }\n\n let { fillOpacity } = customConfig;\n\n let pathBuilder: uPlot.Series.PathBuilder | null = null;\n let pointsBuilder: uPlot.Series.Points.Show | null = null;\n\n if (field.state?.origin) {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n\n const originFrame = allFrames[field.state.origin.frameIndex];\n const originField = originFrame?.fields[field.state.origin.fieldIndex];\n\n const dispName = getFieldDisplayName(originField ?? field, originFrame, allFrames);\n\n // disable default renderers\n if (customRenderedFields.indexOf(dispName) >= 0) {\n pathBuilder = () => null;\n pointsBuilder = () => undefined;\n } else if (customConfig.transform === GraphTransform.Constant) {\n // patch some monkeys!\n const defaultBuilder = uPlot.paths!.linear!();\n\n pathBuilder = (u, seriesIdx) => {\n //eslint-disable-next-line\n const _data: any[] = (u as any)._data; // uplot.AlignedData not exposed in types\n\n // the data we want the line renderer to pull is x at each plot edge with paired flat y values\n\n const r = getTimeRange();\n let xData = [r.from.valueOf(), r.to.valueOf()];\n let firstY = _data[seriesIdx].find((v: number | null | undefined) => v != null);\n let yData = [firstY, firstY];\n let fauxData = _data.slice();\n fauxData[0] = xData;\n fauxData[seriesIdx] = yData;\n\n //eslint-disable-next-line\n return defaultBuilder(\n {\n ...u,\n _data: fauxData,\n } as any,\n seriesIdx,\n 0,\n 1\n );\n };\n }\n\n if (customConfig.fillBelowTo) {\n const fillBelowToField = frame.fields.find(\n (f) =>\n customConfig.fillBelowTo === f.name ||\n customConfig.fillBelowTo === f.config?.displayNameFromDS ||\n customConfig.fillBelowTo === getFieldDisplayName(f, frame, allFrames)\n );\n\n const fillBelowDispName = fillBelowToField\n ? getFieldDisplayName(fillBelowToField, frame, allFrames)\n : customConfig.fillBelowTo;\n\n const t = indexByName.get(dispName);\n const b = indexByName.get(fillBelowDispName);\n if (isNumber(b) && isNumber(t)) {\n builder.addBand({\n series: [t, b],\n fill: undefined, // using null will have the band use fill options from `t`\n });\n\n if (!fillOpacity) {\n fillOpacity = 35; // default from flot\n }\n } else {\n fillOpacity = 0;\n }\n }\n }\n\n let dynamicSeriesColor: ((seriesIdx: number) => string | undefined) | undefined = undefined;\n\n if (colorMode.id === FieldColorModeId.Thresholds) {\n dynamicSeriesColor = (seriesIdx) => getFieldSeriesColor(alignedFrame.fields[seriesIdx], theme).color;\n }\n\n builder.addSeries({\n pathBuilder,\n pointsBuilder,\n scaleKey,\n showPoints,\n pointsFilter,\n colorMode,\n fillOpacity,\n theme,\n dynamicSeriesColor,\n drawStyle: customConfig.drawStyle!,\n lineColor: customConfig.lineColor ?? seriesColor,\n lineWidth: customConfig.lineWidth,\n lineInterpolation: customConfig.lineInterpolation,\n lineStyle: customConfig.lineStyle,\n barAlignment: customConfig.barAlignment,\n barWidthFactor: customConfig.barWidthFactor,\n barMaxWidth: customConfig.barMaxWidth,\n pointSize: customConfig.pointSize,\n spanNulls: customConfig.spanNulls || false,\n show: !customConfig.hideFrom?.viz,\n gradientMode: customConfig.gradientMode,\n thresholds: config.thresholds,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n dataFrameFieldIndex: field.state?.origin,\n });\n\n // Render thresholds in graph\n if (customConfig.thresholdsStyle && config.thresholds) {\n const thresholdDisplay = customConfig.thresholdsStyle.mode ?? GraphThresholdsStyleMode.Off;\n if (thresholdDisplay !== GraphThresholdsStyleMode.Off) {\n builder.addThresholds({\n config: customConfig.thresholdsStyle,\n thresholds: config.thresholds,\n scaleKey,\n theme,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n });\n }\n }\n }\n\n let stackingGroups = getStackingGroups(frame);\n\n builder.setStackingGroups(stackingGroups);\n\n // hook up custom/composite renderers\n renderers?.forEach((r) => {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n let fieldIndices: Record<string, number> = {};\n\n for (let key in r.fieldMap) {\n let dispName = r.fieldMap[key];\n fieldIndices[key] = indexByName.get(dispName)!;\n }\n\n r.init(builder, fieldIndices);\n });\n\n builder.scaleKeys = [xScaleKey, yScaleKey];\n\n // if hovered value is null, how far we may scan left/right to hover nearest non-null\n const hoverProximityPx = 15;\n\n let cursor: Partial<uPlot.Cursor> = {\n // this scans left and right from cursor position to find nearest data index with value != null\n // TODO: do we want to only scan past undefined values, but halt at explicit null values?\n dataIdx: (self, seriesIdx, hoveredIdx, cursorXVal) => {\n let seriesData = self.data[seriesIdx];\n\n if (seriesData[hoveredIdx] == null) {\n let nonNullLft = null,\n nonNullRgt = null,\n i;\n\n i = hoveredIdx;\n while (nonNullLft == null && i-- > 0) {\n if (seriesData[i] != null) {\n nonNullLft = i;\n }\n }\n\n i = hoveredIdx;\n while (nonNullRgt == null && i++ < seriesData.length) {\n if (seriesData[i] != null) {\n nonNullRgt = i;\n }\n }\n\n let xVals = self.data[0];\n\n let curPos = self.valToPos(cursorXVal, 'x');\n let rgtPos = nonNullRgt == null ? Infinity : self.valToPos(xVals[nonNullRgt], 'x');\n let lftPos = nonNullLft == null ? -Infinity : self.valToPos(xVals[nonNullLft], 'x');\n\n let lftDelta = curPos - lftPos;\n let rgtDelta = rgtPos - curPos;\n\n if (lftDelta <= rgtDelta) {\n if (lftDelta <= hoverProximityPx) {\n hoveredIdx = nonNullLft!;\n }\n } else {\n if (rgtDelta <= hoverProximityPx) {\n hoveredIdx = nonNullRgt!;\n }\n }\n }\n\n return hoveredIdx;\n },\n };\n\n if (sync && sync() !== DashboardCursorSync.Off) {\n cursor.sync = {\n key: eventsScope,\n scales: [xScaleKey, null],\n };\n }\n\n builder.setCursor(cursor);\n\n return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame, allFrames: DataFrame[]): Map<string, number> {\n const originNames = new Map<string, number>();\n frame.fields.forEach((field, i) => {\n const origin = field.state?.origin;\n if (origin) {\n const origField = allFrames[origin.frameIndex]?.fields[origin.fieldIndex];\n if (origField) {\n originNames.set(getFieldDisplayName(origField, allFrames[origin.frameIndex], allFrames), i);\n }\n }\n });\n return originNames;\n}\n"],"names":["_a","_b","i"],"mappings":";;;;;;;;;;AAgCA,MAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,SAAA,GAAY,MAAM,EAAE,CAAA;AAE1B,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,EAAA,SAAA,CAAU,CAAC,IAAI,CAAA,IAAK,CAAA;AACtB;AAOA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAQ,QAAA,GAAyB,CAAA,KAAO,KAAK,IAAA,GAAO,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAEtG,MAAM,aAAA,GAAkC;AAAA,EACtC,WAAW,cAAA,CAAe,IAAA;AAAA,EAC1B,YAAY,cAAA,CAAe,IAAA;AAAA,EAC3B,eAAe,aAAA,CAAc;AAC/B,CAAA;AAEO,MAAM,2BAER,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA,GAAa,CAAC,IAAA,KAAS,IAAA;AAAA,EACvB,SAAA,GAAY,CAAC,IAAA,KAAS;AACxB,CAAA,KAAM;AArFN,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAsFE,EAAA,MAAM,WAAA,GAAc,WAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB,SAAA,CAAU,CAAC,CAAC,CAAA;AAEnD,EAAA,IAAI,YAAA;AAEJ,EAAA,OAAA,CAAQ,WAAA,CAAY,CAAC,MAAA,KAAW;AAE9B,IAAA,YAAA,GAAe,OAAO,CAAC,CAAA;AAEvB,IAAA,OAAO,iBAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,mBAAmB,CAAA;AAAA,EAChE,CAAC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,MAAM,mBAAA,GAAA,CAAA,CACJ,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,mBAAkB,aAAA,CAAc,MAAA,GAAS,aAAA,CAAc,MAAA,GAAS,aAAA,CAAc,MAAA;AACtG,EAAA,MAAM,mBAAiB,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,mBAAkB,aAAA,CAAc,MAAA;AAE7E,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM;AAClC,IAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,MACf,QAAA,EAAU,SAAA;AAAA,MACV,aAAa,gBAAA,CAAiB,UAAA;AAAA,MAC9B,WAAW,cAAA,CAAe,KAAA;AAAA,MAC1B,MAAA,EAAQ,IAAA;AAAA,MACR,OAAO,MAAM;AACX,QAAA,MAAM,IAAI,YAAA,EAAa;AACvB,QAAA,OAAO,CAAC,EAAE,IAAA,CAAK,OAAA,IAAW,CAAA,CAAE,EAAA,CAAG,SAAS,CAAA;AAAA,MAC1C;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,cACJ,SAAA,CAAU,MAAA,GAAS,CAAA,GACf,CAAC,GAAG,MAAA,KAAW;AACb,MAAA,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,OAAO,CAAE,CAAA;AAAA,IAChD,CAAA,GACA,KAAA,CAAA;AAEN,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,QAAA,GAAW,UAAU,CAAC,CAAA;AAC5B,MAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,QACd,QAAA,EAAU,SAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAW,mBAAA;AAAA,QACX,IAAA,EAAM,cAAA;AAAA,QACN,KAAA,EAAA,CAAO,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,SAAA;AAAA,QAC7B,QAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,KAAM,OAAK,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,YAAA,CAAA,EAAa;AAAA,QAC5D,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY,CAAC,CAAA,KAAa;AACxC,QAAA,CAAA,CAAE,IAAI,IAAA,EAAK;AAEX,QAAA,CAAA,CAAE,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,OAAA;AACpC,QAAA,CAAA,CAAE,IAAI,SAAA,GAAY,MAAA;AAClB,QAAA,CAAA,CAAE,IAAI,YAAA,GAAe,QAAA;AAErB,QAAA,IAAI,CAAA,GAAI,CAAA;AACR,QAAA,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM;AACpB,UAAA,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAEhB,YAAA,IAAI,WAAA,GAAsB,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA;AACrC,YAAA,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,EAAG,EAAE,IAAA,CAAK,IAAA,EAAM,WAAA,GAAc,KAAA,CAAM,OAAO,CAAA;AACrE,YAAA,CAAA,EAAA;AAAA,UACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,CAAA,CAAE,IAAI,OAAA,EAAQ;AAAA,MAChB,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,QAAA,CAAS;AAAA,MACf,QAAA,EAAU,SAAA;AAAA,MACV,aAAa,gBAAA,CAAiB,UAAA;AAAA,MAC9B,WAAW,cAAA,CAAe,KAAA;AAAA,MAC1B,KAAA,EAAO,CAAC,CAAA,EAAG,OAAA,EAAS,OAAA,KAAS;AA9KnC,QAAA,IAAAA,GAAAA,EAAAC,GAAAA;AA8KsC,QAAA,OAAA,CAAA,CAACD,GAAAA,GAAA,MAAA,CAAO,MAAA,CAAO,GAAA,KAAd,IAAA,GAAAA,GAAAA,GAAqB,OAAA,EAAA,CAASC,GAAAA,GAAA,MAAA,CAAO,MAAA,CAAO,GAAA,KAAd,IAAA,GAAAA,MAAqB,OAAO,CAAA;AAAA,MAAA;AAAA,KAC5F,CAAA;AAED,IAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,MACd,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,mBAAA;AAAA,MACX,IAAA,EAAM,cAAA;AAAA,MACN,KAAA,EAAA,CAAO,EAAA,GAAA,MAAA,CAAO,MAAA,CAAO,MAAA,KAAd,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAsB,SAAA;AAAA,MAC7B,KAAA;AAAA,MACA,MAAM,EAAE,IAAA,EAAA,CAAM,YAAO,MAAA,CAAO,MAAA,KAAd,mBAAsB,YAAA,EAAa;AAAA,MACjD,WAAA,EAAa,CAAC,CAAA,EAAG,QAAA,KAAa,uBAAuB,MAAA,CAAO,OAAA,CAAS,CAAA,EAAG,QAAQ,CAAC;AAAA,KAClF,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,oBAAA,GAAA,CACF,4CAAW,OAAA,CAAQ,CAAC,MAAM,MAAA,CAAO,MAAA,CAAO,EAAE,QAAQ,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,EAAE,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA,KAAM,CAAA,CAAE,CAAA,CAAA,KAAvG,IAAA,GAAA,EAAA,GAA6G,EAAC;AAEhH,EAAA,IAAI,WAAA;AAEJ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAE5B,IAAA,MAAM,MAAA,GAAwC;AAAA,MAC5C,GAAG,KAAA,CAAM,MAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,GAAG,aAAA;AAAA,QACH,GAAG,MAAM,MAAA,CAAO;AAAA;AAClB,KACF;AAEA,IAAA,MAAM,eAAiC,MAAA,CAAO,MAAA;AAE9C,IAAA,IAAI,KAAA,KAAU,UAAW,KAAA,CAAM,IAAA,KAAS,UAAU,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,SAAA,CAAU,IAAA,EAAO;AAC1F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAA,CAAM,EAAA,GAAA,KAAA,CAAM,OAAA,KAAN,IAAA,GAAA,EAAA,GAAiB,gBAAA;AAC3B,IAAA,IAAA,CAAA,CAAI,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,OAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,aAArB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA+B,IAAA,MAAS,aAAa,OAAA,EAAS;AAChE,MAAA,GAAA,GAAM,mBAAA,CAAoB;AAAA,QACxB,KAAA,EAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ;AAAA,YACN,GAAG,KAAA,CAAM,MAAA;AAAA,YACT,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,0BAA0B,KAAK,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,KAAA,EAAO,KAAK,CAAA;AACnD,IAAA,MAAM,cAAc,UAAA,CAAW,KAAA;AAG/B,IAAA,OAAA,CAAQ,QAAA;AAAA,MACN,UAAA;AAAA,QACE;AAAA,UACE,QAAA;AAAA,UACA,aAAa,gBAAA,CAAiB,QAAA;AAAA,UAC9B,WAAW,cAAA,CAAe,EAAA;AAAA,UAC1B,YAAA,EAAA,CAAc,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,IAAA;AAAA,UAC9C,GAAA,EAAA,CAAK,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,GAAA;AAAA,UACrC,eAAA,EAAA,CAAiB,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,eAAA;AAAA,UACjD,GAAA,EAAK,MAAM,MAAA,CAAO,GAAA;AAAA,UAClB,GAAA,EAAK,MAAM,MAAA,CAAO,GAAA;AAAA,UAClB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,cAAc,YAAA,CAAa,gBAAA;AAAA,UAC3B,KAAA,EAAA,CAAA,CACE,EAAA,GAAA,YAAA,CAAa,QAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,IAAA,MAAS,aAAa,OAAA,GACzC,CAAC,CAAA,EAAU,OAAA,EAAiB,OAAA,KAAoB;AAC9C,YAAA,OAAA,GAAU,OAAA,GAAU,IAAI,CAAA,CAAA,GAAK,CAAA;AAC7B,YAAA,OAAA,GAAU,OAAA,GAAU,IAAI,CAAA,GAAI,CAAA;AAC5B,YAAA,OAAO,CAAC,SAAS,OAAO,CAAA;AAAA,UAC1B,CAAA,GACA,MAAM,IAAA,KAAS,SAAA,CAAU,OACvB,CAAC,CAAA,EAAU,SAAiB,OAAA,KAAoB;AAE9C,YAAA,IAAI,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAM,KAAM,IAAA,CAAM,MAAA;AAEzC,YAAA,OAAO,CAAC,IAAI,GAAG,CAAA;AAAA,UAIjB,CAAA,GACA,KAAA,CAAA;AAAA,UACR,QAAA,EAAU,MAAM,MAAA,CAAO;AAAA,SACzB;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,GAAY,QAAA;AAAA,IACd;AAEA,IAAA,IAAI,YAAA,CAAa,aAAA,KAAkB,aAAA,CAAc,MAAA,EAAQ;AACvD,MAAA,IAAI,SAAA;AAEJ,MAAA,IAAI,YAAA,CAAa,aAAA,KAAkB,aAAA,CAAc,MAAA,EAAQ;AACvD,QAAA,IACE,SAAA,CAAU,SAAA,IAAA,CAAA,CACV,EAAA,GAAA,KAAA,CAAM,MAAA,CAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,YAAA,MAAiB,iBAAA,CAAkB,MAAA,IACxD,SAAA,CAAU,EAAA,KAAO,gBAAA,CAAiB,UAAA,EAClC;AACA,UAAA,SAAA,GAAY,mBAAmB,CAAA,EAAG,KAAA,EAAO,SAAA,EAAW,KAAA,CAAM,OAAO,UAAU,CAAA;AAAA,QAC7E,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,WAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,MAAM,kBAAA,GAAqB;AAAA,QACzB,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,aAAa,cAAA,IAAkB,KAAA;AAAA,UACrC,OAAO,CAAA,GAAI,gBAAA;AAAA,UACX,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,SACzC;AAAA,QACA,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,aAAa,cAAA,IAAkB,KAAA;AAAA,UACrC,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,SACzC;AAAA,QACA,KAAA,EAAO,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,OACxC;AAEA,MAAA,IAAI,KAAA;AAGJ,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,MAAA;AAEJ,MAAA,IAAI,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAK,CAAA,EAAG;AAC/B,QAAA,KAAA,GAAQ,SAAA;AAAA,MACV,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM;AACxC,QAAA,IAAI,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAM,IAAA,CAAM,IAAA;AACpC,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAWC,OAAcA,EAAC,CAAA;AAC7C,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AAEA,MAAA,OAAA,CAAQ,OAAA;AAAA,QACN,SAAA;AAAA,UACE;AAAA,YACE,QAAA;AAAA,YACA,OAAO,YAAA,CAAa,SAAA;AAAA,YACpB,MAAM,YAAA,CAAa,SAAA;AAAA,YACnB,SAAA,EAAA,CAAW,EAAA,GAAA,YAAA,CAAa,aAAA,KAAb,IAAA,GAAA,EAAA,GAA8B,aAAA,CAAc,IAAA;AAAA,YACvD,WAAA,EAAa,CAAC,CAAA,EAAG,QAAA,KAAa,uBAAuB,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,YACrE,KAAA;AAAA,YACA,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,CAAa,YAAA,EAAa;AAAA,YACxC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA;AAAA,YACvB,KAAA,EAAA,CAAO,EAAA,GAAA,YAAA,CAAa,iBAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAgC,IAAA;AAAA,YACvC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,YACA,GAAG;AAAA,WACL;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF;AAEA,IAAA,MAAM,aACJ,YAAA,CAAa,SAAA,KAAc,eAAe,MAAA,GAAS,cAAA,CAAe,SAAS,YAAA,CAAa,UAAA;AAE1F,IAAA,IAAI,eAA2C,MAAM,IAAA;AAErD,IAAA,IAAI,YAAA,CAAa,cAAc,IAAA,EAAM;AACnC,MAAA,YAAA,GAAe,CAAC,CAAA,EAAG,SAAA,EAAW,IAAA,EAAM,IAAA,KAAS;AAC3C,QAAA,IAAI,WAAW,EAAC;AAEhB,QAAA,IAAI,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AAE/B,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,MAAA,EAAQ;AAChC,UAAA,MAAM,CAAC,QAAA,EAAU,OAAO,CAAA,GAAI,MAAA,CAAO,IAAA;AACnC,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AACtB,UAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA;AAC9B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAA,CAAS,MAAM,QAAQ,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAClE,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAA,CAAS,MAAM,OAAO,CAAA,EAAG,GAAA,EAAK,IAAI,CAAC,CAAA;AAEhE,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,MAAM,QAAA,EAAU;AAC3B,YAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,UACxB;AAGA,UAAA,KAAA,IAASA,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,IAAA,CAAK,QAAQA,EAAAA,EAAAA,EAAK;AACpC,YAAA,IAAI,OAAA,GAAU,KAAKA,EAAC,CAAA;AACpB,YAAA,IAAI,OAAA,GAAU,IAAA,CAAKA,EAAAA,GAAI,CAAC,CAAA;AAExB,YAAA,IAAI,WAAW,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,EAAG;AAExC,cAAA,IAAI,YAAY,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAG,IAAI,CAAA;AAE3C,cAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,IAAA,EAAM;AAE5B,gBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,kBAAA,IAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,IAAA,EAAM;AAChC,oBAAA,SAAA,IAAa,CAAA;AACb,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,IAAA,EAAM;AAChC,oBAAA,SAAA,IAAa,CAAA;AACb,oBAAA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAEA,cAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,YACzB;AAAA,UACF;AAEA,UAAA,IAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,CAAC,MAAM,OAAA,EAAS;AACxC,YAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,UACvB;AAAA,QACF;AAEA,QAAA,OAAO,QAAA,CAAS,SAAS,QAAA,GAAW,IAAA;AAAA,MACtC,CAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAE,aAAY,GAAI,YAAA;AAEtB,IAAA,IAAI,WAAA,GAA+C,IAAA;AACnD,IAAA,IAAI,aAAA,GAAiD,IAAA;AAErD,IAAA,IAAA,CAAI,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,MAAA,EAAQ;AACvB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,WAAA,GAAc,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,MACrD;AAEA,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,KAAA,CAAM,OAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,WAAA,GAAc,WAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,WAAA,CAAa,MAAA,CAAO,KAAA,CAAM,MAAM,MAAA,CAAO,UAAA,CAAA;AAE3D,MAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,WAAA,IAAA,IAAA,GAAA,WAAA,GAAe,KAAA,EAAO,aAAa,SAAS,CAAA;AAGjF,MAAA,IAAI,oBAAA,CAAqB,OAAA,CAAQ,QAAQ,CAAA,IAAK,CAAA,EAAG;AAC/C,QAAA,WAAA,GAAc,MAAM,IAAA;AACpB,QAAA,aAAA,GAAgB,MAAM,KAAA,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,YAAA,CAAa,SAAA,KAAc,cAAA,CAAe,QAAA,EAAU;AAE7D,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAO,MAAA,EAAQ;AAE5C,QAAA,WAAA,GAAc,CAAC,GAAG,SAAA,KAAc;AAE9B,UAAA,MAAM,QAAgB,CAAA,CAAU,KAAA;AAIhC,UAAA,MAAM,IAAI,YAAA,EAAa;AACvB,UAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,SAAQ,EAAG,CAAA,CAAE,EAAA,CAAG,OAAA,EAAS,CAAA;AAC7C,UAAA,IAAI,MAAA,GAAS,MAAM,SAAS,CAAA,CAAE,KAAK,CAAC,CAAA,KAAiC,KAAK,IAAI,CAAA;AAC9E,UAAA,IAAI,KAAA,GAAQ,CAAC,MAAA,EAAQ,MAAM,CAAA;AAC3B,UAAA,IAAI,QAAA,GAAW,MAAM,KAAA,EAAM;AAC3B,UAAA,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA;AACd,UAAA,QAAA,CAAS,SAAS,CAAA,GAAI,KAAA;AAGtB,UAAA,OAAO,cAAA;AAAA,YACL;AAAA,cACE,GAAG,CAAA;AAAA,cACH,KAAA,EAAO;AAAA,aACT;AAAA,YACA,SAAA;AAAA,YACA,CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,MAAM,gBAAA,GAAmB,MAAM,MAAA,CAAO,IAAA;AAAA,UACpC,CAAC,CAAA,KAAG;AA7bd,YAAA,IAAAF,GAAAA;AA8bY,YAAA,OAAA,YAAA,CAAa,gBAAgB,CAAA,CAAE,IAAA,IAC/B,YAAA,CAAa,WAAA,MAAA,CAAgBA,MAAA,CAAA,CAAE,MAAA,KAAF,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAU,sBACvC,YAAA,CAAa,WAAA,KAAgB,mBAAA,CAAoB,CAAA,EAAG,OAAO,SAAS,CAAA;AAAA,UAAA;AAAA,SACxE;AAEA,QAAA,MAAM,oBAAoB,gBAAA,GACtB,mBAAA,CAAoB,kBAAkB,KAAA,EAAO,SAAS,IACtD,YAAA,CAAa,WAAA;AAEjB,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAClC,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,iBAAiB,CAAA;AAC3C,QAAA,IAAI,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,YACd,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,YACb,IAAA,EAAM,KAAA;AAAA;AAAA,WACP,CAAA;AAED,UAAA,IAAI,CAAC,WAAA,EAAa;AAChB,YAAA,WAAA,GAAc,EAAA;AAAA,UAChB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,WAAA,GAAc,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,kBAAA,GAA8E,KAAA,CAAA;AAElF,IAAA,IAAI,SAAA,CAAU,EAAA,KAAO,gBAAA,CAAiB,UAAA,EAAY;AAChD,MAAA,kBAAA,GAAqB,CAAC,cAAc,mBAAA,CAAoB,YAAA,CAAa,OAAO,SAAS,CAAA,EAAG,KAAK,CAAA,CAAE,KAAA;AAAA,IACjG;AAEA,IAAA,OAAA,CAAQ,SAAA,CAAU;AAAA,MAChB,WAAA;AAAA,MACA,aAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,KAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,SAAA,EAAA,CAAW,EAAA,GAAA,YAAA,CAAa,SAAA,KAAb,IAAA,GAAA,EAAA,GAA0B,WAAA;AAAA,MACrC,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,mBAAmB,YAAA,CAAa,iBAAA;AAAA,MAChC,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,cAAc,YAAA,CAAa,YAAA;AAAA,MAC3B,gBAAgB,YAAA,CAAa,cAAA;AAAA,MAC7B,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,WAAW,YAAA,CAAa,SAAA;AAAA,MACxB,SAAA,EAAW,aAAa,SAAA,IAAa,KAAA;AAAA,MACrC,IAAA,EAAM,EAAA,CAAC,EAAA,GAAA,YAAA,CAAa,QAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAuB,GAAA,CAAA;AAAA,MAC9B,cAAc,YAAA,CAAa,YAAA;AAAA,MAC3B,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,MACtB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,MACtB,SAAS,YAAA,CAAa,WAAA;AAAA,MACtB,SAAS,YAAA,CAAa,WAAA;AAAA;AAAA,MAEtB,mBAAA,EAAA,CAAqB,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa;AAAA,KACnC,CAAA;AAGD,IAAA,IAAI,YAAA,CAAa,eAAA,IAAmB,MAAA,CAAO,UAAA,EAAY;AACrD,MAAA,MAAM,gBAAA,GAAA,CAAmB,EAAA,GAAA,YAAA,CAAa,eAAA,CAAgB,IAAA,KAA7B,YAAqC,wBAAA,CAAyB,GAAA;AACvF,MAAA,IAAI,gBAAA,KAAqB,yBAAyB,GAAA,EAAK;AACrD,QAAA,OAAA,CAAQ,aAAA,CAAc;AAAA,UACpB,QAAQ,YAAA,CAAa,eAAA;AAAA,UACrB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,QAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,UACtB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA;AAAA,UACtB,SAAS,YAAA,CAAa,WAAA;AAAA,UACtB,SAAS,YAAA,CAAa;AAAA,SACvB,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,GAAiB,kBAAkB,KAAK,CAAA;AAE5C,EAAA,OAAA,CAAQ,kBAAkB,cAAc,CAAA;AAGxC,EAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM;AACxB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,eAAuC,EAAC;AAE5C,IAAA,KAAA,IAAS,GAAA,IAAO,EAAE,QAAA,EAAU;AAC1B,MAAA,IAAI,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAC7B,MAAA,YAAA,CAAa,GAAG,CAAA,GAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,EAC9B,CAAA,CAAA;AAEA,EAAA,OAAA,CAAQ,SAAA,GAAY,CAAC,SAAA,EAAW,SAAS,CAAA;AAGzC,EAAA,MAAM,gBAAA,GAAmB,EAAA;AAEzB,EAAA,IAAI,MAAA,GAAgC;AAAA;AAAA;AAAA,IAGlC,OAAA,EAAS,CAAC,IAAA,EAAM,SAAA,EAAW,YAAY,UAAA,KAAe;AACpD,MAAA,IAAI,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA;AAEpC,MAAA,IAAI,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA,EAAM;AAClC,QAAA,IAAI,UAAA,GAAa,IAAA,EACf,UAAA,GAAa,IAAA,EACb,CAAA;AAEF,QAAA,CAAA,GAAI,UAAA;AACJ,QAAA,OAAO,UAAA,IAAc,IAAA,IAAQ,CAAA,EAAA,GAAM,CAAA,EAAG;AACpC,UAAA,IAAI,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA,EAAM;AACzB,YAAA,UAAA,GAAa,CAAA;AAAA,UACf;AAAA,QACF;AAEA,QAAA,CAAA,GAAI,UAAA;AACJ,QAAA,OAAO,UAAA,IAAc,IAAA,IAAQ,CAAA,EAAA,GAAM,UAAA,CAAW,MAAA,EAAQ;AACpD,UAAA,IAAI,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA,EAAM;AACzB,YAAA,UAAA,GAAa,CAAA;AAAA,UACf;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAEvB,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,GAAG,CAAA;AAC1C,QAAA,IAAI,MAAA,GAAS,cAAc,IAAA,GAAO,QAAA,GAAW,KAAK,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG,GAAG,CAAA;AACjF,QAAA,IAAI,MAAA,GAAS,cAAc,IAAA,GAAO,CAAA,QAAA,GAAY,KAAK,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA,EAAG,GAAG,CAAA;AAElF,QAAA,IAAI,WAAW,MAAA,GAAS,MAAA;AACxB,QAAA,IAAI,WAAW,MAAA,GAAS,MAAA;AAExB,QAAA,IAAI,YAAY,QAAA,EAAU;AACxB,UAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,YAAA,UAAA,GAAa,UAAA;AAAA,UACf;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,YAAY,gBAAA,EAAkB;AAChC,YAAA,UAAA,GAAa,UAAA;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAK,KAAM,mBAAA,CAAoB,GAAA,EAAK;AAC9C,IAAA,MAAA,CAAO,IAAA,GAAO;AAAA,MACZ,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQ,CAAC,SAAA,EAAW,IAAI;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,UAAU,MAAM,CAAA;AAExB,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,oBAAA,CAAqB,OAAkB,SAAA,EAA6C;AAClG,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAtmBrC,IAAA,IAAA,EAAA,EAAA,EAAA;AAumBI,IAAA,MAAM,MAAA,GAAA,CAAS,EAAA,GAAA,KAAA,CAAM,KAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,MAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,aAAY,EAAA,GAAA,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,KAA3B,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,OAAO,MAAA,CAAO,UAAA,CAAA;AAC9D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,oBAAoB,SAAA,EAAW,SAAA,CAAU,OAAO,UAAU,CAAA,EAAG,SAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MAC5F;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,WAAA;AACT;;;;"}